diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 830707dce287..bd0a12edd938 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -142,7 +142,7 @@ jobs: distribution: 'temurin' java-version: ${{ matrix.java }} - name: Run a full build - run: hadoop-ozone/dev-support/checks/build.sh -Pdist -Psrc ${{ inputs.ratis_args }} + run: hadoop-ozone/dev-support/checks/build.sh -Pdist -Psrc -Dmaven.javadoc.skip=true ${{ inputs.ratis_args }} env: DEVELOCITY_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }} - name: Store binaries for tests @@ -218,7 +218,7 @@ jobs: distribution: 'temurin' java-version: ${{ matrix.java }} - name: Compile Ozone using Java ${{ matrix.java }} - run: hadoop-ozone/dev-support/checks/build.sh -Dskip.npx -Dskip.installnpx -Djavac.version=${{ matrix.java }} ${{ inputs.ratis_args }} + run: hadoop-ozone/dev-support/checks/build.sh -Pdist -Dskip.npx -Dskip.installnpx -Djavac.version=${{ matrix.java }} ${{ inputs.ratis_args }} env: OZONE_WITH_COVERAGE: false DEVELOCITY_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }} @@ -428,7 +428,6 @@ jobs: mkdir -p hadoop-ozone/dist/target tar xzvf ozone*.tar.gz -C hadoop-ozone/dist/target rm ozone*.tar.gz - sudo chmod -R a+rwX hadoop-ozone/dist/target - name: Execute tests run: | pushd hadoop-ozone/dist/target/ozone-* diff --git a/.github/workflows/intermittent-test-check.yml b/.github/workflows/intermittent-test-check.yml index f4020db9508a..5de5654aced3 100644 --- a/.github/workflows/intermittent-test-check.yml +++ b/.github/workflows/intermittent-test-check.yml @@ -115,7 +115,7 @@ jobs: java-version: 8 - name: Build (most) of Ozone run: | - args="-Dskip.npx -Dskip.installnpx -DskipShade" + args="-Dskip.npx -Dskip.installnpx -DskipShade -Dmaven.javadoc.skip=true" if [[ "${{ github.event.inputs.ratis-ref }}" != "" ]]; then args="$args -Dratis.version=${{ needs.ratis.outputs.ratis-version }}" args="$args -Dratis.thirdparty.version=${{ needs.ratis.outputs.thirdparty-version }}" diff --git a/.github/workflows/repeat-acceptance.yml b/.github/workflows/repeat-acceptance.yml index 5c0edd3d71d1..1c6fc3797edb 100644 --- a/.github/workflows/repeat-acceptance.yml +++ b/.github/workflows/repeat-acceptance.yml @@ -108,7 +108,7 @@ jobs: distribution: 'temurin' java-version: ${{ env.JAVA_VERSION }} - name: Run a full build - run: hadoop-ozone/dev-support/checks/build.sh -Pdist -Psrc + run: hadoop-ozone/dev-support/checks/build.sh -Pdist -Psrc -Dmaven.javadoc.skip=true env: DEVELOCITY_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }} - name: Store binaries for tests diff --git a/hadoop-hdds/annotations/pom.xml b/hadoop-hdds/annotations/pom.xml index c6fed7287b68..3bb148d5c255 100644 --- a/hadoop-hdds/annotations/pom.xml +++ b/hadoop-hdds/annotations/pom.xml @@ -34,4 +34,16 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> true + + + + + org.apache.maven.plugins + maven-compiler-plugin + + none + + + + diff --git a/hadoop-hdds/client/pom.xml b/hadoop-hdds/client/pom.xml index 5c85fda966d8..5cd4ead18fbf 100644 --- a/hadoop-hdds/client/pom.xml +++ b/hadoop-hdds/client/pom.xml @@ -70,6 +70,43 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + diff --git a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java index 02747f53ca6d..dac582a14176 100644 --- a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java +++ b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java @@ -285,6 +285,7 @@ public ContainerCommandResponseProto sendCommand( } for (DatanodeDetails dn : datanodeList) { try { + request = reconstructRequestIfNeeded(request, dn); futureHashMap.put(dn, sendCommandAsync(request, dn).getResponse()); } catch (InterruptedException e) { LOG.error("Command execution was interrupted."); @@ -316,6 +317,29 @@ public ContainerCommandResponseProto sendCommand( return responseProtoHashMap; } + /** + * @param request + * @param dn + * @param pipeline + * In case of getBlock for EC keys, it is required to set replicaIndex for + * every request with the replicaIndex for that DN for which the request is + * sent to. This method unpacks proto and reconstructs request after setting + * the replicaIndex field. + * @return new updated Request + */ + private ContainerCommandRequestProto reconstructRequestIfNeeded( + ContainerCommandRequestProto request, DatanodeDetails dn) { + boolean isEcRequest = pipeline.getReplicationConfig() + .getReplicationType() == HddsProtos.ReplicationType.EC; + if (request.hasGetBlock() && isEcRequest) { + ContainerProtos.GetBlockRequestProto gbr = request.getGetBlock(); + request = request.toBuilder().setGetBlock(gbr.toBuilder().setBlockID( + gbr.getBlockID().toBuilder().setReplicaIndex( + pipeline.getReplicaIndex(dn)).build()).build()).build(); + } + return request; + } + @Override public ContainerCommandResponseProto sendCommand( ContainerCommandRequestProto request, List validators) diff --git a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/client/HddsClientUtils.java b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/client/HddsClientUtils.java index 2b07dacf1ead..6c5f9a0a9891 100644 --- a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/client/HddsClientUtils.java +++ b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/client/HddsClientUtils.java @@ -67,27 +67,26 @@ private HddsClientUtils() { .add(NotReplicatedException.class) .build(); - private static void doNameChecks(String resName) { + private static void doNameChecks(String resName, String resType) { if (resName == null) { - throw new IllegalArgumentException("Bucket or Volume name is null"); + throw new IllegalArgumentException(resType + " name is null"); } if (resName.length() < OzoneConsts.OZONE_MIN_BUCKET_NAME_LENGTH || resName.length() > OzoneConsts.OZONE_MAX_BUCKET_NAME_LENGTH) { - throw new IllegalArgumentException( - "Bucket or Volume length is illegal, " - + "valid length is 3-63 characters"); + throw new IllegalArgumentException(resType + + " length is illegal, " + "valid length is 3-63 characters"); } if (resName.charAt(0) == '.' || resName.charAt(0) == '-') { - throw new IllegalArgumentException( - "Bucket or Volume name cannot start with a period or dash"); + throw new IllegalArgumentException(resType + + " name cannot start with a period or dash"); } if (resName.charAt(resName.length() - 1) == '.' || resName.charAt(resName.length() - 1) == '-') { - throw new IllegalArgumentException("Bucket or Volume name " - + "cannot end with a period or dash"); + throw new IllegalArgumentException(resType + + " name cannot end with a period or dash"); } } @@ -108,27 +107,27 @@ private static boolean isSupportedCharacter(char c, boolean isStrictS3) { return false; } - private static void doCharacterChecks(char currChar, char prev, + private static void doCharacterChecks(char currChar, char prev, String resType, boolean isStrictS3) { if (Character.isUpperCase(currChar)) { - throw new IllegalArgumentException( - "Bucket or Volume name does not support uppercase characters"); + throw new IllegalArgumentException(resType + + " name does not support uppercase characters"); } if (!isSupportedCharacter(currChar, isStrictS3)) { - throw new IllegalArgumentException("Bucket or Volume name has an " + - "unsupported character : " + currChar); + throw new IllegalArgumentException(resType + + " name has an unsupported character : " + currChar); } if (prev == '.' && currChar == '.') { - throw new IllegalArgumentException("Bucket or Volume name should not " + - "have two contiguous periods"); + throw new IllegalArgumentException(resType + + " name should not have two contiguous periods"); } if (prev == '-' && currChar == '.') { - throw new IllegalArgumentException( - "Bucket or Volume name should not have period after dash"); + throw new IllegalArgumentException(resType + + " name should not have period after dash"); } if (prev == '.' && currChar == '-') { - throw new IllegalArgumentException( - "Bucket or Volume name should not have dash after period"); + throw new IllegalArgumentException(resType + + " name should not have dash after period"); } } @@ -140,7 +139,11 @@ private static void doCharacterChecks(char currChar, char prev, * @throws IllegalArgumentException */ public static void verifyResourceName(String resName) { - verifyResourceName(resName, true); + verifyResourceName(resName, "resource", true); + } + + public static void verifyResourceName(String resName, String resType) { + verifyResourceName(resName, resType, true); } /** @@ -150,9 +153,9 @@ public static void verifyResourceName(String resName) { * * @throws IllegalArgumentException */ - public static void verifyResourceName(String resName, boolean isStrictS3) { + public static void verifyResourceName(String resName, String resType, boolean isStrictS3) { - doNameChecks(resName); + doNameChecks(resName, resType); boolean isIPv4 = true; char prev = (char) 0; @@ -162,13 +165,13 @@ public static void verifyResourceName(String resName, boolean isStrictS3) { if (currChar != '.') { isIPv4 = ((currChar >= '0') && (currChar <= '9')) && isIPv4; } - doCharacterChecks(currChar, prev, isStrictS3); + doCharacterChecks(currChar, prev, resType, isStrictS3); prev = currChar; } if (isIPv4) { - throw new IllegalArgumentException( - "Bucket or Volume name cannot be an IPv4 address or all numeric"); + throw new IllegalArgumentException(resType + + " name cannot be an IPv4 address or all numeric"); } } diff --git a/hadoop-hdds/common/pom.xml b/hadoop-hdds/common/pom.xml index 12bfe927b61a..aeec60f97906 100644 --- a/hadoop-hdds/common/pom.xml +++ b/hadoop-hdds/common/pom.xml @@ -257,6 +257,43 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DecommissionUtils.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DecommissionUtils.java index 7d5b610b0875..c176ad1464ec 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DecommissionUtils.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/DecommissionUtils.java @@ -126,7 +126,9 @@ public static Map getCountsMap(DatanodeDetails datanode, JsonNod Map countsMap, String errMsg) throws IOException { for (int i = 1; i <= numDecomNodes; i++) { - if (datanode.getHostName().equals(counts.get("tag.datanode." + i).asText())) { + String datanodeHostName = + (counts.get("tag.datanode." + i) != null) ? (counts.get("tag.datanode." + i).asText()) : ""; + if (datanode.getHostName().equals(datanodeHostName)) { JsonNode pipelinesDN = counts.get("PipelinesWaitingToCloseDN." + i); JsonNode underReplicatedDN = counts.get("UnderReplicatedDN." + i); JsonNode unclosedDN = counts.get("UnclosedContainersDN." + i); diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/DelegatingProperties.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/DelegatingProperties.java new file mode 100644 index 000000000000..bbf18aff8dc9 --- /dev/null +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/DelegatingProperties.java @@ -0,0 +1,190 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hdds.conf; + +import org.apache.hadoop.ozone.OzoneConfigKeys; +import org.apache.hadoop.util.StringUtils; + +import java.util.Collection; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_CRYPTO_COMPLIANCE_MODE_UNRESTRICTED; + +/** + * Delegating properties helper class. It's needed for configuration related classes, so we are able + * to delegate the operations that are happening on their Properties object to their parent's + * Properties object. This is needed because of the configuration compliance checks. + */ +public class DelegatingProperties extends Properties { + private final Properties properties; + private final String complianceMode; + private final boolean checkCompliance; + private final Properties cryptoProperties; + + public DelegatingProperties(Properties properties, String complianceMode, Properties cryptoProperties) { + this.properties = properties; + this.complianceMode = complianceMode; + this.checkCompliance = !complianceMode.equals(OZONE_SECURITY_CRYPTO_COMPLIANCE_MODE_UNRESTRICTED); + this.cryptoProperties = cryptoProperties; + } + + public String checkCompliance(String config, String value) { + // Don't check the ozone.security.crypto.compliance.mode config, even though it's tagged as a crypto config + if (checkCompliance && cryptoProperties.containsKey(config) && + !config.equals(OzoneConfigKeys.OZONE_SECURITY_CRYPTO_COMPLIANCE_MODE)) { + + String whitelistConfig = config + "." + complianceMode + ".whitelist"; + String whitelistValue = properties.getProperty(whitelistConfig, ""); + + if (whitelistValue != null) { + Collection whitelistOptions = StringUtils.getTrimmedStringCollection(whitelistValue); + + if (!whitelistOptions.contains(value)) { + throw new ConfigurationException("Not allowed configuration value! Compliance mode is set to " + + complianceMode + " and " + config + " configuration's value is not allowed. Please check the " + + whitelistConfig + " configuration."); + } + } + } + return value; + } + + @Override + public String getProperty(String key) { + String value = properties.getProperty(key); + return checkCompliance(key, value); + } + + @Override + public Object setProperty(String key, String value) { + return properties.setProperty(key, value); + } + + @Override + public synchronized Object remove(Object key) { + return properties.remove(key); + } + + @Override + public synchronized void clear() { + properties.clear(); + } + + @Override + public Enumeration keys() { + return properties.keys(); + } + + @Override + public Enumeration propertyNames() { + return properties.propertyNames(); + } + + @Override + public Set stringPropertyNames() { + return properties.stringPropertyNames(); + } + + @Override + public int size() { + return properties.size(); + } + + @Override + public boolean isEmpty() { + return properties.isEmpty(); + } + + @Override + public Set keySet() { + return properties.keySet(); + } + + @Override + public boolean contains(Object value) { + return properties.contains(value); + } + + @Override + public boolean containsKey(Object key) { + return properties.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return properties.containsValue(value); + } + + @Override + public Object get(Object key) { + return properties.get(key); + } + + @Override + public synchronized boolean remove(Object key, Object value) { + return properties.remove(key, value); + } + + @Override + public synchronized Object put(Object key, Object value) { + return properties.put(key, value); + } + + @Override + public synchronized void putAll(Map t) { + properties.putAll(t); + } + + @Override + public Collection values() { + return properties.values(); + } + + @Override + public Set> entrySet() { + return properties.entrySet(); + } + + @Override + public synchronized boolean equals(Object o) { + return properties.equals(o); + } + + @Override + public synchronized int hashCode() { + return properties.hashCode(); + } + + public Iterator> iterator() { + Map result = new HashMap<>(); + synchronized (properties) { + for (Map.Entry item : properties.entrySet()) { + if (item.getKey() instanceof String && item.getValue() instanceof String) { + String value = checkCompliance((String) item.getKey(), (String) item.getValue()); + result.put((String) item.getKey(), value); + } + } + } + return result.entrySet().iterator(); + } +} diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java index b8742c6ba929..3ee1b70c6b44 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java @@ -33,6 +33,7 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; @@ -407,4 +408,52 @@ public int getInt(String name, String fallbackName, int defaultValue, } return Integer.parseInt(value); } + + private Properties delegatingProps; + + @Override + public synchronized void reloadConfiguration() { + super.reloadConfiguration(); + delegatingProps = null; + } + + @Override + protected final synchronized Properties getProps() { + if (delegatingProps == null) { + String complianceMode = getPropertyUnsafe(OzoneConfigKeys.OZONE_SECURITY_CRYPTO_COMPLIANCE_MODE, + OzoneConfigKeys.OZONE_SECURITY_CRYPTO_COMPLIANCE_MODE_UNRESTRICTED); + Properties cryptoProperties = getCryptoProperties(); + delegatingProps = new DelegatingProperties(super.getProps(), complianceMode, cryptoProperties); + } + return delegatingProps; + } + + /** + * Get a property value without the compliance check. It's needed to get the compliance + * mode from the configuration. + * + * @param key property name + * @param defaultValue default value + * @return property value, without compliance check + */ + private String getPropertyUnsafe(String key, String defaultValue) { + return super.getProps().getProperty(key, defaultValue); + } + + private Properties getCryptoProperties() { + try { + return super.getAllPropertiesByTag(ConfigTag.CRYPTO_COMPLIANCE.toString()); + } catch (NoSuchMethodError e) { + // We need to handle NoSuchMethodError, because in Hadoop 2 we don't have the + // getAllPropertiesByTag method. We won't be supporting the compliance mode with + // that version, so we are safe to catch the exception and return a new Properties object. + return new Properties(); + } + } + + @Override + public Iterator> iterator() { + DelegatingProperties properties = (DelegatingProperties) getProps(); + return properties.iterator(); + } } diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java index b9a2f87a03da..9b9719386b39 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java @@ -17,10 +17,12 @@ */ package org.apache.hadoop.hdds.fs; -import com.google.common.base.Preconditions; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.hdds.annotation.InterfaceStability; +import org.apache.ratis.util.AutoCloseableLock; +import org.apache.ratis.util.AutoCloseableReadWriteLock; +import org.apache.ratis.util.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,7 +33,6 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -46,12 +47,16 @@ public class CachingSpaceUsageSource implements SpaceUsageSource { LoggerFactory.getLogger(CachingSpaceUsageSource.class); private final ScheduledExecutorService executor; - private final AtomicLong cachedValue = new AtomicLong(); + private final AutoCloseableReadWriteLock lock; + private long cachedUsedSpace; + private long cachedAvailable; + private long cachedCapacity; private final Duration refresh; private final SpaceUsageSource source; private final SpaceUsagePersistence persistence; private boolean running; - private ScheduledFuture scheduledFuture; + private ScheduledFuture updateUsedSpaceFuture; + private ScheduledFuture updateAvailableFuture; private final AtomicBoolean isRefreshRunning; public CachingSpaceUsageSource(SpaceUsageCheckParams params) { @@ -60,15 +65,16 @@ public CachingSpaceUsageSource(SpaceUsageCheckParams params) { CachingSpaceUsageSource(SpaceUsageCheckParams params, ScheduledExecutorService executor) { - Preconditions.checkArgument(params != null, "params == null"); + Preconditions.assertNotNull(params, "params == null"); refresh = params.getRefresh(); source = params.getSource(); + lock = new AutoCloseableReadWriteLock(source.toString()); persistence = params.getPersistence(); this.executor = executor; isRefreshRunning = new AtomicBoolean(); - Preconditions.checkArgument(refresh.isZero() == (executor == null), + Preconditions.assertTrue(refresh.isZero() == (executor == null), "executor should be provided if and only if refresh is requested"); loadInitialValue(); @@ -76,45 +82,81 @@ public CachingSpaceUsageSource(SpaceUsageCheckParams params) { @Override public long getCapacity() { - return source.getCapacity(); + try (AutoCloseableLock ignored = lock.readLock(null, null)) { + return cachedCapacity; + } } @Override public long getAvailable() { - return source.getAvailable(); + try (AutoCloseableLock ignored = lock.readLock(null, null)) { + return cachedAvailable; + } } @Override public long getUsedSpace() { - return cachedValue.get(); + try (AutoCloseableLock ignored = lock.readLock(null, null)) { + return cachedUsedSpace; + } + } + + @Override + public SpaceUsageSource snapshot() { + try (AutoCloseableLock ignored = lock.readLock(null, null)) { + return new Fixed(cachedCapacity, cachedAvailable, cachedUsedSpace); + } } public void incrementUsedSpace(long usedSpace) { - cachedValue.addAndGet(usedSpace); + if (usedSpace == 0) { + return; + } + Preconditions.assertTrue(usedSpace > 0, () -> usedSpace + " < 0"); + final long current, change; + try (AutoCloseableLock ignored = lock.writeLock(null, null)) { + current = cachedAvailable; + change = Math.min(current, usedSpace); + cachedAvailable -= change; + cachedUsedSpace += change; + } + + if (change != usedSpace) { + LOG.warn("Attempted to decrement available space to a negative value. Current: {}, Decrement: {}, Source: {}", + current, usedSpace, source); + } } public void decrementUsedSpace(long reclaimedSpace) { - cachedValue.updateAndGet(current -> { - long newValue = current - reclaimedSpace; - if (newValue < 0) { - if (current > 0) { - LOG.warn("Attempted to decrement used space to a negative value. " + - "Current: {}, Decrement: {}, Source: {}", - current, reclaimedSpace, source); - } - return 0; - } else { - return newValue; - } - }); + if (reclaimedSpace == 0) { + return; + } + Preconditions.assertTrue(reclaimedSpace > 0, () -> reclaimedSpace + " < 0"); + final long current, change; + try (AutoCloseableLock ignored = lock.writeLock(null, null)) { + current = cachedUsedSpace; + change = Math.min(current, reclaimedSpace); + cachedUsedSpace -= change; + cachedAvailable += change; + } + + if (change != reclaimedSpace) { + LOG.warn("Attempted to decrement used space to a negative value. Current: {}, Decrement: {}, Source: {}", + current, reclaimedSpace, source); + } } public void start() { if (executor != null) { - long initialDelay = cachedValue.get() > 0 ? refresh.toMillis() : 0; + long initialDelay = getUsedSpace() > 0 ? refresh.toMillis() : 0; if (!running) { - scheduledFuture = executor.scheduleWithFixedDelay( + updateUsedSpaceFuture = executor.scheduleWithFixedDelay( this::refresh, initialDelay, refresh.toMillis(), MILLISECONDS); + + long availableUpdateDelay = Math.min(refresh.toMillis(), Duration.ofMinutes(1).toMillis()); + updateAvailableFuture = executor.scheduleWithFixedDelay( + this::updateAvailable, availableUpdateDelay, availableUpdateDelay, MILLISECONDS); + running = true; } } else { @@ -126,8 +168,13 @@ public void shutdown() { persistence.save(this); // save cached value if (executor != null) { - if (running && scheduledFuture != null) { - scheduledFuture.cancel(true); + if (running) { + if (updateUsedSpaceFuture != null) { + updateUsedSpaceFuture.cancel(true); + } + if (updateAvailableFuture != null) { + updateAvailableFuture.cancel(true); + } } running = false; @@ -135,21 +182,48 @@ public void shutdown() { } } + /** Schedule immediate refresh. */ public void refreshNow() { - //refresh immediately executor.schedule(this::refresh, 0, MILLISECONDS); } + /** Loads {@code usedSpace} value from persistent source, if present. + * Also updates {@code available} and {@code capacity} from the {@code source}. */ private void loadInitialValue() { final OptionalLong initialValue = persistence.load(); - initialValue.ifPresent(cachedValue::set); + updateCachedValues(initialValue.orElse(0)); + } + + /** Updates {@code available} and {@code capacity} from the {@code source}. */ + private void updateAvailable() { + final long capacity = source.getCapacity(); + final long available = source.getAvailable(); + + try (AutoCloseableLock ignored = lock.writeLock(null, null)) { + cachedAvailable = available; + cachedCapacity = capacity; + } + } + + /** Updates {@code available} and {@code capacity} from the {@code source}, + * sets {@code usedSpace} to the specified {@code used} value. */ + private void updateCachedValues(long used) { + final long capacity = source.getCapacity(); + final long available = source.getAvailable(); + + try (AutoCloseableLock ignored = lock.writeLock(null, null)) { + cachedAvailable = available; + cachedCapacity = capacity; + cachedUsedSpace = used; + } } + /** Refreshes all 3 values. */ private void refresh() { //only one `refresh` can be running at a certain moment if (isRefreshRunning.compareAndSet(false, true)) { try { - cachedValue.set(source.getUsedSpace()); + updateCachedValues(source.getUsedSpace()); } catch (RuntimeException e) { LOG.warn("Error refreshing space usage for {}", source, e); } finally { diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java index 14fb0a40cd00..34b2680b301b 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java @@ -24,6 +24,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos.DeletedBlocksTransactionInfo; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DecommissionScmResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.StartContainerBalancerResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; import org.apache.hadoop.hdds.scm.DatanodeAdminError; import org.apache.hadoop.hdds.scm.container.ContainerID; import org.apache.hadoop.hdds.scm.container.ContainerReplicaInfo; @@ -384,6 +385,8 @@ StartContainerBalancerResponseProto startContainerBalancer( */ boolean getContainerBalancerStatus() throws IOException; + ContainerBalancerStatusInfoResponseProto getContainerBalancerStatusInfo() throws IOException; + /** * returns the list of ratis peer roles. Currently only include peer address. */ diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java index df8ed02cf7f0..45825cb2b621 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java @@ -25,6 +25,7 @@ import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DecommissionScmResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.StartContainerBalancerResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.Type; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; import org.apache.hadoop.hdds.scm.DatanodeAdminError; import org.apache.hadoop.hdds.scm.ScmConfig; import org.apache.hadoop.hdds.scm.ScmInfo; @@ -429,6 +430,8 @@ StartContainerBalancerResponseProto startContainerBalancer( */ boolean getContainerBalancerStatus() throws IOException; + ContainerBalancerStatusInfoResponseProto getContainerBalancerStatusInfo() throws IOException; + /** * Get Datanode usage information by ip or hostname or uuid. * diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/PemFileBasedKeyStoresFactory.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/PemFileBasedKeyStoresFactory.java deleted file mode 100644 index 028d6c8e0329..000000000000 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/PemFileBasedKeyStoresFactory.java +++ /dev/null @@ -1,165 +0,0 @@ -/** -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.apache.hadoop.hdds.security.ssl; - -import org.apache.hadoop.hdds.annotation.InterfaceAudience; -import org.apache.hadoop.hdds.annotation.InterfaceStability; -import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; -import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateNotification; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.net.ssl.KeyManager; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManager; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.security.KeyStore; - -/** - * {@link KeyStoresFactory} implementation that reads the certificates from - * private key pem file and certificate pem file. - *

- * If either the truststore or the keystore certificates file changes, it - * would be refreshed under the corresponding wrapper implementation - - * {@link ReloadingX509KeyManager} or {@link ReloadingX509TrustManager}. - *

- */ -@InterfaceAudience.Private -@InterfaceStability.Evolving -public class PemFileBasedKeyStoresFactory implements KeyStoresFactory, - CertificateNotification { - - private static final Logger LOG = - LoggerFactory.getLogger(PemFileBasedKeyStoresFactory.class); - - private KeyManager[] keyManagers; - private TrustManager[] trustManagers; - private final CertificateClient caClient; - - public PemFileBasedKeyStoresFactory(CertificateClient client) { - this.caClient = client; - } - - /** - * Implements logic of initializing the TrustManagers with the options - * to reload truststore. - */ - private void createTrustManagers() throws - GeneralSecurityException, IOException { - ReloadingX509TrustManager trustManager = new ReloadingX509TrustManager(KeyStore.getDefaultType(), caClient); - trustManagers = new TrustManager[] {trustManager}; - } - - /** - * Implements logic of initializing the KeyManagers with the options - * to reload keystores. - */ - private void createKeyManagers() throws - GeneralSecurityException, IOException { - ReloadingX509KeyManager keystoreManager = new ReloadingX509KeyManager(KeyStore.getDefaultType(), caClient); - keyManagers = new KeyManager[] {keystoreManager}; - } - - /** - * Initializes the keystores of the factory. - * - * @param mode if the keystores are to be used in client or server mode. - * @param requireClientAuth whether client authentication is required. Ignore - * for client mode. - * @throws IOException thrown if the keystores could not be initialized due - * to an IO error. - * @throws GeneralSecurityException thrown if the keystores could not be - * initialized due to a security error. - */ - public synchronized void init(Mode mode, boolean requireClientAuth) - throws IOException, GeneralSecurityException { - - // key manager - if (requireClientAuth || mode == Mode.SERVER) { - createKeyManagers(); - } else { - KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); - keystore.load(null, null); - KeyManagerFactory keyMgrFactory = KeyManagerFactory - .getInstance(KeyManagerFactory.getDefaultAlgorithm()); - - keyMgrFactory.init(keystore, null); - keyManagers = keyMgrFactory.getKeyManagers(); - } - - // trust manager - createTrustManagers(); - caClient.registerNotificationReceiver(this); - } - - /** - * Releases any resources being used. - */ - @Override - public synchronized void destroy() { - if (keyManagers != null) { - keyManagers = null; - } - - if (trustManagers != null) { - trustManagers = null; - } - } - - /** - * Returns the keymanagers for owned certificates. - */ - @Override - public synchronized KeyManager[] getKeyManagers() { - KeyManager[] copy = new KeyManager[keyManagers.length]; - System.arraycopy(keyManagers, 0, copy, 0, keyManagers.length); - return copy; - } - - /** - * Returns the trustmanagers for trusted certificates. - */ - @Override - public synchronized TrustManager[] getTrustManagers() { - TrustManager[] copy = new TrustManager[trustManagers.length]; - System.arraycopy(trustManagers, 0, copy, 0, trustManagers.length); - return copy; - } - - @Override - public synchronized void notifyCertificateRenewed( - CertificateClient certClient, String oldCertId, String newCertId) { - LOG.info("{} notify certificate renewed", certClient.getComponentName()); - if (keyManagers != null) { - for (KeyManager km: keyManagers) { - if (km instanceof ReloadingX509KeyManager) { - ((ReloadingX509KeyManager) km).loadFrom(certClient); - } - } - } - - if (trustManagers != null) { - for (TrustManager tm: trustManagers) { - if (tm instanceof ReloadingX509TrustManager) { - ((ReloadingX509TrustManager) tm).loadFrom(certClient); - } - } - } - } -} diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java index d88f40b4be25..32c94d3ddc75 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509KeyManager.java @@ -20,6 +20,7 @@ import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.hdds.annotation.InterfaceStability; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; +import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateNotification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,22 +35,20 @@ import java.security.Principal; import java.security.PrivateKey; import java.security.cert.X509Certificate; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.concurrent.atomic.AtomicReference; /** - * An implementation of X509KeyManager that exposes a method, - * {@link #loadFrom(CertificateClient)} to reload its configuration. + * An implementation of X509KeyManager that can be notified of certificate changes. * Note that it is necessary to implement the * X509ExtendedKeyManager to properly delegate * the additional methods, otherwise the SSL handshake will fail. */ @InterfaceAudience.Private @InterfaceStability.Evolving -public class ReloadingX509KeyManager extends X509ExtendedKeyManager { +public class ReloadingX509KeyManager extends X509ExtendedKeyManager implements CertificateNotification { public static final Logger LOG = LoggerFactory.getLogger(ReloadingX509KeyManager.class); @@ -67,27 +66,30 @@ public class ReloadingX509KeyManager extends X509ExtendedKeyManager { * materials are changed. */ private PrivateKey currentPrivateKey; - private List currentCertIdsList = new ArrayList<>(); - private String alias; + private List currentTrustChain; + private final String alias; /** * Construct a Reloading509KeystoreManager. * - * @param type type of keystore file, typically 'jks'. - * @param caClient client to get the private key and certificate materials. + * @param type type of keystore file, typically 'jks'. + * @param componentName the name of the component for which the keys are created. + * @param privateKey private key for this key manager. + * @param trustChain list of the trusted certificates. * @throws IOException * @throws GeneralSecurityException */ - public ReloadingX509KeyManager(String type, CertificateClient caClient) + public ReloadingX509KeyManager(String type, String componentName, PrivateKey privateKey, + List trustChain) throws GeneralSecurityException, IOException { this.type = type; + alias = componentName + "_key"; keyManagerRef = new AtomicReference<>(); - keyManagerRef.set(loadKeyManager(caClient)); + keyManagerRef.set(init(privateKey, trustChain)); } @Override - public String chooseEngineClientAlias(String[] strings, - Principal[] principals, SSLEngine sslEngine) { + public String chooseEngineClientAlias(String[] strings, Principal[] principals, SSLEngine sslEngine) { String ret = keyManagerRef.get() .chooseEngineClientAlias(strings, principals, sslEngine); @@ -184,29 +186,9 @@ public PrivateKey getPrivateKey(String s) { return keyManagerRef.get().getPrivateKey(s.toLowerCase(Locale.ROOT)); } - public ReloadingX509KeyManager loadFrom(CertificateClient caClient) { - try { - X509ExtendedKeyManager manager = loadKeyManager(caClient); - if (manager != null) { - keyManagerRef.set(manager); - LOG.info("ReloadingX509KeyManager is reloaded"); - } - } catch (Exception ex) { - // The Consumer.accept interface forces us to convert to unchecked - throw new RuntimeException(ex); - } - return this; - } - - private X509ExtendedKeyManager loadKeyManager(CertificateClient caClient) + private X509ExtendedKeyManager init(PrivateKey newPrivateKey, List newTrustChain) throws GeneralSecurityException, IOException { - PrivateKey privateKey = caClient.getPrivateKey(); - List newCertList = caClient.getTrustChain(); - if (currentPrivateKey != null && currentPrivateKey.equals(privateKey) && - currentCertIdsList.size() > 0 && - newCertList.size() == currentCertIdsList.size() && - newCertList.stream().allMatch(c -> - currentCertIdsList.contains(c.getSerialNumber().toString()))) { + if (isAlreadyUsing(newPrivateKey, newTrustChain)) { // Security materials(key and certificates) keep the same. return null; } @@ -215,30 +197,54 @@ private X509ExtendedKeyManager loadKeyManager(CertificateClient caClient) KeyStore keystore = KeyStore.getInstance(type); keystore.load(null, null); - alias = caClient.getComponentName() + "_key"; - keystore.setKeyEntry(alias, privateKey, EMPTY_PASSWORD, - newCertList.toArray(new X509Certificate[0])); + keystore.setKeyEntry(alias, newPrivateKey, EMPTY_PASSWORD, + newTrustChain.toArray(new X509Certificate[0])); LOG.info("Key manager is loaded with certificate chain"); - for (X509Certificate x509Certificate : newCertList) { + for (X509Certificate x509Certificate : newTrustChain) { LOG.info(x509Certificate.toString()); } KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm()); keyMgrFactory.init(keystore, EMPTY_PASSWORD); - for (KeyManager candidate: keyMgrFactory.getKeyManagers()) { + for (KeyManager candidate : keyMgrFactory.getKeyManagers()) { if (candidate instanceof X509ExtendedKeyManager) { - keyManager = (X509ExtendedKeyManager)candidate; + keyManager = (X509ExtendedKeyManager) candidate; break; } } - currentPrivateKey = privateKey; - currentCertIdsList.clear(); - for (X509Certificate cert: newCertList) { - currentCertIdsList.add(cert.getSerialNumber().toString()); - } + currentPrivateKey = newPrivateKey; + currentTrustChain = newTrustChain; return keyManager; } + + private boolean isAlreadyUsing(PrivateKey privateKey, List newTrustChain) { + return currentPrivateKey != null && currentPrivateKey.equals(privateKey) && + currentTrustChain.size() > 0 && + newTrustChain.size() == currentTrustChain.size() && + newTrustChain.stream() + .allMatch( + newCertificate -> (currentTrustChain.stream() + .anyMatch(oldCert -> oldCert.getSerialNumber().equals(newCertificate.getSerialNumber())) + ) + ); + } + + @Override + public synchronized void notifyCertificateRenewed( + CertificateClient certClient, String oldCertId, String newCertId) { + LOG.info("{} notify certificate renewed", certClient.getComponentName()); + try { + X509ExtendedKeyManager manager = init(certClient.getPrivateKey(), certClient.getTrustChain()); + if (manager != null) { + keyManagerRef.set(manager); + LOG.info("ReloadingX509KeyManager is reloaded"); + } + } catch (Exception ex) { + // The Consumer.accept interface forces us to convert to unchecked + throw new RuntimeException(ex); + } + } } diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509TrustManager.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509TrustManager.java index bfc3939cd0a2..0620adf4975b 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509TrustManager.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/ssl/ReloadingX509TrustManager.java @@ -20,6 +20,7 @@ import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.hdds.annotation.InterfaceStability; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; +import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateNotification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,12 +43,12 @@ /** * A {@link TrustManager} implementation that exposes a method, - * {@link #loadFrom(CertificateClient)} to reload its configuration for + * {@link #init(List)} to reload its configuration for * example when the truststore file on disk changes. */ @InterfaceAudience.Private @InterfaceStability.Evolving -public final class ReloadingX509TrustManager implements X509TrustManager { +public final class ReloadingX509TrustManager implements X509TrustManager, CertificateNotification { public static final Logger LOG = LoggerFactory.getLogger(ReloadingX509TrustManager.class); @@ -57,27 +58,28 @@ public final class ReloadingX509TrustManager implements X509TrustManager { private final String type; private final AtomicReference trustManagerRef; + /** * Current Root CA cert in trustManager, to detect if certificate is changed. */ - private List currentRootCACertIds = new ArrayList<>(); + private List currentRootCACerts = new ArrayList<>(); /** * Creates a reloadable trustmanager. The trustmanager reloads itself * if the underlying truststore materials have changed. * - * @param type type of truststore file, typically 'jks'. - * @param caClient client to get trust certificates. - * @throws IOException thrown if the truststore could not be initialized due - * to an IO error. + * @param type type of truststore file, typically 'jks'. + * @param newRootCaCerts the newest known trusted certificates. + * @throws IOException thrown if the truststore could not be initialized due + * to an IO error. * @throws GeneralSecurityException thrown if the truststore could not be - * initialized due to a security error. + * initialized due to a security error. */ - public ReloadingX509TrustManager(String type, CertificateClient caClient) + public ReloadingX509TrustManager(String type, List newRootCaCerts) throws GeneralSecurityException, IOException { this.type = type; trustManagerRef = new AtomicReference(); - trustManagerRef.set(loadTrustManager(caClient)); + trustManagerRef.set(init(newRootCaCerts)); } @Override @@ -133,39 +135,17 @@ public X509Certificate[] getAcceptedIssuers() { return issuers; } - public ReloadingX509TrustManager loadFrom(CertificateClient caClient) { - try { - X509TrustManager manager = loadTrustManager(caClient); - if (manager != null) { - this.trustManagerRef.set(manager); - LOG.info("ReloadingX509TrustManager is reloaded."); - } - } catch (Exception ex) { - // The Consumer.accept interface forces us to convert to unchecked - throw new RuntimeException(RELOAD_ERROR_MESSAGE, ex); - } - return this; - } - - X509TrustManager loadTrustManager(CertificateClient caClient) + private X509TrustManager init(List newRootCaCerts) throws GeneralSecurityException, IOException { - // SCM certificate client sets root CA as CA cert instead of root CA cert - Set certList = caClient.getAllRootCaCerts(); - Set rootCACerts = certList.isEmpty() ? - caClient.getAllCaCerts() : certList; - // Certificate keeps the same. - if (rootCACerts.size() > 0 && - currentRootCACertIds.size() == rootCACerts.size() && - rootCACerts.stream().allMatch(c -> - currentRootCACertIds.contains(c.getSerialNumber().toString()))) { + if (isAlreadyUsing(newRootCaCerts)) { return null; } X509TrustManager trustManager = null; KeyStore ks = KeyStore.getInstance(type); ks.load(null, null); - insertCertsToKeystore(rootCACerts, ks); + insertCertsToKeystore(newRootCaCerts, ks); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); @@ -177,12 +157,20 @@ X509TrustManager loadTrustManager(CertificateClient caClient) break; } } - currentRootCACertIds.clear(); - rootCACerts.forEach( - c -> currentRootCACertIds.add(c.getSerialNumber().toString())); + currentRootCACerts = newRootCaCerts; return trustManager; } + private boolean isAlreadyUsing(List newRootCaCerts) { + return newRootCaCerts.size() > 0 && + currentRootCACerts.size() == newRootCaCerts.size() && + newRootCaCerts.stream() + .allMatch( + newCert -> currentRootCACerts.stream() + .anyMatch(currentCert -> currentCert.getSerialNumber().equals(newCert.getSerialNumber())) + ); + } + private void insertCertsToKeystore(Iterable certs, KeyStore ks) throws KeyStoreException { LOG.info("Trust manager is loaded with certificates"); @@ -192,4 +180,22 @@ private void insertCertsToKeystore(Iterable certs, LOG.info(certToInsert.toString()); } } + + @Override + public synchronized void notifyCertificateRenewed( + CertificateClient certClient, String oldCertId, String newCertId) { + LOG.info("{} notify certificate renewed", certClient.getComponentName()); + Set certList = certClient.getAllRootCaCerts(); + Set rootCaCerts = certList.isEmpty() ? certClient.getAllCaCerts() : certList; + try { + X509TrustManager manager = init(new ArrayList<>(rootCaCerts)); + if (manager != null) { + this.trustManagerRef.set(manager); + LOG.info("ReloadingX509TrustManager is reloaded."); + } + } catch (Exception ex) { + // The Consumer.accept interface forces us to convert to unchecked + throw new RuntimeException(RELOAD_ERROR_MESSAGE, ex); + } + } } diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java index e196d0df9d7f..0c23a846563a 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClient.java @@ -20,7 +20,8 @@ package org.apache.hadoop.hdds.security.x509.certificate.client; import org.apache.hadoop.hdds.security.exception.OzoneSecurityException; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509KeyManager; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509TrustManager; import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest; import org.apache.hadoop.hdds.security.x509.exception.CertificateException; @@ -174,15 +175,9 @@ default void assertValidKeysAndCertificate() throws OzoneSecurityException { } } - /** - * Return the store factory for key manager and trust manager for server. - */ - KeyStoresFactory getServerKeyStoresFactory() throws CertificateException; + ReloadingX509KeyManager getKeyManager() throws CertificateException; - /** - * Return the store factory for key manager and trust manager for client. - */ - KeyStoresFactory getClientKeyStoresFactory() throws CertificateException; + ReloadingX509TrustManager getTrustManager() throws CertificateException; /** * Register a receiver that will be called after the certificate renewed. diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/LegacyHadoopConfigurationSource.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/LegacyHadoopConfigurationSource.java index fcf6313305b6..4a18a6ca45fb 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/LegacyHadoopConfigurationSource.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/LegacyHadoopConfigurationSource.java @@ -19,10 +19,16 @@ import java.io.IOException; import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hdds.conf.ConfigTag; import org.apache.hadoop.hdds.conf.ConfigurationSource; +import org.apache.hadoop.hdds.conf.DelegatingProperties; import org.apache.hadoop.hdds.conf.MutableConfigurationSource; +import org.apache.hadoop.ozone.OzoneConfigKeys; /** * Configuration source to wrap Hadoop Configuration object. @@ -32,9 +38,55 @@ public class LegacyHadoopConfigurationSource private Configuration configuration; - public LegacyHadoopConfigurationSource( - Configuration configuration) { - this.configuration = configuration; + public LegacyHadoopConfigurationSource(Configuration configuration) { + this.configuration = new Configuration(configuration) { + private Properties delegatingProps; + + @Override + public synchronized void reloadConfiguration() { + super.reloadConfiguration(); + delegatingProps = null; + } + + @Override + protected synchronized Properties getProps() { + if (delegatingProps == null) { + String complianceMode = getPropertyUnsafe(OzoneConfigKeys.OZONE_SECURITY_CRYPTO_COMPLIANCE_MODE, + OzoneConfigKeys.OZONE_SECURITY_CRYPTO_COMPLIANCE_MODE_UNRESTRICTED); + Properties cryptoProperties = getCryptoProperties(); + delegatingProps = new DelegatingProperties(super.getProps(), complianceMode, cryptoProperties); + } + return delegatingProps; + } + + /** + * Get a property value without the compliance check. It's needed to get the compliance mode. + * + * @param key property name + * @param defaultValue default value + * @return property value, without compliance check + */ + private String getPropertyUnsafe(String key, String defaultValue) { + return super.getProps().getProperty(key, defaultValue); + } + + private Properties getCryptoProperties() { + try { + return super.getAllPropertiesByTag(ConfigTag.CRYPTO_COMPLIANCE.toString()); + } catch (NoSuchMethodError e) { + // We need to handle NoSuchMethodError, because in Hadoop 2 we don't have the + // getAllPropertiesByTag method. We won't be supporting the compliance mode with + // that version, so we are safe to catch the exception and return a new Properties object. + return new Properties(); + } + } + + @Override + public Iterator> iterator() { + DelegatingProperties props = (DelegatingProperties) getProps(); + return props.iterator(); + } + }; } @Override diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java index 79ba9bbacf7b..273065b2cfac 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java @@ -342,6 +342,7 @@ private OzoneConsts() { public static final String BUCKET_LAYOUT = "bucketLayout"; public static final String TENANT = "tenant"; public static final String USER_PREFIX = "userPrefix"; + public static final String REWRITE_GENERATION = "rewriteGeneration"; // For multi-tenancy public static final String TENANT_ID_USERNAME_DELIMITER = "$"; diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java index c55945d53742..c53aca2f152c 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneManagerVersion.java @@ -42,6 +42,8 @@ public enum OzoneManagerVersion implements ComponentVersion { OBJECT_TAG(5, "OzoneManager version that supports object tags"), + ATOMIC_REWRITE_KEY(6, "OzoneManager version that supports rewriting key as atomic operation"), + FUTURE_VERSION(-1, "Used internally in the client when the server side is " + " newer and an unknown server version has arrived to the client."); diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChunkBufferImplWithByteBufferList.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChunkBufferImplWithByteBufferList.java index 7c3a0c7d2d56..a3b5f9d2eef8 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChunkBufferImplWithByteBufferList.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/common/ChunkBufferImplWithByteBufferList.java @@ -61,6 +61,7 @@ public class ChunkBufferImplWithByteBufferList implements ChunkBuffer { private void findCurrent() { boolean found = false; + limitPrecedingCurrent = 0; for (int i = 0; i < buffers.size(); i++) { final ByteBuffer buf = buffers.get(i); final int pos = buf.position(); @@ -185,6 +186,8 @@ public ChunkBuffer duplicate(int newPosition, int newLimit) { */ @Override public Iterable iterate(int bufferSize) { + Preconditions.checkArgument(bufferSize > 0); + return () -> new Iterator() { @Override public boolean hasNext() { @@ -198,10 +201,40 @@ public ByteBuffer next() { } findCurrent(); ByteBuffer current = buffers.get(currentIndex); - final ByteBuffer duplicated = current.duplicate(); - duplicated.limit(current.limit()); - current.position(current.limit()); - return duplicated; + + // If current buffer has enough space or it's the last one, return it. + if (current.remaining() >= bufferSize || currentIndex == buffers.size() - 1) { + final ByteBuffer duplicated = current.duplicate(); + int duplicatedLimit = Math.min(current.position() + bufferSize, current.limit()); + duplicated.limit(duplicatedLimit); + duplicated.position(current.position()); + + current.position(duplicatedLimit); + return duplicated; + } + + // Otherwise, create a new buffer. + int newBufferSize = Math.min(bufferSize, remaining()); + ByteBuffer allocated = ByteBuffer.allocate(newBufferSize); + int remainingToFill = allocated.remaining(); + + while (remainingToFill > 0) { + final ByteBuffer b = current(); + int bytes = Math.min(b.remaining(), remainingToFill); + b.limit(b.position() + bytes); + allocated.put(b); + remainingToFill -= bytes; + advanceCurrent(); + } + + allocated.flip(); + + // Up-to-date current. + current = buffers.get(currentIndex); + // Reset + current.limit(current.capacity()); + + return allocated; } }; } diff --git a/hadoop-hdds/common/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/hadoop-hdds/common/src/main/resources/META-INF/services/javax.annotation.processing.Processor deleted file mode 100644 index 8d65dbc0764c..000000000000 --- a/hadoop-hdds/common/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ /dev/null @@ -1,18 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -org.apache.hadoop.hdds.conf.ConfigFileGenerator -org.apache.ozone.annotations.RequestFeatureValidatorProcessor -org.apache.ozone.annotations.ReplicateAnnotationProcessor diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml index fe6ef0d5e679..f34886400fd7 100644 --- a/hadoop-hdds/common/src/main/resources/ozone-default.xml +++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml @@ -4216,6 +4216,20 @@ + + ozone.om.db.max.open.files + -1 + OZONE, OM + + Max number of open files that OM RocksDB will open simultaneously + Essentially sets `max_open_files` config for the active OM RocksDB instance. + This will limit the total number of files opened by OM db. + Default is -1 which is unlimited and gives max performance. + If you are certain that your ulimit will always be bigger than number of files in the database, + set max_open_files to -1, or else set it to a value lesser than or equal to ulimit. + + + ozone.om.snapshot.db.max.open.files 100 diff --git a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/conf/TestOzoneConfiguration.java b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/conf/TestOzoneConfiguration.java index 26da27921eaf..be733be798ea 100644 --- a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/conf/TestOzoneConfiguration.java +++ b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/conf/TestOzoneConfiguration.java @@ -31,6 +31,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hdds.utils.LegacyHadoopConfigurationSource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -151,6 +152,67 @@ public void getConfigurationObject() { assertEquals(Duration.ofSeconds(3), configuration.getDuration()); } + @Test + public void testRestrictedComplianceModeWithOzoneConf() { + Configuration config = new Configuration(); + config.set("ozone.security.crypto.compliance.mode", "restricted"); + OzoneConfiguration ozoneConfig = new OzoneConfiguration(config); + + // Set it to an allowed config value + ozoneConfig.set("hdds.x509.signature.algorithm", "SHA512withDCA"); + ozoneConfig.set("hdds.x509.signature.algorithm.restricted.whitelist", "SHA512withRSA,SHA512withDCA"); + + assertEquals("restricted", ozoneConfig.get("ozone.security.crypto.compliance.mode")); + assertEquals("SHA512withRSA,SHA512withDCA", ozoneConfig.get("hdds.x509.signature.algorithm.restricted.whitelist")); + assertEquals("SHA512withDCA", ozoneConfig.get("hdds.x509.signature.algorithm")); + + // Set it to a disallowed config value + ozoneConfig.set("hdds.x509.signature.algorithm", "SHA256withRSA"); + + assertThrows(ConfigurationException.class, () -> ozoneConfig.get("hdds.x509.signature.algorithm")); + + // Check it with a Hadoop Configuration + Configuration hadoopConfig = + LegacyHadoopConfigurationSource.asHadoopConfiguration(ozoneConfig); + assertThrows(ConfigurationException.class, () -> hadoopConfig.get("hdds.x509.signature.algorithm")); + } + + @Test + public void testRestrictedComplianceModeWithLegacyHadoopConf() { + Configuration config = new Configuration(); + config.addResource("ozone-default.xml"); + config.set("ozone.security.crypto.compliance.mode", "restricted"); + LegacyHadoopConfigurationSource legacyHadoopConf = new LegacyHadoopConfigurationSource(config); + + // Set it to an allowed config value + legacyHadoopConf.set("hdds.x509.signature.algorithm", "SHA512withDCA"); + legacyHadoopConf.set("hdds.x509.signature.algorithm.restricted.whitelist", "SHA512withRSA,SHA512withDCA"); + + assertEquals("restricted", legacyHadoopConf.get("ozone.security.crypto.compliance.mode")); + assertEquals("SHA512withRSA,SHA512withDCA", + legacyHadoopConf.get("hdds.x509.signature.algorithm.restricted.whitelist")); + assertEquals("SHA512withDCA", legacyHadoopConf.get("hdds.x509.signature.algorithm")); + + // Set it to a disallowed config value + legacyHadoopConf.set("hdds.x509.signature.algorithm", "SHA256withRSA"); + + assertThrows(ConfigurationException.class, () -> legacyHadoopConf.get("hdds.x509.signature.algorithm")); + + // Check it with a Hadoop Configuration + Configuration legacyConf = LegacyHadoopConfigurationSource.asHadoopConfiguration(legacyHadoopConf); + assertThrows(ConfigurationException.class, () -> legacyConf.get("hdds.x509.signature.algorithm")); + } + + @Test + public void testUnrestrictedComplianceMode() { + OzoneConfiguration ozoneConfig = new OzoneConfiguration(); + ozoneConfig.set("hdds.x509.signature.algorithm", "SHA256"); + ozoneConfig.set("hdds.x509.signature.algorithm.unrestricted.whitelist", "SHA512withRSA"); + + assertEquals(ozoneConfig.get("hdds.x509.signature.algorithm"), "SHA256"); + assertEquals(ozoneConfig.get("ozone.security.crypto.compliance.mode"), "unrestricted"); + } + @Test public void getConfigurationObjectWithDefault() { OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); diff --git a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java index 8523861000e7..b84ca130f27c 100644 --- a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java +++ b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java @@ -36,19 +36,20 @@ import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * Tests for {@link CachingSpaceUsageSource}. */ -public class TestCachingSpaceUsageSource { +class TestCachingSpaceUsageSource { @TempDir private static File dir; @Test - public void providesInitialValueUntilStarted() { + void providesInitialValueUntilStarted() { final long initialValue = validInitialValue(); SpaceUsageCheckParams params = paramsBuilder(new AtomicLong(initialValue)) .withRefresh(Duration.ZERO) @@ -57,10 +58,11 @@ public void providesInitialValueUntilStarted() { SpaceUsageSource subject = new CachingSpaceUsageSource(params); assertEquals(initialValue, subject.getUsedSpace()); + assertAvailableWasUpdated(params.getSource(), subject); } @Test - public void ignoresMissingInitialValue() { + void ignoresMissingInitialValue() { SpaceUsageCheckParams params = paramsBuilder() .withRefresh(Duration.ZERO) .build(); @@ -68,10 +70,11 @@ public void ignoresMissingInitialValue() { SpaceUsageSource subject = new CachingSpaceUsageSource(params); assertEquals(0, subject.getUsedSpace()); + assertAvailableWasUpdated(params.getSource(), subject); } @Test - public void updatesValueFromSourceUponStartIfPeriodicRefreshNotConfigured() { + void updatesValueFromSourceUponStartIfPeriodicRefreshNotConfigured() { AtomicLong savedValue = new AtomicLong(validInitialValue()); SpaceUsageCheckParams params = paramsBuilder(savedValue) .withRefresh(Duration.ZERO).build(); @@ -79,11 +82,11 @@ public void updatesValueFromSourceUponStartIfPeriodicRefreshNotConfigured() { CachingSpaceUsageSource subject = new CachingSpaceUsageSource(params); subject.start(); - assertSubjectWasRefreshed(params.getSource().getUsedSpace(), subject); + assertSubjectWasRefreshed(params.getSource(), subject); } @Test - public void schedulesRefreshWithDelayIfConfigured() { + void schedulesRefreshWithDelayIfConfigured() { long initialValue = validInitialValue(); AtomicLong savedValue = new AtomicLong(initialValue); SpaceUsageCheckParams params = paramsBuilder(savedValue) @@ -96,13 +99,13 @@ public void schedulesRefreshWithDelayIfConfigured() { subject.start(); verifyRefreshWasScheduled(executor, refresh.toMillis(), refresh); - assertSubjectWasRefreshed(params.getSource().getUsedSpace(), subject); + assertSubjectWasRefreshed(params.getSource(), subject); assertEquals(initialValue, savedValue.get(), "value should not have been saved to file yet"); } @Test - public void schedulesImmediateRefreshIfInitialValueMissing() { + void schedulesImmediateRefreshIfInitialValueMissing() { final long initialValue = missingInitialValue(); AtomicLong savedValue = new AtomicLong(initialValue); SpaceUsageCheckParams params = paramsBuilder(savedValue).build(); @@ -113,13 +116,13 @@ public void schedulesImmediateRefreshIfInitialValueMissing() { subject.start(); verifyRefreshWasScheduled(executor, 0L, params.getRefresh()); - assertSubjectWasRefreshed(params.getSource().getUsedSpace(), subject); + assertSubjectWasRefreshed(params.getSource(), subject); assertEquals(initialValue, savedValue.get(), "value should not have been saved to file yet"); } @Test - public void savesValueOnShutdown() { + void savesValueOnShutdown() { AtomicLong savedValue = new AtomicLong(validInitialValue()); SpaceUsageSource source = mock(SpaceUsageSource.class); final long usedSpace = 4L; @@ -138,22 +141,44 @@ public void savesValueOnShutdown() { "value should have been saved to file"); assertEquals(usedSpace, subject.getUsedSpace(), "no further updates from source expected"); - verify(future).cancel(true); + verify(future, times(2)).cancel(true); verify(executor).shutdown(); } @Test - public void testDecrementDoesNotGoNegative() { + void decrementUsedSpaceMoreThanCurrent() { SpaceUsageCheckParams params = paramsBuilder(new AtomicLong(50)) .withRefresh(Duration.ZERO) .build(); CachingSpaceUsageSource subject = new CachingSpaceUsageSource(params); + SpaceUsageSource original = subject.snapshot(); // Try to decrement more than the current value - subject.decrementUsedSpace(100); + final long change = original.getUsedSpace() * 2; + subject.decrementUsedSpace(change); - // Check that the value has been set to 0 + // should not drop below 0 assertEquals(0, subject.getUsedSpace()); + // available and used change by same amount (in opposite directions) + assertEquals(original.getAvailable() + original.getUsedSpace(), subject.getAvailable()); + } + + @Test + void decrementAvailableSpaceMoreThanCurrent() { + SpaceUsageCheckParams params = paramsBuilder(new AtomicLong(50)) + .withRefresh(Duration.ZERO) + .build(); + CachingSpaceUsageSource subject = new CachingSpaceUsageSource(params); + SpaceUsageSource original = subject.snapshot(); + + // Try to decrement more than the current value + final long change = original.getAvailable() * 2; + subject.incrementUsedSpace(change); + + // should not drop below 0 + assertEquals(0, subject.getAvailable()); + // available and used change by same amount (in opposite directions) + assertEquals(original.getUsedSpace() + original.getAvailable(), subject.getUsedSpace()); } private static long missingInitialValue() { @@ -197,14 +222,29 @@ private static void verifyRefreshWasScheduled( ScheduledExecutorService executor, long expectedInitialDelay, Duration refresh) { + // refresh usedSpace verify(executor).scheduleWithFixedDelay(any(), eq(expectedInitialDelay), eq(refresh.toMillis()), eq(TimeUnit.MILLISECONDS)); + + // update available/capacity + final long oneMinute = Duration.ofMinutes(1).toMillis(); + final long delay = Math.min(refresh.toMillis(), oneMinute); + verify(executor).scheduleWithFixedDelay(any(), eq(delay), + eq(delay), eq(TimeUnit.MILLISECONDS)); + } + + private static void assertAvailableWasUpdated(SpaceUsageSource source, + SpaceUsageSource subject) { + + assertEquals(source.getCapacity(), subject.getCapacity()); + assertEquals(source.getAvailable(), subject.getAvailable()); } - private static void assertSubjectWasRefreshed(long expected, + private static void assertSubjectWasRefreshed(SpaceUsageSource source, SpaceUsageSource subject) { - assertEquals(expected, subject.getUsedSpace(), + assertAvailableWasUpdated(source, subject); + assertEquals(source.getUsedSpace(), subject.getUsedSpace(), "subject should have been refreshed"); } diff --git a/hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/common/TestChunkBufferImplWithByteBufferList.java b/hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/common/TestChunkBufferImplWithByteBufferList.java index 072c07be64f1..b06b4b563324 100644 --- a/hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/common/TestChunkBufferImplWithByteBufferList.java +++ b/hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/common/TestChunkBufferImplWithByteBufferList.java @@ -67,6 +67,76 @@ public void rejectsMultipleCurrentBuffers() { assertThrows(IllegalArgumentException.class, () -> ChunkBuffer.wrap(list)); } + @Test + public void testIterateSmallerOverSingleChunk() { + ChunkBuffer subject = ChunkBuffer.wrap(ImmutableList.of(ByteBuffer.allocate(100))); + + assertEquals(0, subject.position()); + assertEquals(100, subject.remaining()); + assertEquals(100, subject.limit()); + + subject.iterate(25).forEach(buffer -> assertEquals(25, buffer.remaining())); + + assertEquals(100, subject.position()); + assertEquals(0, subject.remaining()); + assertEquals(100, subject.limit()); + } + + @Test + public void testIterateOverMultipleChunksFitChunkSize() { + ByteBuffer b1 = ByteBuffer.allocate(100); + ByteBuffer b2 = ByteBuffer.allocate(100); + ByteBuffer b3 = ByteBuffer.allocate(100); + ChunkBuffer subject = ChunkBuffer.wrap(ImmutableList.of(b1, b2, b3)); + + assertEquals(0, subject.position()); + assertEquals(300, subject.remaining()); + assertEquals(300, subject.limit()); + + subject.iterate(100).forEach(buffer -> assertEquals(100, buffer.remaining())); + + assertEquals(300, subject.position()); + assertEquals(0, subject.remaining()); + assertEquals(300, subject.limit()); + } + + @Test + public void testIterateOverMultipleChunksSmallerChunks() { + ByteBuffer b1 = ByteBuffer.allocate(100); + ByteBuffer b2 = ByteBuffer.allocate(100); + ByteBuffer b3 = ByteBuffer.allocate(100); + ChunkBuffer subject = ChunkBuffer.wrap(ImmutableList.of(b1, b2, b3)); + + assertEquals(0, subject.position()); + assertEquals(300, subject.remaining()); + assertEquals(300, subject.limit()); + + subject.iterate(50).forEach(buffer -> assertEquals(50, buffer.remaining())); + + assertEquals(300, subject.position()); + assertEquals(0, subject.remaining()); + assertEquals(300, subject.limit()); + } + + @Test + public void testIterateOverMultipleChunksBiggerChunks() { + ByteBuffer b1 = ByteBuffer.allocate(100); + ByteBuffer b2 = ByteBuffer.allocate(100); + ByteBuffer b3 = ByteBuffer.allocate(100); + ByteBuffer b4 = ByteBuffer.allocate(100); + ChunkBuffer subject = ChunkBuffer.wrap(ImmutableList.of(b1, b2, b3, b4)); + + assertEquals(0, subject.position()); + assertEquals(400, subject.remaining()); + assertEquals(400, subject.limit()); + + subject.iterate(200).forEach(buffer -> assertEquals(200, buffer.remaining())); + + assertEquals(400, subject.position()); + assertEquals(0, subject.remaining()); + assertEquals(400, subject.limit()); + } + private static void assertEmpty(ChunkBuffer subject) { assertEquals(0, subject.position()); assertEquals(0, subject.remaining()); diff --git a/hadoop-hdds/config/pom.xml b/hadoop-hdds/config/pom.xml index fb72f93570b9..1c71bf3d90a4 100644 --- a/hadoop-hdds/config/pom.xml +++ b/hadoop-hdds/config/pom.xml @@ -50,4 +50,41 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + + compile + + + none + + + + default-testCompile + + testCompile + + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + + + diff --git a/hadoop-hdds/container-service/pom.xml b/hadoop-hdds/container-service/pom.xml index 13973c871e6c..7a341bd66a8f 100644 --- a/hadoop-hdds/container-service/pom.xml +++ b/hadoop-hdds/container-service/pom.xml @@ -123,6 +123,43 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + org.apache.maven.plugins maven-dependency-plugin diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java index e494243ccc1c..b47116950c53 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java @@ -216,7 +216,6 @@ private ContainerCommandResponseProto dispatchRequest( long startTime = Time.monotonicNow(); Type cmdType = msg.getCmdType(); long containerID = msg.getContainerID(); - metrics.incContainerOpsMetrics(cmdType); Container container = getContainer(containerID); boolean isWriteStage = (cmdType == Type.WriteChunk && dispatcherContext != null @@ -228,6 +227,16 @@ private ContainerCommandResponseProto dispatchRequest( && dispatcherContext.getStage() == DispatcherContext.WriteChunkStage.COMMIT_DATA); + if (dispatcherContext == null) { + // increase all op not through ratis + metrics.incContainerOpsMetrics(cmdType); + } else if (isWriteStage) { + // increase WriteChunk in only WRITE_STAGE + metrics.incContainerOpsMetrics(cmdType); + } else if (cmdType != Type.WriteChunk) { + metrics.incContainerOpsMetrics(cmdType); + } + try { if (DispatcherContext.op(dispatcherContext).validateToken()) { validateToken(msg); diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java index 6046af1e0a79..7b3202b4a458 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java @@ -102,7 +102,6 @@ public class DatanodeStateMachine implements Closeable { private final DatanodeDetails datanodeDetails; private final CommandDispatcher commandDispatcher; private final ReportManager reportManager; - private long commandsHandled; private final AtomicLong nextHB; private volatile Thread stateMachineThread = null; private Thread cmdProcessThread = null; @@ -279,10 +278,10 @@ public DatanodeStateMachine(DatanodeDetails datanodeDetails, } private int getEndPointTaskThreadPoolSize() { - // TODO(runzhiwang): current only support one recon, if support multiple - // recon in future reconServerCount should be the real number of recon - int reconServerCount = 1; - int totalServerCount = reconServerCount; + // TODO(runzhiwang): The default totalServerCount here is set to 1, + // which requires additional processing if want to increase + // the number of recons. + int totalServerCount = 1; try { totalServerCount += HddsUtils.getSCMAddressForDatanodes(conf).size(); @@ -329,13 +328,11 @@ public OzoneContainer getContainer() { * Runs the state machine at a fixed frequency. */ private void startStateMachineThread() throws IOException { - long now; - reportManager.init(); initCommandHandlerThread(conf); upgradeFinalizer.runPrefinalizeStateActions(layoutStorage, this); - + LOG.info("Ozone container server started."); while (context.getState() != DatanodeStates.SHUTDOWN) { try { LOG.debug("Executing cycle Number : {}", context.getExecutionCount()); @@ -352,7 +349,7 @@ private void startStateMachineThread() throws IOException { LOG.error("Unable to finish the execution.", e); } - now = Time.monotonicNow(); + long now = Time.monotonicNow(); if (now < nextHB.get()) { if (!Thread.interrupted()) { try { @@ -542,7 +539,6 @@ public boolean isTransitionAllowedTo(DatanodeStates newState) { public void startDaemon() { Runnable startStateMachineTask = () -> { try { - LOG.info("Ozone container server started."); startStateMachineThread(); } catch (Exception ex) { LOG.error("Unable to start the DatanodeState Machine", ex); @@ -660,16 +656,14 @@ private void initCommandHandlerThread(ConfigurationSource config) { * we have single command queue process thread. */ Runnable processCommandQueue = () -> { - long now; while (getContext().getState() != DatanodeStates.SHUTDOWN) { SCMCommand command = getContext().getNextCommand(); if (command != null) { commandDispatcher.handle(command); - commandsHandled++; } else { try { // Sleep till the next HB + 1 second. - now = Time.monotonicNow(); + long now = Time.monotonicNow(); if (nextHB.get() > now) { Thread.sleep((nextHB.get() - now) + 1000L); } @@ -701,15 +695,6 @@ private Thread getCommandHandlerThread(Runnable processCommandQueue) { return handlerThread; } - /** - * Returns the number of commands handled by the datanode. - * @return count - */ - @VisibleForTesting - public long getCommandHandled() { - return commandsHandled; - } - /** * returns the Command Dispatcher. * @return CommandDispatcher diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/StateContext.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/StateContext.java index 712b3f0f2326..93a45905975a 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/StateContext.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/StateContext.java @@ -152,6 +152,8 @@ public class StateContext { private final String threadNamePrefix; + private RunningDatanodeState runningDatanodeState; + /** * Constructs a StateContext. * @@ -612,9 +614,11 @@ public DatanodeState getTask() { parentDatanodeStateMachine.getConnectionManager(), this); case RUNNING: - return new RunningDatanodeState(this.conf, - parentDatanodeStateMachine.getConnectionManager(), - this); + if (runningDatanodeState == null) { + runningDatanodeState = new RunningDatanodeState(this.conf, + parentDatanodeStateMachine.getConnectionManager(), this); + } + return runningDatanodeState; case SHUTDOWN: return null; default: @@ -654,7 +658,11 @@ public void execute(ExecutorService service, long time, TimeUnit unit) // Adding not null check, in a case where datanode is still starting up, but // we called stop DatanodeStateMachine, this sets state to SHUTDOWN, and // there is a chance of getting task as null. - if (task != null) { + if (task == null) { + return; + } + + try { if (this.isEntering()) { task.onEnter(); } @@ -691,6 +699,8 @@ public void execute(ExecutorService service, long time, TimeUnit unit) // that we can terminate the datanode. setShutdownOnError(); } + } finally { + task.clear(); } } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/DatanodeState.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/DatanodeState.java index 25be207dcd9c..f057a852bc4e 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/DatanodeState.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/DatanodeState.java @@ -55,4 +55,10 @@ public interface DatanodeState { T await(long time, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException; + /** + * Clean up some resources. + */ + @SuppressWarnings("checkstyle:WhitespaceAround") + default void clear(){} + } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/datanode/RunningDatanodeState.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/datanode/RunningDatanodeState.java index 4e5b64c27e5e..c4d507668d4c 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/datanode/RunningDatanodeState.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/datanode/RunningDatanodeState.java @@ -31,11 +31,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.EnumMap; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; @@ -54,9 +51,6 @@ public class RunningDatanodeState implements DatanodeState { private final ConfigurationSource conf; private final StateContext context; private CompletionService ecs; - /** Cache the end point task per end point per end point state. */ - private Map>> endpointTasks; public RunningDatanodeState(ConfigurationSource conf, SCMConnectionManager connectionManager, @@ -64,55 +58,6 @@ public RunningDatanodeState(ConfigurationSource conf, this.connectionManager = connectionManager; this.conf = conf; this.context = context; - initEndPointTask(); - } - - /** - * Initialize end point tasks corresponding to each end point, - * each end point state. - */ - private void initEndPointTask() { - endpointTasks = new HashMap<>(); - for (EndpointStateMachine endpoint : connectionManager.getValues()) { - EnumMap> endpointTaskForState = - new EnumMap<>(EndPointStates.class); - - for (EndPointStates state : EndPointStates.values()) { - Callable endPointTask = null; - switch (state) { - case GETVERSION: - endPointTask = new VersionEndpointTask(endpoint, conf, - context.getParent().getContainer()); - break; - case REGISTER: - endPointTask = RegisterEndpointTask.newBuilder() - .setConfig(conf) - .setEndpointStateMachine(endpoint) - .setContext(context) - .setDatanodeDetails(context.getParent().getDatanodeDetails()) - .setOzoneContainer(context.getParent().getContainer()) - .build(); - break; - case HEARTBEAT: - endPointTask = HeartbeatEndpointTask.newBuilder() - .setConfig(conf) - .setEndpointStateMachine(endpoint) - .setDatanodeDetails(context - .getParent() - .getDatanodeDetails()) - .setContext(context) - .build(); - break; - default: - break; - } - - if (endPointTask != null) { - endpointTaskForState.put(state, endPointTask); - } - } - endpointTasks.put(endpoint, endpointTaskForState); - } } /** @@ -140,7 +85,7 @@ public void onExit() { public void execute(ExecutorService executor) { ecs = new ExecutorCompletionService<>(executor); for (EndpointStateMachine endpoint : connectionManager.getValues()) { - Callable endpointTask = getEndPointTask(endpoint); + Callable endpointTask = buildEndPointTask(endpoint); if (endpointTask != null) { // Just do a timely wait. A slow EndpointStateMachine won't occupy // the thread in executor from DatanodeStateMachine for a long time, @@ -171,12 +116,30 @@ public void setExecutorCompletionService(ExecutorCompletionService e) { this.ecs = e; } - private Callable getEndPointTask( + @SuppressWarnings("checkstyle:Indentation") + private Callable buildEndPointTask( EndpointStateMachine endpoint) { - if (endpointTasks.containsKey(endpoint)) { - return endpointTasks.get(endpoint).get(endpoint.getState()); - } else { - throw new IllegalArgumentException("Illegal endpoint: " + endpoint); + switch (endpoint.getState()) { + case GETVERSION: + return new VersionEndpointTask(endpoint, conf, + context.getParent().getContainer()); + case REGISTER: + return RegisterEndpointTask.newBuilder() + .setConfig(conf) + .setEndpointStateMachine(endpoint) + .setContext(context) + .setDatanodeDetails(context.getParent().getDatanodeDetails()) + .setOzoneContainer(context.getParent().getContainer()) + .build(); + case HEARTBEAT: + return HeartbeatEndpointTask.newBuilder() + .setConfig(conf) + .setEndpointStateMachine(endpoint) + .setDatanodeDetails(context.getParent().getDatanodeDetails()) + .setContext(context) + .build(); + default: + return null; } } @@ -238,4 +201,9 @@ private Callable getEndPointTask( } return computeNextContainerState(results); } + + @Override + public void clear() { + ecs = null; + } } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServerGrpc.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServerGrpc.java index 346b05ebb4c1..ad9c5c9d9ca0 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServerGrpc.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/XceiverServerGrpc.java @@ -155,7 +155,7 @@ public XceiverServerGrpc(DatanodeDetails datanodeDetails, if (secConf.isSecurityEnabled() && secConf.isGrpcTlsEnabled()) { try { SslContextBuilder sslClientContextBuilder = SslContextBuilder.forServer( - caClient.getServerKeyStoresFactory().getKeyManagers()[0]); + caClient.getKeyManager()); SslContextBuilder sslContextBuilder = GrpcSslContexts.configure( sslClientContextBuilder, secConf.getGrpcSslProvider()); nettyServerBuilder.sslContext(sslContextBuilder.build()); diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java index 6bd15946184e..3634ae34ac8d 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java @@ -39,6 +39,7 @@ public class CSMMetrics { public static final String SOURCE_NAME = CSMMetrics.class.getSimpleName(); + private RaftGroupId gid; // ratis op metrics metrics private @Metric MutableCounterLong numWriteStateMachineOps; @@ -50,6 +51,7 @@ public class CSMMetrics { private @Metric MutableRate transactionLatencyMs; private final EnumMap opsLatencyMs; + private final EnumMap opsQueueingDelay; private MetricsRegistry registry = null; // Failure Metrics @@ -64,15 +66,22 @@ public class CSMMetrics { private @Metric MutableCounterLong numDataCacheMiss; private @Metric MutableCounterLong numDataCacheHit; private @Metric MutableCounterLong numEvictedCacheCount; + private @Metric MutableCounterLong pendingApplyTransactions; private @Metric MutableRate applyTransactionNs; private @Metric MutableRate writeStateMachineDataNs; + private @Metric MutableRate writeStateMachineQueueingLatencyNs; + private @Metric MutableRate untilApplyTransactionNs; + private @Metric MutableRate startTransactionCompleteNs; - public CSMMetrics() { + public CSMMetrics(RaftGroupId gid) { + this.gid = gid; this.opsLatencyMs = new EnumMap<>(ContainerProtos.Type.class); + this.opsQueueingDelay = new EnumMap<>(ContainerProtos.Type.class); this.registry = new MetricsRegistry(CSMMetrics.class.getSimpleName()); for (ContainerProtos.Type type : ContainerProtos.Type.values()) { opsLatencyMs.put(type, registry.newRate(type.toString() + "Ms", type + " op")); + opsQueueingDelay.put(type, registry.newRate("queueingDelay" + type.toString() + "Ns", type + " op")); } } @@ -80,7 +89,12 @@ public static CSMMetrics create(RaftGroupId gid) { MetricsSystem ms = DefaultMetricsSystem.instance(); return ms.register(SOURCE_NAME + gid.toString(), "Container State Machine", - new CSMMetrics()); + new CSMMetrics(gid)); + } + + @Metric + public String getRaftGroupId() { + return gid.toString(); } public void incNumWriteStateMachineOps() { @@ -189,6 +203,11 @@ public void incPipelineLatencyMs(ContainerProtos.Type type, transactionLatencyMs.add(latencyMillis); } + public void recordQueueingDelay(ContainerProtos.Type type, + long latencyNanos) { + opsQueueingDelay.get(type).add(latencyNanos); + } + public void incNumStartTransactionVerifyFailures() { numStartTransactionVerifyFailures.incr(); } @@ -205,6 +224,19 @@ public void recordWriteStateMachineCompletionNs(long latencyNanos) { writeStateMachineDataNs.add(latencyNanos); } + + public void recordWriteStateMachineQueueingLatencyNs(long latencyNanos) { + writeStateMachineQueueingLatencyNs.add(latencyNanos); + } + + public void recordUntilApplyTransactionNs(long latencyNanos) { + untilApplyTransactionNs.add(latencyNanos); + } + + public void recordStartTransactionCompleteNs(long latencyNanos) { + startTransactionCompleteNs.add(latencyNanos); + } + public void incNumDataCacheMiss() { numDataCacheMiss.incr(); } @@ -216,8 +248,16 @@ public void incNumEvictedCacheCount() { numEvictedCacheCount.incr(); } + public void incPendingApplyTransactions() { + pendingApplyTransactions.incr(); + } + + public void decPendingApplyTransactions() { + pendingApplyTransactions.incr(-1); + } + public void unRegister() { MetricsSystem ms = DefaultMetricsSystem.instance(); - ms.unregisterSource(SOURCE_NAME); + ms.unregisterSource(SOURCE_NAME + gid.toString()); } } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java index 6351c746fe5c..f583eadd7ea9 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java @@ -402,6 +402,7 @@ public TransactionContext startTransaction(LogEntryProto entry, RaftPeerRole rol @Override public TransactionContext startTransaction(RaftClientRequest request) throws IOException { + long startTime = Time.monotonicNowNanos(); final ContainerCommandRequestProto proto = message2ContainerCommandRequestProto(request.getMessage()); Preconditions.checkArgument(request.getRaftGroupId().equals(gid)); @@ -411,6 +412,8 @@ public TransactionContext startTransaction(RaftClientRequest request) .setStateMachine(this) .setServerRole(RaftPeerRole.LEADER); + metrics.incPendingApplyTransactions(); + try { dispatcher.validateContainerCommand(proto); } catch (IOException ioe) { @@ -440,9 +443,11 @@ public TransactionContext startTransaction(RaftClientRequest request) builder.setStateMachineData(write.getData()); } final ContainerCommandRequestProto containerCommandRequestProto = protoBuilder.build(); - return builder.setStateMachineContext(new Context(proto, containerCommandRequestProto)) + TransactionContext txnContext = builder.setStateMachineContext(new Context(proto, containerCommandRequestProto)) .setLogData(containerCommandRequestProto.toByteString()) .build(); + metrics.recordStartTransactionCompleteNs(Time.monotonicNowNanos() - startTime); + return txnContext; } private static ContainerCommandRequestProto getContainerCommandRequestProto( @@ -521,6 +526,8 @@ private CompletableFuture writeStateMachineData( CompletableFuture writeChunkFuture = CompletableFuture.supplyAsync(() -> { try { + metrics.recordWriteStateMachineQueueingLatencyNs( + Time.monotonicNowNanos() - startTime); return dispatchCommand(requestProto, context); } catch (Exception e) { LOG.error("{}: writeChunk writeStateMachineData failed: blockId" + @@ -884,6 +891,11 @@ private CompletableFuture applyTransaction( final CheckedSupplier task = () -> { try { + long timeNow = Time.monotonicNowNanos(); + long queueingDelay = timeNow - context.getStartTime(); + metrics.recordQueueingDelay(request.getCmdType(), queueingDelay); + // TODO: add a counter to track number of executing applyTransaction + // and queue size return dispatchCommand(request, context); } catch (Exception e) { exceptionHandler.accept(e); @@ -932,11 +944,13 @@ public CompletableFuture applyTransaction(TransactionContext trx) { .setTerm(trx.getLogEntry().getTerm()) .setLogIndex(index); + final Context context = (Context) trx.getStateMachineContext(); long applyTxnStartTime = Time.monotonicNowNanos(); + metrics.recordUntilApplyTransactionNs(applyTxnStartTime - context.getStartTime()); applyTransactionSemaphore.acquire(); metrics.incNumApplyTransactionsOps(); - final Context context = (Context) trx.getStateMachineContext(); + Objects.requireNonNull(context, "context == null"); final ContainerCommandRequestProto requestProto = context.getLogProto(); final Type cmdType = requestProto.getCmdType(); @@ -1021,6 +1035,9 @@ public CompletableFuture applyTransaction(TransactionContext trx) { applyTransactionSemaphore.release(); metrics.recordApplyTransactionCompletionNs( Time.monotonicNowNanos() - applyTxnStartTime); + if (trx.getServerRole() == RaftPeerRole.LEADER) { + metrics.decPendingApplyTransactions(); + } }); return applyTransactionFuture; } catch (InterruptedException e) { diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/DispatcherContext.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/DispatcherContext.java index d6c976cb389e..15af26453524 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/DispatcherContext.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/DispatcherContext.java @@ -19,6 +19,7 @@ import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.hdds.annotation.InterfaceStability; +import org.apache.hadoop.util.Time; import org.apache.ratis.server.protocol.TermIndex; import java.util.Map; @@ -118,12 +119,15 @@ public static Op op(DispatcherContext context) { private final Map container2BCSIDMap; + private long startTime; + private DispatcherContext(Builder b) { this.op = Objects.requireNonNull(b.op, "op == null"); this.term = b.term; this.logIndex = b.logIndex; this.stage = b.stage; this.container2BCSIDMap = b.container2BCSIDMap; + this.startTime = Time.monotonicNowNanos(); } /** Use {@link DispatcherContext#op(DispatcherContext)} for handling null. */ @@ -147,6 +151,10 @@ public Map getContainer2BCSIDMap() { return container2BCSIDMap; } + public long getStartTime() { + return startTime; + } + @Override public String toString() { return op + "-" + stage + TermIndex.valueOf(term, logIndex); diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/XceiverServerRatis.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/XceiverServerRatis.java index e1df809c8aea..dc0c4b067603 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/XceiverServerRatis.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/XceiverServerRatis.java @@ -56,7 +56,6 @@ import org.apache.hadoop.hdds.ratis.RatisHelper; import org.apache.hadoop.hdds.scm.pipeline.PipelineID; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; import org.apache.hadoop.hdds.tracing.TracingUtil; import org.apache.hadoop.hdds.utils.HddsServerUtil; @@ -542,14 +541,12 @@ public static XceiverServerRatis newXceiverServerRatis( private static Parameters createTlsParameters(SecurityConfig conf, CertificateClient caClient) throws IOException { if (conf.isSecurityEnabled() && conf.isGrpcTlsEnabled()) { - KeyStoresFactory managerFactory = - caClient.getServerKeyStoresFactory(); GrpcTlsConfig serverConfig = new GrpcTlsConfig( - managerFactory.getKeyManagers()[0], - managerFactory.getTrustManagers()[0], true); + caClient.getKeyManager(), + caClient.getTrustManager(), true); GrpcTlsConfig clientConfig = new GrpcTlsConfig( - managerFactory.getKeyManagers()[0], - managerFactory.getTrustManagers()[0], false); + caClient.getKeyManager(), + caClient.getTrustManager(), false); return RatisHelper.setServerTlsConf(serverConfig, clientConfig); } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java index aef3965dcd49..4fa211a92c5a 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java @@ -260,8 +260,8 @@ public OzoneContainer( if (certClient != null && secConf.isGrpcTlsEnabled()) { tlsClientConfig = new GrpcTlsConfig( - certClient.getClientKeyStoresFactory().getKeyManagers()[0], - certClient.getClientKeyStoresFactory().getTrustManagers()[0], true); + certClient.getKeyManager(), + certClient.getTrustManager(), true); } else { tlsClientConfig = null; } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/GrpcReplicationClient.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/GrpcReplicationClient.java index 6c9cdc3fef10..ad4f4293b914 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/GrpcReplicationClient.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/GrpcReplicationClient.java @@ -35,7 +35,6 @@ import org.apache.hadoop.hdds.protocol.datanode.proto.IntraDatanodeProtocolServiceGrpc; import org.apache.hadoop.hdds.protocol.datanode.proto.IntraDatanodeProtocolServiceGrpc.IntraDatanodeProtocolServiceStub; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; import org.apache.hadoop.ozone.OzoneConsts; @@ -82,11 +81,10 @@ public GrpcReplicationClient( SslContextBuilder sslContextBuilder = GrpcSslContexts.forClient(); if (certClient != null) { - KeyStoresFactory factory = certClient.getClientKeyStoresFactory(); sslContextBuilder - .trustManager(factory.getTrustManagers()[0]) + .trustManager(certClient.getTrustManager()) .clientAuth(ClientAuth.REQUIRE) - .keyManager(factory.getKeyManagers()[0]); + .keyManager(certClient.getKeyManager()); } if (secConfig.useTestCert()) { channelBuilder.overrideAuthority("localhost"); diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ReplicationServer.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ReplicationServer.java index f72ca2a6881d..b4e92a4a60a2 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ReplicationServer.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/ReplicationServer.java @@ -115,15 +115,13 @@ public void init(boolean enableZeroCopy) { if (secConf.isSecurityEnabled() && secConf.isGrpcTlsEnabled()) { try { - SslContextBuilder sslContextBuilder = SslContextBuilder.forServer( - caClient.getServerKeyStoresFactory().getKeyManagers()[0]); + SslContextBuilder sslContextBuilder = SslContextBuilder.forServer(caClient.getKeyManager()); sslContextBuilder = GrpcSslContexts.configure( sslContextBuilder, secConf.getGrpcSslProvider()); sslContextBuilder.clientAuth(ClientAuth.REQUIRE); - sslContextBuilder.trustManager( - caClient.getServerKeyStoresFactory().getTrustManagers()[0]); + sslContextBuilder.trustManager(caClient.getTrustManager()); nettyServerBuilder.sslContext(sslContextBuilder.build()); } catch (IOException ex) { diff --git a/hadoop-hdds/docs/pom.xml b/hadoop-hdds/docs/pom.xml index 94f60ea4aa0c..d14ae28c10d8 100644 --- a/hadoop-hdds/docs/pom.xml +++ b/hadoop-hdds/docs/pom.xml @@ -35,6 +35,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.codehaus.mojo exec-maven-plugin diff --git a/hadoop-hdds/erasurecode/pom.xml b/hadoop-hdds/erasurecode/pom.xml index 14511a160cea..cd0afbca7f80 100644 --- a/hadoop-hdds/erasurecode/pom.xml +++ b/hadoop-hdds/erasurecode/pom.xml @@ -60,6 +60,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + none + + diff --git a/hadoop-hdds/framework/pom.xml b/hadoop-hdds/framework/pom.xml index 4a134e1c338d..5eb3d2071b70 100644 --- a/hadoop-hdds/framework/pom.xml +++ b/hadoop-hdds/framework/pom.xml @@ -104,6 +104,10 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> org.eclipse.jetty jetty-webapp + + org.glassfish.jersey.containers + jersey-container-servlet-core + ratis-server org.apache.ratis @@ -190,6 +194,48 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-annotation-processing + ${hdds.version} + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + org.apache.ozone.annotations.ReplicateAnnotationProcessor + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.kohsuke.MetaInfServices + + + + + + + org.apache.maven.plugins maven-jar-plugin diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java index 3570257b5855..c058cb4d444e 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java @@ -104,6 +104,8 @@ import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.StopContainerBalancerRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ResetDeletedBlockRetryCountRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.Type; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoRequestProto; import org.apache.hadoop.hdds.scm.DatanodeAdminError; import org.apache.hadoop.hdds.scm.ScmInfo; import org.apache.hadoop.hdds.scm.container.ContainerID; @@ -1025,6 +1027,19 @@ public boolean getContainerBalancerStatus() throws IOException { } + @Override + public ContainerBalancerStatusInfoResponseProto getContainerBalancerStatusInfo() throws IOException { + + ContainerBalancerStatusInfoRequestProto request = + ContainerBalancerStatusInfoRequestProto.getDefaultInstance(); + ContainerBalancerStatusInfoResponseProto response = + submitRequest(Type.GetContainerBalancerStatusInfo, + builder -> builder.setContainerBalancerStatusInfoRequest(request)) + .getContainerBalancerStatusInfoResponse(); + return response; + + } + /** * Builds request for datanode usage information and receives response. * diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java index 8c8c00f6e91b..2fb258e1a29e 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/DefaultCertificateClient.java @@ -27,9 +27,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.security.GeneralSecurityException; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; +import java.security.KeyStore; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; @@ -72,14 +74,14 @@ import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetCertResponseProto; import org.apache.hadoop.hdds.protocolPB.SCMSecurityProtocolClientSideTranslatorPB; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509KeyManager; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509TrustManager; import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType; import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateCodec; import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest; import org.apache.hadoop.hdds.security.x509.exception.CertificateException; import org.apache.hadoop.hdds.security.x509.keys.HDDSKeyGenerator; import org.apache.hadoop.hdds.security.x509.keys.KeyCodec; -import org.apache.hadoop.hdds.security.x509.keys.SecurityUtil; import org.apache.hadoop.ozone.OzoneSecurityUtil; import com.google.common.base.Preconditions; @@ -126,8 +128,8 @@ public abstract class DefaultCertificateClient implements CertificateClient { private final String threadNamePrefix; private List pemEncodedCACerts = null; private Lock pemEncodedCACertsLock = new ReentrantLock(); - private KeyStoresFactory serverKeyStoresFactory; - private KeyStoresFactory clientKeyStoresFactory; + private ReloadingX509KeyManager keyManager; + private ReloadingX509TrustManager trustManager; private ScheduledExecutorService executorService; private Consumer certIdSaveCallback; @@ -1021,21 +1023,32 @@ public List updateCAList() throws IOException { } @Override - public synchronized KeyStoresFactory getServerKeyStoresFactory() - throws CertificateException { - if (serverKeyStoresFactory == null) { - serverKeyStoresFactory = SecurityUtil.getServerKeyStoresFactory(this, true); + public ReloadingX509TrustManager getTrustManager() throws CertificateException { + try { + if (trustManager == null) { + Set newRootCaCerts = rootCaCertificates.isEmpty() ? + caCertificates : rootCaCertificates; + trustManager = new ReloadingX509TrustManager(KeyStore.getDefaultType(), new ArrayList<>(newRootCaCerts)); + notificationReceivers.add(trustManager); + } + return trustManager; + } catch (IOException | GeneralSecurityException e) { + throw new CertificateException("Failed to init trustManager", e, CertificateException.ErrorCode.KEYSTORE_ERROR); } - return serverKeyStoresFactory; } @Override - public KeyStoresFactory getClientKeyStoresFactory() - throws CertificateException { - if (clientKeyStoresFactory == null) { - clientKeyStoresFactory = SecurityUtil.getClientKeyStoresFactory(this, true); + public ReloadingX509KeyManager getKeyManager() throws CertificateException { + try { + if (keyManager == null) { + keyManager = new ReloadingX509KeyManager( + KeyStore.getDefaultType(), getComponentName(), getPrivateKey(), getTrustChain()); + notificationReceivers.add(keyManager); + } + return keyManager; + } catch (IOException | GeneralSecurityException e) { + throw new CertificateException("Failed to init keyManager", e, CertificateException.ErrorCode.KEYSTORE_ERROR); } - return clientKeyStoresFactory; } /** @@ -1071,14 +1084,6 @@ public synchronized void close() throws IOException { if (rootCaRotationPoller != null) { rootCaRotationPoller.close(); } - - if (serverKeyStoresFactory != null) { - serverKeyStoresFactory.destroy(); - } - - if (clientKeyStoresFactory != null) { - clientKeyStoresFactory.destroy(); - } } /** diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java index 96fb2a7fd916..41545fb7e9ad 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/keys/SecurityUtil.java @@ -18,8 +18,6 @@ */ package org.apache.hadoop.hdds.security.x509.keys; -import java.io.IOException; -import java.security.GeneralSecurityException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; @@ -30,10 +28,6 @@ import java.security.spec.X509EncodedKeySpec; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; -import org.apache.hadoop.hdds.security.ssl.PemFileBasedKeyStoresFactory; -import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; -import org.apache.hadoop.hdds.security.x509.exception.CertificateException; /** * Utility functions for Security modules for Ozone. @@ -93,33 +87,4 @@ public static PublicKey getPublicKey(byte[] encodedKey, } return key; } - - public static KeyStoresFactory getServerKeyStoresFactory( - CertificateClient client, - boolean requireClientAuth) throws CertificateException { - PemFileBasedKeyStoresFactory factory = - new PemFileBasedKeyStoresFactory(client); - try { - factory.init(KeyStoresFactory.Mode.SERVER, requireClientAuth); - } catch (IOException | GeneralSecurityException e) { - throw new CertificateException("Failed to init keyStoresFactory", e, - CertificateException.ErrorCode.KEYSTORE_ERROR); - } - return factory; - } - - public static KeyStoresFactory getClientKeyStoresFactory( - CertificateClient client, - boolean requireClientAuth) throws CertificateException { - PemFileBasedKeyStoresFactory factory = - new PemFileBasedKeyStoresFactory(client); - - try { - factory.init(KeyStoresFactory.Mode.CLIENT, requireClientAuth); - } catch (IOException | GeneralSecurityException e) { - throw new CertificateException("Failed to init keyStoresFactory", e, - CertificateException.ErrorCode.KEYSTORE_ERROR); - } - return factory; - } } diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java index c4fb6063ac16..f27f42e0b4c7 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java @@ -84,7 +84,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import com.sun.jersey.spi.container.servlet.ServletContainer; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.Connector; @@ -112,6 +111,8 @@ import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.webapp.WebAppContext; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.servlet.ServletContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -137,17 +138,17 @@ public final class HttpServer2 implements FilterContainer { public static final String HTTP_SCHEME = "http"; public static final String HTTPS_SCHEME = "https"; - private static final String HTTP_MAX_REQUEST_HEADER_SIZE_KEY = + public static final String HTTP_MAX_REQUEST_HEADER_SIZE_KEY = "hadoop.http.max.request.header.size"; private static final int HTTP_MAX_REQUEST_HEADER_SIZE_DEFAULT = 65536; - private static final String HTTP_MAX_RESPONSE_HEADER_SIZE_KEY = + public static final String HTTP_MAX_RESPONSE_HEADER_SIZE_KEY = "hadoop.http.max.response.header.size"; private static final int HTTP_MAX_RESPONSE_HEADER_SIZE_DEFAULT = 65536; private static final String HTTP_SOCKET_BACKLOG_SIZE_KEY = "hadoop.http.socket.backlog.size"; private static final int HTTP_SOCKET_BACKLOG_SIZE_DEFAULT = 128; - private static final String HTTP_MAX_THREADS_KEY = "hadoop.http.max.threads"; + public static final String HTTP_MAX_THREADS_KEY = "hadoop.http.max.threads"; private static final String HTTP_ACCEPTOR_COUNT_KEY = "hadoop.http.acceptor.count"; // -1 to use default behavior of setting count based on CPU core count @@ -171,7 +172,7 @@ public final class HttpServer2 implements FilterContainer { private static final int HTTP_IDLE_TIMEOUT_MS_DEFAULT = 60000; private static final String HTTP_TEMP_DIR_KEY = "hadoop.http.temp.dir"; - private static final String FILTER_INITIALIZER_PROPERTY + public static final String FILTER_INITIALIZER_PROPERTY = "ozone.http.filter.initializers"; // The ServletContext attribute where the daemon Configuration @@ -836,10 +837,8 @@ public void addJerseyResourcePackage(final String packageName, final String pathSpec) { LOG.info("addJerseyResourcePackage: packageName={}, pathSpec={}", packageName, pathSpec); - final ServletHolder sh = new ServletHolder(ServletContainer.class); - sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", - "com.sun.jersey.api.core.PackagesResourceConfig"); - sh.setInitParameter("com.sun.jersey.config.property.packages", packageName); + final ResourceConfig config = new ResourceConfig().packages(packageName); + final ServletHolder sh = new ServletHolder(new ServletContainer(config)); webAppContext.addServlet(sh, pathSpec); } @@ -1674,8 +1673,7 @@ private String inferMimeType(ServletRequest request) { String path = ((HttpServletRequest) request).getRequestURI(); ServletContextHandler.Context sContext = (ServletContextHandler.Context) config.getServletContext(); - String mime = sContext.getMimeType(path); - return (mime == null) ? null : mime; + return sContext.getMimeType(path); } private void initHttpHeaderMap() { diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/SignalLogger.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/SignalLogger.java index df6f18cf6ee3..df3839c470e0 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/SignalLogger.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/SignalLogger.java @@ -22,7 +22,6 @@ import jnr.posix.POSIX; import jnr.posix.POSIXFactory; import jnr.posix.SignalHandler; -import jnr.posix.util.DefaultPOSIXHandler; import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.hdds.annotation.InterfaceStability; import org.slf4j.Logger; @@ -44,6 +43,10 @@ public enum SignalLogger { private static final Set SIGNALS = EnumSet.of(Signal.SIGHUP, Signal.SIGINT, Signal.SIGTERM); + private static final POSIX POSIX_IMPL = POSIXFactory.getJavaPOSIX(); + + private static final SignalHandler DEFAULT_HANDLER = System::exit; + private boolean registered = false; /** @@ -51,9 +54,12 @@ public enum SignalLogger { */ private static class Handler implements SignalHandler { private final Logger log; + private final SignalHandler prevHandler; - Handler(Logger log) { + Handler(Signal signal, Logger log) { this.log = log; + SignalHandler handler = POSIX_IMPL.signal(signal, this); + prevHandler = handler != null ? handler : DEFAULT_HANDLER; } /** @@ -64,6 +70,7 @@ private static class Handler implements SignalHandler { @Override public void handle(int signal) { log.error("RECEIVED SIGNAL {}: {}", signal, Signal.valueOf(signal)); + prevHandler.handle(signal); } } @@ -80,15 +87,13 @@ public void register(final Logger log) { StringBuilder bld = new StringBuilder(); bld.append("registered UNIX signal handlers for ["); String separator = ""; - final POSIX posix = POSIXFactory.getPOSIX(new DefaultPOSIXHandler(), true); - final Handler handler = new Handler(log); for (Signal signal : SIGNALS) { try { - posix.signal(signal, handler); + new Handler(signal, log); bld.append(separator).append(signal.name()); separator = ", "; } catch (Exception e) { - log.debug("", e); + log.info("Error installing UNIX signal handler for {}", signal, e); } } bld.append("]"); diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBConfigFromFile.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBConfigFromFile.java index f23e910ba01d..ba4674439d1c 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBConfigFromFile.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBConfigFromFile.java @@ -136,7 +136,7 @@ public static ManagedDBOptions readFromFile(String dbFileName, env, options, cfDescs, true); } catch (RocksDBException rdEx) { - toIOException("Unable to find/open Options file.", rdEx); + throw toIOException("Unable to find/open Options file.", rdEx); } } } diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/cache/FullTableCache.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/cache/FullTableCache.java index cb1a3f16a9c5..01d1a03d4340 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/cache/FullTableCache.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/cache/FullTableCache.java @@ -19,16 +19,20 @@ package org.apache.hadoop.hdds.utils.db.cache; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NavigableMap; +import java.util.Queue; import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -54,7 +58,8 @@ public class FullTableCache implements TableCache { private final Map, CacheValue> cache; private final NavigableMap>> epochEntries; - private final ExecutorService executorService; + private final ScheduledExecutorService executorService; + private final Queue epochCleanupQueue = new ConcurrentLinkedQueue<>(); private final ReadWriteLock lock; @@ -82,8 +87,8 @@ public FullTableCache(String threadNamePrefix) { .setDaemon(true) .setNameFormat(threadNamePrefix + "FullTableCache-Cleanup-%d") .build(); - executorService = Executors.newSingleThreadExecutor(threadFactory); - + executorService = Executors.newScheduledThreadPool(1, threadFactory); + executorService.scheduleWithFixedDelay(() -> cleanupTask(), 0, 1000L, TimeUnit.MILLISECONDS); statsRecorder = new CacheStatsRecorder(); } @@ -111,18 +116,31 @@ public void loadInitial(CacheKey key, CacheValue value) { @Override public void put(CacheKey cacheKey, CacheValue value) { try { - lock.writeLock().lock(); + lock.readLock().lock(); cache.put(cacheKey, value); - epochEntries.computeIfAbsent(value.getEpoch(), - v -> new CopyOnWriteArraySet<>()).add(cacheKey); + // add in case of null value for cleanup purpose only when key is deleted + if (value.getCacheValue() == null) { + epochEntries.computeIfAbsent(value.getEpoch(), + v -> new CopyOnWriteArraySet<>()).add(cacheKey); + } } finally { - lock.writeLock().unlock(); + lock.readLock().unlock(); } } @Override public void cleanup(List epochs) { - executorService.execute(() -> evictCache(epochs)); + epochCleanupQueue.clear(); + epochCleanupQueue.addAll(epochs); + } + + private void cleanupTask() { + if (epochCleanupQueue.isEmpty()) { + return; + } + ArrayList epochList = new ArrayList<>(epochCleanupQueue); + epochCleanupQueue.removeAll(epochList); + evictCache(epochList); } @Override @@ -139,45 +157,48 @@ public Iterator, CacheValue>> iterator() { @VisibleForTesting @Override public void evictCache(List epochs) { + // when no delete entries, can exit immediately + if (epochEntries.isEmpty()) { + return; + } + Set> currentCacheKeys; CacheKey cachekey; long lastEpoch = epochs.get(epochs.size() - 1); - for (long currentEpoch : epochEntries.keySet()) { - currentCacheKeys = epochEntries.get(currentEpoch); + // Acquire lock to avoid race between cleanup and add to cache entry by + // client requests. + try { + lock.writeLock().lock(); + for (long currentEpoch : epochEntries.keySet()) { + currentCacheKeys = epochEntries.get(currentEpoch); - // If currentEntry epoch is greater than last epoch provided, we have - // deleted all entries less than specified epoch. So, we can break. - if (currentEpoch > lastEpoch) { - break; - } + // If currentEntry epoch is greater than last epoch provided, we have + // deleted all entries less than specified epoch. So, we can break. + if (currentEpoch > lastEpoch) { + break; + } - // Acquire lock to avoid race between cleanup and add to cache entry by - // client requests. - try { - lock.writeLock().lock(); - if (epochs.contains(currentEpoch)) { - for (Iterator> iterator = currentCacheKeys.iterator(); - iterator.hasNext();) { - cachekey = iterator.next(); - cache.computeIfPresent(cachekey, ((k, v) -> { - // If cache epoch entry matches with current Epoch, remove entry - // from cache. - if (v.getCacheValue() == null && v.getEpoch() == currentEpoch) { - if (LOG.isDebugEnabled()) { - LOG.debug("CacheKey {} with epoch {} is removed from cache", - k.getCacheKey(), currentEpoch); - } - return null; + for (Iterator> iterator = currentCacheKeys.iterator(); + iterator.hasNext();) { + cachekey = iterator.next(); + cache.computeIfPresent(cachekey, ((k, v) -> { + // If cache epoch entry matches with current Epoch, remove entry + // from cache. + if (v.getCacheValue() == null && v.getEpoch() == currentEpoch) { + if (LOG.isDebugEnabled()) { + LOG.debug("CacheKey {} with epoch {} is removed from cache", + k.getCacheKey(), currentEpoch); } - return v; - })); - } + return null; + } + return v; + })); // Remove epoch entry, as the entry is there in epoch list. epochEntries.remove(currentEpoch); } - } finally { - lock.writeLock().unlock(); } + } finally { + lock.writeLock().unlock(); } } diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java index c3b515e7ef72..539ec48f6ed1 100644 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java +++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509KeyManager.java @@ -24,7 +24,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import javax.net.ssl.KeyManager; import java.security.PrivateKey; import static org.assertj.core.api.Assertions.assertThat; @@ -48,23 +47,20 @@ public static void setUp() throws Exception { @Test public void testReload() throws Exception { - KeyManager km = caClient.getServerKeyStoresFactory().getKeyManagers()[0]; + ReloadingX509KeyManager km = caClient.getKeyManager(); PrivateKey privateKey1 = caClient.getPrivateKey(); - assertEquals(privateKey1, ((ReloadingX509KeyManager)km).getPrivateKey( - caClient.getComponentName() + "_key")); + assertEquals(privateKey1, km.getPrivateKey(caClient.getComponentName() + "_key")); caClient.renewRootCA(); caClient.renewKey(); PrivateKey privateKey2 = caClient.getPrivateKey(); assertNotEquals(privateKey1, privateKey2); - assertEquals(privateKey2, ((ReloadingX509KeyManager)km).getPrivateKey( - caClient.getComponentName() + "_key")); + assertEquals(privateKey2, km.getPrivateKey(caClient.getComponentName() + "_key")); assertThat(reloaderLog.getOutput()).contains("ReloadingX509KeyManager is reloaded"); - // Make sure there is two reloads happened, one for server, one for client - assertEquals(2, StringUtils.countMatches(reloaderLog.getOutput(), - "ReloadingX509KeyManager is reloaded")); + // Only one reload has to happen for the CertificateClient's keyManager. + assertEquals(1, StringUtils.countMatches(reloaderLog.getOutput(), "ReloadingX509KeyManager is reloaded")); } } diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java index 8db0a9801ebe..5575411524ca 100644 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java +++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestReloadingX509TrustManager.java @@ -46,9 +46,7 @@ public static void setUp() throws Exception { @Test public void testReload() throws Exception { - ReloadingX509TrustManager tm = - (ReloadingX509TrustManager) caClient.getServerKeyStoresFactory() - .getTrustManagers()[0]; + ReloadingX509TrustManager tm = caClient.getTrustManager(); X509Certificate cert1 = caClient.getRootCACertificate(); assertThat(tm.getAcceptedIssuers()).containsOnly(cert1); @@ -61,8 +59,7 @@ public void testReload() throws Exception { assertThat(reloaderLog.getOutput()) .contains("ReloadingX509TrustManager is reloaded"); - // Make sure there are two reload happened, one for server, one for client - assertEquals(2, StringUtils.countMatches(reloaderLog.getOutput(), - "ReloadingX509TrustManager is reloaded")); + // Only one reload has to happen for the CertificateClient's trustManager. + assertEquals(1, StringUtils.countMatches(reloaderLog.getOutput(), "ReloadingX509TrustManager is reloaded")); } } diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestPemFileBasedKeyStoresFactory.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestSSLConnectionWithReload.java similarity index 79% rename from hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestPemFileBasedKeyStoresFactory.java rename to hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestSSLConnectionWithReload.java index 6efb93c93d65..9e1014788609 100644 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestPemFileBasedKeyStoresFactory.java +++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/ssl/TestSSLConnectionWithReload.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hdds.scm.pipeline.PipelineID; import org.apache.hadoop.hdds.security.SecurityConfig; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClientTestImpl; +import org.apache.hadoop.hdds.security.x509.exception.CertificateException; import org.apache.hadoop.ozone.container.ContainerTestHelper; import org.apache.ratis.thirdparty.io.grpc.ManagedChannel; import org.apache.ratis.thirdparty.io.grpc.Server; @@ -42,8 +43,6 @@ import org.apache.ratis.thirdparty.io.netty.handler.ssl.SslContextBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; import javax.net.ssl.SSLException; import java.util.ArrayList; @@ -52,13 +51,12 @@ import java.util.concurrent.CompletableFuture; import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result.SUCCESS; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; /** - * Test PemFileBasedKeyStoresFactory. + * Test. */ -public class TestPemFileBasedKeyStoresFactory { +public class TestSSLConnectionWithReload { private CertificateClientTestImpl caClient; private SecurityConfig secConf; private static final int RELOAD_INTERVAL = 2000; @@ -70,29 +68,6 @@ public void setup() throws Exception { secConf = new SecurityConfig(conf); } - @ValueSource(booleans = {true, false}) - @ParameterizedTest - public void testInit(boolean clientAuth) throws Exception { - KeyStoresFactory keyStoresFactory = new PemFileBasedKeyStoresFactory( - caClient); - try { - keyStoresFactory.init(KeyStoresFactory.Mode.CLIENT, clientAuth); - assertEquals(clientAuth, keyStoresFactory.getKeyManagers()[0] - instanceof ReloadingX509KeyManager); - assertInstanceOf(ReloadingX509TrustManager.class, keyStoresFactory.getTrustManagers()[0]); - } finally { - keyStoresFactory.destroy(); - } - - try { - keyStoresFactory.init(KeyStoresFactory.Mode.SERVER, clientAuth); - assertInstanceOf(ReloadingX509KeyManager.class, keyStoresFactory.getKeyManagers()[0]); - assertInstanceOf(ReloadingX509TrustManager.class, keyStoresFactory.getTrustManagers()[0]); - } finally { - keyStoresFactory.destroy(); - } - } - @Test public void testConnectionWithCertReload() throws Exception { KeyStoresFactory serverFactory = null; @@ -101,15 +76,11 @@ public void testConnectionWithCertReload() throws Exception { ManagedChannel channel = null; try { // create server - serverFactory = new PemFileBasedKeyStoresFactory(caClient); - serverFactory.init(KeyStoresFactory.Mode.SERVER, true); - server = setupServer(serverFactory); + server = setupServer(); server.start(); // create client - clientFactory = new PemFileBasedKeyStoresFactory(caClient); - clientFactory.init(KeyStoresFactory.Mode.CLIENT, true); - channel = setupClient(clientFactory, server.getPort()); + channel = setupClient(server.getPort()); XceiverClientProtocolServiceStub asyncStub = XceiverClientProtocolServiceGrpc.newStub(channel); @@ -165,6 +136,7 @@ public void onNext(ContainerCommandResponseProto value) { @Override public void onError(Throwable t) { } + @Override public void onCompleted() { } @@ -174,25 +146,25 @@ public void onCompleted() { return replyFuture.get(); } - private ManagedChannel setupClient(KeyStoresFactory factory, int port) - throws SSLException { + private ManagedChannel setupClient(int port) + throws SSLException, CertificateException { NettyChannelBuilder channelBuilder = NettyChannelBuilder.forAddress("localhost", port); SslContextBuilder sslContextBuilder = GrpcSslContexts.forClient(); - sslContextBuilder.trustManager(factory.getTrustManagers()[0]); - sslContextBuilder.keyManager(factory.getKeyManagers()[0]); + sslContextBuilder.trustManager(caClient.getTrustManager()); + sslContextBuilder.keyManager(caClient.getKeyManager()); channelBuilder.useTransportSecurity().sslContext(sslContextBuilder.build()); return channelBuilder.build(); } - private Server setupServer(KeyStoresFactory factory) throws SSLException { + private Server setupServer() throws SSLException, CertificateException { NettyServerBuilder nettyServerBuilder = NettyServerBuilder.forPort(0) .addService(new GrpcService()); SslContextBuilder sslContextBuilder = SslContextBuilder.forServer( - factory.getKeyManagers()[0]); + caClient.getKeyManager()); sslContextBuilder.clientAuth(ClientAuth.REQUIRE); - sslContextBuilder.trustManager(factory.getTrustManagers()[0]); + sslContextBuilder.trustManager(caClient.getTrustManager()); sslContextBuilder = GrpcSslContexts.configure( sslContextBuilder, secConf.getGrpcSslProvider()); nettyServerBuilder.sslContext(sslContextBuilder.build()); diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClientTestImpl.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClientTestImpl.java index 30bd9fc32006..00058500f597 100644 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClientTestImpl.java +++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/client/CertificateClientTestImpl.java @@ -18,8 +18,10 @@ import java.io.IOException; import java.math.BigInteger; +import java.security.GeneralSecurityException; import java.security.InvalidKeyException; import java.security.KeyPair; +import java.security.KeyStore; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; @@ -46,8 +48,9 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.hadoop.hdds.conf.OzoneConfiguration; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.SecurityConfig; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509KeyManager; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509TrustManager; import org.apache.hadoop.hdds.security.x509.certificate.authority.DefaultApprover; import org.apache.hadoop.hdds.security.x509.certificate.authority.profile.DefaultProfile; import org.apache.hadoop.hdds.security.x509.certificate.utils.CertificateSignRequest; @@ -55,8 +58,6 @@ import org.apache.hadoop.hdds.security.x509.exception.CertificateException; import org.apache.hadoop.hdds.security.x509.keys.HDDSKeyGenerator; -import org.apache.hadoop.hdds.security.x509.keys.SecurityUtil; - import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_X509_DEFAULT_DURATION; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_X509_DEFAULT_DURATION_DEFAULT; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_X509_MAX_DURATION; @@ -79,8 +80,8 @@ public class CertificateClientTestImpl implements CertificateClient { private HDDSKeyGenerator keyGen; private DefaultApprover approver; - private KeyStoresFactory serverKeyStoresFactory; - private KeyStoresFactory clientKeyStoresFactory; + private ReloadingX509KeyManager keyManager; + private ReloadingX509TrustManager trustManager; private Map certificateMap; private ScheduledExecutorService executorService; private Set notificationReceivers; @@ -135,20 +136,16 @@ public CertificateClientTestImpl(OzoneConfiguration conf, boolean autoRenew) String certDuration = conf.get(HDDS_X509_DEFAULT_DURATION, HDDS_X509_DEFAULT_DURATION_DEFAULT); x509Certificate = approver.sign(securityConfig, rootKeyPair.getPrivate(), - rootCert, - Date.from(start.atZone(ZoneId.systemDefault()).toInstant()), - Date.from(start.plus(Duration.parse(certDuration)) - .atZone(ZoneId.systemDefault()).toInstant()), - csrBuilder.build(), "scm1", "cluster1", - String.valueOf(System.nanoTime())); + rootCert, + Date.from(start.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(start.plus(Duration.parse(certDuration)) + .atZone(ZoneId.systemDefault()).toInstant()), + csrBuilder.build(), "scm1", "cluster1", + String.valueOf(System.nanoTime())); certificateMap.put(x509Certificate.getSerialNumber().toString(), x509Certificate); notificationReceivers = new HashSet<>(); - serverKeyStoresFactory = SecurityUtil.getServerKeyStoresFactory( - this, true); - clientKeyStoresFactory = SecurityUtil.getClientKeyStoresFactory( - this, true); if (autoRenew) { Duration gracePeriod = securityConfig.getRenewalGracePeriod(); @@ -337,13 +334,31 @@ public void run() { } @Override - public KeyStoresFactory getServerKeyStoresFactory() { - return serverKeyStoresFactory; + public ReloadingX509KeyManager getKeyManager() throws CertificateException { + try { + if (keyManager == null) { + keyManager = new ReloadingX509KeyManager( + KeyStore.getDefaultType(), getComponentName(), getPrivateKey(), getTrustChain()); + notificationReceivers.add(keyManager); + } + return keyManager; + } catch (IOException | GeneralSecurityException e) { + throw new CertificateException("Failed to init keyManager", e, CertificateException.ErrorCode.KEYSTORE_ERROR); + } } @Override - public KeyStoresFactory getClientKeyStoresFactory() { - return clientKeyStoresFactory; + public ReloadingX509TrustManager getTrustManager() throws CertificateException { + try { + if (trustManager == null) { + Set newRootCaCerts = getAllRootCaCerts().isEmpty() ? getAllCaCerts() : getAllRootCaCerts(); + trustManager = new ReloadingX509TrustManager(KeyStore.getDefaultType(), new ArrayList<>(newRootCaCerts)); + notificationReceivers.add(trustManager); + } + return trustManager; + } catch (IOException | GeneralSecurityException e) { + throw new CertificateException("Failed to init trustManager", e); + } } @Override @@ -362,14 +377,6 @@ public void registerRootCARotationListener( @Override public void close() throws IOException { - if (serverKeyStoresFactory != null) { - serverKeyStoresFactory.destroy(); - } - - if (clientKeyStoresFactory != null) { - clientKeyStoresFactory.destroy(); - } - if (executorService != null) { executorService.shutdown(); } diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/cache/TestTableCache.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/cache/TestTableCache.java index aabc664140c2..3f645f90e700 100644 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/cache/TestTableCache.java +++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/cache/TestTableCache.java @@ -115,7 +115,12 @@ public void testTableCacheWithRenameKey(TableCache.CacheType cacheType) { // Epoch entries should be like (long, (key1, key2, ...)) // (0, (0A, 0B)) (1, (1A, 1B)) (2, (2A, 1B)) assertEquals(3, tableCache.getEpochEntries().size()); - assertEquals(2, tableCache.getEpochEntries().get(0L).size()); + if (cacheType == TableCache.CacheType.FULL_CACHE) { + // first time cache value is null for xA cases and non-null value for xB cases, so have 1 entry + assertEquals(1, tableCache.getEpochEntries().get(0L).size()); + } else { + assertEquals(2, tableCache.getEpochEntries().get(0L).size()); + } // Cache should be like (key, (cacheValue, long)) // (0A, (null, 0)) (0B, (0, 0)) @@ -227,9 +232,13 @@ public void testPartialTableCacheWithOverrideEntries( assertEquals(3, tableCache.size()); - // It will have 2 additional entries because we have 2 override entries. - assertEquals(3 + 2, - tableCache.getEpochEntries().size()); + if (cacheType == TableCache.CacheType.FULL_CACHE) { + // full table cache keep only deleted entry which is 0 + assertEquals(0, tableCache.getEpochEntries().size()); + } else { + // It will have 2 additional entries because we have 2 override entries. + assertEquals(3 + 2, tableCache.getEpochEntries().size()); + } // Now remove @@ -301,9 +310,13 @@ public void testPartialTableCacheWithOverrideAndDelete( assertEquals(3, tableCache.size()); - // It will have 4 additional entries because we have 4 override entries. - assertEquals(3 + 4, - tableCache.getEpochEntries().size()); + if (cacheType == TableCache.CacheType.FULL_CACHE) { + // It will have 2 deleted entries + assertEquals(2, tableCache.getEpochEntries().size()); + } else { + // It will have 4 additional entries because we have 4 override entries. + assertEquals(3 + 4, tableCache.getEpochEntries().size()); + } // Now remove @@ -506,7 +519,12 @@ public void testTableCacheWithNonConsecutiveEpochList( tableCache.evictCache(epochs); assertEquals(2, tableCache.size()); - assertEquals(2, tableCache.getEpochEntries().size()); + if (cacheType == TableCache.CacheType.FULL_CACHE) { + // no deleted entries + assertEquals(0, tableCache.getEpochEntries().size()); + } else { + assertEquals(2, tableCache.getEpochEntries().size()); + } assertNotNull(tableCache.get(new CacheKey<>(Long.toString(0)))); assertEquals(2, diff --git a/hadoop-hdds/hadoop-dependency-client/pom.xml b/hadoop-hdds/hadoop-dependency-client/pom.xml index 5d0ca946aeed..03b677e3818c 100644 --- a/hadoop-hdds/hadoop-dependency-client/pom.xml +++ b/hadoop-hdds/hadoop-dependency-client/pom.xml @@ -319,4 +319,16 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> snappy-java + + + + + org.apache.maven.plugins + maven-compiler-plugin + + none + + + + diff --git a/hadoop-hdds/hadoop-dependency-server/pom.xml b/hadoop-hdds/hadoop-dependency-server/pom.xml index 47c571945919..69daeac4bd7f 100644 --- a/hadoop-hdds/hadoop-dependency-server/pom.xml +++ b/hadoop-hdds/hadoop-dependency-server/pom.xml @@ -97,7 +97,7 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> com.sun.jersey - jersey-json + * org.apache.kerby @@ -167,6 +167,10 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${hadoop.version} compile + + com.sun.jersey + * + org.apache.hadoop.thirdparty hadoop-shaded-guava @@ -206,4 +210,16 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> snappy-java + + + + + org.apache.maven.plugins + maven-compiler-plugin + + none + + + + diff --git a/hadoop-hdds/hadoop-dependency-test/pom.xml b/hadoop-hdds/hadoop-dependency-test/pom.xml index c7b2776094c4..80ec91cd6d94 100644 --- a/hadoop-hdds/hadoop-dependency-test/pom.xml +++ b/hadoop-hdds/hadoop-dependency-test/pom.xml @@ -104,4 +104,16 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> slf4j-reload4j + + + + + org.apache.maven.plugins + maven-compiler-plugin + + none + + + + diff --git a/hadoop-hdds/interface-admin/pom.xml b/hadoop-hdds/interface-admin/pom.xml index 8f38fb28dbb7..9230b02b524c 100644 --- a/hadoop-hdds/interface-admin/pom.xml +++ b/hadoop-hdds/interface-admin/pom.xml @@ -50,6 +50,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> com.salesforce.servicelibs proto-backwards-compatibility + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.xolstice.maven.plugins protobuf-maven-plugin diff --git a/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto b/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto index c190dc3f4517..039914369b5f 100644 --- a/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto +++ b/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto @@ -84,6 +84,7 @@ message ScmContainerLocationRequest { optional SingleNodeQueryRequestProto singleNodeQueryRequest = 45; optional GetContainersOnDecomNodeRequestProto getContainersOnDecomNodeRequest = 46; optional GetMetricsRequestProto getMetricsRequest = 47; + optional ContainerBalancerStatusInfoRequestProto containerBalancerStatusInfoRequest = 48; } message ScmContainerLocationResponse { @@ -139,6 +140,7 @@ message ScmContainerLocationResponse { optional SingleNodeQueryResponseProto singleNodeQueryResponse = 45; optional GetContainersOnDecomNodeResponseProto getContainersOnDecomNodeResponse = 46; optional GetMetricsResponseProto getMetricsResponse = 47; + optional ContainerBalancerStatusInfoResponseProto containerBalancerStatusInfoResponse = 48; enum Status { OK = 1; @@ -193,6 +195,7 @@ enum Type { SingleNodeQuery = 41; GetContainersOnDecomNode = 42; GetMetrics = 43; + GetContainerBalancerStatusInfo = 44; } /** @@ -607,6 +610,38 @@ message ContainerBalancerStatusResponseProto { required bool isRunning = 1; } +message ContainerBalancerStatusInfoRequestProto { + optional string traceID = 1; +} + +message ContainerBalancerStatusInfoResponseProto { + optional bool isRunning = 1; + optional ContainerBalancerStatusInfo containerBalancerStatusInfo = 2; +} +message ContainerBalancerStatusInfo { + optional uint64 startedAt = 1; + optional ContainerBalancerConfigurationProto configuration = 2; + repeated ContainerBalancerTaskIterationStatusInfo iterationsStatusInfo = 3; +} + +message ContainerBalancerTaskIterationStatusInfo { + optional int32 iterationNumber = 1; + optional string iterationResult = 2; + optional int64 sizeScheduledForMoveGB = 3; + optional int64 dataSizeMovedGB = 4; + optional int64 containerMovesScheduled = 5; + optional int64 containerMovesCompleted = 6; + optional int64 containerMovesFailed = 7; + optional int64 containerMovesTimeout = 8; + repeated NodeTransferInfo sizeEnteringNodesGB = 9; + repeated NodeTransferInfo sizeLeavingNodesGB = 10; +} + +message NodeTransferInfo { + optional string uuid = 1; + optional int64 dataVolumeGB = 2; +} + message DecommissionScmRequestProto { required string scmId = 1; } diff --git a/hadoop-hdds/interface-client/pom.xml b/hadoop-hdds/interface-client/pom.xml index 2160f7c5edbf..98cfc53f5e86 100644 --- a/hadoop-hdds/interface-client/pom.xml +++ b/hadoop-hdds/interface-client/pom.xml @@ -58,6 +58,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> com.salesforce.servicelibs proto-backwards-compatibility + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.xolstice.maven.plugins protobuf-maven-plugin diff --git a/hadoop-hdds/interface-server/pom.xml b/hadoop-hdds/interface-server/pom.xml index b0e8d152b184..6c689171c8d3 100644 --- a/hadoop-hdds/interface-server/pom.xml +++ b/hadoop-hdds/interface-server/pom.xml @@ -51,6 +51,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> com.salesforce.servicelibs proto-backwards-compatibility + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.xolstice.maven.plugins protobuf-maven-plugin diff --git a/hadoop-hdds/managed-rocksdb/pom.xml b/hadoop-hdds/managed-rocksdb/pom.xml index f2f90ae5a92a..b95fcc3479d6 100644 --- a/hadoop-hdds/managed-rocksdb/pom.xml +++ b/hadoop-hdds/managed-rocksdb/pom.xml @@ -42,6 +42,15 @@ - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + none + + + + diff --git a/hadoop-hdds/rocks-native/pom.xml b/hadoop-hdds/rocks-native/pom.xml index 1c8f01bff93e..509586806c81 100644 --- a/hadoop-hdds/rocks-native/pom.xml +++ b/hadoop-hdds/rocks-native/pom.xml @@ -56,6 +56,13 @@ ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + none + + diff --git a/hadoop-hdds/rocksdb-checkpoint-differ/pom.xml b/hadoop-hdds/rocksdb-checkpoint-differ/pom.xml index e3d365b65051..22f87556054c 100644 --- a/hadoop-hdds/rocksdb-checkpoint-differ/pom.xml +++ b/hadoop-hdds/rocksdb-checkpoint-differ/pom.xml @@ -99,6 +99,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + none + + maven-enforcer-plugin diff --git a/hadoop-hdds/server-scm/pom.xml b/hadoop-hdds/server-scm/pom.xml index bb2bdec14052..f1a998f27cfb 100644 --- a/hadoop-hdds/server-scm/pom.xml +++ b/hadoop-hdds/server-scm/pom.xml @@ -121,6 +121,48 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-annotation-processing + ${hdds.version} + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + org.apache.ozone.annotations.ReplicateAnnotationProcessor + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.kohsuke.MetaInfServices + + + + + + + org.apache.maven.plugins maven-dependency-plugin diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ScmUtils.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ScmUtils.java index cc6147c7a64d..3f6b90b05e21 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ScmUtils.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ScmUtils.java @@ -23,10 +23,8 @@ import java.util.concurrent.BlockingQueue; import org.apache.hadoop.hdds.conf.ConfigurationSource; import org.apache.hadoop.hdds.conf.OzoneConfiguration; -import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ScmOps; import org.apache.hadoop.hdds.scm.events.SCMEvents; import org.apache.hadoop.hdds.scm.exceptions.SCMException; -import org.apache.hadoop.hdds.scm.safemode.Precheck; import org.apache.hadoop.hdds.scm.security.RootCARotationManager; import org.apache.hadoop.hdds.scm.server.ContainerReportQueue; @@ -39,7 +37,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; import java.net.InetSocketAddress; import java.util.Optional; import java.util.OptionalInt; @@ -75,30 +72,6 @@ public final class ScmUtils { private ScmUtils() { } - /** - * Perform all prechecks for given scm operation. - * - * @param operation - * @param preChecks prechecks to be performed - */ - public static void preCheck(ScmOps operation, Precheck... preChecks) - throws SCMException { - for (Precheck preCheck : preChecks) { - preCheck.check(operation); - } - } - - /** - * Create SCM directory file based on given path. - */ - public static File createSCMDir(String dirPath) { - File dirFile = new File(dirPath); - if (!dirFile.mkdirs() && !dirFile.exists()) { - throw new IllegalArgumentException("Unable to create path: " + dirFile); - } - return dirFile; - } - public static InetSocketAddress getScmBlockProtocolServerAddress( OzoneConfiguration conf, String localScmServiceId, String nodeId) { String bindHostKey = ConfUtils.addKeySuffixes( diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java index 7e163ac306f8..34682b85bccd 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/AbstractContainerReportHandler.java @@ -349,8 +349,18 @@ private boolean updateContainerState(final DatanodeDetails datanode, break; case DELETING: /* - * The container is under deleting. do nothing. + HDDS-11136: If a DELETING container has a non-empty CLOSED replica, the container should be moved back to CLOSED + state. */ + boolean replicaStateAllowed = replica.getState() == State.CLOSED; + boolean replicaNotEmpty = replica.hasIsEmpty() && !replica.getIsEmpty(); + if (replicaStateAllowed && replicaNotEmpty) { + logger.info("Moving DELETING container {} to CLOSED state, datanode {} reported replica with state={}, " + + "isEmpty={} and keyCount={}.", containerId, datanode.getHostName(), replica.getState(), false, + replica.getKeyCount()); + containerManager.transitionDeletingToClosedState(containerId); + } + break; case DELETED: /* diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java index 2a60e268ff4a..3eba240533e3 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java @@ -131,6 +131,16 @@ void updateContainerState(ContainerID containerID, LifeCycleEvent event) throws IOException, InvalidStateTransitionException; + /** + * Bypasses the container state machine to change a container's state from DELETING to CLOSED. This API was + * introduced to fix a bug (HDDS-11136), and should be used with care otherwise. + * + * @see HDDS-11136 + * @param containerID id of the container to transition + * @throws IOException + */ + void transitionDeletingToClosedState(ContainerID containerID) throws IOException; + /** * Returns the latest list of replicas for given containerId. * diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java index 8e1e881c44ea..00aee0f62c25 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java @@ -283,6 +283,21 @@ public void updateContainerState(final ContainerID cid, } } + @Override + public void transitionDeletingToClosedState(ContainerID containerID) throws IOException { + HddsProtos.ContainerID proto = containerID.getProtobuf(); + lock.lock(); + try { + if (containerExist(containerID)) { + containerStateManager.transitionDeletingToClosedState(proto); + } else { + throwContainerNotFoundException(containerID); + } + } finally { + lock.unlock(); + } + } + @Override public Set getContainerReplicas(final ContainerID id) throws ContainerNotFoundException { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java index 9f741068a86e..4f478b201cd4 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java @@ -151,6 +151,18 @@ void updateContainerState(HddsProtos.ContainerID id, HddsProtos.LifeCycleEvent event) throws IOException, InvalidStateTransitionException; + + /** + * Bypasses the container state machine to change a container's state from DELETING to CLOSED. This API was + * introduced to fix a bug (HDDS-11136), and should be used with care otherwise. + * + * @see HDDS-11136 + * @param id id of the container to transition + * @throws IOException + */ + @Replicate + void transitionDeletingToClosedState(HddsProtos.ContainerID id) throws IOException; + /** * */ diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java index cf5975d05eb1..28a732795b17 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java @@ -39,6 +39,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState; import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.scm.ScmConfigKeys; +import org.apache.hadoop.hdds.scm.container.common.helpers.InvalidContainerStateException; import org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps; import org.apache.hadoop.hdds.scm.container.states.ContainerState; import org.apache.hadoop.hdds.scm.container.states.ContainerStateMap; @@ -367,6 +368,28 @@ public void updateContainerState(final HddsProtos.ContainerID containerID, } } + @Override + public void transitionDeletingToClosedState(HddsProtos.ContainerID containerID) throws IOException { + final ContainerID id = ContainerID.getFromProtobuf(containerID); + + try (AutoCloseableLock ignored = writeLock(id)) { + if (containers.contains(id)) { + final ContainerInfo oldInfo = containers.getContainerInfo(id); + final LifeCycleState oldState = oldInfo.getState(); + if (oldState != DELETING) { + throw new InvalidContainerStateException("Cannot transition container " + id + " from " + oldState + + " back to CLOSED. The container must be in the DELETING state."); + } + ExecutionUtil.create(() -> { + containers.updateState(id, oldState, CLOSED); + transactionBuffer.addToBuffer(containerStore, id, containers.getContainerInfo(id)); + }).onException(() -> { + transactionBuffer.addToBuffer(containerStore, id, oldInfo); + containers.updateState(id, CLOSED, oldState); + }).execute(); + } + } + } @Override public Set getContainerReplicas(final ContainerID id) { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java index 5416a9ff1c38..dd2d1c578940 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/AbstractFindTargetGreedy.java @@ -279,4 +279,8 @@ NodeManager getNodeManager() { return nodeManager; } + @Override + public Map getSizeEnteringNodes() { + return sizeEnteringNode; + } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java index f47abe65befd..3dddd67bd8ad 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java @@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.time.OffsetDateTime; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; @@ -53,6 +54,7 @@ public class ContainerBalancer extends StatefulService { private volatile Thread currentBalancingThread; private volatile ContainerBalancerTask task = null; private ReentrantLock lock; + private OffsetDateTime startedAt; /** * Constructs ContainerBalancer with the specified arguments. Initializes @@ -175,6 +177,24 @@ public ContainerBalancerTask.Status getBalancerStatus() { : ContainerBalancerTask.Status.STOPPED; } + /** + * Get balancer status info. + * + * @return balancer status info if balancer started + */ + public ContainerBalancerStatusInfo getBalancerStatusInfo() throws IOException { + if (isBalancerRunning()) { + ContainerBalancerConfigurationProto configProto = readConfiguration(ContainerBalancerConfigurationProto.class); + return new ContainerBalancerStatusInfo( + this.startedAt, + configProto, + task.getCurrentIterationsStatistic() + ); + } else { + return null; + } + + } /** * Checks if ContainerBalancer is in valid state to call stop. * @@ -204,6 +224,7 @@ public String getServiceName() { @Override public void start() throws IllegalContainerBalancerStateException, InvalidContainerBalancerConfigurationException { + startedAt = OffsetDateTime.now(); lock.lock(); try { // should be leader-ready, out of safe mode, and not running already @@ -251,6 +272,7 @@ public void start() throws IllegalContainerBalancerStateException, public void startBalancer(ContainerBalancerConfiguration configuration) throws IllegalContainerBalancerStateException, InvalidContainerBalancerConfigurationException, IOException { + startedAt = OffsetDateTime.now(); lock.lock(); try { // validates state, config, and then saves config diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java index e275d345a5a7..644e362b3bf2 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java @@ -453,7 +453,7 @@ public String toString() { excludeNodes.equals("") ? "None" : excludeNodes); } - ContainerBalancerConfigurationProto.Builder toProtobufBuilder() { + public ContainerBalancerConfigurationProto.Builder toProtobufBuilder() { ContainerBalancerConfigurationProto.Builder builder = ContainerBalancerConfigurationProto.newBuilder(); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerMetrics.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerMetrics.java index 09558d3a6d4f..6446089db353 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerMetrics.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerMetrics.java @@ -131,6 +131,11 @@ void incrementNumContainerMovesScheduledInLatestIteration(long valueToAdd) { this.numContainerMovesScheduledInLatestIteration.incr(valueToAdd); } + public void resetNumContainerMovesScheduledInLatestIteration() { + numContainerMovesScheduledInLatestIteration.incr( + -getNumContainerMovesScheduledInLatestIteration()); + } + /** * Gets the amount of data moved by Container Balancer in the latest * iteration. diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerStatusInfo.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerStatusInfo.java new file mode 100644 index 000000000000..cbe8385e53a7 --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerStatusInfo.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.scm.container.balancer; + +import org.apache.hadoop.hdds.protocol.proto.HddsProtos; + +import java.time.OffsetDateTime; +import java.util.List; + +/** + * Info about balancer status. + */ +public class ContainerBalancerStatusInfo { + private final OffsetDateTime startedAt; + private final HddsProtos.ContainerBalancerConfigurationProto configuration; + private final List iterationsStatusInfo; + + public ContainerBalancerStatusInfo( + OffsetDateTime startedAt, + HddsProtos.ContainerBalancerConfigurationProto configuration, + List iterationsStatusInfo) { + this.startedAt = startedAt; + this.configuration = configuration; + this.iterationsStatusInfo = iterationsStatusInfo; + } + + public OffsetDateTime getStartedAt() { + return startedAt; + } + + public HddsProtos.ContainerBalancerConfigurationProto getConfiguration() { + return configuration; + } + + public List getIterationsStatusInfo() { + return iterationsStatusInfo; + } +} diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java index 8daf764057ef..7fea44671ffa 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java @@ -51,12 +51,14 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_NODE_REPORT_INTERVAL; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_NODE_REPORT_INTERVAL_DEFAULT; @@ -115,6 +117,7 @@ public class ContainerBalancerTask implements Runnable { private IterationResult iterationResult; private int nextIterationIndex; private boolean delayStart; + private List iterationsStatistic; /** * Constructs ContainerBalancerTask with the specified arguments. @@ -155,6 +158,7 @@ public ContainerBalancerTask(StorageContainerManager scm, this.selectedSources = new HashSet<>(); this.selectedTargets = new HashSet<>(); findSourceStrategy = new FindSourceGreedy(nodeManager); + this.iterationsStatistic = new ArrayList<>(); } /** @@ -250,7 +254,9 @@ private void balance() { } IterationResult iR = doIteration(); + saveIterationStatistic(i, iR); metrics.incrementNumIterations(1); + LOG.info("Result of this iteration of Container Balancer: {}", iR); // if no new move option is generated, it means the cluster cannot be @@ -292,6 +298,85 @@ private void balance() { tryStopWithSaveConfiguration("Completed all iterations."); } + private void saveIterationStatistic(Integer iterationNumber, IterationResult iR) { + ContainerBalancerTaskIterationStatusInfo iterationStatistic = new ContainerBalancerTaskIterationStatusInfo( + iterationNumber, + iR.name(), + getSizeScheduledForMoveInLatestIteration() / OzoneConsts.GB, + metrics.getDataSizeMovedGBInLatestIteration(), + metrics.getNumContainerMovesScheduledInLatestIteration(), + metrics.getNumContainerMovesCompletedInLatestIteration(), + metrics.getNumContainerMovesFailedInLatestIteration(), + metrics.getNumContainerMovesTimeoutInLatestIteration(), + findTargetStrategy.getSizeEnteringNodes() + .entrySet() + .stream() + .filter(Objects::nonNull) + .filter(datanodeDetailsLongEntry -> datanodeDetailsLongEntry.getValue() > 0) + .collect( + Collectors.toMap( + entry -> entry.getKey().getUuid(), + entry -> entry.getValue() / OzoneConsts.GB + ) + ), + findSourceStrategy.getSizeLeavingNodes() + .entrySet() + .stream() + .filter(Objects::nonNull) + .filter(datanodeDetailsLongEntry -> datanodeDetailsLongEntry.getValue() > 0) + .collect( + Collectors.toMap( + entry -> entry.getKey().getUuid(), + entry -> entry.getValue() / OzoneConsts.GB + ) + ) + ); + iterationsStatistic.add(iterationStatistic); + } + + public List getCurrentIterationsStatistic() { + + int lastIterationNumber = iterationsStatistic.stream() + .mapToInt(ContainerBalancerTaskIterationStatusInfo::getIterationNumber) + .max() + .orElse(0); + + ContainerBalancerTaskIterationStatusInfo currentIterationStatistic = new ContainerBalancerTaskIterationStatusInfo( + lastIterationNumber + 1, + null, + getSizeScheduledForMoveInLatestIteration() / OzoneConsts.GB, + sizeActuallyMovedInLatestIteration / OzoneConsts.GB, + metrics.getNumContainerMovesScheduledInLatestIteration(), + metrics.getNumContainerMovesCompletedInLatestIteration(), + metrics.getNumContainerMovesFailedInLatestIteration(), + metrics.getNumContainerMovesTimeoutInLatestIteration(), + findTargetStrategy.getSizeEnteringNodes() + .entrySet() + .stream() + .filter(Objects::nonNull) + .filter(datanodeDetailsLongEntry -> datanodeDetailsLongEntry.getValue() > 0) + .collect(Collectors.toMap( + entry -> entry.getKey().getUuid(), + entry -> entry.getValue() / OzoneConsts.GB + ) + ), + findSourceStrategy.getSizeLeavingNodes() + .entrySet() + .stream() + .filter(Objects::nonNull) + .filter(datanodeDetailsLongEntry -> datanodeDetailsLongEntry.getValue() > 0) + .collect( + Collectors.toMap( + entry -> entry.getKey().getUuid(), + entry -> entry.getValue() / OzoneConsts.GB + ) + ) + ); + List resultList = new ArrayList<>(iterationsStatistic); + resultList.add(currentIterationStatistic); + return resultList; + } + /** * Logs the reason for stop and save configuration and stop the task. * @@ -1060,6 +1145,7 @@ private void resetState() { this.sizeScheduledForMoveInLatestIteration = 0; this.sizeActuallyMovedInLatestIteration = 0; metrics.resetDataSizeMovedGBInLatestIteration(); + metrics.resetNumContainerMovesScheduledInLatestIteration(); metrics.resetNumContainerMovesCompletedInLatestIteration(); metrics.resetNumContainerMovesTimeoutInLatestIteration(); metrics.resetNumDatanodesInvolvedInLatestIteration(); @@ -1136,6 +1222,10 @@ IterationResult getIterationResult() { return iterationResult; } + ContainerBalancerConfiguration getConfig() { + return config; + } + @VisibleForTesting void setConfig(ContainerBalancerConfiguration config) { this.config = config; diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTaskIterationStatusInfo.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTaskIterationStatusInfo.java new file mode 100644 index 000000000000..1d597b0ca273 --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTaskIterationStatusInfo.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.scm.container.balancer; + +import java.util.Map; +import java.util.UUID; + +/** + * Information about balancer task iteration. + */ +public class ContainerBalancerTaskIterationStatusInfo { + private final Integer iterationNumber; + private final String iterationResult; + private final long sizeScheduledForMoveGB; + private final long dataSizeMovedGB; + private final long containerMovesScheduled; + private final long containerMovesCompleted; + private final long containerMovesFailed; + private final long containerMovesTimeout; + private final Map sizeEnteringNodesGB; + private final Map sizeLeavingNodesGB; + + @SuppressWarnings("checkstyle:ParameterNumber") + public ContainerBalancerTaskIterationStatusInfo( + Integer iterationNumber, + String iterationResult, + long sizeScheduledForMoveGB, + long dataSizeMovedGB, + long containerMovesScheduled, + long containerMovesCompleted, + long containerMovesFailed, + long containerMovesTimeout, + Map sizeEnteringNodesGB, + Map sizeLeavingNodesGB) { + this.iterationNumber = iterationNumber; + this.iterationResult = iterationResult; + this.sizeScheduledForMoveGB = sizeScheduledForMoveGB; + this.dataSizeMovedGB = dataSizeMovedGB; + this.containerMovesScheduled = containerMovesScheduled; + this.containerMovesCompleted = containerMovesCompleted; + this.containerMovesFailed = containerMovesFailed; + this.containerMovesTimeout = containerMovesTimeout; + this.sizeEnteringNodesGB = sizeEnteringNodesGB; + this.sizeLeavingNodesGB = sizeLeavingNodesGB; + } + + public Integer getIterationNumber() { + return iterationNumber; + } + + public String getIterationResult() { + return iterationResult; + } + + public long getSizeScheduledForMoveGB() { + return sizeScheduledForMoveGB; + } + + public long getDataSizeMovedGB() { + return dataSizeMovedGB; + } + + public long getContainerMovesScheduled() { + return containerMovesScheduled; + } + + public long getContainerMovesCompleted() { + return containerMovesCompleted; + } + + public long getContainerMovesFailed() { + return containerMovesFailed; + } + + public long getContainerMovesTimeout() { + return containerMovesTimeout; + } + + public Map getSizeEnteringNodesGB() { + return sizeEnteringNodesGB; + } + + public Map getSizeLeavingNodesGB() { + return sizeLeavingNodesGB; + } +} + + diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java index 8306d8e1e1ff..435cc9859a94 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceGreedy.java @@ -201,4 +201,9 @@ public void reInitialize(List potentialDataNodes, sizeLeavingNode.clear(); resetSources(potentialDataNodes); } + + @Override + public Map getSizeLeavingNodes() { + return sizeLeavingNode; + } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceStrategy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceStrategy.java index f9eb24bd3cc6..9e429aaa21d9 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceStrategy.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindSourceStrategy.java @@ -24,6 +24,7 @@ import jakarta.annotation.Nonnull; import java.util.Collection; import java.util.List; +import java.util.Map; /** * This interface can be used to implement strategies to get a @@ -85,4 +86,6 @@ void reInitialize(List potentialDataNodes, * {@link DatanodeDetails} that containers can move from */ void resetPotentialSources(@Nonnull Collection sources); + + Map getSizeLeavingNodes(); } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindTargetStrategy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindTargetStrategy.java index a9f2ee00a2d3..389ea6e5192f 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindTargetStrategy.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/FindTargetStrategy.java @@ -25,6 +25,7 @@ import jakarta.annotation.Nonnull; import java.util.Collection; import java.util.List; +import java.util.Map; /** * This interface can be used to implement strategies to find a target for a @@ -68,4 +69,6 @@ void reInitialize(List potentialDataNodes, * that containers can be moved to */ void resetPotentialTargets(@Nonnull Collection targets); + + Map getSizeEnteringNodes(); } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java index 72f4c4dc870c..f0d78b23079a 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/HASecurityUtils.java @@ -23,7 +23,6 @@ import org.apache.hadoop.hdds.scm.proxy.SCMSecurityProtocolFailoverProxyProvider; import org.apache.hadoop.hdds.scm.server.SCMStorageConfig; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.x509.certificate.authority.CAType; import org.apache.hadoop.hdds.security.x509.certificate.authority.CertificateServer; import org.apache.hadoop.hdds.security.x509.certificate.authority.CertificateStore; @@ -156,11 +155,8 @@ public static CertificateServer initializeRootCertificateServer( public static GrpcTlsConfig createSCMRatisTLSConfig(SecurityConfig conf, CertificateClient certificateClient) throws IOException { if (conf.isSecurityEnabled() && conf.isGrpcTlsEnabled()) { - KeyStoresFactory serverKeyFactory = - certificateClient.getServerKeyStoresFactory(); - - return new GrpcTlsConfig(serverKeyFactory.getKeyManagers()[0], - serverKeyFactory.getTrustManagers()[0], true); + return new GrpcTlsConfig(certificateClient.getKeyManager(), + certificateClient.getTrustManager(), true); } return null; } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcClient.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcClient.java index bc5a58472e30..eebcfac03c7c 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcClient.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcClient.java @@ -24,7 +24,6 @@ import org.apache.hadoop.hdds.protocol.scm.proto.InterSCMProtocolServiceGrpc; import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.ratis.thirdparty.io.grpc.ManagedChannel; @@ -73,11 +72,8 @@ public InterSCMGrpcClient(final String host, if (securityConfig.isSecurityEnabled() && securityConfig.isGrpcTlsEnabled()) { SslContextBuilder sslClientContextBuilder = SslContextBuilder.forClient(); - KeyStoresFactory keyStoreFactory = - scmCertificateClient.getClientKeyStoresFactory(); - sslClientContextBuilder.keyManager(keyStoreFactory.getKeyManagers()[0]); - sslClientContextBuilder.trustManager( - keyStoreFactory.getTrustManagers()[0]); + sslClientContextBuilder.keyManager(scmCertificateClient.getKeyManager()); + sslClientContextBuilder.trustManager(scmCertificateClient.getTrustManager()); SslContextBuilder sslContextBuilder = GrpcSslContexts.configure( sslClientContextBuilder, securityConfig.getGrpcSslProvider()); channelBuilder.sslContext(sslContextBuilder.build()) diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcProtocolService.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcProtocolService.java index 92f28d07e973..4b45fd4d34f4 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcProtocolService.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/InterSCMGrpcProtocolService.java @@ -26,7 +26,6 @@ import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.ratis.thirdparty.io.grpc.Server; @@ -70,10 +69,9 @@ public class InterSCMGrpcProtocolService { && securityConfig.isGrpcTlsEnabled()) { try { CertificateClient certClient = scm.getScmCertificateClient(); - KeyStoresFactory keyStores = certClient.getServerKeyStoresFactory(); SslContextBuilder sslServerContextBuilder = - forServer(keyStores.getKeyManagers()[0]) - .trustManager(keyStores.getTrustManagers()[0]); + forServer(certClient.getKeyManager()) + .trustManager(certClient.getTrustManager()); SslContextBuilder sslContextBuilder = GrpcSslContexts.configure( sslServerContextBuilder, securityConfig.getGrpcSslProvider()); sslContextBuilder.clientAuth(ClientAuth.REQUIRE); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManagerMXBean.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManagerMXBean.java index 10c9b1554cf0..a66fc0d22fb5 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManagerMXBean.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManagerMXBean.java @@ -20,6 +20,7 @@ import org.apache.hadoop.hdds.annotation.InterfaceAudience; +import java.util.HashMap; import java.util.Map; /** @@ -48,4 +49,8 @@ public interface NodeManagerMXBean { */ Map> getNodeStatusInfo(); + default Map getNodeStatistics() { + return new HashMap<>(); + } + } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java index 818e1826328b..038f76b52e9a 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java @@ -83,6 +83,7 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.Arrays; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -1217,6 +1218,53 @@ public static String[] calculateStoragePercentage( return storagePercentage; } + @Override + public Map getNodeStatistics() { + Map nodeStatistics = new HashMap<>(); + // Statistics node usaged + nodeUsageStatistics(nodeStatistics); + // todo: Statistics of other instances + return nodeStatistics; + } + + private void nodeUsageStatistics(Map nodeStatics) { + if (nodeStateManager.getAllNodes().size() < 1) { + return; + } + float[] usages = new float[nodeStateManager.getAllNodes().size()]; + float totalOzoneUsed = 0; + int i = 0; + for (DatanodeInfo dni : nodeStateManager.getAllNodes()) { + String[] storagePercentage = calculateStoragePercentage( + dni.getStorageReports()); + if (storagePercentage[0].equals("N/A")) { + usages[i++] = 0; + } else { + float storagePerc = Float.parseFloat(storagePercentage[0]); + usages[i++] = storagePerc; + totalOzoneUsed = totalOzoneUsed + storagePerc; + } + } + + totalOzoneUsed /= nodeStateManager.getAllNodes().size(); + Arrays.sort(usages); + float median = usages[usages.length / 2]; + nodeStatics.put(UsageStatics.MEDIAN.getLabel(), String.valueOf(median)); + float max = usages[usages.length - 1]; + nodeStatics.put(UsageStatics.MAX.getLabel(), String.valueOf(max)); + float min = usages[0]; + nodeStatics.put(UsageStatics.MIN.getLabel(), String.valueOf(min)); + + float dev = 0; + for (i = 0; i < usages.length; i++) { + dev += (usages[i] - totalOzoneUsed) * (usages[i] - totalOzoneUsed); + } + dev = (float) Math.sqrt(dev / usages.length); + DecimalFormat decimalFormat = new DecimalFormat("#0.00"); + decimalFormat.setRoundingMode(RoundingMode.HALF_UP); + nodeStatics.put(UsageStatics.STDEV.getLabel(), decimalFormat.format(dev)); + } + /** * Based on the current time and the last heartbeat, calculate the time difference * and get a string of the relative value. E.g. "2s ago", "1m 2s ago", etc. @@ -1284,6 +1332,20 @@ public String getLabel() { } } + private enum UsageStatics { + MIN("Min"), + MAX("Max"), + MEDIAN("Median"), + STDEV("Stdev"); + private String label; + public String getLabel() { + return label; + } + UsageStatics(String label) { + this.label = label; + } + } + /** * Returns the min of no healthy volumes reported out of the set * of datanodes constituting the pipeline. diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java index 3d7cff358fe4..f2efae959872 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java @@ -34,6 +34,7 @@ import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ActivatePipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ClosePipelineRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ClosePipelineResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerRequestProto; @@ -600,6 +601,13 @@ public ScmContainerLocationResponse processRequest( .setContainerBalancerStatusResponse(getContainerBalancerStatus( request.getContainerBalancerStatusRequest())) .build(); + case GetContainerBalancerStatusInfo: + return ScmContainerLocationResponse.newBuilder() + .setCmdType(request.getCmdType()) + .setStatus(Status.OK) + .setContainerBalancerStatusInfoResponse(getContainerBalancerStatusInfo( + request.getContainerBalancerStatusInfoRequest())) + .build(); case GetPipeline: return ScmContainerLocationResponse.newBuilder() .setCmdType(request.getCmdType()) @@ -1196,6 +1204,12 @@ public ContainerBalancerStatusResponseProto getContainerBalancerStatus( .setIsRunning(impl.getContainerBalancerStatus()).build(); } + public ContainerBalancerStatusInfoResponseProto getContainerBalancerStatusInfo( + StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoRequestProto request) + throws IOException { + return impl.getContainerBalancerStatusInfo(); + } + public DecommissionNodesResponseProto decommissionNodes( DecommissionNodesRequestProto request) throws IOException { List errors = diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/Precheck.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/Precheck.java deleted file mode 100644 index 12c6c317542a..000000000000 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/Precheck.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements.  See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership.  The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License.  You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop.hdds.scm.safemode; - -import org.apache.hadoop.hdds.scm.exceptions.SCMException; - -/** - * Precheck for SCM operations. - * */ -public interface Precheck { - boolean check(T t) throws SCMException; - String type(); -} diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SafeModePrecheck.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SafeModePrecheck.java deleted file mode 100644 index 6a0001c673ce..000000000000 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SafeModePrecheck.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements.  See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership.  The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License.  You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop.hdds.scm.safemode; - -import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.hadoop.hdds.conf.ConfigurationSource; -import org.apache.hadoop.hdds.HddsConfigKeys; -import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ScmOps; -import org.apache.hadoop.hdds.scm.exceptions.SCMException; -import org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes; - -/** - * Safe mode pre-check for SCM operations. - * */ -public class SafeModePrecheck implements Precheck { - - private AtomicBoolean inSafeMode; - public static final String PRECHECK_TYPE = "SafeModePrecheck"; - - public SafeModePrecheck(ConfigurationSource conf) { - boolean safeModeEnabled = conf.getBoolean( - HddsConfigKeys.HDDS_SCM_SAFEMODE_ENABLED, - HddsConfigKeys.HDDS_SCM_SAFEMODE_ENABLED_DEFAULT); - if (safeModeEnabled) { - inSafeMode = new AtomicBoolean(true); - } else { - inSafeMode = new AtomicBoolean(false); - } - } - - @Override - public boolean check(ScmOps op) throws SCMException { - if (inSafeMode.get() && SafeModeRestrictedOps - .isRestrictedInSafeMode(op)) { - throw new SCMException("SafeModePrecheck failed for " + op, - ResultCodes.SAFE_MODE_EXCEPTION); - } - return inSafeMode.get(); - } - - @Override - public String type() { - return PRECHECK_TYPE; - } - - public boolean isInSafeMode() { - return inSafeMode.get(); - } - - public void setInSafeMode(boolean inSafeMode) { - this.inSafeMode.set(inSafeMode); - } -} diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java index 47bc66d8331a..828b452d3000 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java @@ -33,28 +33,33 @@ import org.apache.hadoop.hdds.conf.ReconfigurationHandler; import org.apache.hadoop.hdds.protocol.DatanodeDetails; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; -import org.apache.hadoop.hdds.protocol.proto.ReconfigureProtocolProtos.ReconfigureProtocolService; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.DeletedBlocksTransactionInfo; +import org.apache.hadoop.hdds.protocol.proto.ReconfigureProtocolProtos.ReconfigureProtocolService; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DecommissionScmResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DecommissionScmResponseProto.Builder; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.NodeTransferInfo; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.StartContainerBalancerResponseProto; import org.apache.hadoop.hdds.protocolPB.ReconfigureProtocolPB; import org.apache.hadoop.hdds.protocolPB.ReconfigureProtocolServerSideTranslatorPB; import org.apache.hadoop.hdds.ratis.RatisHelper; import org.apache.hadoop.hdds.scm.DatanodeAdminError; +import org.apache.hadoop.hdds.scm.FetchMetrics; import org.apache.hadoop.hdds.scm.ScmInfo; import org.apache.hadoop.hdds.scm.container.ContainerID; import org.apache.hadoop.hdds.scm.container.ContainerInfo; import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException; import org.apache.hadoop.hdds.scm.container.ContainerReplica; -import org.apache.hadoop.hdds.scm.container.common.helpers.DeletedBlocksTransactionInfoWrapper; import org.apache.hadoop.hdds.scm.container.ReplicationManagerReport; import org.apache.hadoop.hdds.scm.container.balancer.ContainerBalancer; import org.apache.hadoop.hdds.scm.container.balancer.ContainerBalancerConfiguration; +import org.apache.hadoop.hdds.scm.container.balancer.ContainerBalancerStatusInfo; import org.apache.hadoop.hdds.scm.container.balancer.IllegalContainerBalancerStateException; import org.apache.hadoop.hdds.scm.container.balancer.InvalidContainerBalancerConfigurationException; import org.apache.hadoop.hdds.scm.container.common.helpers.ContainerWithPipeline; +import org.apache.hadoop.hdds.scm.container.common.helpers.DeletedBlocksTransactionInfoWrapper; import org.apache.hadoop.hdds.scm.events.SCMEvents; import org.apache.hadoop.hdds.scm.exceptions.SCMException; import org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes; @@ -62,7 +67,6 @@ import org.apache.hadoop.hdds.scm.ha.SCMRatisServer; import org.apache.hadoop.hdds.scm.ha.SCMRatisServerImpl; import org.apache.hadoop.hdds.scm.node.DatanodeUsageInfo; -import org.apache.hadoop.hdds.scm.FetchMetrics; import org.apache.hadoop.hdds.scm.node.NodeStatus; import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException; import org.apache.hadoop.hdds.scm.pipeline.Pipeline; @@ -108,14 +112,14 @@ import java.util.Optional; import java.util.Set; import java.util.TreeSet; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; -import java.util.UUID; import static org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.StorageContainerLocationProtocolService.newReflectiveBlockingService; +import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_HANDLER_COUNT_KEY; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_HANDLER_COUNT_DEFAULT; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_HANDLER_COUNT_KEY; -import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_HANDLER_COUNT_KEY; import static org.apache.hadoop.hdds.scm.ScmUtils.checkIfCertSignRequestAllowed; import static org.apache.hadoop.hdds.scm.ha.HASecurityUtils.createSCMRatisTLSConfig; import static org.apache.hadoop.hdds.scm.server.StorageContainerManager.startRpcServer; @@ -1202,6 +1206,67 @@ public boolean getContainerBalancerStatus() { return scm.getContainerBalancer().isBalancerRunning(); } + @Override + public ContainerBalancerStatusInfoResponseProto getContainerBalancerStatusInfo() throws IOException { + AUDIT.logReadSuccess(buildAuditMessageForSuccess( + SCMAction.GET_CONTAINER_BALANCER_STATUS_INFO, null)); + ContainerBalancerStatusInfo balancerStatusInfo = scm.getContainerBalancer().getBalancerStatusInfo(); + if (balancerStatusInfo == null) { + return ContainerBalancerStatusInfoResponseProto + .newBuilder() + .setIsRunning(false) + .build(); + } else { + + return ContainerBalancerStatusInfoResponseProto + .newBuilder() + .setIsRunning(true) + .setContainerBalancerStatusInfo(StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfo + .newBuilder() + .setStartedAt(balancerStatusInfo.getStartedAt().toEpochSecond()) + .setConfiguration(balancerStatusInfo.getConfiguration()) + .addAllIterationsStatusInfo( + balancerStatusInfo.getIterationsStatusInfo() + .stream() + .map( + info -> ContainerBalancerTaskIterationStatusInfo.newBuilder() + .setIterationNumber(info.getIterationNumber()) + .setIterationResult(Optional.ofNullable(info.getIterationResult()).orElse("")) + .setSizeScheduledForMoveGB(info.getSizeScheduledForMoveGB()) + .setDataSizeMovedGB(info.getDataSizeMovedGB()) + .setContainerMovesScheduled(info.getContainerMovesScheduled()) + .setContainerMovesCompleted(info.getContainerMovesCompleted()) + .setContainerMovesFailed(info.getContainerMovesFailed()) + .setContainerMovesTimeout(info.getContainerMovesTimeout()) + .addAllSizeEnteringNodesGB( + info.getSizeEnteringNodesGB().entrySet() + .stream() + .map(entry -> NodeTransferInfo.newBuilder() + .setUuid(entry.getKey().toString()) + .setDataVolumeGB(entry.getValue()) + .build() + ) + .collect(Collectors.toList()) + ) + .addAllSizeLeavingNodesGB( + info.getSizeLeavingNodesGB().entrySet() + .stream() + .map(entry -> NodeTransferInfo.newBuilder() + .setUuid(entry.getKey().toString()) + .setDataVolumeGB(entry.getValue()) + .build() + ) + .collect(Collectors.toList()) + ) + .build() + ) + .collect(Collectors.toList()) + ) + ) + .build(); + } + } + /** * Get Datanode usage info such as capacity, SCMUsed, and remaining by ip * or hostname or uuid. diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java index 63cce60bcf0d..5c0248f162d1 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java @@ -146,6 +146,7 @@ import org.apache.hadoop.hdds.server.events.EventQueue; import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager; import org.apache.hadoop.hdds.utils.HddsVersionInfo; +import org.apache.hadoop.hdds.utils.NettyMetrics; import org.apache.hadoop.hdds.utils.IOUtils; import org.apache.hadoop.hdds.utils.LegacyHadoopConfigurationSource; import org.apache.hadoop.ipc.RPC; @@ -236,6 +237,7 @@ public final class StorageContainerManager extends ServiceRuntimeInfoImpl private static SCMMetrics metrics; private static SCMPerformanceMetrics perfMetrics; private SCMHAMetrics scmHAMetrics; + private final NettyMetrics nettyMetrics; /* * RPC Endpoints exposed by SCM. @@ -456,6 +458,7 @@ private StorageContainerManager(OzoneConfiguration conf, registerMXBean(); registerMetricsSource(this); + this.nettyMetrics = NettyMetrics.create(); } private void initializeEventHandlers() { @@ -1710,6 +1713,7 @@ public void stop() { metrics.unRegister(); } + nettyMetrics.unregister(); if (perfMetrics != null) { perfMetrics.unRegister(); } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/audit/SCMAction.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/audit/SCMAction.java index 4e1fe234ff01..128e3401c370 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/audit/SCMAction.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/audit/SCMAction.java @@ -47,6 +47,7 @@ public enum SCMAction implements AuditAction { START_CONTAINER_BALANCER, STOP_CONTAINER_BALANCER, GET_CONTAINER_BALANCER_STATUS, + GET_CONTAINER_BALANCER_STATUS_INFO, GET_CONTAINER_WITH_PIPELINE_BATCH, ADD_SCM, GET_REPLICATION_MANAGER_REPORT, diff --git a/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm-overview.html b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm-overview.html index be110c9cc564..67655b539f0e 100644 --- a/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm-overview.html +++ b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm-overview.html @@ -28,6 +28,32 @@

SCM Information

+

Statistics

+ + + + + + + + + + + + + + + + + + + + + + + +
Datanode Usagein percentage (%)
Min{{statistics.nodes.usages.min}}
Median{{statistics.nodes.usages.median}}
Max{{statistics.nodes.usages.max}}
Standard Deviation{{statistics.nodes.usages.stdev}}
+

Node Status

diff --git a/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js index c6c79b33d894..8ca9fb257c9e 100644 --- a/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js +++ b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js @@ -32,6 +32,16 @@ $scope.RecordsToDisplay = "10"; $scope.currentPage = 1; $scope.lastIndex = 0; + $scope.statistics = { + nodes : { + usages : { + min : "N/A", + max : "N/A", + median : "N/A", + stdev : "N/A" + } + } + } function get_protocol(URLScheme, value, baseProto, fallbackProto) { let protocol = "unknown" @@ -81,6 +91,18 @@ $scope.totalItems = nodeStatusCopy.length; $scope.lastIndex = Math.ceil(nodeStatusCopy.length / $scope.RecordsToDisplay); $scope.nodeStatus = nodeStatusCopy.slice(0, $scope.RecordsToDisplay); + + ctrl.nodemanagermetrics.NodeStatistics.forEach(function(obj) { + if(obj.key == "Min") { + $scope.statistics.nodes.usages.min = obj.value; + } else if(obj.key == "Max") { + $scope.statistics.nodes.usages.max = obj.value; + } else if(obj.key == "Median") { + $scope.statistics.nodes.usages.median = obj.value; + } else if(obj.key == "Stdev") { + $scope.statistics.nodes.usages.stdev = obj.value; + } + }); }); /*if option is 'All' display all records else display specified record on page*/ $scope.UpdateRecordsToShow = () => { diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java index 25a4a80f233e..83791c3257d8 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerManagerImpl.java @@ -41,12 +41,14 @@ import org.apache.hadoop.hdds.scm.pipeline.PipelineManager; import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.hdds.utils.db.DBStoreBuilder; +import org.apache.hadoop.ozone.common.statemachine.InvalidStateTransitionException; import org.apache.hadoop.ozone.container.common.SCMTestUtils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -132,6 +134,62 @@ void testUpdateContainerState() throws Exception { assertEquals(LifeCycleState.CLOSED, containerManager.getContainer(cid).getState()); } + @Test + void testTransitionDeletingToClosedState() throws IOException, InvalidStateTransitionException { + // allocate OPEN Ratis and Ec containers, and do a series of state changes to transition them to DELETING + final ContainerInfo container = containerManager.allocateContainer( + RatisReplicationConfig.getInstance( + ReplicationFactor.THREE), "admin"); + ContainerInfo ecContainer = containerManager.allocateContainer(new ECReplicationConfig(3, 2), "admin"); + final ContainerID cid = container.containerID(); + final ContainerID ecCid = ecContainer.containerID(); + assertEquals(LifeCycleState.OPEN, containerManager.getContainer(cid).getState()); + assertEquals(LifeCycleState.OPEN, containerManager.getContainer(ecCid).getState()); + + // OPEN -> CLOSING + containerManager.updateContainerState(cid, + HddsProtos.LifeCycleEvent.FINALIZE); + containerManager.updateContainerState(ecCid, HddsProtos.LifeCycleEvent.FINALIZE); + assertEquals(LifeCycleState.CLOSING, containerManager.getContainer(cid).getState()); + assertEquals(LifeCycleState.CLOSING, containerManager.getContainer(ecCid).getState()); + + // CLOSING -> CLOSED + containerManager.updateContainerState(cid, HddsProtos.LifeCycleEvent.CLOSE); + containerManager.updateContainerState(ecCid, HddsProtos.LifeCycleEvent.CLOSE); + assertEquals(LifeCycleState.CLOSED, containerManager.getContainer(cid).getState()); + assertEquals(LifeCycleState.CLOSED, containerManager.getContainer(ecCid).getState()); + + // CLOSED -> DELETING + containerManager.updateContainerState(cid, HddsProtos.LifeCycleEvent.DELETE); + containerManager.updateContainerState(ecCid, HddsProtos.LifeCycleEvent.DELETE); + assertEquals(LifeCycleState.DELETING, containerManager.getContainer(cid).getState()); + assertEquals(LifeCycleState.DELETING, containerManager.getContainer(ecCid).getState()); + + // DELETING -> CLOSED + containerManager.transitionDeletingToClosedState(cid); + containerManager.transitionDeletingToClosedState(ecCid); + // the containers should be back in CLOSED state now + assertEquals(LifeCycleState.CLOSED, containerManager.getContainer(cid).getState()); + assertEquals(LifeCycleState.CLOSED, containerManager.getContainer(ecCid).getState()); + } + + @Test + void testTransitionDeletingToClosedStateAllowsOnlyDeletingContainers() throws IOException { + // test for RATIS container + final ContainerInfo container = containerManager.allocateContainer( + RatisReplicationConfig.getInstance( + ReplicationFactor.THREE), "admin"); + final ContainerID cid = container.containerID(); + assertEquals(LifeCycleState.OPEN, containerManager.getContainer(cid).getState()); + assertThrows(IOException.class, () -> containerManager.transitionDeletingToClosedState(cid)); + + // test for EC container + final ContainerInfo ecContainer = containerManager.allocateContainer(new ECReplicationConfig(3, 2), "admin"); + final ContainerID ecCid = ecContainer.containerID(); + assertEquals(LifeCycleState.OPEN, containerManager.getContainer(ecCid).getState()); + assertThrows(IOException.class, () -> containerManager.transitionDeletingToClosedState(ecCid)); + } + @Test void testGetContainers() throws Exception { assertEquals(emptyList(), containerManager.getContainers()); diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java index 695c88d11a3c..7c3666ad6179 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerReportHandler.java @@ -66,6 +66,7 @@ import java.util.stream.Stream; import static org.apache.hadoop.hdds.protocol.MockDatanodeDetails.randomDatanodeDetails; +import static org.apache.hadoop.hdds.scm.HddsTestUtils.getContainerReports; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.Mockito.doAnswer; @@ -100,7 +101,6 @@ void setup() throws IOException, InvalidStateTransitionException { dbStore = DBStoreBuilder.createDBStore( conf, new SCMDBDefinition()); scmhaManager = SCMHAManagerStub.getInstance(true); - nodeManager = new MockNodeManager(true, 10); pipelineManager = new MockPipelineManager(dbStore, scmhaManager, nodeManager); containerStateManager = ContainerStateManagerImpl.newBuilder() @@ -151,6 +151,10 @@ void setup() throws IOException, InvalidStateTransitionException { }).when(containerManager).removeContainerReplica( any(ContainerID.class), any(ContainerReplica.class)); + doAnswer(invocation -> { + containerStateManager.transitionDeletingToClosedState(((ContainerID) invocation.getArgument(0)).getProtobuf()); + return null; + }).when(containerManager).transitionDeletingToClosedState(any(ContainerID.class)); } @AfterEach @@ -442,6 +446,107 @@ public void testClosingToClosedForECContainer() assertEquals(LifeCycleState.CLOSED, containerManager.getContainer(container2.containerID()).getState()); } + /** + * Tests that a DELETING RATIS container transitions to CLOSED if a non-empty CLOSED replica is reported. It does not + * transition if a non-empty CLOSING replica is reported. + */ + @Test + public void ratisContainerShouldTransitionFromDeletingToClosedWhenNonEmptyClosedReplica() throws IOException { + ContainerInfo container = getContainer(LifeCycleState.DELETING); + containerStateManager.addContainer(container.getProtobuf()); + + // set up a non-empty CLOSED replica + DatanodeDetails dnWithClosedReplica = nodeManager.getNodes(NodeStatus.inServiceHealthy()).get(0); + ContainerReplicaProto.Builder builder = ContainerReplicaProto.newBuilder(); + ContainerReplicaProto closedReplica = builder.setContainerID(container.getContainerID()) + .setIsEmpty(false) + .setState(ContainerReplicaProto.State.CLOSED) + .setKeyCount(0) + .setBlockCommitSequenceId(123) + .setOriginNodeId(dnWithClosedReplica.getUuidString()).build(); + + // set up a non-empty CLOSING replica + DatanodeDetails dnWithClosingReplica = nodeManager.getNodes(NodeStatus.inServiceHealthy()).get(1); + ContainerReplicaProto closingReplica = builder.setState(ContainerReplicaProto.State.CLOSING) + .setOriginNodeId(dnWithClosingReplica.getUuidString()).build(); + + // should not transition on processing the CLOSING replica's report + ContainerReportHandler containerReportHandler = new ContainerReportHandler(nodeManager, containerManager); + ContainerReportsProto closingContainerReport = getContainerReports(closingReplica); + containerReportHandler + .onMessage(new ContainerReportFromDatanode(dnWithClosingReplica, closingContainerReport), publisher); + + assertEquals(LifeCycleState.DELETING, containerStateManager.getContainer(container.containerID()).getState()); + + // should transition on processing the CLOSED replica's report + ContainerReportsProto closedContainerReport = getContainerReports(closedReplica); + containerReportHandler + .onMessage(new ContainerReportFromDatanode(dnWithClosedReplica, closedContainerReport), publisher); + assertEquals(LifeCycleState.CLOSED, containerStateManager.getContainer(container.containerID()).getState()); + } + + @Test + public void ratisContainerShouldNotTransitionFromDeletingToClosedWhenEmptyClosedReplica() throws IOException { + ContainerInfo container = getContainer(LifeCycleState.DELETING); + containerStateManager.addContainer(container.getProtobuf()); + + // set up an empty CLOSED replica + DatanodeDetails dnWithClosedReplica = nodeManager.getNodes(NodeStatus.inServiceHealthy()).get(0); + ContainerReplicaProto.Builder builder = ContainerReplicaProto.newBuilder(); + ContainerReplicaProto closedReplica = builder.setContainerID(container.getContainerID()) + .setIsEmpty(true) + .setState(ContainerReplicaProto.State.CLOSED) + .setKeyCount(0) + .setBlockCommitSequenceId(123) + .setOriginNodeId(dnWithClosedReplica.getUuidString()).build(); + + ContainerReportHandler containerReportHandler = new ContainerReportHandler(nodeManager, containerManager); + ContainerReportsProto closedContainerReport = getContainerReports(closedReplica); + containerReportHandler + .onMessage(new ContainerReportFromDatanode(dnWithClosedReplica, closedContainerReport), publisher); + assertEquals(LifeCycleState.DELETING, containerStateManager.getContainer(container.containerID()).getState()); + } + + /** + * Tests that a DELETING EC container transitions to CLOSED if a non-empty CLOSED replica is reported. It does not + * transition if a non-empty CLOSING (or any other state) replica is reported. + */ + @Test + public void ecContainerShouldTransitionFromDeletingToClosedWhenNonEmptyClosedReplica() throws IOException { + ContainerInfo container = getECContainer(LifeCycleState.DELETING, PipelineID.randomId(), + new ECReplicationConfig(6, 3)); + containerStateManager.addContainer(container.getProtobuf()); + + // set up a non-empty CLOSED replica + DatanodeDetails dnWithClosedReplica = nodeManager.getNodes(NodeStatus.inServiceHealthy()).get(0); + ContainerReplicaProto.Builder builder = ContainerReplicaProto.newBuilder(); + ContainerReplicaProto closedReplica = builder.setContainerID(container.getContainerID()) + .setIsEmpty(false) + .setState(ContainerReplicaProto.State.CLOSED) + .setKeyCount(0) + .setBlockCommitSequenceId(0) + .setReplicaIndex(1) + .setOriginNodeId(dnWithClosedReplica.getUuidString()).build(); + + // set up a non-empty CLOSING replica + DatanodeDetails dnWithClosingReplica = nodeManager.getNodes(NodeStatus.inServiceHealthy()).get(1); + ContainerReplicaProto closingReplica = builder.setState(ContainerReplicaProto.State.CLOSING).setReplicaIndex(2) + .setOriginNodeId(dnWithClosingReplica.getUuidString()).build(); + + // should not transition on processing the CLOSING replica's report + ContainerReportHandler containerReportHandler = new ContainerReportHandler(nodeManager, containerManager); + ContainerReportsProto closingContainerReport = getContainerReports(closingReplica); + containerReportHandler + .onMessage(new ContainerReportFromDatanode(dnWithClosingReplica, closingContainerReport), publisher); + assertEquals(LifeCycleState.DELETING, containerStateManager.getContainer(container.containerID()).getState()); + + // should transition on processing the CLOSED replica's report + ContainerReportsProto closedContainerReport = getContainerReports(closedReplica); + containerReportHandler + .onMessage(new ContainerReportFromDatanode(dnWithClosedReplica, closedContainerReport), publisher); + assertEquals(LifeCycleState.CLOSED, containerStateManager.getContainer(container.containerID()).getState()); + } + /** * Creates the required number of DNs that will hold a replica each for the * specified EC container. Registers these DNs with the NodeManager, adds this diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java index 27505c6dd3b3..a7043d026427 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestContainerStateManager.java @@ -35,6 +35,7 @@ import org.apache.hadoop.hdds.protocol.proto .StorageContainerDatanodeProtocolProtos.ContainerReplicaProto; +import org.apache.hadoop.hdds.scm.container.common.helpers.InvalidContainerStateException; import org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps; import org.apache.hadoop.hdds.scm.ha.SCMHAManagerStub; import org.apache.hadoop.hdds.scm.ha.SCMHAManager; @@ -50,6 +51,8 @@ import org.junit.jupiter.api.io.TempDir; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.any; import static org.mockito.Mockito.when; @@ -148,6 +151,47 @@ public void checkReplicationStateMissingReplica() assertEquals(3, c1.getReplicationConfig().getRequiredNodes()); } + @Test + public void testTransitionDeletingToClosedState() throws IOException { + HddsProtos.ContainerInfoProto.Builder builder = HddsProtos.ContainerInfoProto.newBuilder(); + builder.setContainerID(1) + .setState(HddsProtos.LifeCycleState.DELETING) + .setUsedBytes(0) + .setNumberOfKeys(0) + .setOwner("root") + .setReplicationType(HddsProtos.ReplicationType.RATIS) + .setReplicationFactor(ReplicationFactor.THREE); + + HddsProtos.ContainerInfoProto container = builder.build(); + HddsProtos.ContainerID cid = HddsProtos.ContainerID.newBuilder().setId(container.getContainerID()).build(); + containerStateManager.addContainer(container); + containerStateManager.transitionDeletingToClosedState(cid); + assertEquals(HddsProtos.LifeCycleState.CLOSED, containerStateManager.getContainer(ContainerID.getFromProtobuf(cid)) + .getState()); + } + + @Test + public void testTransitionDeletingToClosedStateAllowsOnlyDeletingContainer() throws IOException { + HddsProtos.ContainerInfoProto.Builder builder = HddsProtos.ContainerInfoProto.newBuilder(); + builder.setContainerID(1) + .setState(HddsProtos.LifeCycleState.QUASI_CLOSED) + .setUsedBytes(0) + .setNumberOfKeys(0) + .setOwner("root") + .setReplicationType(HddsProtos.ReplicationType.RATIS) + .setReplicationFactor(ReplicationFactor.THREE); + + HddsProtos.ContainerInfoProto container = builder.build(); + HddsProtos.ContainerID cid = HddsProtos.ContainerID.newBuilder().setId(container.getContainerID()).build(); + containerStateManager.addContainer(container); + try { + containerStateManager.transitionDeletingToClosedState(cid); + fail("Was expecting an Exception, but did not catch any."); + } catch (IOException e) { + assertInstanceOf(InvalidContainerStateException.class, e.getCause().getCause()); + } + } + private void addReplica(ContainerInfo cont, DatanodeDetails node) { ContainerReplica replica = ContainerReplica.newBuilder() .setContainerID(cont.containerID()) diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java index 35804795cc52..7a8f655f0678 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerDatanodeNodeLimit.java @@ -21,11 +21,20 @@ import jakarta.annotation.Nonnull; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.protocol.DatanodeDetails; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos; +import org.apache.hadoop.hdds.scm.ContainerPlacementStatus; import org.apache.hadoop.hdds.scm.container.ContainerID; +import org.apache.hadoop.hdds.scm.container.ContainerInfo; +import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException; +import org.apache.hadoop.hdds.scm.container.ContainerReplica; +import org.apache.hadoop.hdds.scm.container.ContainerReplicaNotFoundException; import org.apache.hadoop.hdds.scm.node.DatanodeUsageInfo; +import org.apache.hadoop.hdds.scm.node.NodeStatus; import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.ozone.test.GenericTestUtils; +import org.apache.ozone.test.tag.Flaky; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -36,9 +45,13 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; import java.util.stream.Stream; import static org.apache.hadoop.hdds.scm.container.balancer.TestableCluster.RANDOM; @@ -46,6 +59,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.atLeastOnce; @@ -255,14 +269,11 @@ public void testBalancerWithMoveManager(@Nonnull MockedSCM mockedSCM) mockedSCM.disableLegacyReplicationManager(); mockedSCM.startBalancerTask(config); - verify(mockedSCM.getMoveManager(), atLeastOnce()) - .move(any(ContainerID.class), - any(DatanodeDetails.class), - any(DatanodeDetails.class)); + verify(mockedSCM.getMoveManager(), atLeastOnce()). + move(any(ContainerID.class), any(DatanodeDetails.class), any(DatanodeDetails.class)); verify(mockedSCM.getReplicationManager(), times(0)) - .move(any(ContainerID.class), any( - DatanodeDetails.class), any(DatanodeDetails.class)); + .move(any(ContainerID.class), any(DatanodeDetails.class), any(DatanodeDetails.class)); } @ParameterizedTest(name = "MockedSCM #{index}: {0}") @@ -287,6 +298,7 @@ public void unBalancedNodesListShouldBeEmptyWhenClusterIsBalanced(@Nonnull Mocke @ParameterizedTest(name = "MockedSCM #{index}: {0}") @MethodSource("createMockedSCMs") + @Flaky("HDDS-11093") public void testMetrics(@Nonnull MockedSCM mockedSCM) throws IOException, NodeNotFoundException { OzoneConfiguration ozoneConfig = new OzoneConfiguration(); ozoneConfig.set("hdds.datanode.du.refresh.period", "1ms"); @@ -323,6 +335,259 @@ public void testMetrics(@Nonnull MockedSCM mockedSCM) throws IOException, NodeNo assertEquals(1, metrics.getNumContainerMovesFailed()); } + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void containerBalancerShouldSelectOnlyClosedContainers(@Nonnull MockedSCM mockedSCM) { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(10); + config.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); + + Map cidToInfoMap = mockedSCM.getCluster().getCidToInfoMap(); + // Make all containers open, balancer should not select any of them + for (ContainerInfo containerInfo : cidToInfoMap.values()) { + containerInfo.setState(HddsProtos.LifeCycleState.OPEN); + } + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + + // Balancer should have identified unbalanced nodes + assertFalse(TestContainerBalancerDatanodeNodeLimit.getUnBalancedNodes(task).isEmpty()); + // No container should have been selected + assertTrue(task.getContainerToSourceMap().isEmpty()); + + // Iteration result should be CAN_NOT_BALANCE_ANY_MORE because no container move is generated + assertEquals(ContainerBalancerTask.IterationResult.CAN_NOT_BALANCE_ANY_MORE, task.getIterationResult()); + + // Now, close all containers + for (ContainerInfo containerInfo : cidToInfoMap.values()) { + containerInfo.setState(HddsProtos.LifeCycleState.CLOSED); + } + ContainerBalancerTask nextTask = mockedSCM.startBalancerTask(config); + + // Check whether all selected containers are closed + for (ContainerID cid: nextTask.getContainerToSourceMap().keySet()) { + assertSame(cidToInfoMap.get(cid).getState(), HddsProtos.LifeCycleState.CLOSED); + } + } + + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void balancerShouldNotSelectNonClosedContainerReplicas(@Nonnull MockedSCM mockedSCM) + throws ContainerNotFoundException { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(10); + config.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); + + // Let's mock such that all replicas have CLOSING state + Map> cidToReplicasMap = mockedSCM.getCluster().getCidToReplicasMap(); + when(mockedSCM.getContainerManager().getContainerReplicas(any(ContainerID.class))) + .thenAnswer(invocationOnMock -> { + ContainerID cid = (ContainerID) invocationOnMock.getArguments()[0]; + Set replicas = cidToReplicasMap.get(cid); + Set replicasToReturn = new HashSet<>(replicas.size()); + for (ContainerReplica replica : replicas) { + ContainerReplica newReplica = replica.toBuilder() + .setContainerState(StorageContainerDatanodeProtocolProtos.ContainerReplicaProto.State.CLOSING) + .build(); + replicasToReturn.add(newReplica); + } + + return replicasToReturn; + }); + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + + // Balancer should have identified unbalanced nodes + assertFalse(TestContainerBalancerDatanodeNodeLimit.getUnBalancedNodes(task).isEmpty()); + // No container should have moved because all replicas are CLOSING + assertTrue(task.getContainerToSourceMap().isEmpty()); + } + + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void containerBalancerShouldObeyMaxSizeToMoveLimit(@Nonnull MockedSCM mockedSCM) { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(1); + config.setMaxSizeToMovePerIteration(10 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(10 * STORAGE_UNIT); + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + + // Balancer should not have moved more size than the limit + assertThat(task.getSizeScheduledForMoveInLatestIteration()).isLessThanOrEqualTo(10 * STORAGE_UNIT); + + long size = task.getMetrics().getDataSizeMovedGBInLatestIteration(); + assertThat(size).isGreaterThan(0); + assertThat(size).isLessThanOrEqualTo(10); + } + + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void targetDatanodeShouldNotAlreadyContainSelectedContainer(@Nonnull MockedSCM mockedSCM) { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(10); + config.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + + Map map = task.getContainerToTargetMap(); + Map> cidToReplicasMap = mockedSCM.getCluster().getCidToReplicasMap(); + for (Map.Entry entry : map.entrySet()) { + ContainerID container = entry.getKey(); + DatanodeDetails target = entry.getValue(); + assertTrue(cidToReplicasMap.get(container) + .stream() + .map(ContainerReplica::getDatanodeDetails) + .noneMatch(target::equals)); + } + } + + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void containerMoveSelectionShouldFollowPlacementPolicy(@Nonnull MockedSCM mockedSCM) { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(10); + config.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + + Map containerFromSourceMap = task.getContainerToSourceMap(); + Map containerToTargetMap = task.getContainerToTargetMap(); + + // For each move selection, check if {replicas - source + target} satisfies placement policy + for (Map.Entry entry : containerFromSourceMap.entrySet()) { + ContainerID container = entry.getKey(); + DatanodeDetails source = entry.getValue(); + + List replicas = mockedSCM.getCluster().getCidToReplicasMap().get(container) + .stream() + .map(ContainerReplica::getDatanodeDetails) + .collect(Collectors.toList()); + // Remove source and add target + replicas.remove(source); + replicas.add(containerToTargetMap.get(container)); + + ContainerInfo containerInfo = mockedSCM.getCluster().getCidToInfoMap().get(container); + ContainerPlacementStatus placementStatus; + int requiredNodes = containerInfo.getReplicationConfig().getRequiredNodes(); + if (containerInfo.getReplicationType() == HddsProtos.ReplicationType.RATIS) { + placementStatus = mockedSCM.getPlacementPolicy().validateContainerPlacement(replicas, requiredNodes); + } else { + placementStatus = mockedSCM.getEcPlacementPolicy().validateContainerPlacement(replicas, requiredNodes); + } + assertTrue(placementStatus.isPolicySatisfied()); + } + } + + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void targetDatanodeShouldBeInServiceHealthy(@Nonnull MockedSCM mockedSCM) throws NodeNotFoundException { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(10); + config.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + + for (DatanodeDetails target : task.getSelectedTargets()) { + NodeStatus status = mockedSCM.getNodeManager().getNodeStatus(target); + assertSame(HddsProtos.NodeOperationalState.IN_SERVICE, status.getOperationalState()); + assertTrue(status.isHealthy()); + } + } + + + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void selectedContainerShouldNotAlreadyHaveBeenSelected(@Nonnull MockedSCM mockedSCM) + throws NodeNotFoundException, ContainerNotFoundException, TimeoutException, ContainerReplicaNotFoundException { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(10); + config.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); + + mockedSCM.enableLegacyReplicationManager(); + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + int numContainers = task.getContainerToTargetMap().size(); + + /* Assuming move is called exactly once for each unique container, number of calls to move should equal number of + unique containers. If number of calls to move is more than number of unique containers, at least one container + has been re-selected. It's expected that number of calls to move should equal number of unique, selected containers + (from containerToTargetMap). + */ + verify(mockedSCM.getReplicationManager(), times(numContainers)) + .move(any(ContainerID.class), any(DatanodeDetails.class), any(DatanodeDetails.class)); + + // Try the same test by disabling LegacyReplicationManager so that MoveManager is used. + mockedSCM.disableLegacyReplicationManager(); + ContainerBalancerTask nextTask = mockedSCM.startBalancerTask(config); + + numContainers = nextTask.getContainerToTargetMap().size(); + verify(mockedSCM.getMoveManager(), times(numContainers)) + .move(any(ContainerID.class), any(DatanodeDetails.class), any(DatanodeDetails.class)); + } + + @ParameterizedTest(name = "MockedSCM #{index}: {0}") + @MethodSource("createMockedSCMs") + public void balancerShouldNotSelectConfiguredExcludeContainers(@Nonnull MockedSCM mockedSCM) { + ContainerBalancerConfiguration config = balancerConfigByOzoneConfig(new OzoneConfiguration()); + int nodeCount = mockedSCM.getCluster().getNodeCount(); + if (nodeCount < DATANODE_COUNT_LIMIT_FOR_SMALL_CLUSTER) { + config.setMaxDatanodesPercentageToInvolvePerIteration(100); + } + config.setIterations(1); + config.setThreshold(10); + config.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); + config.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); + config.setExcludeContainers("1, 4, 5"); + + ContainerBalancerTask task = mockedSCM.startBalancerTask(config); + + Set excludeContainers = config.getExcludeContainers(); + for (ContainerID container : task.getContainerToSourceMap().keySet()) { + assertThat(excludeContainers).doesNotContain(container); + } + } public static List getUnBalancedNodes(@Nonnull ContainerBalancerTask task) { ArrayList result = new ArrayList<>(); diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerStatusInfo.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerStatusInfo.java new file mode 100644 index 000000000000..b8ac648e8442 --- /dev/null +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerStatusInfo.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.scm.container.balancer; + +import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.ozone.OzoneConsts; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Tests for {@link ContainerBalancerStatusInfo}. + */ +class TestContainerBalancerStatusInfo { + + @Test + void testGetIterationStatistics() { + MockedSCM mockedScm = new MockedSCM(new TestableCluster(20, OzoneConsts.GB)); + + ContainerBalancerConfiguration config = new OzoneConfiguration().getObject(ContainerBalancerConfiguration.class); + + config.setIterations(2); + config.setBalancingInterval(0); + config.setMaxSizeToMovePerIteration(50 * OzoneConsts.GB); + + ContainerBalancerTask task = mockedScm.startBalancerTask(config); + List iterationStatistics = task.getCurrentIterationsStatistic(); + assertEquals(3, iterationStatistics.size()); + iterationStatistics.forEach(is -> { + assertTrue(is.getContainerMovesCompleted() > 0); + assertEquals(0, is.getContainerMovesFailed()); + assertEquals(0, is.getContainerMovesTimeout()); + assertFalse(is.getSizeEnteringNodesGB().isEmpty()); + assertFalse(is.getSizeLeavingNodesGB().isEmpty()); + }); + + } +} diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java index 0f4551b45c24..d0e9cd53fec1 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancerTask.java @@ -27,7 +27,6 @@ import org.apache.hadoop.hdds.protocol.MockDatanodeDetails; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto; -import org.apache.hadoop.hdds.scm.ContainerPlacementStatus; import org.apache.hadoop.hdds.scm.PlacementPolicy; import org.apache.hadoop.hdds.scm.PlacementPolicyValidateProxy; import org.apache.hadoop.hdds.scm.container.ContainerID; @@ -47,7 +46,6 @@ import org.apache.hadoop.hdds.scm.ha.StatefulServiceStateManagerImpl; import org.apache.hadoop.hdds.scm.net.NetworkTopology; import org.apache.hadoop.hdds.scm.node.DatanodeUsageInfo; -import org.apache.hadoop.hdds.scm.node.NodeStatus; import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; import org.apache.hadoop.hdds.server.events.EventPublisher; @@ -74,11 +72,9 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotSame; -import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.apache.hadoop.hdds.scm.container.replication.ReplicationManager.ReplicationManagerConfiguration; @@ -86,10 +82,8 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; /** @@ -248,259 +242,6 @@ public void setup(TestInfo testInfo) throws IOException, NodeNotFoundException, sb.getMetrics(), balancerConfiguration, false); } - @Test - public void containerBalancerShouldSelectOnlyClosedContainers() - throws IllegalContainerBalancerStateException, IOException, - InvalidContainerBalancerConfigurationException, TimeoutException { - // make all containers open, balancer should not select any of them - for (ContainerInfo containerInfo : cidToInfoMap.values()) { - containerInfo.setState(HddsProtos.LifeCycleState.OPEN); - } - balancerConfiguration.setThreshold(10); - startBalancer(balancerConfiguration); - stopBalancer(); - - // balancer should have identified unbalanced nodes - assertFalse(TestContainerBalancerDatanodeNodeLimit.getUnBalancedNodes(containerBalancerTask).isEmpty()); - // no container should have been selected - assertTrue(containerBalancerTask.getContainerToSourceMap() - .isEmpty()); - /* - Iteration result should be CAN_NOT_BALANCE_ANY_MORE because no container - move is generated - */ - assertEquals( - ContainerBalancerTask.IterationResult.CAN_NOT_BALANCE_ANY_MORE, - containerBalancerTask.getIterationResult()); - - // now, close all containers - for (ContainerInfo containerInfo : cidToInfoMap.values()) { - containerInfo.setState(HddsProtos.LifeCycleState.CLOSED); - } - startBalancer(balancerConfiguration); - stopBalancer(); - - // check whether all selected containers are closed - for (ContainerID cid: - containerBalancerTask.getContainerToSourceMap().keySet()) { - assertSame( - cidToInfoMap.get(cid).getState(), HddsProtos.LifeCycleState.CLOSED); - } - } - - /** - * Container Balancer should not select a non-CLOSED replica for moving. - */ - @Test - public void balancerShouldNotSelectNonClosedContainerReplicas() - throws IOException, IllegalContainerBalancerStateException, - InvalidContainerBalancerConfigurationException, TimeoutException { - - // let's mock such that all replicas have CLOSING state - when(containerManager.getContainerReplicas(any(ContainerID.class))) - .thenAnswer(invocationOnMock -> { - ContainerID cid = (ContainerID) invocationOnMock.getArguments()[0]; - Set replicas = cidToReplicasMap.get(cid); - Set replicasToReturn = - new HashSet<>(replicas.size()); - for (ContainerReplica replica : replicas) { - ContainerReplica newReplica = - replica.toBuilder().setContainerState( - ContainerReplicaProto.State.CLOSING).build(); - replicasToReturn.add(newReplica); - } - - return replicasToReturn; - }); - - balancerConfiguration.setThreshold(10); - balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100); - balancerConfiguration.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); - balancerConfiguration.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); - - startBalancer(balancerConfiguration); - stopBalancer(); - - // balancer should have identified unbalanced nodes - assertFalse(TestContainerBalancerDatanodeNodeLimit.getUnBalancedNodes(containerBalancerTask).isEmpty()); - // no container should have moved because all replicas are CLOSING - assertTrue( - containerBalancerTask.getContainerToSourceMap().isEmpty()); - } - - @Test - public void containerBalancerShouldObeyMaxSizeToMoveLimit() - throws IllegalContainerBalancerStateException, IOException, - InvalidContainerBalancerConfigurationException, TimeoutException { - balancerConfiguration.setThreshold(1); - balancerConfiguration.setMaxSizeToMovePerIteration(10 * STORAGE_UNIT); - balancerConfiguration.setIterations(1); - startBalancer(balancerConfiguration); - - // balancer should not have moved more size than the limit - assertThat(containerBalancerTask.getSizeScheduledForMoveInLatestIteration()) - .isLessThanOrEqualTo(10 * STORAGE_UNIT); - - long size = containerBalancerTask.getMetrics() - .getDataSizeMovedGBInLatestIteration(); - assertThat(size).isGreaterThan(0); - assertThat(size).isLessThanOrEqualTo(10); - stopBalancer(); - } - - @Test - public void targetDatanodeShouldNotAlreadyContainSelectedContainer() - throws IllegalContainerBalancerStateException, IOException, - InvalidContainerBalancerConfigurationException, TimeoutException { - balancerConfiguration.setThreshold(10); - balancerConfiguration.setMaxSizeToMovePerIteration(100 * STORAGE_UNIT); - balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100); - startBalancer(balancerConfiguration); - - stopBalancer(); - Map map = - containerBalancerTask.getContainerToTargetMap(); - for (Map.Entry entry : map.entrySet()) { - ContainerID container = entry.getKey(); - DatanodeDetails target = entry.getValue(); - assertTrue(cidToReplicasMap.get(container) - .stream() - .map(ContainerReplica::getDatanodeDetails) - .noneMatch(target::equals)); - } - } - - @Test - public void containerMoveSelectionShouldFollowPlacementPolicy() - throws IllegalContainerBalancerStateException, IOException, - InvalidContainerBalancerConfigurationException, TimeoutException { - balancerConfiguration.setThreshold(10); - balancerConfiguration.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); - balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100); - balancerConfiguration.setIterations(1); - startBalancer(balancerConfiguration); - - stopBalancer(); - Map containerFromSourceMap = - containerBalancerTask.getContainerToSourceMap(); - Map containerToTargetMap = - containerBalancerTask.getContainerToTargetMap(); - - // for each move selection, check if {replicas - source + target} - // satisfies placement policy - for (Map.Entry entry : - containerFromSourceMap.entrySet()) { - ContainerID container = entry.getKey(); - DatanodeDetails source = entry.getValue(); - - List replicas = cidToReplicasMap.get(container) - .stream() - .map(ContainerReplica::getDatanodeDetails) - .collect(Collectors.toList()); - // remove source and add target - replicas.remove(source); - replicas.add(containerToTargetMap.get(container)); - - ContainerInfo containerInfo = cidToInfoMap.get(container); - ContainerPlacementStatus placementStatus; - if (containerInfo.getReplicationType() == - HddsProtos.ReplicationType.RATIS) { - placementStatus = placementPolicy.validateContainerPlacement(replicas, - containerInfo.getReplicationConfig().getRequiredNodes()); - } else { - placementStatus = - ecPlacementPolicy.validateContainerPlacement(replicas, - containerInfo.getReplicationConfig().getRequiredNodes()); - } - assertTrue(placementStatus.isPolicySatisfied()); - } - } - - @Test - public void targetDatanodeShouldBeInServiceHealthy() - throws NodeNotFoundException, IllegalContainerBalancerStateException, - IOException, InvalidContainerBalancerConfigurationException, - TimeoutException { - balancerConfiguration.setThreshold(10); - balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100); - balancerConfiguration.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); - balancerConfiguration.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); - balancerConfiguration.setIterations(1); - startBalancer(balancerConfiguration); - - stopBalancer(); - for (DatanodeDetails target : containerBalancerTask.getSelectedTargets()) { - NodeStatus status = mockNodeManager.getNodeStatus(target); - assertSame(HddsProtos.NodeOperationalState.IN_SERVICE, - status.getOperationalState()); - assertTrue(status.isHealthy()); - } - } - - @Test - public void selectedContainerShouldNotAlreadyHaveBeenSelected() - throws IllegalContainerBalancerStateException, IOException, - InvalidContainerBalancerConfigurationException, NodeNotFoundException, - TimeoutException { - balancerConfiguration.setThreshold(10); - balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100); - balancerConfiguration.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); - balancerConfiguration.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); - balancerConfiguration.setIterations(1); - rmConf.setEnableLegacy(true); - - startBalancer(balancerConfiguration); - - stopBalancer(); - - int numContainers = containerBalancerTask.getContainerToTargetMap().size(); - - /* - Assuming move is called exactly once for each unique container, number of - calls to move should equal number of unique containers. If number of - calls to move is more than number of unique containers, at least one - container has been re-selected. It's expected that number of calls to - move should equal number of unique, selected containers (from - containerToTargetMap). - */ - verify(replicationManager, times(numContainers)) - .move(any(ContainerID.class), any(DatanodeDetails.class), - any(DatanodeDetails.class)); - - /* - Try the same test by disabling LegacyReplicationManager so that - MoveManager is used. - */ - rmConf.setEnableLegacy(false); - startBalancer(balancerConfiguration); - stopBalancer(); - numContainers = containerBalancerTask.getContainerToTargetMap().size(); - verify(moveManager, times(numContainers)) - .move(any(ContainerID.class), any(DatanodeDetails.class), - any(DatanodeDetails.class)); - } - - @Test - public void balancerShouldNotSelectConfiguredExcludeContainers() - throws IllegalContainerBalancerStateException, IOException, - InvalidContainerBalancerConfigurationException, TimeoutException { - balancerConfiguration.setThreshold(10); - balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100); - balancerConfiguration.setMaxSizeToMovePerIteration(50 * STORAGE_UNIT); - balancerConfiguration.setMaxSizeEnteringTarget(50 * STORAGE_UNIT); - balancerConfiguration.setExcludeContainers("1, 4, 5"); - - startBalancer(balancerConfiguration); - - stopBalancer(); - Set excludeContainers = - balancerConfiguration.getExcludeContainers(); - for (ContainerID container : - containerBalancerTask.getContainerToSourceMap().keySet()) { - assertThat(excludeContainers).doesNotContain(container); - } - } - /** * Tests if {@link ContainerBalancer} follows the includeNodes and * excludeNodes configurations in {@link ContainerBalancerConfiguration}. diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestInterSCMGrpcProtocolService.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestInterSCMGrpcProtocolService.java index dfb3ff5179e0..8c9c643f689b 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestInterSCMGrpcProtocolService.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestInterSCMGrpcProtocolService.java @@ -17,13 +17,15 @@ package org.apache.hadoop.hdds.scm.ha; +import com.google.common.collect.ImmutableList; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.metadata.SCMMetadataStore; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509KeyManager; +import org.apache.hadoop.hdds.security.ssl.ReloadingX509TrustManager; import org.apache.hadoop.hdds.security.x509.CertificateTestUtils; import org.apache.hadoop.hdds.security.x509.certificate.client.SCMCertificateClient; import org.apache.hadoop.hdds.utils.TransactionInfo; @@ -36,11 +38,6 @@ import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; -import javax.net.ssl.KeyManager; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509KeyManager; -import javax.net.ssl.X509TrustManager; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -48,6 +45,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.security.KeyPair; +import java.security.KeyStore; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.concurrent.CompletableFuture; @@ -57,10 +55,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -79,10 +77,10 @@ class TestInterSCMGrpcProtocolService { private X509Certificate serviceCert; private X509Certificate clientCert; - private X509KeyManager serverKeyManager; - private X509TrustManager serverTrustManager; - private X509KeyManager clientKeyManager; - private X509TrustManager clientTrustManager; + private ReloadingX509KeyManager serverKeyManager; + private ReloadingX509TrustManager serverTrustManager; + private ReloadingX509KeyManager clientKeyManager; + private ReloadingX509TrustManager clientTrustManager; @TempDir private Path temp; @@ -205,62 +203,25 @@ private SCMCertificateClient setupCertificateClientForMTLS( serviceCert = createSelfSignedCert(serviceKeys, "service"); clientCert = createSelfSignedCert(clientKeys, "client"); - serverKeyManager = aKeyManagerWith(serviceKeys, serviceCert); - serverTrustManager = aTrustManagerThatTrusts(clientCert); - KeyStoresFactory serverKeyStores = - aKeyStoresFactoryWith(serverKeyManager, serverTrustManager); - - clientKeyManager = aKeyManagerWith(clientKeys, clientCert); - clientTrustManager = aTrustManagerThatTrusts(serviceCert); - KeyStoresFactory clientKeyStores = - aKeyStoresFactoryWith(clientKeyManager, clientTrustManager); + ReloadingX509TrustManager toSpyServerTrustManager = new ReloadingX509TrustManager(KeyStore.getDefaultType(), + ImmutableList.of(clientCert)); + serverTrustManager = spy(toSpyServerTrustManager); + ReloadingX509TrustManager toSpyClientTrustManager = new ReloadingX509TrustManager(KeyStore.getDefaultType(), + ImmutableList.of(serviceCert)); + clientTrustManager = spy(toSpyClientTrustManager); + ReloadingX509KeyManager toSpyServerKeyManager = new ReloadingX509KeyManager(KeyStore.getDefaultType(), "server", + serviceKeys.getPrivate(), ImmutableList.of(serviceCert)); + ReloadingX509KeyManager toSpyClientKeyManager = new ReloadingX509KeyManager(KeyStore.getDefaultType(), "server", + clientKeys.getPrivate(), ImmutableList.of(clientCert)); + clientKeyManager = spy(toSpyClientKeyManager); + serverKeyManager = spy(toSpyServerKeyManager); SCMCertificateClient scmCertClient = mock(SCMCertificateClient.class); - doReturn(serverKeyStores).when(scmCertClient).getServerKeyStoresFactory(); - doReturn(clientKeyStores).when(scmCertClient).getClientKeyStoresFactory(); + doReturn(serverKeyManager, clientKeyManager).when(scmCertClient).getKeyManager(); + doReturn(serverTrustManager, clientTrustManager).when(scmCertClient).getTrustManager(); return scmCertClient; } - private KeyStoresFactory aKeyStoresFactoryWith( - X509KeyManager keyManager, - X509TrustManager trustManager - ) { - KeyStoresFactory serverKeyStores = mock(KeyStoresFactory.class); - doReturn(new KeyManager[]{keyManager}) - .when(serverKeyStores).getKeyManagers(); - doReturn(new TrustManager[]{trustManager}) - .when(serverKeyStores).getTrustManagers(); - return serverKeyStores; - } - - private X509TrustManager aTrustManagerThatTrusts(X509Certificate certificate) - throws CertificateException { - X509TrustManager trustManager = mock(X509TrustManager.class); - doNothing().when(trustManager).checkServerTrusted(any(), any()); - doNothing().when(trustManager).checkClientTrusted(any(), any()); - doReturn(new X509Certificate[] {certificate}) - .when(trustManager).getAcceptedIssuers(); - return trustManager; - } - - private X509KeyManager aKeyManagerWith(KeyPair keyPair, - X509Certificate certificate) { - X509KeyManager keyManager = mock(X509KeyManager.class); - doReturn("server") - .when(keyManager).chooseServerAlias(any(), any(), any()); - doReturn("client") - .when(keyManager).chooseClientAlias(any(), any(), any()); - doReturn(new String[] {"server"}) - .when(keyManager).getServerAliases(any(), any()); - doReturn(new String[] {"client"}) - .when(keyManager).getClientAliases(any(), any()); - doReturn(new X509Certificate[] {certificate}) - .when(keyManager).getCertificateChain(any()); - doReturn(keyPair.getPrivate()) - .when(keyManager).getPrivateKey(any()); - return keyManager; - } - private OzoneConfiguration setupConfiguration(int port) { OzoneConfiguration conf = new OzoneConfiguration(); conf.setInt(ScmConfigKeys.OZONE_SCM_GRPC_PORT_KEY, port); @@ -269,5 +230,4 @@ private OzoneConfiguration setupConfiguration(int port) { return conf; } - } diff --git a/hadoop-hdds/test-utils/pom.xml b/hadoop-hdds/test-utils/pom.xml index ea3c94b65a6d..f720d65bdf50 100644 --- a/hadoop-hdds/test-utils/pom.xml +++ b/hadoop-hdds/test-utils/pom.xml @@ -106,4 +106,15 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + + + org.apache.maven.plugins + maven-compiler-plugin + + none + + + + diff --git a/hadoop-hdds/tools/pom.xml b/hadoop-hdds/tools/pom.xml index 5122f1d4a450..5e7238f5f3eb 100644 --- a/hadoop-hdds/tools/pom.xml +++ b/hadoop-hdds/tools/pom.xml @@ -110,4 +110,51 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> test + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + org.kohsuke.metainf-services + metainf-services + ${metainf-services.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + org.kohsuke.metainf_services.AnnotationProcessorImpl + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + + + + + + + + + diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java index 44e4d4c9c50b..e58074bf140a 100644 --- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStatusSubcommand.java @@ -18,10 +18,22 @@ package org.apache.hadoop.hdds.scm.cli; import org.apache.hadoop.hdds.cli.HddsVersionProvider; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfo; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo; import org.apache.hadoop.hdds.scm.client.ScmClient; +import org.apache.hadoop.ozone.OzoneConsts; +import picocli.CommandLine; import picocli.CommandLine.Command; import java.io.IOException; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.List; +import java.util.stream.Collectors; /** * Handler to query status of container balancer. @@ -33,13 +45,134 @@ versionProvider = HddsVersionProvider.class) public class ContainerBalancerStatusSubcommand extends ScmSubcommand { + @CommandLine.Option(names = {"-v", "--verbose"}, + description = "Verbose output. Show current iteration info.") + private boolean verbose; + + @CommandLine.Option(names = {"-H", "--history"}, + description = "Verbose output with history. Show current iteration info and history of iterations. " + + "Works only with -v.") + private boolean verboseWithHistory; + @Override public void execute(ScmClient scmClient) throws IOException { - boolean execReturn = scmClient.getContainerBalancerStatus(); - if (execReturn) { + ContainerBalancerStatusInfoResponseProto response = scmClient.getContainerBalancerStatusInfo(); + boolean isRunning = response.getIsRunning(); + ContainerBalancerStatusInfo balancerStatusInfo = response.getContainerBalancerStatusInfo(); + if (isRunning) { + LocalDateTime dateTime = + LocalDateTime.ofInstant(Instant.ofEpochSecond(balancerStatusInfo.getStartedAt()), ZoneId.systemDefault()); System.out.println("ContainerBalancer is Running."); + + if (verbose) { + System.out.printf("Started at: %s %s%n%n", dateTime.toLocalDate(), dateTime.toLocalTime()); + System.out.println(getConfigurationPrettyString(balancerStatusInfo.getConfiguration())); + List iterationsStatusInfoList + = balancerStatusInfo.getIterationsStatusInfoList(); + + System.out.println("Current iteration info:"); + System.out.println( + getPrettyIterationStatusInfo(iterationsStatusInfoList.get(iterationsStatusInfoList.size() - 1)) + ); + + if (verboseWithHistory) { + System.out.println("Iteration history list:"); + System.out.println( + iterationsStatusInfoList.stream().map(this::getPrettyIterationStatusInfo) + .collect(Collectors.joining("\n")) + ); + } + } + } else { System.out.println("ContainerBalancer is Not Running."); } } + + String getConfigurationPrettyString(HddsProtos.ContainerBalancerConfigurationProto configuration) { + return String.format("Container Balancer Configuration values:%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %d%n" + + "%-50s %dGB%n" + + "%-50s %dGB%n" + + "%-50s %dGB%n" + + "%-50s %d%n" + + "%-50s %dmin%n" + + "%-50s %dmin%n" + + "%-50s %dmin%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n", "Key", "Value", "Threshold", + configuration.getUtilizationThreshold(), "Max Datanodes to Involve per Iteration(percent)", + configuration.getDatanodesInvolvedMaxPercentagePerIteration(), + "Max Size to Move per Iteration", + configuration.getDatanodesInvolvedMaxPercentagePerIteration() / OzoneConsts.GB, + "Max Size Entering Target per Iteration", + configuration.getSizeEnteringTargetMax() / OzoneConsts.GB, + "Max Size Leaving Source per Iteration", + configuration.getSizeLeavingSourceMax() / OzoneConsts.GB, + "Number of Iterations", + configuration.getIterations(), + "Time Limit for Single Container's Movement", + Duration.ofMillis(configuration.getMoveTimeout()).toMinutes(), + "Time Limit for Single Container's Replication", + Duration.ofMillis(configuration.getMoveReplicationTimeout()).toMinutes(), + "Interval between each Iteration", + Duration.ofMillis(configuration.getBalancingIterationInterval()).toMinutes(), + "Whether to Enable Network Topology", + configuration.getMoveNetworkTopologyEnable(), + "Whether to Trigger Refresh Datanode Usage Info", + configuration.getTriggerDuBeforeMoveEnable(), + "Container IDs to Exclude from Balancing", + configuration.getExcludeContainers().isEmpty() ? "None" : configuration.getExcludeContainers(), + "Datanodes Specified to be Balanced", + configuration.getIncludeDatanodes().isEmpty() ? "None" : configuration.getIncludeDatanodes(), + "Datanodes Excluded from Balancing", + configuration.getExcludeDatanodes().isEmpty() ? "None" : configuration.getExcludeDatanodes()); + } + + private String getPrettyIterationStatusInfo(ContainerBalancerTaskIterationStatusInfo iterationStatusInfo) { + int iterationNumber = iterationStatusInfo.getIterationNumber(); + String iterationResult = iterationStatusInfo.getIterationResult(); + long sizeScheduledForMove = iterationStatusInfo.getSizeScheduledForMoveGB(); + long dataSizeMovedGB = iterationStatusInfo.getDataSizeMovedGB(); + long containerMovesScheduled = iterationStatusInfo.getContainerMovesScheduled(); + long containerMovesCompleted = iterationStatusInfo.getContainerMovesCompleted(); + long containerMovesFailed = iterationStatusInfo.getContainerMovesFailed(); + long containerMovesTimeout = iterationStatusInfo.getContainerMovesTimeout(); + String enteringDataNodeList = iterationStatusInfo.getSizeEnteringNodesGBList() + .stream().map(nodeInfo -> nodeInfo.getUuid() + " <- " + nodeInfo.getDataVolumeGB() + "\n") + .collect(Collectors.joining()); + String leavingDataNodeList = iterationStatusInfo.getSizeLeavingNodesGBList() + .stream().map(nodeInfo -> nodeInfo.getUuid() + " -> " + nodeInfo.getDataVolumeGB() + "\n") + .collect(Collectors.joining()); + return String.format( + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %s%n" + + "%-50s %n%s" + + "%-50s %n%s", + "Key", "Value", + "Iteration number", iterationNumber, + "Iteration result", + iterationResult.isEmpty() ? "IN_PROGRESS" : iterationResult, + "Size scheduled to move", sizeScheduledForMove, + "Moved data size", dataSizeMovedGB, + "Scheduled to move containers", containerMovesScheduled, + "Already moved containers", containerMovesCompleted, + "Failed to move containers", containerMovesFailed, + "Failed to move containers by timeout", containerMovesTimeout, + "Entered data to nodes", enteringDataNodeList, + "Exited data from nodes", leavingDataNodeList); + } } + diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java index 0dd52cd291ab..ba556bf24e98 100644 --- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos.DeletedBlocksTransactionInfo; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.DecommissionScmResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.StartContainerBalancerResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; import org.apache.hadoop.hdds.scm.DatanodeAdminError; import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.XceiverClientManager; @@ -508,6 +509,11 @@ public boolean getContainerBalancerStatus() throws IOException { return storageContainerLocationClient.getContainerBalancerStatus(); } + @Override + public ContainerBalancerStatusInfoResponseProto getContainerBalancerStatusInfo() throws IOException { + return storageContainerLocationClient.getContainerBalancerStatusInfo(); + } + @Override public List getScmRatisRoles() throws IOException { return storageContainerLocationClient.getScmInfo().getRatisPeerRoles(); diff --git a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java index 27c360e72743..41b419d23263 100644 --- a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java +++ b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java @@ -18,10 +18,13 @@ package org.apache.hadoop.hdds.scm.cli.datanode; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos; -import org.apache.hadoop.hdds.scm.cli.ContainerBalancerStopSubcommand; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfo; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ContainerBalancerStatusInfoResponseProto; import org.apache.hadoop.hdds.scm.cli.ContainerBalancerStartSubcommand; import org.apache.hadoop.hdds.scm.cli.ContainerBalancerStatusSubcommand; +import org.apache.hadoop.hdds.scm.cli.ContainerBalancerStopSubcommand; import org.apache.hadoop.hdds.scm.client.ScmClient; +import org.apache.hadoop.hdds.scm.container.balancer.ContainerBalancerConfiguration; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,6 +34,8 @@ import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; +import java.time.OffsetDateTime; +import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -42,16 +47,16 @@ * Unit tests to validate the ContainerBalancerSubCommand class includes the * correct output when executed against a mock client. */ -public class TestContainerBalancerSubCommand { +class TestContainerBalancerSubCommand { - private ContainerBalancerStopSubcommand stopCmd; - private ContainerBalancerStartSubcommand startCmd; - private ContainerBalancerStatusSubcommand statusCmd; + private static final String DEFAULT_ENCODING = StandardCharsets.UTF_8.name(); private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); private final PrintStream originalOut = System.out; private final PrintStream originalErr = System.err; - private static final String DEFAULT_ENCODING = StandardCharsets.UTF_8.name(); + private ContainerBalancerStopSubcommand stopCmd; + private ContainerBalancerStartSubcommand startCmd; + private ContainerBalancerStatusSubcommand statusCmd; @BeforeEach public void setup() throws UnsupportedEncodingException { @@ -69,15 +74,147 @@ public void tearDown() { } @Test - public void testContainerBalancerStatusSubcommandRunning() - throws IOException { + public void testContainerBalancerStatusInfoSubcommandRunning() + throws IOException { ScmClient scmClient = mock(ScmClient.class); + ContainerBalancerConfiguration config = new ContainerBalancerConfiguration(); + config.setThreshold(10); + config.setMaxDatanodesPercentageToInvolvePerIteration(20); + config.setMaxSizeToMovePerIteration(53687091200L); + config.setMaxSizeEnteringTarget(27917287424L); + config.setMaxSizeLeavingSource(27917287424L); + config.setIterations(2); + config.setExcludeNodes(""); + config.setMoveTimeout(3900000); + config.setMoveReplicationTimeout(3000000); + config.setBalancingInterval(0); + config.setIncludeNodes(""); + config.setExcludeNodes(""); + config.setNetworkTopologyEnable(false); + config.setTriggerDuEnable(false); + + StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo iteration0StatusInfo = + StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo.newBuilder() + .setIterationNumber(0) + .setIterationResult("ITERATION_COMPLETED") + .setSizeScheduledForMoveGB(48) + .setDataSizeMovedGB(48) + .setContainerMovesScheduled(11) + .setContainerMovesCompleted(11) + .setContainerMovesFailed(0) + .setContainerMovesTimeout(0) + .addSizeEnteringNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("80f6bc27-e6f3-493e-b1f4-25f810ad960d") + .setDataVolumeGB(27) + .build() + ) + .addSizeEnteringNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("701ca98e-aa1a-4b36-b817-e28ed634bba6") + .setDataVolumeGB(23L) + .build() + ) + .addSizeLeavingNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("b8b9c511-c30f-4933-8938-2f272e307070") + .setDataVolumeGB(24L) + .build() + ) + .addSizeLeavingNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("7bd99815-47e7-4015-bc61-ca6ef6dfd130") + .setDataVolumeGB(26L) + .build() + ) + .build(); + StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo iteration1StatusInfo = + StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo.newBuilder() + .setIterationNumber(1) + .setIterationResult("ITERATION_COMPLETED") + .setSizeScheduledForMoveGB(48) + .setDataSizeMovedGB(48) + .setContainerMovesScheduled(11) + .setContainerMovesCompleted(11) + .setContainerMovesFailed(0) + .setContainerMovesTimeout(0) + .addSizeEnteringNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("80f6bc27-e6f3-493e-b1f4-25f810ad960d") + .setDataVolumeGB(27L) + .build() + ) + .addSizeEnteringNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("701ca98e-aa1a-4b36-b817-e28ed634bba6") + .setDataVolumeGB(23L) + .build() + ) + .addSizeLeavingNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("b8b9c511-c30f-4933-8938-2f272e307070") + .setDataVolumeGB(24L) + .build() + ) + .addSizeLeavingNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("7bd99815-47e7-4015-bc61-ca6ef6dfd130") + .setDataVolumeGB(26L) + .build() + ) + .build(); + StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo iteration2StatusInfo = + StorageContainerLocationProtocolProtos.ContainerBalancerTaskIterationStatusInfo.newBuilder() + .setIterationNumber(1) + .setIterationResult("") + .setSizeScheduledForMoveGB(48) + .setDataSizeMovedGB(48) + .setContainerMovesScheduled(11) + .setContainerMovesCompleted(11) + .setContainerMovesFailed(0) + .setContainerMovesTimeout(0) + .addSizeEnteringNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("80f6bc27-e6f3-493e-b1f4-25f810ad960d") + .setDataVolumeGB(27L) + .build() + ) + .addSizeEnteringNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("701ca98e-aa1a-4b36-b817-e28ed634bba6") + .setDataVolumeGB(23L) + .build() + ) + .addSizeLeavingNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("b8b9c511-c30f-4933-8938-2f272e307070") + .setDataVolumeGB(24L) + .build() + ) + .addSizeLeavingNodesGB( + StorageContainerLocationProtocolProtos.NodeTransferInfo.newBuilder() + .setUuid("7bd99815-47e7-4015-bc61-ca6ef6dfd130") + .setDataVolumeGB(26L) + .build() + ) + .build(); + ContainerBalancerStatusInfoResponseProto statusInfoResponseProto = + ContainerBalancerStatusInfoResponseProto.newBuilder() + .setIsRunning(true) + .setContainerBalancerStatusInfo(ContainerBalancerStatusInfo.newBuilder() + .setStartedAt(OffsetDateTime.now().toEpochSecond()) + .setConfiguration(config.toProtobufBuilder().setShouldRun(true)) + .addAllIterationsStatusInfo( + Arrays.asList(iteration0StatusInfo, iteration1StatusInfo, iteration2StatusInfo) + ) + ) + + .build(); //test status is running - when(scmClient.getContainerBalancerStatus()).thenAnswer(invocation -> true); + when(scmClient.getContainerBalancerStatusInfo()).thenReturn(statusInfoResponseProto); statusCmd.execute(scmClient); - Pattern p = Pattern.compile( "^ContainerBalancer\\sis\\sRunning."); Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING)); @@ -85,11 +222,32 @@ public void testContainerBalancerStatusSubcommandRunning() } @Test - public void testContainerBalancerStatusSubcommandNotRunning() - throws IOException { + public void testContainerBalancerStatusInfoSubcommandRunningOnStoppedBalancer() + throws IOException { ScmClient scmClient = mock(ScmClient.class); - when(scmClient.getContainerBalancerStatus()).thenAnswer(invocation -> false); + //test status is running + when(scmClient.getContainerBalancerStatusInfo()).thenReturn( + ContainerBalancerStatusInfoResponseProto.newBuilder() + .setIsRunning(false) + .build()); + + statusCmd.execute(scmClient); + Pattern p = Pattern.compile( + "^ContainerBalancer\\sis\\sNot\\sRunning."); + Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING)); + assertTrue(m.find()); + } + + @Test + void testContainerBalancerStatusSubcommandNotRunning() + throws IOException { + ScmClient scmClient = mock(ScmClient.class); + + when(scmClient.getContainerBalancerStatusInfo()).thenReturn( + ContainerBalancerStatusInfoResponseProto.newBuilder() + .setIsRunning(false) + .build()); statusCmd.execute(scmClient); @@ -100,13 +258,13 @@ public void testContainerBalancerStatusSubcommandNotRunning() } @Test - public void testContainerBalancerStopSubcommand() throws IOException { + public void testContainerBalancerStopSubcommand() throws IOException { ScmClient scmClient = mock(ScmClient.class); stopCmd.execute(scmClient); Pattern p = Pattern.compile("^Sending\\sstop\\scommand." + - "\\sWaiting\\sfor\\sContainer\\sBalancer\\sto\\sstop...\\n" + - "Container\\sBalancer\\sstopped."); + "\\sWaiting\\sfor\\sContainer\\sBalancer\\sto\\sstop...\\n" + + "Container\\sBalancer\\sstopped."); Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING)); assertTrue(m.find()); @@ -114,10 +272,10 @@ public void testContainerBalancerStopSubcommand() throws IOException { @Test public void testContainerBalancerStartSubcommandWhenBalancerIsNotRunning() - throws IOException { + throws IOException { ScmClient scmClient = mock(ScmClient.class); when(scmClient.startContainerBalancer( - null, null, null, null, null, null, null, null, null, null, null, null)) + null, null, null, null, null, null, null, null, null, null, null, null)) .thenReturn( StorageContainerLocationProtocolProtos .StartContainerBalancerResponseProto.newBuilder() @@ -133,10 +291,10 @@ public void testContainerBalancerStartSubcommandWhenBalancerIsNotRunning() @Test public void testContainerBalancerStartSubcommandWhenBalancerIsRunning() - throws IOException { + throws IOException { ScmClient scmClient = mock(ScmClient.class); when(scmClient.startContainerBalancer( - null, null, null, null, null, null, null, null, null, null, null, null)) + null, null, null, null, null, null, null, null, null, null, null, null)) .thenReturn(StorageContainerLocationProtocolProtos .StartContainerBalancerResponseProto.newBuilder() .setStart(false) diff --git a/hadoop-ozone/client/pom.xml b/hadoop-ozone/client/pom.xml index 2a052584ada1..dac609caa46d 100644 --- a/hadoop-ozone/client/pom.xml +++ b/hadoop-ozone/client/pom.xml @@ -79,6 +79,43 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java index 575701be8001..216b51b8e866 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneBucket.java @@ -490,6 +490,28 @@ public OzoneOutputStream createKey(String key, long size, .createKey(volumeName, name, key, size, replicationConfig, keyMetadata, tags); } + /** + * This API allows to atomically update an existing key. The key read before invoking this API + * should remain unchanged for this key to be written. This is controlled by the generation + * field in the existing Key param. If the key is replaced or updated the generation will change. If the + * generation has changed since the existing Key was read, either the initial key create will fail, + * or the key will fail to commit after the data has been written as the checks are carried out + * both at key open and commit time. + * + * @param keyName Existing key to rewrite. This must exist in the bucket. + * @param size The size of the new key + * @param existingKeyGeneration The generation of the existing key which is checked for changes at key create + * and commit time. + * @param replicationConfig The replication configuration for the key to be rewritten. + * @param metadata custom key value metadata + * @return OzoneOutputStream to which the data has to be written. + * @throws IOException + */ + public OzoneOutputStream rewriteKey(String keyName, long size, long existingKeyGeneration, + ReplicationConfig replicationConfig, Map metadata) throws IOException { + return proxy.rewriteKey(volumeName, name, keyName, size, existingKeyGeneration, replicationConfig, metadata); + } + /** * Creates a new key in the bucket, with default replication type RATIS and * with replication factor THREE. @@ -1862,8 +1884,7 @@ private void addKeyPrefixInfoToResultList(String keyPrefix, keyInfo.getDataSize(), keyInfo.getCreationTime(), keyInfo.getModificationTime(), keyInfo.getReplicationConfig(), - keyInfo.isFile(), - keyInfo.getOwnerName()); + keyInfo.isFile(), keyInfo.getOwnerName()); keysResultList.add(ozoneKey); } } diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java index fdd89fe81990..3b8d7fffbccf 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java @@ -72,10 +72,6 @@ public class OzoneKey { */ private final boolean isFile; - /** - * Constructs OzoneKey from OmKeyInfo. - * - */ @SuppressWarnings("parameternumber") public OzoneKey(String volumeName, String bucketName, String keyName, long size, long creationTime, @@ -219,6 +215,10 @@ public boolean isFile() { return isFile; } + /** + * Constructs OzoneKey from OmKeyInfo. + * + */ public static OzoneKey fromKeyInfo(OmKeyInfo keyInfo) { return new OzoneKey(keyInfo.getVolumeName(), keyInfo.getBucketName(), keyInfo.getKeyName(), keyInfo.getDataSize(), keyInfo.getCreationTime(), diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKeyDetails.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKeyDetails.java index 168e15d9bdd4..fe547794e92b 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKeyDetails.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKeyDetails.java @@ -42,6 +42,12 @@ public class OzoneKeyDetails extends OzoneKey { private final CheckedSupplier contentSupplier; + /** + * The generation of an existing key. This can be used with atomic commits, to + * ensure the key has not changed since the key details were read. + */ + private final Long generation; + /** * Constructs OzoneKeyDetails from OmKeyInfo. */ @@ -53,12 +59,30 @@ public OzoneKeyDetails(String volumeName, String bucketName, String keyName, Map metadata, FileEncryptionInfo feInfo, CheckedSupplier contentSupplier, - boolean isFile, String owner, Map tags) { + boolean isFile, String owner, Map tags, Long generation) { super(volumeName, bucketName, keyName, size, creationTime, modificationTime, replicationConfig, metadata, isFile, owner, tags); this.ozoneKeyLocations = ozoneKeyLocations; this.feInfo = feInfo; this.contentSupplier = contentSupplier; + this.generation = generation; + } + + /** + * Constructs OzoneKeyDetails from OmKeyInfo. + */ + @SuppressWarnings("parameternumber") + public OzoneKeyDetails(String volumeName, String bucketName, String keyName, + long size, long creationTime, long modificationTime, + List ozoneKeyLocations, + ReplicationConfig replicationConfig, + Map metadata, + FileEncryptionInfo feInfo, + CheckedSupplier contentSupplier, + boolean isFile, String owner, Map tags) { + this(volumeName, bucketName, keyName, size, creationTime, + modificationTime, ozoneKeyLocations, replicationConfig, metadata, feInfo, contentSupplier, + isFile, owner, tags, null); } /** @@ -72,6 +96,10 @@ public FileEncryptionInfo getFileEncryptionInfo() { return feInfo; } + public Long getGeneration() { + return generation; + } + /** * Get OzoneInputStream to read the content of the key. * @return OzoneInputStream diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java index 74344344f890..55985a18d36f 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java @@ -355,6 +355,29 @@ OzoneOutputStream createKey(String volumeName, String bucketName, Map metadata) throws IOException; + /** + * This API allows to atomically update an existing key. The key read before invoking this API + * should remain unchanged for this key to be written. This is controlled by the generation + * field in the existing Key param. If the key is replaced or updated the generation will change. If the + * generation has changed since the existing Key was read, either the initial key create will fail, + * or the key will fail to commit after the data has been written as the checks are carried out + * both at key open and commit time. + * + * @param volumeName Name of the Volume + * @param bucketName Name of the Bucket + * @param keyName Existing key to rewrite. This must exist in the bucket. + * @param size The size of the new key + * @param existingKeyGeneration The generation of the existing key which is checked for changes at key create + * and commit time. + * @param replicationConfig The replication configuration for the key to be rewritten. + * @param metadata custom key value metadata + * @return {@link OzoneOutputStream} + * @throws IOException + */ + OzoneOutputStream rewriteKey(String volumeName, String bucketName, String keyName, + long size, long existingKeyGeneration, ReplicationConfig replicationConfig, + Map metadata) throws IOException; + /** * Writes a key in an existing bucket. * @param volumeName Name of the Volume diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java index 248f21cd7034..3ddceadb460b 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java @@ -709,7 +709,7 @@ public void createBucket( private static void verifyVolumeName(String volumeName) throws OMException { try { - HddsClientUtils.verifyResourceName(volumeName, false); + HddsClientUtils.verifyResourceName(volumeName, "volume", false); } catch (IllegalArgumentException e) { throw new OMException(e.getMessage(), OMException.ResultCodes.INVALID_VOLUME_NAME); @@ -718,7 +718,7 @@ private static void verifyVolumeName(String volumeName) throws OMException { private static void verifyBucketName(String bucketName) throws OMException { try { - HddsClientUtils.verifyResourceName(bucketName, false); + HddsClientUtils.verifyResourceName(bucketName, "bucket", false); } catch (IllegalArgumentException e) { throw new OMException(e.getMessage(), OMException.ResultCodes.INVALID_BUCKET_NAME); @@ -1396,22 +1396,7 @@ public OzoneOutputStream createKey( String volumeName, String bucketName, String keyName, long size, ReplicationConfig replicationConfig, Map metadata, Map tags) throws IOException { - verifyVolumeName(volumeName); - verifyBucketName(bucketName); - if (checkKeyNameEnabled) { - HddsClientUtils.verifyKeyName(keyName); - } - HddsClientUtils.checkNotNull(keyName); - if (omVersion - .compareTo(OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT) < 0) { - if (replicationConfig != null && - replicationConfig.getReplicationType() - == HddsProtos.ReplicationType.EC) { - throw new IOException("Can not set the replication of the key to" - + " Erasure Coded replication, as OzoneManager does not support" - + " Erasure Coded replication."); - } - } + createKeyPreChecks(volumeName, bucketName, keyName, replicationConfig); if (omVersion.compareTo(OzoneManagerVersion.OBJECT_TAG) < 0) { if (tags != null && !tags.isEmpty()) { @@ -1419,9 +1404,6 @@ public OzoneOutputStream createKey( } } - if (replicationConfig != null) { - replicationConfigValidator.validate(replicationConfig); - } String ownerName = getRealUserInfo().getShortUserName(); OmKeyArgs.Builder builder = new OmKeyArgs.Builder() @@ -1447,6 +1429,61 @@ public OzoneOutputStream createKey( return createOutputStream(openKey); } + @Override + public OzoneOutputStream rewriteKey(String volumeName, String bucketName, String keyName, + long size, long existingKeyGeneration, ReplicationConfig replicationConfig, + Map metadata) throws IOException { + if (omVersion.compareTo(OzoneManagerVersion.ATOMIC_REWRITE_KEY) < 0) { + throw new IOException("OzoneManager does not support atomic key rewrite."); + } + + createKeyPreChecks(volumeName, bucketName, keyName, replicationConfig); + + OmKeyArgs.Builder builder = new OmKeyArgs.Builder() + .setVolumeName(volumeName) + .setBucketName(bucketName) + .setKeyName(keyName) + .setDataSize(size) + .setReplicationConfig(replicationConfig) + .addAllMetadataGdpr(metadata) + .setLatestVersionLocation(getLatestVersionLocation) + .setExpectedDataGeneration(existingKeyGeneration); + + OpenKeySession openKey = ozoneManagerClient.openKey(builder.build()); + // For bucket with layout OBJECT_STORE, when create an empty file (size=0), + // OM will set DataSize to OzoneConfigKeys#OZONE_SCM_BLOCK_SIZE, + // which will cause S3G's atomic write length check to fail, + // so reset size to 0 here. + if (isS3GRequest.get() && size == 0) { + openKey.getKeyInfo().setDataSize(0); + } + return createOutputStream(openKey); + } + + private void createKeyPreChecks(String volumeName, String bucketName, String keyName, + ReplicationConfig replicationConfig) throws IOException { + verifyVolumeName(volumeName); + verifyBucketName(bucketName); + if (checkKeyNameEnabled) { + HddsClientUtils.verifyKeyName(keyName); + } + HddsClientUtils.checkNotNull(keyName); + if (omVersion + .compareTo(OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT) < 0) { + if (replicationConfig != null && + replicationConfig.getReplicationType() + == HddsProtos.ReplicationType.EC) { + throw new IOException("Can not set the replication of the key to" + + " Erasure Coded replication, as OzoneManager does not support" + + " Erasure Coded replication."); + } + } + + if (replicationConfig != null) { + replicationConfigValidator.validate(replicationConfig); + } + } + @Override public OzoneDataStreamOutput createStreamKey( String volumeName, String bucketName, String keyName, long size, @@ -1767,8 +1804,10 @@ private OzoneKeyDetails getOzoneKeyDetails(OmKeyInfo keyInfo) { keyInfo.getModificationTime(), ozoneKeyLocations, keyInfo.getReplicationConfig(), keyInfo.getMetadata(), keyInfo.getFileEncryptionInfo(), - () -> getInputStreamWithRetryFunction(keyInfo), keyInfo.isFile(), - keyInfo.getOwnerName(), keyInfo.getTags()); + () -> getInputStreamWithRetryFunction(keyInfo), keyInfo.isFile(), + keyInfo.getOwnerName(), keyInfo.getTags(), + keyInfo.getGeneration() + ); } @Override @@ -2117,6 +2156,8 @@ public OzoneMultipartUploadList listMultipartUploads(String volumeName, @Override public OzoneFileStatus getOzoneFileStatus(String volumeName, String bucketName, String keyName) throws IOException { + verifyVolumeName(volumeName); + verifyBucketName(bucketName); OmKeyArgs keyArgs = new OmKeyArgs.Builder() .setVolumeName(volumeName) .setBucketName(bucketName) diff --git a/hadoop-ozone/common/pom.xml b/hadoop-ozone/common/pom.xml index bc981f0bb34b..15d961e09491 100644 --- a/hadoop-ozone/common/pom.xml +++ b/hadoop-ozone/common/pom.xml @@ -140,6 +140,43 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java index 6735c0a4f0a0..01c95874e4b3 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java @@ -522,7 +522,7 @@ public static RepeatedOmKeyInfo prepareKeyForDelete(OmKeyInfo keyInfo, public static void validateVolumeName(String volumeName, boolean isStrictS3) throws OMException { try { - HddsClientUtils.verifyResourceName(volumeName, isStrictS3); + HddsClientUtils.verifyResourceName(volumeName, "volume", isStrictS3); } catch (IllegalArgumentException e) { throw new OMException("Invalid volume name: " + volumeName, OMException.ResultCodes.INVALID_VOLUME_NAME); @@ -535,7 +535,7 @@ public static void validateVolumeName(String volumeName, boolean isStrictS3) public static void validateBucketName(String bucketName, boolean isStrictS3) throws OMException { try { - HddsClientUtils.verifyResourceName(bucketName, isStrictS3); + HddsClientUtils.verifyResourceName(bucketName, "bucket", isStrictS3); } catch (IllegalArgumentException e) { throw new OMException("Invalid bucket name: " + bucketName, OMException.ResultCodes.INVALID_BUCKET_NAME); @@ -571,9 +571,9 @@ public static void validateSnapshotName(String snapshotName) return; } try { - HddsClientUtils.verifyResourceName(snapshotName); + HddsClientUtils.verifyResourceName(snapshotName, "snapshot"); } catch (IllegalArgumentException e) { - throw new OMException("Invalid snapshot name: " + snapshotName, + throw new OMException("Invalid snapshot name: " + snapshotName + "\n" + e.getMessage(), OMException.ResultCodes.INVALID_SNAPSHOT_ERROR); } } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java index 7b7556b5e308..d992f43877df 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java @@ -53,6 +53,11 @@ private OMConfigKeys() { "ozone.om.handler.count.key"; public static final int OZONE_OM_HANDLER_COUNT_DEFAULT = 100; + public static final String OZONE_OM_DB_MAX_OPEN_FILES + = "ozone.om.db.max.open.files"; + public static final int OZONE_OM_DB_MAX_OPEN_FILES_DEFAULT + = -1; + public static final String OZONE_OM_INTERNAL_SERVICE_ID = "ozone.om.internal.service.id"; diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java index 19d5ab4fa713..ba28b45a0e5a 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java @@ -54,6 +54,13 @@ public final class OmKeyArgs implements Auditable { private final boolean headOp; private final boolean forceUpdateContainerCacheFromSCM; private final Map tags; + // expectedDataGeneration, when used in key creation indicates that a + // key with the same keyName should exist with the given generation. + // For a key commit to succeed, the original key should still be present with the + // generation unchanged. + // This allows a key to be created an committed atomically if the original has not + // been modified. + private Long expectedDataGeneration = null; private OmKeyArgs(Builder b) { this.volumeName = b.volumeName; @@ -74,6 +81,7 @@ private OmKeyArgs(Builder b) { this.forceUpdateContainerCacheFromSCM = b.forceUpdateContainerCacheFromSCM; this.ownerName = b.ownerName; this.tags = b.tags; + this.expectedDataGeneration = b.expectedDataGeneration; } public boolean getIsMultipartKey() { @@ -156,6 +164,10 @@ public Map getTags() { return tags; } + public Long getExpectedDataGeneration() { + return expectedDataGeneration; + } + @Override public Map toAuditMap() { Map auditMap = new LinkedHashMap<>(); @@ -179,7 +191,7 @@ public void addLocationInfo(OmKeyLocationInfo locationInfo) { } public OmKeyArgs.Builder toBuilder() { - return new OmKeyArgs.Builder() + OmKeyArgs.Builder builder = new OmKeyArgs.Builder() .setVolumeName(volumeName) .setBucketName(bucketName) .setKeyName(keyName) @@ -197,11 +209,16 @@ public OmKeyArgs.Builder toBuilder() { .setAcls(acls) .setForceUpdateContainerCacheFromSCM(forceUpdateContainerCacheFromSCM) .addAllTags(tags); + + if (expectedDataGeneration != null) { + builder.setExpectedDataGeneration(expectedDataGeneration); + } + return builder; } @Nonnull public KeyArgs toProtobuf() { - return KeyArgs.newBuilder() + KeyArgs.Builder builder = KeyArgs.newBuilder() .setVolumeName(getVolumeName()) .setBucketName(getBucketName()) .setKeyName(getKeyName()) @@ -210,8 +227,11 @@ public KeyArgs toProtobuf() { .setLatestVersionLocation(getLatestVersionLocation()) .setHeadOp(isHeadOp()) .setForceUpdateContainerCacheFromSCM( - isForceUpdateContainerCacheFromSCM()) - .build(); + isForceUpdateContainerCacheFromSCM()); + if (expectedDataGeneration != null) { + builder.setExpectedDataGeneration(expectedDataGeneration); + } + return builder.build(); } /** @@ -236,6 +256,7 @@ public static class Builder { private boolean headOp; private boolean forceUpdateContainerCacheFromSCM; private final Map tags = new HashMap<>(); + private Long expectedDataGeneration = null; public Builder setVolumeName(String volume) { this.volumeName = volume; @@ -345,6 +366,11 @@ public Builder setForceUpdateContainerCacheFromSCM(boolean value) { return this; } + public Builder setExpectedDataGeneration(long generation) { + this.expectedDataGeneration = generation; + return this; + } + public OmKeyArgs build() { return new OmKeyArgs(this); } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java index c8e7f8f60938..f52a142239b4 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java @@ -107,6 +107,14 @@ public static Codec getCodec(boolean ignorePipeline) { */ private Map tags; + // expectedDataGeneration, when used in key creation indicates that a + // key with the same keyName should exist with the given generation. + // For a key commit to succeed, the original key should still be present with the + // generation unchanged. + // This allows a key to be created an committed atomically if the original has not + // been modified. + private Long expectedDataGeneration = null; + private OmKeyInfo(Builder b) { super(b); this.volumeName = b.volumeName; @@ -124,6 +132,7 @@ private OmKeyInfo(Builder b) { this.isFile = b.isFile; this.ownerName = b.ownerName; this.tags = b.tags; + this.expectedDataGeneration = b.expectedDataGeneration; } public String getVolumeName() { @@ -166,10 +175,26 @@ public String getFileName() { return fileName; } + public void setExpectedDataGeneration(Long generation) { + this.expectedDataGeneration = generation; + } + + public Long getExpectedDataGeneration() { + return expectedDataGeneration; + } + public String getOwnerName() { return ownerName; } + /** + * Returns the generation of the object. Note this is currently the same as updateID for a key. + * @return long + */ + public long getGeneration() { + return getUpdateID(); + } + public synchronized OmKeyLocationInfoGroup getLatestVersionLocations() { return keyLocationVersions.size() == 0 ? null : keyLocationVersions.get(keyLocationVersions.size() - 1); @@ -452,6 +477,7 @@ public static class Builder extends WithParentObjectId.Builder { private boolean isFile; private final Map tags = new HashMap<>(); + private Long expectedDataGeneration = null; public Builder() { } @@ -590,6 +616,11 @@ public Builder addAllTags(Map keyTags) { return this; } + public Builder setExpectedDataGeneration(Long existingGeneration) { + this.expectedDataGeneration = existingGeneration; + return this; + } + public OmKeyInfo build() { return new OmKeyInfo(this); } @@ -695,6 +726,9 @@ private KeyInfo getProtobuf(boolean ignorePipeline, String fullKeyName, kb.setFileEncryptionInfo(OMPBHelper.convert(encInfo)); } kb.setIsFile(isFile); + if (expectedDataGeneration != null) { + kb.setExpectedDataGeneration(expectedDataGeneration); + } if (ownerName != null) { kb.setOwnerName(ownerName); } @@ -745,6 +779,9 @@ public static OmKeyInfo getFromProtobuf(KeyInfo keyInfo) throws IOException { if (keyInfo.hasIsFile()) { builder.setFile(keyInfo.getIsFile()); } + if (keyInfo.hasExpectedDataGeneration()) { + builder.setExpectedDataGeneration(keyInfo.getExpectedDataGeneration()); + } if (keyInfo.hasOwnerName()) { builder.setOwnerName(keyInfo.getOwnerName()); @@ -863,6 +900,9 @@ public OmKeyInfo copyObject() { if (fileChecksum != null) { builder.setFileChecksum(fileChecksum); } + if (expectedDataGeneration != null) { + builder.setExpectedDataGeneration(expectedDataGeneration); + } return builder.build(); } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java index 3e21494ac61a..e6a85566fe2b 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java @@ -689,8 +689,13 @@ public OpenKeySession openKey(OmKeyArgs args) throws IOException { KeyArgs.Builder keyArgs = KeyArgs.newBuilder() .setVolumeName(args.getVolumeName()) .setBucketName(args.getBucketName()) - .setKeyName(args.getKeyName()) - .setOwnerName(args.getOwner()); + .setKeyName(args.getKeyName()); + + // When rewriting a key, the owner does not need to be passed, as it is inherited + // from the existing key. Hence it can be null. + if (args.getOwner() != null) { + keyArgs.setOwnerName(args.getOwner()); + } if (args.getAcls() != null) { keyArgs.addAllAcls(args.getAcls().stream().distinct().map(a -> @@ -733,6 +738,10 @@ public OpenKeySession openKey(OmKeyArgs args) throws IOException { keyArgs.setSortDatanodes(args.getSortDatanodes()); + if (args.getExpectedDataGeneration() != null) { + keyArgs.setExpectedDataGeneration(args.getExpectedDataGeneration()); + } + req.setKeyArgs(keyArgs.build()); OMRequest omRequest = createOMRequest(Type.CreateKey) diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java index 4aead0cd8bcb..03ab063c9d30 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java @@ -67,6 +67,7 @@ public void protobufConversion() throws IOException { assertFalse(key.isHsync()); key.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID, "clientid"); assertTrue(key.isHsync()); + assertEquals(5678L, key.getExpectedDataGeneration()); } @Test @@ -123,6 +124,7 @@ private OmKeyInfo createOmKeyInfo(ReplicationConfig replicationConfig) { .setReplicationConfig(replicationConfig) .addMetadata("key1", "value1") .addMetadata("key2", "value2") + .setExpectedDataGeneration(5678L) .build(); } diff --git a/hadoop-ozone/csi/pom.xml b/hadoop-ozone/csi/pom.xml index 4118af5b0693..04c153f3988c 100644 --- a/hadoop-ozone/csi/pom.xml +++ b/hadoop-ozone/csi/pom.xml @@ -171,6 +171,22 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> com.salesforce.servicelibs proto-backwards-compatibility + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + org.xolstice.maven.plugins protobuf-maven-plugin @@ -212,6 +228,21 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> depcheck + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + diff --git a/hadoop-ozone/datanode/pom.xml b/hadoop-ozone/datanode/pom.xml index 2f2193348899..29c10671d9da 100644 --- a/hadoop-ozone/datanode/pom.xml +++ b/hadoop-ozone/datanode/pom.xml @@ -62,6 +62,13 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.apache.maven.plugins maven-dependency-plugin diff --git a/hadoop-ozone/dev-support/checks/build.sh b/hadoop-ozone/dev-support/checks/build.sh index a9fe7702c90f..f9938e703874 100755 --- a/hadoop-ozone/dev-support/checks/build.sh +++ b/hadoop-ozone/dev-support/checks/build.sh @@ -18,7 +18,7 @@ cd "$DIR/../../.." || exit 1 : ${OZONE_WITH_COVERAGE:="false"} -MAVEN_OPTIONS='-V -B -Dmaven.javadoc.skip=true -DskipTests -DskipDocs --no-transfer-progress' +MAVEN_OPTIONS='-V -B -DskipTests -DskipDocs --no-transfer-progress' if [[ "${OZONE_WITH_COVERAGE}" == "true" ]]; then MAVEN_OPTIONS="${MAVEN_OPTIONS} -Pcoverage" diff --git a/hadoop-ozone/dist/pom.xml b/hadoop-ozone/dist/pom.xml index 64fc2cfa3728..07a4328bd887 100644 --- a/hadoop-ozone/dist/pom.xml +++ b/hadoop-ozone/dist/pom.xml @@ -28,13 +28,20 @@ UTF-8 true - 20240316-jdk17-1 + 20240712-jdk17-2 apache/ozone-testkrb5:20230318-1 true + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.codehaus.mojo exec-maven-plugin diff --git a/hadoop-ozone/dist/src/main/compose/common/ec-test.sh b/hadoop-ozone/dist/src/main/compose/common/ec-test.sh index 65a659563e59..04df2b2787d3 100755 --- a/hadoop-ozone/dist/src/main/compose/common/ec-test.sh +++ b/hadoop-ozone/dist/src/main/compose/common/ec-test.sh @@ -20,6 +20,8 @@ start_docker_env 5 ## Exclude virtual-host tests. This is tested separately as it requires additional config. execute_robot_test scm -v BUCKET:erasure --exclude virtual-host s3 +execute_robot_test scm ec/rewrite.robot + prefix=${RANDOM} execute_robot_test scm -v PREFIX:${prefix} ec/basic.robot docker-compose up -d --no-recreate --scale datanode=4 diff --git a/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - CreateKey Metrics.json b/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - CreateKey Metrics.json new file mode 100644 index 000000000000..78b027afd2e9 --- /dev/null +++ b/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - CreateKey Metrics.json @@ -0,0 +1,3730 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 52, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "om_performance_metrics_check_access_latency_ns_avg_time" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_check_access_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Check access latency (time in ns)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 1 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_check_access_latency_ns_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Check access latency (ops per sec)", + "type": "timeseries" + } + ], + "title": "OM Check Access Latency Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 51, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 2 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_estimate_num_keys", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_estimate_num_keys", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Estimate no. of keys metrics", + "type": "timeseries" + } + ], + "title": "OM Rocksdb Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 50, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "ozone_manager_double_buffer_metrics_flush_time_avg_time" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 3 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ozone_manager_double_buffer_metrics_flush_time_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "expr": "", + "hide": false, + "instant": false, + "range": true, + "refId": "B" + } + ], + "title": "Double buffer metrics (time in ns)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 3 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ozone_manager_double_buffer_metrics_flush_time_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ozone_manager_double_buffer_metrics_queue_size_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ozone_manager_double_buffer_metrics_total_num_of_flush_operations", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "Double buffer metrics (no. of ops)", + "type": "timeseries" + } + ], + "title": "OM Double Buffer Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 8, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "table_cache_metrics_size, bucketTable" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 4 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "table_cache_metrics_size", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}, {{tablename}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Table cache metrics (size)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 4 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "table_cache_metrics_miss_count", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}, {{tablename}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "table_cache_metrics_hit_count", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}, {{tablename}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Table cache metrics (hit/miss count)", + "type": "timeseries" + } + ], + "title": "OM Table Cache Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 4 + }, + "id": 64, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "om_metrics_num_get_service_lists" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 13 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_get_service_lists", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_key_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "OM (no. of ops) Metrics", + "type": "timeseries" + } + ], + "title": "OM Service Lists Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 63, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "om_metrics_num_keys, .*" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 49, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_keys", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Num Key Metrics", + "type": "timeseries" + } + ], + "title": "OM No. of Key Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 53, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 20 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_read_lock_held_time_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_write_lock_waiting_time_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_read_lock_waiting_time_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_write_lock_held_time_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "D", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_read_lock_held_time_i_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "E", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_read_lock_waiting_time_i_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "F", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_write_lock_held_time_i_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "G", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_lock_metrics_write_lock_waiting_time_i_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "H", + "useBackend": false + } + ], + "title": "Lock (read/write) metrics (no. of ops)", + "type": "timeseries" + } + ], + "title": "OM Lock Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 54, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 21 + }, + "id": 48, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_flushCount{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_cacheHitCount{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_appendEntryCount{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_server_retryCacheEntryCount{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "D", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_server_retryCacheMissCount{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "E", + "useBackend": false + } + ], + "title": "Ratis log metrics (count)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "ratis_log_worker_appendEntryLatency, .*:9875, group-0A2AA1204044" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 21 + }, + "id": 24, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_appendEntryLatency{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_server_follower_entry_latency{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Ratis log metrics (latency)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 21 + }, + "id": 45, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ratis_log_worker_flushTime{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_writelogExecutionTime{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_enqueuedTime{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_syncTime{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "D", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_queueingDelay{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "E", + "useBackend": false + } + ], + "title": "Ratis log metrics (time)", + "type": "timeseries" + } + ], + "title": "OM Ratis Log Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 56, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 9 + }, + "id": 29, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ugi_metrics_get_groups_avg_time{servername=\"ozoneManager\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Ugi Metrics (avg. time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 9 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ugi_metrics_get_groups_num_ops{servername=\"ozoneManager\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Ugi Metrics (no. of ops)", + "type": "timeseries" + } + ], + "title": "OM Ugi Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 7, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 8 + }, + "id": 26, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success_latency_ns_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_init_multipart_upload_success_latency_ns_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "S3 Gateway multipart upload metrics (no. of ops)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 8 + }, + "id": 25, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_init_multipart_upload_success_latency_ns_avg_time", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "S3 Gateway multipart upload metrics (avg time)", + "type": "timeseries" + } + ], + "title": "S3 Gateway Multipart Upload Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 57, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 9 + }, + "id": 34, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_create_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": " Combined Latency (avg. time) Metrics ", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 9 + }, + "id": 32, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success_latency_ns_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_put_key_metadata_latency_ns_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_create_key_success_latency_ns_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "Combined Latency (no. of ops) Metrics", + "type": "timeseries" + } + ], + "title": "S3 Gateway Combined Latency Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 59, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 11 + }, + "id": 37, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_put_key_success_length", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Put key success length", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 11 + }, + "id": 36, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Head key success metrics", + "type": "timeseries" + } + ], + "title": "S3 Gateway Key Success Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 60, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 12 + }, + "id": 33, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "container_client_metrics_total_write_chunk_calls", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Container client metrics", + "type": "timeseries" + } + ], + "title": "S3 Gateway Container Client Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 40, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 13 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_num_put_block", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_num_write_chunk", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "SCM (no. of ops) Metrics", + "type": "timeseries" + } + ], + "title": "SCM Metrics (no. of ops)", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 61, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 14 + }, + "id": 41, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_latency_put_block_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}},{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_latency_write_chunk_avg_time", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "SCM Combined Latency Metrics (avg. time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 8, + "y": 14 + }, + "id": 42, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_latency_write_chunk_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "SCM Combined Latency Metrics (no. of ops)", + "type": "timeseries" + } + ], + "title": "SCM Combined Latency Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 62, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 15 + }, + "id": 46, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_flushTime{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_writelogExecutionTime{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_enqueuedTime{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_syncTime{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "D", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_queueingDelay{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "E", + "useBackend": false + } + ], + "title": "Ratis log metrics (time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "ratis_log_worker_appendEntryLatency, .*:9883, group-1E3FC9CE5915" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 15 + }, + "id": 47, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ratis_log_worker_appendEntryLatency{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ratis_server_follower_entry_latency{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Ratis log metrics (latency)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 15 + }, + "id": 22, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_flushCount{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_cacheHitCount{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_log_worker_appendEntryCount{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_server_retryCacheEntryCount{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "D", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ratis_server_retryCacheMissCount{instance=~\".*:9883\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{instance}}, {{group}}", + "range": true, + "refId": "E", + "useBackend": false + } + ], + "title": "Ratis log metrics (count)", + "type": "timeseries" + } + ], + "title": "Datanode Ratis Log Metrics", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-12h", + "to": "now" + }, + "timeRangeUpdatedDuringEditOrView": false, + "timepicker": {}, + "timezone": "", + "title": "Create key Dashboard", + "version": 36, + "weekStart": "" +} \ No newline at end of file diff --git a/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - DeleteKey Metrics.json b/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - DeleteKey Metrics.json new file mode 100644 index 000000000000..40f409d0add9 --- /dev/null +++ b/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - DeleteKey Metrics.json @@ -0,0 +1,1774 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 10, + "panels": [], + "title": "OM Metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "No. of Keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_key_delete_fails", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "No. of Failed Key Deletes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "No. of Keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 1 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_key_deletes", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "No. of Successful Key Deletes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 1 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_delete_key_failure_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Delete Key Failure Latency (avg. time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 1 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_delete_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Delete Key Success Latency (avg. time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 8 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_delete_keys_resolve_bucket_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Delete Keys ResolveBucket Latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 8 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_delete_keys_acl_check_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Delete Keys AclCheck Latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 8 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_delete_key_resolve_bucket_and_acl_check_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Delete Key ResolveBucket And AclCheck Latency", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 5, + "panels": [], + "title": "S3 Gateway Metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "No. of Keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 16 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_delete_key_failure", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "No. of Failed Key Deletes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "No. of Keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 16 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_delete_key_success", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "No. of Successful Key Deletes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 16 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_delete_key_failure_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Delete Key Failure Latency Metrics (avg. time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 16 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_delete_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Delete Key Success Latency Metrics (avg. time)", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 2, + "panels": [], + "title": "SCM Metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "No. of Keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 24 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "scm_performance_metrics_delete_key_failure", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "No. of Failed Key Deletes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "No. of Keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 24 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "scm_performance_metrics_delete_key_success", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "No. of Successful Key Deletes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 24 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "scm_performance_metrics_delete_key_failure_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "DeleteKey Failure Latency Metrics (avg. time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 24 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "scm_performance_metrics_delete_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "DeleteKey Success Latency Metrics (avg. time)", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Delete Key Dashboard", + "version": 6, + "weekStart": "" +} \ No newline at end of file diff --git a/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - ReadKey Metrics.json b/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - ReadKey Metrics.json new file mode 100644 index 000000000000..827e2f04e10a --- /dev/null +++ b/hadoop-ozone/dist/src/main/compose/common/grafana/dashboards/Ozone - ReadKey Metrics.json @@ -0,0 +1,3221 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 19, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_estimate_num_keys", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_estimate_num_keys", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_keytable_estimate_num_keys", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "Rocksdb metrics (no. of keys)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "cache used", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 1 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_block_cache_usage", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_block_cache_usage", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Rocksdb block cache usage metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of files", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 1 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_num_files_at_level0", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_keytable_num_files_at_level0", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_s3secrettable_num_files_at_level0", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "Rocksdb level0 metrics (num files)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 10 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rdb_metrics_num_db_key_get_if_exist_checks{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rdb_metrics_num_db_key_get_if_exist_gets{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Rocksdb no. of db key metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 10 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_cur_size_active_mem_table", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_cur_size_all_mem_tables", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_size_all_mem_tables", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "Rocksdb mem table metrics (size)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 10 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_estimate_table_readers_mem", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_estimate_table_readers_mem", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_keytable_estimate_table_readers_mem", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "Rocksdb om db table readers mem metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 19 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_filetable_live_sst_files_size", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_keytable_live_sst_files_size", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rocksdb_om_db_s3secrettable_live_sst_files_size", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + } + ], + "title": "Rocksdb live sst file size metrics", + "type": "timeseries" + } + ], + "title": "OM Rocksdb Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 20, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 2 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ugi_metrics_get_groups_num_ops{servername=\"ozoneManager\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Ugi Metrics (no. of ops)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 2 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "ugi_metrics_get_groups_avg_time{servername=\"ozoneManager\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Ugi Metrics (avg. time)", + "type": "timeseries" + } + ], + "title": "OM Ugi Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 2, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no of keys", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 163 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_keys", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "OM num key metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 163 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_key_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "OM num key ops metrics", + "type": "timeseries" + } + ], + "title": "OM Num Key Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 21, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 164 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_metrics_num_get_service_lists", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Get service lists metrics", + "type": "timeseries" + } + ], + "title": "OM Service Lists Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 4 + }, + "id": 22, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 5 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "om_performance_metrics_get_key_info_read_key_info_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Read key info (avg time) metrics", + "type": "timeseries" + } + ], + "title": "OM Read Key Info Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 23, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 174 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "table_cache_metrics_hit_count{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}, {{tablename}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "table_cache_metrics_miss_count{instance=~\".*:9875\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}, {{tablename}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Table cache metrics (count)", + "type": "timeseries" + } + ], + "title": "OM Table Cache Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 9, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 47 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_get_key_metadata_latency_ns_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_get_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_failure_latency_ns_avg_time", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success_latency_ns_avg_time", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "D", + "useBackend": false + } + ], + "title": "Combined key latency metrics (avg. time)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 47 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_get_key_metadata_latency_ns_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_get_key_success_latency_ns_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_failure_latency_ns_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "C", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success_latency_ns_num_ops", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "D", + "useBackend": false + } + ], + "title": "Combined key latency metrics (no. of ops)", + "type": "timeseries" + } + ], + "title": "S3 Gateway Combined Latency Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 24, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 146 + }, + "id": 26, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_get_key_success", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_success", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Key success metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 146 + }, + "id": 27, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_get_key_success_length", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Key success length metrics", + "type": "timeseries" + } + ], + "title": "S3 Gateway Key Success Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 25, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 138 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "s3_gateway_metrics_head_key_failure", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "head key failure metric", + "type": "timeseries" + } + ], + "title": "S3 Gateway Key Failure Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 29, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 43 + }, + "id": 36, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_bytes_get_block", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Bytes block metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 43 + }, + "id": 37, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_bytes_read_chunk", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Bytes chunk metrics", + "type": "timeseries" + } + ], + "title": "SCM Bytes Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 11 + }, + "id": 38, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "time (ns)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 44 + }, + "id": 39, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_latency_get_block_avg_time", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_latency_read_chunk_avg_time", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Combined latency (avg. time) metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 44 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_latency_get_block_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Combined Latency (no. of ops)", + "type": "timeseries" + } + ], + "title": "SCM Combined Latency Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 42, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 21 + }, + "id": 41, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_num_read_chunk", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "no. of read chunk metric", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 21 + }, + "id": 43, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_num_get_block", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "no. of block metrics", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "no. of ops", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 21 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "storage_container_metrics_num_ops", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "no. of ops metrics", + "type": "timeseries" + } + ], + "title": "SCM No. Of Ops Metrics", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 45, + "panels": [ + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 14 + }, + "id": 46, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ugi_metrics_login_success_avg_time{instance=~\".*:9877\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "success avg time metric", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 14 + }, + "id": 47, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "ugi_metrics_login_success_num_ops{instance=~\".*:9877\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{__name__}}, {{hostname}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "success no. of ops metric", + "type": "timeseries" + } + ], + "title": "SCM Ugi Metrics", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Read Key Dashboard", + "version": 21, + "weekStart": "" +} \ No newline at end of file diff --git a/hadoop-ozone/dist/src/main/compose/common/hadoop-secure.yaml b/hadoop-ozone/dist/src/main/compose/common/hadoop-secure.yaml index f2e147da815c..8600659b7865 100644 --- a/hadoop-ozone/dist/src/main/compose/common/hadoop-secure.yaml +++ b/hadoop-ozone/dist/src/main/compose/common/hadoop-secure.yaml @@ -14,11 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: rm: image: ${HADOOP_IMAGE}:${HADOOP_VERSION} hostname: rm + dns_search: . volumes: - ../..:/opt/ozone - ../../libexec/transformation.py:/opt/transformation.py @@ -37,6 +37,7 @@ services: nm: image: ${HADOOP_IMAGE}:${HADOOP_VERSION} hostname: nm + dns_search: . volumes: - ../..:/opt/ozone - ../../libexec/transformation.py:/opt/transformation.py @@ -56,6 +57,7 @@ services: image: ${HADOOP_IMAGE}:${HADOOP_VERSION} container_name: jhs hostname: jhs + dns_search: . volumes: - ../..:/opt/ozone - ../_keytabs:/etc/security/keytabs diff --git a/hadoop-ozone/dist/src/main/compose/common/hadoop.yaml b/hadoop-ozone/dist/src/main/compose/common/hadoop.yaml index ce0459244009..4fb56e5aa985 100644 --- a/hadoop-ozone/dist/src/main/compose/common/hadoop.yaml +++ b/hadoop-ozone/dist/src/main/compose/common/hadoop.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: rm: image: ${HADOOP_IMAGE}:${HADOOP_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/common/s3-haproxy.yaml b/hadoop-ozone/dist/src/main/compose/common/s3-haproxy.yaml index e77534c31f8e..8ddf3f5f65a3 100644 --- a/hadoop-ozone/dist/src/main/compose/common/s3-haproxy.yaml +++ b/hadoop-ozone/dist/src/main/compose/common/s3-haproxy.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-s3-worker: &s3-worker image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/compatibility/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/compatibility/docker-compose.yaml index 2f97d242ed22..a1c3b293ab69 100644 --- a/hadoop-ozone/dist/src/main/compose/compatibility/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/compatibility/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/compatibility/docker-config b/hadoop-ozone/dist/src/main/compose/compatibility/docker-config index 55aeebeab1a0..a5727d2b1e4a 100644 --- a/hadoop-ozone/dist/src/main/compose/compatibility/docker-config +++ b/hadoop-ozone/dist/src/main/compose/compatibility/docker-config @@ -30,6 +30,7 @@ OZONE-SITE.XML_hdds.datanode.dir=/data/hdds OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB OZONE-SITE.XML_ozone.recon.address=recon:9891 OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http HADOOP_OPTS="-Dhadoop.opts=test" HDFS_STORAGECONTAINERMANAGER_OPTS="-Dhdfs.scm.opts=test" diff --git a/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-compose.yaml index dc6bae7822e5..5220d71669df 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-config index 5e715e5a563a..29984d43662c 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-config @@ -52,6 +52,7 @@ OZONE-SITE.XML_hdds.container.report.interval=30s OZONE-SITE.XML_ozone.om.s3.grpc.server_enabled=true OZONE-SITE.XML_ozone.recon.db.dir=/data/metadata/recon OZONE-SITE.XML_dfs.container.ratis.datastream.enabled=true +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE_CONF_DIR=/etc/hadoop OZONE_LOG_DIR=/var/log/hadoop diff --git a/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-compose.yaml index 2d79546265d3..99044feb6b37 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - services: datanode: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-config index 5cc7854fb85f..623f95955837 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-csi/docker-config @@ -35,6 +35,7 @@ OZONE-SITE.XML_ozone.scm.client.address=scm OZONE-SITE.XML_hdds.datanode.dir=/data/hdds OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE_CONF_DIR=/etc/hadoop OZONE_LOG_DIR=/var/log/hadoop diff --git a/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-compose.yaml index 947df508b266..9971e7f9da6f 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-config index ab8485ef729e..08c490ea51f0 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-ha/docker-config @@ -50,6 +50,7 @@ OZONE-SITE.XML_ozone.recon.address=recon:9891 OZONE-SITE.XML_ozone.recon.http-address=0.0.0.0:9888 OZONE-SITE.XML_ozone.recon.https-address=0.0.0.0:9889 OZONE-SITE.XML_hdds.container.ratis.datastream.enabled=true +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE_CONF_DIR=/etc/hadoop OZONE_LOG_DIR=/var/log/hadoop diff --git a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/Dockerfile b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/Dockerfile index 714a6f56d66c..55fa73234611 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/Dockerfile +++ b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/Dockerfile @@ -20,13 +20,14 @@ ARG OZONE_RUNNER_VERSION FROM ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} # Install ssh -RUN sudo yum install -y openssh-clients openssh-server +RUN sudo dnf install -y openssh-clients openssh-server RUN sudo ssh-keygen -A RUN sudo mkdir -p /run/sshd RUN sudo sed -i "s/.*UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config RUN sudo sed -i "s/.*PermitUserEnvironment.*/PermitUserEnvironment yes/g" /etc/ssh/sshd_config RUN sudo sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd +RUN sudo rm -f /etc/nologin /var/run/nologin #/opt/hadoop is mounted, we can't use it as a home RUN sudo usermod -d /opt hadoop @@ -38,6 +39,8 @@ RUN sudo chmod 700 /opt/.ssh RUN echo "export JAVA_HOME=$JAVA_HOME" | sudo sh -c 'cat >> /etc/profile' RUN echo "JAVA_HOME=$JAVA_HOME" | sh -c 'cat >> /opt/.ssh/environment' +RUN echo "OZONE_CONF_DIR=$OZONE_CONF_DIR" >> /opt/.ssh/environment +RUN echo "OZONE_LOG_DIR=$OZONE_LOG_DIR" >> /opt/.ssh/environment # Install required robot framework libraries RUN sudo pip3 install robotframework-sshlibrary diff --git a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-compose.yaml index 8792046097e8..097d99c6b7a1 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-compose.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: datanode: build: diff --git a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config index a51579ac96c4..65834455eaaf 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config @@ -38,6 +38,7 @@ OZONE-SITE.XML_hdds.profiler.endpoint.enabled=true OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s OZONE-SITE.XML_hdds.container.report.interval=60s OZONE-SITE.XML_ozone.om.s3.grpc.server_enabled=true +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http HDFS-SITE.XML_rpc.metrics.quantile.enable=true HDFS-SITE.XML_rpc.metrics.percentiles.intervals=60,300 ASYNC_PROFILER_HOME=/opt/profiler diff --git a/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-compose.yaml index 8e0cd1637396..599de3954e8e 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-config index 5fb56165303a..79d2e5285fb4 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-om-prepare/docker-config @@ -32,5 +32,6 @@ OZONE-SITE.XML_ozone.scm.client.address=scm OZONE-SITE.XML_ozone.client.failover.max.attempts=6 OZONE-SITE.XML_hdds.datanode.dir=/data/hdds OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http no_proxy=om1,om2,om3,scm,s3g,recon,kdc,localhost,127.0.0.1 diff --git a/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-compose.yaml index fdee3fa16eb6..f6ca16537f41 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-compose.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: datanode_1: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-config index 7d71b35860b2..8239aad2a5de 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-topology/docker-config @@ -43,6 +43,7 @@ OZONE-SITE.XML_net.topology.node.switch.mapping.impl=org.apache.hadoop.net.Table OZONE-SITE.XML_net.topology.table.file.name=/opt/hadoop/compose/ozone-topology/network-config OZONE-SITE.XML_ozone.network.topology.aware.read=true OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http HDFS-SITE.XML_rpc.metrics.quantile.enable=true HDFS-SITE.XML_rpc.metrics.percentiles.intervals=60,300 diff --git a/hadoop-ozone/dist/src/main/compose/ozone/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozone/docker-compose.yaml index 0d93ed06508e..b5424cc7c88f 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/ozone/docker-config b/hadoop-ozone/dist/src/main/compose/ozone/docker-config index 83057f9d394e..4458bb687582 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone/docker-config @@ -51,6 +51,7 @@ OZONE-SITE.XML_hdds.scm.replication.thread.interval=15s OZONE-SITE.XML_hdds.scm.replication.under.replicated.interval=5s OZONE-SITE.XML_hdds.scm.replication.over.replicated.interval=5s OZONE-SITE.XML_hdds.scm.wait.time.after.safemode.exit=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE-SITE.XML_hdds.container.ratis.datastream.enabled=true diff --git a/hadoop-ozone/dist/src/main/compose/ozone/freon-ockg.yaml b/hadoop-ozone/dist/src/main/compose/ozone/freon-ockg.yaml index 437b329cdabe..e23093ff1f78 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone/freon-ockg.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone/freon-ockg.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: freon: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/ozone/freon-rk.yaml b/hadoop-ozone/dist/src/main/compose/ozone/freon-rk.yaml index a47ad2987668..cd7ce4d06cba 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone/freon-rk.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone/freon-rk.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: freon: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/ozone/legacy-bucket.yaml b/hadoop-ozone/dist/src/main/compose/ozone/legacy-bucket.yaml index d2d57c99ef1e..70c3aa4e0100 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone/legacy-bucket.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone/legacy-bucket.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-legacy-bucket-config: &legacy-bucket-config environment: diff --git a/hadoop-ozone/dist/src/main/compose/ozone/monitoring.yaml b/hadoop-ozone/dist/src/main/compose/ozone/monitoring.yaml index 4a0e8f067c59..59a26d55d84b 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone/monitoring.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone/monitoring.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-monitoring-config: &monitoring-config env_file: diff --git a/hadoop-ozone/dist/src/main/compose/ozone/profiling.yaml b/hadoop-ozone/dist/src/main/compose/ozone/profiling.yaml index 0f71efeec769..88171539f33b 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone/profiling.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozone/profiling.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-profiling-config: &profiling-config privileged: true diff --git a/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-compose.yaml index 0db6fa13ebc4..eafb11fe8124 100644 --- a/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-compose.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: datanode: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-config b/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-config index 31b846ae9b2e..06696a0e4130 100644 --- a/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozoneblockade/docker-config @@ -39,6 +39,7 @@ OZONE-SITE.XML_hdds.scm.replication.event.timeout=10s OZONE-SITE.XML_dfs.ratis.server.failure.duration=35s OZONE-SITE.XML_hdds.scm.safemode.min.datanode=3 OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http HDFS-SITE.XML_rpc.metrics.quantile.enable=true HDFS-SITE.XML_rpc.metrics.percentiles.intervals=60,300 diff --git a/hadoop-ozone/dist/src/main/compose/ozonescripts/Dockerfile b/hadoop-ozone/dist/src/main/compose/ozonescripts/Dockerfile index 35c6ccabd375..f7494a70b397 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonescripts/Dockerfile +++ b/hadoop-ozone/dist/src/main/compose/ozonescripts/Dockerfile @@ -19,13 +19,14 @@ ARG OZONE_RUNNER_VERSION FROM ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} -RUN sudo yum install -y openssh-clients openssh-server +RUN sudo dnf install -y openssh-clients openssh-server RUN sudo ssh-keygen -A RUN sudo mkdir -p /run/sshd RUN sudo sed -i "s/.*UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config RUN sudo sed -i "s/.*PermitUserEnvironment.*/PermitUserEnvironment yes/g" /etc/ssh/sshd_config RUN sudo sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd +RUN sudo rm -f /etc/nologin /var/run/nologin #/opt/hadoop is mounted, we can't use it as a home RUN sudo usermod -d /opt hadoop @@ -36,6 +37,8 @@ RUN sudo chmod 600 /opt/.ssh/* RUN sudo chmod 700 /opt/.ssh RUN echo "export JAVA_HOME=$JAVA_HOME" | sudo sh -c 'cat >> /etc/profile' -RUN echo "JAVA_HOME=$JAVA_HOME" | sh -c 'cat >> /opt/.ssh/environment' +RUN echo "JAVA_HOME=$JAVA_HOME" >> /opt/.ssh/environment +RUN echo "OZONE_CONF_DIR=$OZONE_CONF_DIR" >> /opt/.ssh/environment +RUN echo "OZONE_LOG_DIR=$OZONE_LOG_DIR" >> /opt/.ssh/environment CMD ["sudo","/usr/sbin/sshd","-D"] diff --git a/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-compose.yaml index 0b149482d925..9176739471cd 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-compose.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: datanode: build: diff --git a/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-config b/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-config index 6bd0e4364420..66f4cf151ec9 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozonescripts/docker-config @@ -27,6 +27,7 @@ OZONE-SITE.XML_ozone.server.default.replication=1 OZONE-SITE.XML_hdds.datanode.dir=/data/hdds OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE_CONF_DIR=/etc/hadoop OZONE_LOG_DIR=/var/log/hadoop diff --git a/hadoop-ozone/dist/src/main/compose/ozonescripts/disabled-test.sh b/hadoop-ozone/dist/src/main/compose/ozonescripts/test.sh similarity index 100% rename from hadoop-ozone/dist/src/main/compose/ozonescripts/disabled-test.sh rename to hadoop-ozone/dist/src/main/compose/ozonescripts/test.sh diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-compose.yaml index 1ba764f25788..d55d5e0e2e8f 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-compose.yaml @@ -14,11 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: kdc: image: ${OZONE_TESTKRB5_IMAGE} hostname: kdc + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -28,6 +28,7 @@ services: ipv4_address: 172.25.0.100 kms: image: apache/hadoop:${HADOOP_VERSION} + dns_search: . ports: - 9600:9600 env_file: @@ -44,6 +45,7 @@ services: ipv4_address: 172.25.0.101 datanode1: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -66,6 +68,7 @@ services: ipv4_address: 172.25.0.102 datanode2: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -88,6 +91,7 @@ services: ipv4_address: 172.25.0.103 datanode3: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -111,6 +115,7 @@ services: om1: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: om1 + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -136,6 +141,7 @@ services: om2: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: om2 + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -161,6 +167,7 @@ services: om3: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: om3 + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -186,6 +193,7 @@ services: httpfs: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: httpfs + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -204,6 +212,7 @@ services: s3g: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: s3g + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -221,6 +230,7 @@ services: scm1.org: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: scm1.org + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -248,6 +258,7 @@ services: scm2.org: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: scm2.org + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -276,6 +287,7 @@ services: scm3.org: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: scm3.org + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -304,6 +316,7 @@ services: recon: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: recon + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config index a194fbc22653..db517a7f7c68 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config @@ -124,6 +124,7 @@ OZONE-SITE.XML_ozone.httpfs.http.auth.kerberos.principal=HTTP/httpfs@EXAMPLE.COM OZONE-SITE.XML_ozone.recon.http.auth.kerberos.principal=HTTP/recon@EXAMPLE.COM OZONE-SITE.XML_ozone.recon.http.auth.kerberos.keytab=/etc/security/keytabs/recon.keytab OZONE-SITE.XML_ozone.recon.http.auth.kerberos.keytab=/etc/security/keytabs/recon.keytab +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http CORE-SITE.XML_hadoop.http.authentication.simple.anonymous.allowed=false CORE-SITE.XML_hadoop.http.authentication.signature.secret.file=/etc/security/http_secret @@ -170,4 +171,4 @@ OZONE-SITE.XML_ozone.filesystem.snapshot.enabled=true OZONE-SITE.XML_hdds.secret.key.rotate.duration=5m OZONE-SITE.XML_hdds.secret.key.rotate.check.duration=1m -OZONE-SITE.XML_hdds.secret.key.expiry.duration=1h \ No newline at end of file +OZONE-SITE.XML_hdds.secret.key.expiry.duration=1h diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/om-bootstrap.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/om-bootstrap.yaml index 90a382021406..73420b5cb38f 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/om-bootstrap.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/om-bootstrap.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-OM-Ratis-config: &common-env-file env_file: diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/root-ca-rotation.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/root-ca-rotation.yaml index be36cde6ddd4..cd9789c6676c 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/root-ca-rotation.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/root-ca-rotation.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-root-cert-rotation-config: &root-cert-rotation-config environment: diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/s3g-virtual-host.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/s3g-virtual-host.yaml index 708231ad20e8..23f3728e9c33 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/s3g-virtual-host.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/s3g-virtual-host.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-s3g-virtual-host-config: &s3g-virtual-host-config environment: diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/scm-decommission.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/scm-decommission.yaml index 8a1e2b3f2fcd..7964bdff9f8e 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/scm-decommission.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/scm-decommission.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: scm4.org: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-compose.yaml index 189d087be62e..625aac77723b 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-compose.yaml @@ -14,17 +14,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: kdc: image: ${OZONE_TESTKRB5_IMAGE} hostname: kdc + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs command: ["krb5kdc","-n"] kms: image: apache/hadoop:3 + dns_search: . ports: - 9600:9600 env_file: @@ -35,6 +36,7 @@ services: command: ["hadoop", "kms"] datanode: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -49,6 +51,7 @@ services: om: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: om + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -65,6 +68,7 @@ services: s3g: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: s3g + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -79,6 +83,7 @@ services: scm: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: scm + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-config b/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-config index 0ffba0c96f48..12a7819d1ad7 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-mr/docker-config @@ -37,6 +37,7 @@ OZONE-SITE.XML_ozone.om.kerberos.principal=om/om@EXAMPLE.COM OZONE-SITE.XML_ozone.om.kerberos.keytab.file=/etc/security/keytabs/om.keytab OZONE-SITE.XML_ozone.administrators=* OZONE-SITE.XML_ozone.s3.administrators="s3g" +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE-SITE.XML_ozone.security.enabled=true OZONE-SITE.XML_ozone.security.http.kerberos.enabled=true diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure/certificate-rotation.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure/certificate-rotation.yaml index 4b953f634355..32cecd4a2b79 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure/certificate-rotation.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure/certificate-rotation.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-cert-rotation-config: &cert-rotation-config environment: diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-compose.yaml index aabc0aafae25..39d26c362f6e 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-compose.yaml @@ -14,11 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: kdc: image: ${OZONE_TESTKRB5_IMAGE} hostname: kdc + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -26,6 +26,7 @@ services: kms: image: apache/hadoop:${HADOOP_VERSION} hostname: kms + dns_search: . ports: - 9600:9600 env_file: @@ -38,6 +39,7 @@ services: datanode: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: dn + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -52,6 +54,7 @@ services: om: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: om + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -68,6 +71,7 @@ services: httpfs: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: httpfs + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -83,6 +87,7 @@ services: s3g: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: s3g + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -97,6 +102,7 @@ services: recon: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: recon + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs @@ -111,6 +117,7 @@ services: scm: image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION} hostname: scm + dns_search: . volumes: - ../..:/opt/hadoop - ../_keytabs:/etc/security/keytabs diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-config b/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-config index 19cb80c4c2c0..4f13d624969a 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure/docker-config @@ -38,6 +38,7 @@ OZONE-SITE.XML_hdds.grpc.tls.enabled=true OZONE-SITE.XML_ozone.server.default.replication=3 OZONE-SITE.XML_ozone.datanode.pipeline.limit=1 OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE-SITE.XML_ozone.recon.om.snapshot.task.interval.delay=1m OZONE-SITE.XML_ozone.recon.db.dir=/data/metadata/recon diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure/fcq.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure/fcq.yaml index e074d7df480d..a29a46f6a08d 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure/fcq.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure/fcq.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-FCQ-config: &FCQ-config environment: diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure/root-ca-rotation.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure/root-ca-rotation.yaml index d26425231b3e..44d466d9ab91 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure/root-ca-rotation.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure/root-ca-rotation.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - x-root-cert-rotation-config: &root-cert-rotation-config environment: diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure/vault.yaml b/hadoop-ozone/dist/src/main/compose/ozonesecure/vault.yaml index b89b93621a51..9c7e4b085d09 100644 --- a/hadoop-ozone/dist/src/main/compose/ozonesecure/vault.yaml +++ b/hadoop-ozone/dist/src/main/compose/ozonesecure/vault.yaml @@ -14,7 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" services: om: env_file: diff --git a/hadoop-ozone/dist/src/main/compose/restart/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/restart/docker-compose.yaml index d0923c5f7d73..f5926659ef55 100644 --- a/hadoop-ozone/dist/src/main/compose/restart/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/restart/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/restart/docker-config b/hadoop-ozone/dist/src/main/compose/restart/docker-config index e256391c7d96..161af7a2975a 100644 --- a/hadoop-ozone/dist/src/main/compose/restart/docker-config +++ b/hadoop-ozone/dist/src/main/compose/restart/docker-config @@ -31,6 +31,7 @@ OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB OZONE-SITE.XML_ozone.recon.address=recon:9891 OZONE-SITE.XML_ozone.recon.om.snapshot.task.interval.delay=1m OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE_CONF_DIR=/etc/hadoop OZONE_LOG_DIR=/var/log/hadoop diff --git a/hadoop-ozone/dist/src/main/compose/test-all.sh b/hadoop-ozone/dist/src/main/compose/test-all.sh index 85294b6b7938..90933a849e04 100755 --- a/hadoop-ozone/dist/src/main/compose/test-all.sh +++ b/hadoop-ozone/dist/src/main/compose/test-all.sh @@ -36,8 +36,8 @@ if [[ "${OZONE_WITH_COVERAGE}" == "true" ]]; then export OZONE_OPTS="-javaagent:share/coverage/jacoco-agent.jar=output=tcpclient,address=$DOCKER_BRIDGE_IP,includes=org.apache.hadoop.ozone.*:org.apache.hadoop.hdds.*:org.apache.hadoop.fs.ozone.*" fi -tests=$(find_tests) cd "$SCRIPT_DIR" +tests=$(find_tests) RESULT=0 run_test_scripts ${tests} || RESULT=$? diff --git a/hadoop-ozone/dist/src/main/compose/testlib.sh b/hadoop-ozone/dist/src/main/compose/testlib.sh index d4ad22e58ecc..44b4f303807f 100755 --- a/hadoop-ozone/dist/src/main/compose/testlib.sh +++ b/hadoop-ozone/dist/src/main/compose/testlib.sh @@ -212,7 +212,7 @@ execute_robot_test(){ "$SMOKETEST_DIR_INSIDE/$TEST" local -i rc=$? - FULL_CONTAINER_NAME=$(docker-compose ps | grep "[-_]${CONTAINER}[-_]" | head -n 1 | awk '{print $1}') + FULL_CONTAINER_NAME=$(docker-compose ps -a | grep "[-_]${CONTAINER}[-_]" | head -n 1 | awk '{print $1}') docker cp "$FULL_CONTAINER_NAME:$OUTPUT_PATH" "$RESULT_DIR/" if [[ ${rc} -gt 0 ]] && [[ ${rc} -le 250 ]]; then @@ -251,7 +251,7 @@ create_stack_dumps() { ## @description Copy any 'out' files for daemon processes to the result dir copy_daemon_logs() { local c f - for c in $(docker-compose ps | grep "^${COMPOSE_ENV_NAME}[_-]" | awk '{print $1}'); do + for c in $(docker-compose ps -a | grep "^${COMPOSE_ENV_NAME}[_-]" | awk '{print $1}'); do for f in $(docker exec "${c}" ls -1 /var/log/hadoop 2> /dev/null | grep -F -e '.out' -e audit); do docker cp "${c}:/var/log/hadoop/${f}" "$RESULT_DIR/" done @@ -304,9 +304,10 @@ get_output_name() { save_container_logs() { local output_name=$(get_output_name) - local c - for c in $(docker-compose ps "$@" | cut -f1 -d' ' | tail -n +3); do - docker logs "${c}" >> "$RESULT_DIR/docker-${output_name}${c}.log" 2>&1 + local id + for i in $(docker-compose ps -a -q "$@"); do + local c=$(docker ps -a --filter "id=${i}" --format "{{ .Names }}") + docker logs "${i}" >> "$RESULT_DIR/docker-${output_name}${c}.log" 2>&1 done } diff --git a/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-compose.yaml index 186228fe60fe..84ae48fbbc36 100644 --- a/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config @@ -23,6 +21,7 @@ x-common-config: - docker-config - ../../../common/security.conf image: ${OZONE_IMAGE} + dns_search: . x-environment: &environment diff --git a/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-config b/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-config index e252ebecaf1f..909b72852aa8 100644 --- a/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/upgrade/compose/ha/docker-config @@ -39,6 +39,7 @@ OZONE-SITE.XML_ozone.scm.datanode.id.dir=/data OZONE-SITE.XML_ozone.scm.container.size=1GB OZONE-SITE.XML_hdds.datanode.dir=/data/hdds OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http # If SCM sends container close commands as part of upgrade finalization while # datanodes are doing a leader election, all 3 replicas may end up in the diff --git a/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-compose.yaml index 68d1874cb16e..28b3d922f719 100644 --- a/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-config b/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-config index 45ef68acdd2b..95ce6c0c9c5b 100644 --- a/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/upgrade/compose/non-ha/docker-config @@ -36,6 +36,7 @@ OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB OZONE-SITE.XML_ozone.recon.db.dir=/data/metadata/recon OZONE-SITE.XML_ozone.recon.om.snapshot.task.interval.delay=1m OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE_CONF_DIR=/etc/hadoop OZONE_LOG_DIR=/var/log/hadoop diff --git a/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-compose.yaml b/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-compose.yaml index 33ca9da3478c..b7bf1fc49838 100644 --- a/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-compose.yaml +++ b/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-compose.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-common-config: &common-config diff --git a/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-config b/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-config index f6c0116c1d50..1b805c98960f 100644 --- a/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/upgrade/compose/om-ha/docker-config @@ -31,6 +31,7 @@ OZONE-SITE.XML_ozone.scm.datanode.id.dir=/data OZONE-SITE.XML_ozone.scm.block.client.address=scm OZONE-SITE.XML_ozone.scm.container.size=1GB OZONE-SITE.XML_ozone.scm.client.address=scm +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http OZONE-SITE.XML_hdds.datanode.dir=/data/hdds OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB diff --git a/hadoop-ozone/dist/src/main/compose/xcompat/clients.yaml b/hadoop-ozone/dist/src/main/compose/xcompat/clients.yaml index 2057cdd8a993..0bf0f619bd7c 100644 --- a/hadoop-ozone/dist/src/main/compose/xcompat/clients.yaml +++ b/hadoop-ozone/dist/src/main/compose/xcompat/clients.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - services: old_client_1_0_0: image: apache/ozone:1.0.0 diff --git a/hadoop-ozone/dist/src/main/compose/xcompat/docker-config b/hadoop-ozone/dist/src/main/compose/xcompat/docker-config index 4c11af72ade3..85099f902d39 100644 --- a/hadoop-ozone/dist/src/main/compose/xcompat/docker-config +++ b/hadoop-ozone/dist/src/main/compose/xcompat/docker-config @@ -35,4 +35,5 @@ OZONE-SITE.XML_ozone.scm.pipeline.owner.container.count=1 OZONE-SITE.XML_recon.om.snapshot.task.interval.delay=1m OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s OZONE-SITE.XML_ozone.default.bucket.layout=LEGACY +OZONE-SITE.XML_ozone.http.basedir=/tmp/ozone_http no_proxy=om,recon,scm,s3g,kdc,localhost,127.0.0.1 diff --git a/hadoop-ozone/dist/src/main/compose/xcompat/new-cluster.yaml b/hadoop-ozone/dist/src/main/compose/xcompat/new-cluster.yaml index 7dfd061c8ace..6e3ff6cfbc9c 100644 --- a/hadoop-ozone/dist/src/main/compose/xcompat/new-cluster.yaml +++ b/hadoop-ozone/dist/src/main/compose/xcompat/new-cluster.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-new-config: &new-config diff --git a/hadoop-ozone/dist/src/main/compose/xcompat/old-cluster.yaml b/hadoop-ozone/dist/src/main/compose/xcompat/old-cluster.yaml index dbdaa20a2a08..c603bb51df32 100644 --- a/hadoop-ozone/dist/src/main/compose/xcompat/old-cluster.yaml +++ b/hadoop-ozone/dist/src/main/compose/xcompat/old-cluster.yaml @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -version: "3.8" - # reusable fragments (see https://docs.docker.com/compose/compose-file/#extension-fields) x-old-config: &old-config diff --git a/hadoop-ozone/dist/src/main/license/bin/LICENSE.txt b/hadoop-ozone/dist/src/main/license/bin/LICENSE.txt index 2ce8730586c5..c28483c67356 100644 --- a/hadoop-ozone/dist/src/main/license/bin/LICENSE.txt +++ b/hadoop-ozone/dist/src/main/license/bin/LICENSE.txt @@ -251,9 +251,6 @@ CDDL 1.1 + GPLv2 with classpath exception com.sun.istack:istack-commons-runtime com.sun.jersey:jersey-client com.sun.jersey:jersey-core - com.sun.jersey:jersey-json - com.sun.jersey:jersey-server - com.sun.jersey:jersey-servlet javax.annotation:javax.annotation-api javax.el:javax.el-api javax.interceptor:javax.interceptor-api diff --git a/hadoop-ozone/dist/src/main/license/jar-report.txt b/hadoop-ozone/dist/src/main/license/jar-report.txt index 58c080bece41..042c9380e4af 100644 --- a/hadoop-ozone/dist/src/main/license/jar-report.txt +++ b/hadoop-ozone/dist/src/main/license/jar-report.txt @@ -134,8 +134,6 @@ share/ozone/lib/jersey-hk2.jar share/ozone/lib/jersey-media-jaxb.jar share/ozone/lib/jersey-media-json-jackson.jar share/ozone/lib/jersey-server.jar -share/ozone/lib/jersey-server.jar -share/ozone/lib/jersey-servlet.jar share/ozone/lib/jetty-client.jar share/ozone/lib/jetty-http.jar share/ozone/lib/jetty-io.jar diff --git a/hadoop-ozone/dist/src/main/smoketest/admincli/cert.robot b/hadoop-ozone/dist/src/main/smoketest/admincli/cert.robot index 43aac21fae2d..bd5b82b8c4ae 100644 --- a/hadoop-ozone/dist/src/main/smoketest/admincli/cert.robot +++ b/hadoop-ozone/dist/src/main/smoketest/admincli/cert.robot @@ -30,10 +30,9 @@ List certificates List certificates as JSON Pass Execution If '${SECURITY_ENABLED}' == 'false' N/A - Execute ozone admin cert list --json 1>> outStream 2>> errStream - ${output} Execute cat outStream | jq -r '.[0] | keys' + Execute ozone admin cert list --json 1>> ${TEMP_DIR}/outStream 2>> ${TEMP_DIR}/errStream + ${output} Execute cat ${TEMP_DIR}/outStream | jq -r '.[0] | keys' Should Contain ${output} serialNumber - ${errOutput} = Execute cat errStream + ${errOutput} = Execute cat ${TEMP_DIR}/errStream Should Contain ${errOutput} Certificate list:(BatchSize= - Execute rm outStream - Execute rm errStream \ No newline at end of file + [teardown] Remove Files ${TEMP_DIR}/outStream ${TEMP_DIR}/errStream diff --git a/hadoop-ozone/dist/src/main/smoketest/admincli/datanode.robot b/hadoop-ozone/dist/src/main/smoketest/admincli/datanode.robot index 5b6c2fe97e25..03cb03979ecb 100644 --- a/hadoop-ozone/dist/src/main/smoketest/admincli/datanode.robot +++ b/hadoop-ozone/dist/src/main/smoketest/admincli/datanode.robot @@ -20,6 +20,9 @@ Resource ../commonlib.robot Suite Setup Run Keyword if '${SECURITY_ENABLED}' == 'true' Kinit test user testuser testuser.keytab Test Timeout 5 minutes +*** Variables *** +${LIST_FILE} ${TEMP_DIR}/datanode.list + *** Keywords *** Assert Output [arguments] ${output} ${expected} ${uuid} @@ -31,57 +34,57 @@ Assert Output *** Test Cases *** List datanodes - Execute ozone admin datanode list > datanode.list - ${output} = Get File datanode.list + Execute ozone admin datanode list > ${LIST_FILE} + ${output} = Get File ${LIST_FILE} Should contain ${output} Datanode: Should contain ${output} Related pipelines: Filter list by UUID - ${uuid} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$2 }' + ${uuid} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$2 }' ${output} = Execute ozone admin datanode list --id "${uuid}" Assert Output ${output} 1 ${uuid} Filter list by Ip address - ${uuid} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$2 }' - ${ip} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$3 }' + ${uuid} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$2 }' + ${ip} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$3 }' ${output} = Execute ozone admin datanode list --ip "${ip}" Assert Output ${output} 1 ${uuid} Filter list by Hostname - ${uuid} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$2 }' - ${hostname} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$4 }' + ${uuid} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$2 }' + ${hostname} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$4 }' ${output} = Execute ozone admin datanode list --hostname "${hostname}" Assert Output ${output} 1 ${uuid} Filter list by NodeOperationalState - ${uuid} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$2 }' - ${expected} = Execute grep -c 'Operational State: IN_SERVICE' datanode.list + ${uuid} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$2 }' + ${expected} = Execute grep -c 'Operational State: IN_SERVICE' ${LIST_FILE} ${output} = Execute ozone admin datanode list --operational-state IN_SERVICE Assert Output ${output} ${expected} ${uuid} Filter list by NodeState - ${uuid} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$2 }' - ${expected} = Execute grep -c 'Health State: HEALTHY' datanode.list + ${uuid} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$2 }' + ${expected} = Execute grep -c 'Health State: HEALTHY' ${LIST_FILE} ${output} = Execute ozone admin datanode list --node-state HEALTHY Assert Output ${output} ${expected} ${uuid} Get usage info by UUID - ${uuid} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$2 }' + ${uuid} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$2 }' ${output} = Execute ozone admin datanode usageinfo --uuid "${uuid}" Should contain ${output} Usage Information (1 Datanodes) Get usage info by Ip address - ${ip} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$3 }' + ${ip} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$3 }' ${output} = Execute ozone admin datanode usageinfo --address "${ip}" Should contain ${output} Usage Information (1 Datanodes) Get usage info by Hostname - ${hostname} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$4 }' + ${hostname} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$3 }' | awk -F '[/]' '{ print \$4 }' ${output} = Execute ozone admin datanode usageinfo --address "${hostname}" Should contain ${output} Usage Information (1 Datanodes) Get usage info with invalid address - ${uuid} = Execute grep '^Datanode:' datanode.list | head -1 | awk '{ print \$2 }' + ${uuid} = Execute grep '^Datanode:' ${LIST_FILE} | head -1 | awk '{ print \$2 }' ${output} = Execute ozone admin datanode usageinfo --address "${uuid}" Should contain ${output} Usage Information (0 Datanodes) diff --git a/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot b/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot index 49679587be94..4299afe5f2d1 100644 --- a/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot +++ b/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot @@ -63,11 +63,43 @@ Datanode Recommission is Finished Run Container Balancer ${result} = Execute ozone admin containerbalancer start -t 1 -d 100 -i 1 Should Contain ${result} Container Balancer started successfully. + +Wait Finish Of Balancing ${result} = Execute ozone admin containerbalancer status Should Contain ${result} ContainerBalancer is Running. Wait Until Keyword Succeeds 3min 10sec ContainerBalancer is Not Running Sleep 60000ms +Verify Verbose Balancer Status + [arguments] ${output} + + Should Contain ${output} ContainerBalancer is Running. + Should Contain ${output} Started at: + Should Contain ${output} Container Balancer Configuration values: + +Verify Balancer Iteration + [arguments] ${output} ${number} ${status} ${containers} + + Should Contain ${output} Iteration number ${number} + Should Contain ${output} Iteration result ${status} + Should Contain ${output} Scheduled to move containers ${containers} + +Run Balancer Status + ${result} = Execute ozone admin containerbalancer status + Should Contain ${result} ContainerBalancer is Running. + +Run Balancer Verbose Status + ${result} = Execute ozone admin containerbalancer status -v + Verify Verbose Balancer Status ${result} + Verify Balancer Iteration ${result} 1 IN_PROGRESS 3 + Should Contain ${result} Current iteration info: + +Run Balancer Verbose History Status + ${result} = Execute ozone admin containerbalancer status -v --history + Verify Verbose Balancer Status ${result} + Verify Balancer Iteration ${result} 1 IN_PROGRESS 3 + Should Contain ${result} Iteration history list: + ContainerBalancer is Not Running ${result} = Execute ozone admin containerbalancer status Should contain ${result} ContainerBalancer is Not Running. @@ -133,6 +165,14 @@ Verify Container Balancer for RATIS containers Run Container Balancer + Run Balancer Status + + Run Balancer Verbose Status + + Run Balancer Verbose History Status + + Wait Finish Of Balancing + ${datanodeOzoneUsedBytesInfoAfterContainerBalancing} = Get Datanode Ozone Used Bytes Info ${uuid} Should Not Be Equal As Integers ${datanodeOzoneUsedBytesInfo} ${datanodeOzoneUsedBytesInfoAfterContainerBalancing} Should Be True ${datanodeOzoneUsedBytesInfoAfterContainerBalancing} < ${SIZE} * 3.5 diff --git a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot index 685f57fd2bb8..83f0a1b69e26 100644 --- a/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot +++ b/hadoop-ozone/dist/src/main/smoketest/basic/ozone-shell-lib.robot @@ -21,6 +21,7 @@ Resource ../commonlib.robot *** Variables *** ${prefix} generated ${SCM} scm +${TMP_JSON} ${TEMP_DIR}/bb1.json *** Keywords *** @@ -44,18 +45,18 @@ Test ozone shell Should Be Equal ${result} 10995116277760 ${result} = Execute ozone sh bucket create ${protocol}${server}/${volume}/bb1 --space-quota 10TB --namespace-quota 100 Should Be Empty ${result} - Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 > bb1.json - ${result} = Execute jq -r '. | select(.name=="bb1") | .storageType' bb1.json + Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 > ${TMP_JSON} + ${result} = Execute jq -r '. | select(.name=="bb1") | .storageType' ${TMP_JSON} Should Be Equal ${result} DISK - ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInBytes' bb1.json + ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInBytes' ${TMP_JSON} Should Be Equal ${result} 10995116277760 - ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInNamespace' bb1.json + ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInNamespace' ${TMP_JSON} Should Be Equal ${result} 100 Execute ozone sh bucket setquota ${protocol}${server}/${volume}/bb1 --space-quota 1TB --namespace-quota 1000 - Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 > bb1.json - ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInBytes' bb1.json + Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 > ${TMP_JSON} + ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInBytes' ${TMP_JSON} Should Be Equal ${result} 1099511627776 - ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInNamespace' bb1.json + ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInNamespace' ${TMP_JSON} Should Be Equal ${result} 1000 ${result} = Execute ozone sh bucket list ${protocol}${server}/${volume}/ | jq -r '.[] | select(.name=="bb1") | .volumeName' Should Be Equal ${result} ${volume} @@ -75,16 +76,16 @@ Test ozone shell Execute ozone sh bucket delete -r --yes ${protocol}${server}/${volume}/bb1 Execute ozone sh volume delete ${protocol}${server}/${volume} Execute ozone sh volume create ${protocol}${server}/${volume} - Execute ozone sh volume info ${protocol}${server}/${volume} > volume.json - ${result} = Execute jq -r '. | select(.name=="${volume}") | .quotaInBytes' volume.json + Execute ozone sh volume info ${protocol}${server}/${volume} > ${TMP_JSON} + ${result} = Execute jq -r '. | select(.name=="${volume}") | .quotaInBytes' ${TMP_JSON} Should Be Equal ${result} -1 - ${result} = Execute jq -r '. | select(.name=="${volume}") | .quotaInNamespace' volume.json + ${result} = Execute jq -r '. | select(.name=="${volume}") | .quotaInNamespace' ${TMP_JSON} Should Be Equal ${result} -1 Execute ozone sh bucket create ${protocol}${server}/${volume}/bb1 - Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 > bb1.json - ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInBytes' bb1.json + Execute ozone sh bucket info ${protocol}${server}/${volume}/bb1 > ${TMP_JSON} + ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInBytes' ${TMP_JSON} Should Be Equal ${result} -1 - ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInNamespace' bb1.json + ${result} = Execute jq -r '. | select(.name=="bb1") | .quotaInNamespace' ${TMP_JSON} Should Be Equal ${result} -1 Execute ozone sh bucket delete ${protocol}${server}/${volume}/bb1 Execute ozone sh volume delete ${protocol}${server}/${volume} diff --git a/hadoop-ozone/dist/src/main/smoketest/cli/classpath.robot b/hadoop-ozone/dist/src/main/smoketest/cli/classpath.robot index 9578d29621c0..6991d8bf8a22 100644 --- a/hadoop-ozone/dist/src/main/smoketest/cli/classpath.robot +++ b/hadoop-ozone/dist/src/main/smoketest/cli/classpath.robot @@ -19,28 +19,32 @@ Library BuiltIn Resource ../lib/os.robot Resource ../ozone-lib/shell.robot Test Timeout 5 minutes -Suite Setup Find Jars Dir *** Test Cases *** Ignores HADOOP_CLASSPATH if OZONE_CLASSPATH is set - [setup] Create File %{HDDS_LIB_JARS_DIR}/hadoop-classpath.jar - Set Environment Variable HADOOP_CLASSPATH %{HDDS_LIB_JARS_DIR}/hadoop-classpath.jar + [setup] Create File ${TEMP_DIR}/hadoop-classpath.jar + Set Environment Variable HADOOP_CLASSPATH ${TEMP_DIR}/hadoop-classpath.jar Set Environment Variable OZONE_CLASSPATH ${EMPTY} ${output} = Execute ozone classpath ozone-insight Should Contain ${output} hdds-interface - Should Not Contain ${output} %{HDDS_LIB_JARS_DIR}/hadoop-classpath.jar - [teardown] Remove File %{HDDS_LIB_JARS_DIR}/hadoop-classpath.jar + Should Not Contain ${output} ${TEMP_DIR}/hadoop-classpath.jar + [teardown] Remove File ${TEMP_DIR}/hadoop-classpath.jar Picks up items from OZONE_CLASSPATH - [setup] Create File %{HDDS_LIB_JARS_DIR}/ozone-classpath.jar - Set Environment Variable OZONE_CLASSPATH %{HDDS_LIB_JARS_DIR}/ozone-classpath.jar + [setup] Create File ${TEMP_DIR}/ozone-classpath.jar + Set Environment Variable OZONE_CLASSPATH ${TEMP_DIR}/ozone-classpath.jar ${output} = Execute ozone classpath ozone-insight - Should Contain ${output} %{HDDS_LIB_JARS_DIR}/ozone-classpath.jar - [teardown] Remove File %{HDDS_LIB_JARS_DIR}/ozone-classpath.jar + Should Contain ${output} ${TEMP_DIR}/ozone-classpath.jar + [teardown] Remove File ${TEMP_DIR}/ozone-classpath.jar Adds optional dir entries - [setup] Create File %{HDDS_LIB_JARS_DIR}/ozone-insight/optional.jar Set Environment Variable OZONE_CLASSPATH ${EMPTY} - ${output} = Execute ozone classpath ozone-insight - Should Contain ${output} %{HDDS_LIB_JARS_DIR}/ozone-insight/optional.jar - [teardown] Remove File %{HDDS_LIB_JARS_DIR}/ozone-insight/optional.jar + ${OZONE_COPY} = Set Variable ${TEMP_DIR}/ozone-copy + Copy Directory ${OZONE_DIR} ${OZONE_COPY} + ${jars_dir} = Find Jars Dir ${OZONE_COPY} + Create File ${jars_dir}/ozone-insight/optional.jar + + ${output} = Execute ${OZONE_COPY}/bin/ozone classpath ozone-insight + Should Contain ${output} ${jars_dir}/ozone-insight/optional.jar + + [teardown] Remove Directory ${OZONE_COPY} recursive=True diff --git a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-corrupt-block.robot b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-corrupt-block.robot index b3f499484130..e0fcd50ac12f 100644 --- a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-corrupt-block.robot +++ b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-corrupt-block.robot @@ -35,7 +35,7 @@ Test ozone debug read-replicas with corrupt block replica Should Be Equal As Integers ${count_files} 7 ${json} = Read Replicas Manifest - ${md5sum} = Execute md5sum testfile | awk '{print $1}' + ${md5sum} = Execute md5sum ${TEMP_DIR}/${TESTFILE} | awk '{print $1}' FOR ${replica} IN RANGE 3 ${datanode} = Set Variable ${json}[blocks][0][replicas][${replica}][hostname] diff --git a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-dead-datanode.robot b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-dead-datanode.robot index 09a9510dbbf0..e8385bb5938f 100644 --- a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-dead-datanode.robot +++ b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-dead-datanode.robot @@ -34,7 +34,7 @@ Test ozone debug read-replicas with one datanode DEAD Should Be Equal As Integers ${count_files} 5 ${json} = Read Replicas Manifest - ${md5sum} = Execute md5sum testfile | awk '{print $1}' + ${md5sum} = Execute md5sum ${TEMP_DIR}/${TESTFILE} | awk '{print $1}' FOR ${replica} IN RANGE 2 Verify Healthy Replica ${json} ${replica} ${md5sum} diff --git a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-lease-recovery.robot b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-lease-recovery.robot index a721f2acbbe6..f867ee99f644 100644 --- a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-lease-recovery.robot +++ b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-lease-recovery.robot @@ -30,8 +30,8 @@ ${TESTFILE} testfile22 Create volume bucket and put key Execute ozone sh volume create /${VOLUME} Execute ozone sh bucket create /${VOLUME}/${BUCKET} - Create File ${TESTFILE} - Execute ozone sh key put /${VOLUME}/${BUCKET}/${TESTFILE} ${TESTFILE} + Create File ${TEMP_DIR}/${TESTFILE} + Execute ozone sh key put /${VOLUME}/${BUCKET}/${TESTFILE} ${TEMP_DIR}/${TESTFILE} *** Test Cases *** Test ozone debug recover for o3fs diff --git a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-stale-datanode.robot b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-stale-datanode.robot index 2bd1b10dbce6..c7cc7aaf3aa4 100644 --- a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-stale-datanode.robot +++ b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-stale-datanode.robot @@ -35,7 +35,7 @@ Test ozone debug read-replicas with one datanode STALE Should Be Equal As Integers ${count_files} 7 ${json} = Read Replicas Manifest - ${md5sum} = Execute md5sum testfile | awk '{print $1}' + ${md5sum} = Execute md5sum ${TEMP_DIR}/${TESTFILE} | awk '{print $1}' FOR ${replica} IN RANGE 3 ${datanode} = Set Variable ${json}[blocks][0][replicas][${replica}][hostname] diff --git a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-tests.robot b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-tests.robot index c26e163a051b..ca1995bf3a1c 100644 --- a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-tests.robot +++ b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug-tests.robot @@ -32,8 +32,8 @@ ${TESTFILE} testfile Write keys Execute ozone sh volume create o3://om/${VOLUME} --space-quota 100TB --namespace-quota 100 Execute ozone sh bucket create o3://om/${VOLUME}/${BUCKET} --space-quota 1TB - Execute dd if=/dev/urandom of=${TESTFILE} bs=100000 count=15 - Execute ozone sh key put o3://om/${VOLUME}/${BUCKET}/${TESTFILE} ${TESTFILE} + Execute dd if=/dev/urandom of=${TEMP_DIR}/${TESTFILE} bs=100000 count=15 + Execute ozone sh key put o3://om/${VOLUME}/${BUCKET}/${TESTFILE} ${TEMP_DIR}/${TESTFILE} *** Test Cases *** Test ozone debug read-replicas @@ -44,7 +44,7 @@ Test ozone debug read-replicas Should Be Equal As Integers ${count_files} 7 ${json} = Read Replicas Manifest - ${md5sum} = Execute md5sum ${TESTFILE} | awk '{print $1}' + ${md5sum} = Execute md5sum ${TEMP_DIR}/${TESTFILE} | awk '{print $1}' FOR ${replica} IN RANGE 3 Verify Healthy Replica ${json} ${replica} ${md5sum} diff --git a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug.robot b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug.robot index 9f2364aaaeb8..fa915819eea7 100644 --- a/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug.robot +++ b/hadoop-ozone/dist/src/main/smoketest/debug/ozone-debug.robot @@ -20,8 +20,8 @@ Resource ../lib/os.robot *** Keywords *** Execute read-replicas CLI tool - Execute ozone debug -Dozone.network.topology.aware.read=true read-replicas o3://om/${VOLUME}/${BUCKET}/${TESTFILE} - ${directory} = Execute ls -d /opt/hadoop/${VOLUME}_${BUCKET}_${TESTFILE}_*/ | tail -n 1 + Execute ozone debug -Dozone.network.topology.aware.read=true read-replicas --output-dir ${TEMP_DIR} o3://om/${VOLUME}/${BUCKET}/${TESTFILE} + ${directory} = Execute ls -d ${TEMP_DIR}/${VOLUME}_${BUCKET}_${TESTFILE}_*/ | tail -n 1 Directory Should Exist ${directory} File Should Exist ${directory}/${TESTFILE}_manifest [Return] ${directory} @@ -40,7 +40,7 @@ Read Replicas Manifest Validate JSON [arguments] ${json} Should Be Equal ${json}[filename] ${VOLUME}/${BUCKET}/${TESTFILE} - ${file_size} = Get File Size ${TESTFILE} + ${file_size} = Get File Size ${TEMP_DIR}/${TESTFILE} Should Be Equal ${json}[datasize] ${file_size} Should Be Equal As Integers ${json}[blocks][0][blockIndex] 1 Should Not Be Empty Convert To String ${json}[blocks][0][containerId] diff --git a/hadoop-ozone/dist/src/main/smoketest/ec/rewrite.robot b/hadoop-ozone/dist/src/main/smoketest/ec/rewrite.robot new file mode 100644 index 000000000000..5b5df209eced --- /dev/null +++ b/hadoop-ozone/dist/src/main/smoketest/ec/rewrite.robot @@ -0,0 +1,45 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +*** Settings *** +Documentation Test EC shell commands +Library OperatingSystem +Resource ../commonlib.robot +Resource ../lib/os.robot +Resource ../ozone-lib/shell.robot +Resource ../s3/commonawslib.robot +Resource lib.resource +Suite Setup Run Keyword if '${SECURITY_ENABLED}' == 'true' Kinit test user testuser testuser.keytab + + +*** Variables *** +${ENDPOINT_URL} http://s3g:9878 + + +*** Test Cases *** + +Rewrite Multipart Key + [setup] Setup v4 headers + ${bucket} = Create bucket with layout /s3v OBJECT_STORE + ${key} = Set Variable multipart.key + ${file} = Create Random File MB 12 + Execute AWSS3Cli cp ${file} s3://${bucket}/${key} + Key Should Match Local File /s3v/${bucket}/${key} ${file} + Verify Key Replica Replication Config /s3v/${bucket}/${key} RATIS THREE + + Execute ozone sh key rewrite -t EC -r rs-3-2-1024k /s3v/${bucket}/${key} + + Key Should Match Local File /s3v/${bucket}/${key} ${file} + Verify Key EC Replication Config /s3v/${bucket}/${key} RS 3 2 1048576 diff --git a/hadoop-ozone/dist/src/main/smoketest/httpfs/operations.robot b/hadoop-ozone/dist/src/main/smoketest/httpfs/operations.robot index ac9b56f2fff3..d16840e57b17 100644 --- a/hadoop-ozone/dist/src/main/smoketest/httpfs/operations.robot +++ b/hadoop-ozone/dist/src/main/smoketest/httpfs/operations.robot @@ -42,8 +42,3 @@ Execute create file command ${output2} Run process curl -X PUT -T ${file_name} ${curl_extra_commands} "${final_url2}" -H"Content-Type: application/octet-stream" shell=True Should Be Equal As Integers ${output2.rc} 0 [return] ${output2} - -Create file - [Arguments] ${file_name} - Run process touch ${file_name} shell=True - Run process echo "Hello world!">${file_name} shell=True \ No newline at end of file diff --git a/hadoop-ozone/dist/src/main/smoketest/httpfs/operations_tests.robot b/hadoop-ozone/dist/src/main/smoketest/httpfs/operations_tests.robot index 40786232407e..603162622e8b 100644 --- a/hadoop-ozone/dist/src/main/smoketest/httpfs/operations_tests.robot +++ b/hadoop-ozone/dist/src/main/smoketest/httpfs/operations_tests.robot @@ -18,6 +18,7 @@ Documentation HttpFS gateway test with curl commands Library Process Library String Library BuiltIn +Library OperatingSystem Resource operations.robot Resource ../lib/os.robot Resource ../commonlib.robot @@ -61,10 +62,10 @@ Create second bucket Should contain ${bucket.stdout} true Create local testfile - Create file testfile + Create File ${TEMP_DIR}/testfile "Hello world!" Create testfile - ${file} = Execute create file command ${volume}/buck1/testfile testfile + ${file} = Execute create file command ${volume}/buck1/testfile ${TEMP_DIR}/testfile Should contain ${file.stdout} http://httpfs:14000/webhdfs/v1/${volume}/buck1/testfile Read file @@ -151,4 +152,4 @@ Get quota usage of directory # ${status_after} = Execute curl command vol1/buck1 GETFILESTATUS ${EMPTY} # ${json_after} = evaluate json.loads('''${status_after.stdout}''') json # ${owner_after} = Set Variable ${json_after["FileStatus"]["owner"]} - # Should be equal hadoop ${owner_after} \ No newline at end of file + # Should be equal hadoop ${owner_after} diff --git a/hadoop-ozone/dist/src/main/smoketest/lib/os.robot b/hadoop-ozone/dist/src/main/smoketest/lib/os.robot index cc20d6ee286e..98f836ff8bf7 100644 --- a/hadoop-ozone/dist/src/main/smoketest/lib/os.robot +++ b/hadoop-ozone/dist/src/main/smoketest/lib/os.robot @@ -40,13 +40,28 @@ Compare files ${checksumafter} = Execute md5sum ${file2} | awk '{print $1}' Should Be Equal ${checksumbefore} ${checksumafter} +Create Random File MB + [arguments] ${size_in_megabytes} ${path}=${EMPTY} + ${path} = Create Random File ${size_in_megabytes} 1048576 ${path} + [return] ${path} + +Create Random File KB + [arguments] ${size_in_kilobytes} ${path}=${EMPTY} + ${path} = Create Random File ${size_in_kilobytes} 1024 ${path} + [return] ${path} + Create Random File - ${postfix} = Generate Random String 5 [NUMBERS] + [arguments] ${block_count} ${block_size} ${path}=${EMPTY} + ${path} = Run Keyword If '${path}' == '${EMPTY}' Get Random Filename + ... ELSE Set Variable ${path} + Execute dd if=/dev/urandom of=${path} bs=${block_size} count=${block_count} status=none + [return] ${path} + +Get Random Filename + ${postfix} = Generate Random String 10 [LOWER] ${tmpfile} = Set Variable /tmp/tempfile-${postfix} File Should Not Exist ${tmpfile} - ${content} = Set Variable "Random string" - Create File ${tmpfile} ${content} - [Return] ${tmpfile} + [return] ${tmpfile} List All Processes ${output} = Execute ps aux diff --git a/hadoop-ozone/dist/src/main/smoketest/omha/data-creation-before-om-bootstrap.robot b/hadoop-ozone/dist/src/main/smoketest/omha/data-creation-before-om-bootstrap.robot index 4d1100aee574..46aaffdebe8e 100644 --- a/hadoop-ozone/dist/src/main/smoketest/omha/data-creation-before-om-bootstrap.robot +++ b/hadoop-ozone/dist/src/main/smoketest/omha/data-creation-before-om-bootstrap.robot @@ -20,7 +20,7 @@ Test Timeout 5 minutes Test Setup Run Keyword if '${SECURITY_ENABLED}' == 'true' Kinit test user testuser testuser.keytab *** Variables *** -${TMP_FILE} tmp.txt +${TMP_FILE} ${TEMP_DIR}/tmp.txt ${VOLUME} ${BUCKET} ${SNAP_1} @@ -37,19 +37,6 @@ Create volume and bucket ${bucket_res} = Execute ozone sh bucket create /${volume}/${bucket} Should Be Empty ${bucket_res} -Create tmp file - [arguments] ${file_name} - ${create_res} = Execute touch ${file_name} - Should Be Empty ${create_res} - ${ls_grep_res} = Execute ls -lah | grep '${file_name}' - Should contain ${ls_grep_res} ${file_name} - -Delete tmp file - [arguments] ${file_name} - Execute rm ${file_name} - ${file_exists} = Execute [[ -f ${file_name} ]] && echo "File exists" || echo "File doesn't exist" - Should contain ${file_exists} File doesn't exist - Create a key and set contents same as the keyName [arguments] ${volume} ${bucket} ${key_prefix} ${key_name} ${tmp_file} Execute echo "${key_prefix}/${key_name}" > ${tmp_file} @@ -83,14 +70,9 @@ Create 100 metadata keys under /${VOLUME}/${BUCKET} Create snapshot '${SNAP_1}' Create snapshot ${VOLUME} ${BUCKET} ${SNAP_1} -Create tmp file to be used for key creation - Create tmp file ${TMP_FILE} - Create 2 actual keys with prefix '${KEY_PREFIX}', key contents the same as the key name Create actual keys ${VOLUME} ${BUCKET} ${KEY_PREFIX} ${KEY_1} ${KEY_2} ${TMP_FILE} + [teardown] Remove File ${TMP_FILE} Create snapshot '${SNAP_2}' Create snapshot ${VOLUME} ${BUCKET} ${SNAP_2} - -Cleanup tmp file - Delete tmp file ${TMP_FILE} diff --git a/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell.robot b/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell.robot index b255d516da56..2b54e8bf330c 100644 --- a/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell.robot +++ b/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell.robot @@ -53,8 +53,16 @@ Create Random Volume [return] vol-${random} Find Jars Dir - ${dir} = Execute ozone envvars | grep 'HDDS_LIB_JARS_DIR' | cut -f2 -d= | sed -e "s/'//g" -e 's/"//g' - Set Environment Variable HDDS_LIB_JARS_DIR ${dir} + [arguments] ${ozone_dir}=${OZONE_DIR} + ${dir} = Execute ${ozone_dir}/bin/ozone envvars | grep 'HDDS_LIB_JARS_DIR' | cut -f2 -d= | sed -e "s/'//g" -e 's/"//g' + [return] ${dir} + +Create bucket with layout + [Arguments] ${volume} ${layout} + ${postfix} = Generate Random String 10 [LOWER] + ${bucket} = Set Variable bucket-${postfix} + ${result} = Execute ozone sh bucket create --layout ${layout} ${volume}/${bucket} + [Return] ${bucket} Create Key [arguments] ${key} ${file} ${args}=${EMPTY} diff --git a/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell_tests.robot b/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell_tests.robot index 56fbcf8b61f0..22805efcb1bb 100644 --- a/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell_tests.robot +++ b/hadoop-ozone/dist/src/main/smoketest/ozone-lib/shell_tests.robot @@ -48,7 +48,7 @@ Key Should Match Local File Key Should Match Local File o3://${OM_SERVICE_ID}/vol1/bucket/passwd /etc/passwd Compare Key With Local File with Different File - ${random_file} = Create Random File + ${random_file} = Create Random File KB 42 ${matches} = Compare Key With Local File o3://${OM_SERVICE_ID}/vol1/bucket/passwd ${random_file} Should Be Equal ${matches} ${FALSE} [Teardown] Remove File ${random_file} diff --git a/hadoop-ozone/dist/src/main/smoketest/s3/MultipartUpload.robot b/hadoop-ozone/dist/src/main/smoketest/s3/MultipartUpload.robot index 33f3e2c7a9ff..dd06d55f75f6 100644 --- a/hadoop-ozone/dist/src/main/smoketest/s3/MultipartUpload.robot +++ b/hadoop-ozone/dist/src/main/smoketest/s3/MultipartUpload.robot @@ -22,6 +22,7 @@ Resource ../commonlib.robot Resource commonawslib.robot Test Timeout 5 minutes Suite Setup Setup Multipart Tests +Suite Teardown Teardown Multipart Tests Test Setup Generate random prefix *** Keywords *** @@ -29,18 +30,19 @@ Setup Multipart Tests Setup s3 tests # 5MB + a bit - Create Random File KB /tmp/part1 5121 + Create Random File KB 5121 /tmp/part1 # 1MB - a bit - Create Random File KB /tmp/part2 1023 + Create Random File KB 1023 /tmp/part2 -Create Random file - [arguments] ${size_in_megabytes} - Execute dd if=/dev/urandom of=/tmp/part1 bs=1048576 count=${size_in_megabytes} status=none + Create Random File MB 10 /tmp/10mb + Create Random File MB 22 /tmp/22mb + Create Random File KB 10 /tmp/10kb + + +Teardown Multipart Tests + Remove Files /tmp/part1 /tmp/part2 /tmp/10mb /tmp/22mb /tmp/10kb -Create Random File KB - [arguments] ${file} ${size_in_kilobytes} - Execute dd if=/dev/urandom of=${file} bs=1024 count=${size_in_kilobytes} status=none Wait Til Date Past [arguments] ${date} @@ -77,11 +79,9 @@ Test Multipart Upload # upload we get error entity too small. So, considering further complete # multipart upload, uploading each part as 5MB file, exception is for last part - Run Keyword Create Random file 5 ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey --part-number 1 --body /tmp/part1 --upload-id ${nextUploadID} Should contain ${result} ETag # override part - Run Keyword Create Random file 5 ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey --part-number 1 --body /tmp/part1 --upload-id ${nextUploadID} Should contain ${result} ETag @@ -94,7 +94,6 @@ Test Multipart Upload Complete Should contain ${result} UploadId #upload parts - Run Keyword Create Random file 5 ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey1 --part-number 1 --body /tmp/part1 --upload-id ${uploadID} ${eTag1} = Execute and checkrc echo '${result}' | jq -r '.ETag' 0 Should contain ${result} ETag @@ -171,13 +170,11 @@ Test Multipart Upload Complete Entity too small Should contain ${result} UploadId #upload parts - Execute echo "Part1" > /tmp/part1 - ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey2 --part-number 1 --body /tmp/part1 --upload-id ${uploadID} + ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey2 --part-number 1 --body /tmp/10kb --upload-id ${uploadID} ${eTag1} = Execute and checkrc echo '${result}' | jq -r '.ETag' 0 Should contain ${result} ETag - Execute echo "Part2" > /tmp/part2 - ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey2 --part-number 2 --body /tmp/part2 --upload-id ${uploadID} + ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey2 --part-number 2 --body /tmp/10kb --upload-id ${uploadID} ${eTag2} = Execute and checkrc echo '${result}' | jq -r '.ETag' 0 Should contain ${result} ETag @@ -199,7 +196,6 @@ Test Multipart Upload Complete Invalid part errors and complete mpu with few par ${result} = Execute AWSS3APICli and checkrc complete-multipart-upload --upload-id ${uploadID} --bucket ${BUCKET} --key ${PREFIX}/multipartKey3 --multipart-upload 'Parts=[{ETag=etag1,PartNumber=2},{ETag=etag2,PartNumber=1}]' 255 Should contain ${result} InvalidPart #upload parts - Run Keyword Create Random file 5 ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey3 --part-number 1 --body /tmp/part1 --upload-id ${uploadID} ${eTag1} = Execute and checkrc echo '${result}' | jq -r '.ETag' 0 Should contain ${result} ETag @@ -264,7 +260,6 @@ Test list parts Should contain ${result} UploadId #upload parts - Run Keyword Create Random file 5 ${result} = Execute AWSS3APICli upload-part --bucket ${BUCKET} --key ${PREFIX}/multipartKey5 --part-number 1 --body /tmp/part1 --upload-id ${uploadID} ${eTag1} = Execute and checkrc echo '${result}' | jq -r '.ETag' 0 Should contain ${result} ETag @@ -298,14 +293,12 @@ Test list parts ${result} = Execute AWSS3APICli and checkrc abort-multipart-upload --bucket ${BUCKET} --key ${PREFIX}/multipartKey5 --upload-id ${uploadID} 0 Test Multipart Upload with the simplified aws s3 cp API - Create Random file 22 - Execute AWSS3Cli cp /tmp/part1 s3://${BUCKET}/mpyawscli - Execute AWSS3Cli cp s3://${BUCKET}/mpyawscli /tmp/part1.result + Execute AWSS3Cli cp /tmp/22mb s3://${BUCKET}/mpyawscli + Execute AWSS3Cli cp s3://${BUCKET}/mpyawscli /tmp/22mb.result Execute AWSS3Cli rm s3://${BUCKET}/mpyawscli - Compare files /tmp/part1 /tmp/part1.result + Compare files /tmp/22mb /tmp/22mb.result Test Multipart Upload Put With Copy - Run Keyword Create Random file 5 ${result} = Execute AWSS3APICli put-object --bucket ${BUCKET} --key ${PREFIX}/copytest/source --body /tmp/part1 @@ -327,8 +320,7 @@ Test Multipart Upload Put With Copy Compare files /tmp/part1 /tmp/part-result Test Multipart Upload Put With Copy and range - Run Keyword Create Random file 10 - ${result} = Execute AWSS3APICli put-object --bucket ${BUCKET} --key ${PREFIX}/copyrange/source --body /tmp/part1 + ${result} = Execute AWSS3APICli put-object --bucket ${BUCKET} --key ${PREFIX}/copyrange/source --body /tmp/10mb ${result} = Execute AWSS3APICli create-multipart-upload --bucket ${BUCKET} --key ${PREFIX}/copyrange/destination @@ -351,15 +343,14 @@ Test Multipart Upload Put With Copy and range Execute AWSS3APICli complete-multipart-upload --upload-id ${uploadID} --bucket ${BUCKET} --key ${PREFIX}/copyrange/destination --multipart-upload 'Parts=[{ETag=${eTag1},PartNumber=1},{ETag=${eTag2},PartNumber=2}]' Execute AWSS3APICli get-object --bucket ${BUCKET} --key ${PREFIX}/copyrange/destination /tmp/part-result - Compare files /tmp/part1 /tmp/part-result + Compare files /tmp/10mb /tmp/part-result Test Multipart Upload Put With Copy and range with IfModifiedSince - Run Keyword Create Random file 10 ${curDate} = Get Current Date ${beforeCreate} = Subtract Time From Date ${curDate} 1 day ${tomorrow} = Add Time To Date ${curDate} 1 day - ${result} = Execute AWSS3APICli put-object --bucket ${BUCKET} --key ${PREFIX}/copyrange/source --body /tmp/part1 + ${result} = Execute AWSS3APICli put-object --bucket ${BUCKET} --key ${PREFIX}/copyrange/source --body /tmp/10mb ${result} = Execute AWSS3APICli create-multipart-upload --bucket ${BUCKET} --key ${PREFIX}/copyrange/destination @@ -404,7 +395,7 @@ Test Multipart Upload Put With Copy and range with IfModifiedSince Execute AWSS3APICli complete-multipart-upload --upload-id ${uploadID} --bucket ${BUCKET} --key ${PREFIX}/copyrange/destination --multipart-upload 'Parts=[{ETag=${eTag1},PartNumber=1},{ETag=${eTag2},PartNumber=2}]' Execute AWSS3APICli get-object --bucket ${BUCKET} --key ${PREFIX}/copyrange/destination /tmp/part-result - Compare files /tmp/part1 /tmp/part-result + Compare files /tmp/10mb /tmp/part-result Test Multipart Upload list ${result} = Execute AWSS3APICli create-multipart-upload --bucket ${BUCKET} --key ${PREFIX}/listtest/key1 diff --git a/hadoop-ozone/dist/src/main/smoketest/s3/boto_client.py b/hadoop-ozone/dist/src/main/smoketest/s3/boto_client.py index 598761213ea9..fce21e90601e 100755 --- a/hadoop-ozone/dist/src/main/smoketest/s3/boto_client.py +++ b/hadoop-ozone/dist/src/main/smoketest/s3/boto_client.py @@ -22,6 +22,7 @@ import json import unittest import boto3 +import tempfile from botocore.client import Config from botocore.exceptions import ClientError import os.path @@ -71,12 +72,14 @@ def setUp(self): logging.error(e) print(e) - f = open('multiUpload.gz',"wb") - f.seek(10485760) - f.write(b"\0") - f.close() - self.s3.Bucket(str(self.target_bucket)).upload_file('./multiUpload.gz','multiUpload.1.gz') - self.s3.Bucket(str(self.target_bucket)).upload_file('./multiUpload.gz','multiUpload.2.gz') + with tempfile.TemporaryDirectory() as temp_dir: + local_path = temp_dir + '/multiUpload.gz' + f = open(local_path, "wb") + f.seek(10485760) + f.write(b"\0") + f.close() + self.s3.Bucket(str(self.target_bucket)).upload_file(local_path, 'multiUpload.1.gz') + self.s3.Bucket(str(self.target_bucket)).upload_file(local_path, 'multiUpload.2.gz') def test_create_bucket(self): self.assertTrue(self.s3_client is not None) @@ -145,8 +148,10 @@ def test_upload_file(self): def test_download_file(self): self.assertTrue(self.s3 is not None) try: - self.s3.Bucket(str(self.target_bucket)).download_file('README10.md', 'download.md') - self.assertTrue(path.exists("./download.md")) + with tempfile.TemporaryDirectory() as temp_dir: + local_path = temp_dir + '/download.md' + self.s3.Bucket(str(self.target_bucket)).download_file('README10.md', local_path) + self.assertTrue(path.exists(local_path)) except ClientError as e: print(e) logging.error(e) diff --git a/hadoop-ozone/dist/src/main/smoketest/s3/commonawslib.robot b/hadoop-ozone/dist/src/main/smoketest/s3/commonawslib.robot index b20537014dd1..45dee9270bd8 100644 --- a/hadoop-ozone/dist/src/main/smoketest/s3/commonawslib.robot +++ b/hadoop-ozone/dist/src/main/smoketest/s3/commonawslib.robot @@ -129,13 +129,6 @@ Create bucket with name Should contain ${result} Location Should contain ${result} ${bucket} -Create bucket with layout - [Arguments] ${layout} - ${postfix} = Generate Ozone String - ${bucket} = Set Variable bucket-${postfix} - ${result} = Execute ozone sh bucket create --layout ${layout} s3v/${bucket} - [Return] ${bucket} - Setup s3 tests Return From Keyword if ${OZONE_S3_TESTS_SET_UP} Run Keyword Generate random prefix @@ -156,7 +149,7 @@ Setup links for S3 tests Create generated bucket [Arguments] ${layout}=OBJECT_STORE - ${BUCKET} = Create bucket with layout ${layout} + ${BUCKET} = Create bucket with layout s3v ${layout} Set Global Variable ${BUCKET} Create encrypted bucket diff --git a/hadoop-ozone/dist/src/main/smoketest/s3/secretgenerate.robot b/hadoop-ozone/dist/src/main/smoketest/s3/secretgenerate.robot index 70dcfa1abede..e9b5dd5df724 100644 --- a/hadoop-ozone/dist/src/main/smoketest/s3/secretgenerate.robot +++ b/hadoop-ozone/dist/src/main/smoketest/s3/secretgenerate.robot @@ -45,13 +45,15 @@ S3 Gateway Secret Already Exists Should contain ${result} HTTP/1.1 400 S3_SECRET_ALREADY_EXISTS ignore_case=True S3 Gateway Generate Secret By Username + [Tags] robot:skip # TODO: Enable after HDDS-11041 is done. Pass Execution If '${SECURITY_ENABLED}' == 'false' Skipping this check as security is not enabled ${result} = Execute curl -X PUT --negotiate -u : -v ${ENDPOINT_URL}/secret/testuser Should contain ${result} HTTP/1.1 200 OK ignore_case=True Should Match Regexp ${result} .*.* S3 Gateway Generate Secret By Username For Other User + [Tags] robot:skip # TODO: Enable after HDDS-11041 is done. Pass Execution If '${SECURITY_ENABLED}' == 'false' Skipping this check as security is not enabled ${result} = Execute curl -X PUT --negotiate -u : -v ${ENDPOINT_URL}/secret/testuser2 Should contain ${result} HTTP/1.1 200 OK ignore_case=True - Should Match Regexp ${result} .*.* \ No newline at end of file + Should Match Regexp ${result} .*.* diff --git a/hadoop-ozone/dist/src/main/smoketest/s3/secretrevoke.robot b/hadoop-ozone/dist/src/main/smoketest/s3/secretrevoke.robot index 0f15f23067b0..59725c0416c9 100644 --- a/hadoop-ozone/dist/src/main/smoketest/s3/secretrevoke.robot +++ b/hadoop-ozone/dist/src/main/smoketest/s3/secretrevoke.robot @@ -38,13 +38,15 @@ S3 Gateway Revoke Secret Should contain ${result} HTTP/1.1 200 OK ignore_case=True S3 Gateway Revoke Secret By Username + [Tags] robot:skip # TODO: Enable after HDDS-11041 is done. Pass Execution If '${SECURITY_ENABLED}' == 'false' Skipping this check as security is not enabled Execute ozone s3 getsecret -u testuser ${OM_HA_PARAM} ${result} = Execute curl -X DELETE --negotiate -u : -v ${ENDPOINT_URL}/secret/testuser Should contain ${result} HTTP/1.1 200 OK ignore_case=True S3 Gateway Revoke Secret By Username For Other User + [Tags] robot:skip # TODO: Enable after HDDS-11041 is done. Pass Execution If '${SECURITY_ENABLED}' == 'false' Skipping this check as security is not enabled Execute ozone s3 getsecret -u testuser2 ${OM_HA_PARAM} ${result} = Execute curl -X DELETE --negotiate -u : -v ${ENDPOINT_URL}/secret/testuser2 - Should contain ${result} HTTP/1.1 200 OK ignore_case=True \ No newline at end of file + Should contain ${result} HTTP/1.1 200 OK ignore_case=True diff --git a/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-token.robot b/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-token.robot index cf71c292a42d..4d803873b8be 100644 --- a/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-token.robot +++ b/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-token.robot @@ -21,13 +21,16 @@ Library BuiltIn Resource ../commonlib.robot Test Timeout 5 minutes +*** Variables *** +${TOKEN_FILE} ${TEMP_DIR}/ozone.token + *** Keywords *** Get and use Token in Secure Cluster Run Keyword Kinit test user testuser testuser.keytab - Execute ozone sh token get -t ./ozone.token - File Should Not Be Empty ./ozone.token + Execute ozone sh token get -t ${TOKEN_FILE} + File Should Not Be Empty ${TOKEN_FILE} Execute kdestroy - Set Environment Variable HADOOP_TOKEN_FILE_LOCATION ./ozone.token + Set Environment Variable HADOOP_TOKEN_FILE_LOCATION ${TOKEN_FILE} ${output} = Execute ozone sh volume list / Should not contain ${output} Client cannot authenticate Remove Environment Variable HADOOP_TOKEN_FILE_LOCATION @@ -36,13 +39,13 @@ Get and use Token in Secure Cluster Run Keyword Kinit test user testuser testuser.keytab Get Token in Unsecure Cluster - ${output} = Execute ozone sh token get -t ./ozone.token + ${output} = Execute ozone sh token get -t ${TOKEN_FILE} Should Contain ${output} ozone sh token get Should Contain ${output} only when security is enabled # should be executed after Get Token Print Valid Token File - ${output} = Execute ozone sh token print -t ./ozone.token + ${output} = Execute ozone sh token print -t ${TOKEN_FILE} Should Not Be Empty ${output} Print Nonexistent Token File @@ -50,20 +53,20 @@ Print Nonexistent Token File Should Contain ${output} operation failed as token file: /asdf Renew Token in Secure Cluster - ${output} = Execute ozone sh token renew -t ./ozone.token + ${output} = Execute ozone sh token renew -t ${TOKEN_FILE} Should contain ${output} Token renewed successfully Renew Token in Unsecure Cluster - ${output} = Execute ozone sh token renew -t ./ozone.token + ${output} = Execute ozone sh token renew -t ${TOKEN_FILE} Should Contain ${output} ozone sh token renew Should Contain ${output} only when security is enabled Cancel Token in Secure Cluster - ${output} = Execute ozone sh token cancel -t ./ozone.token + ${output} = Execute ozone sh token cancel -t ${TOKEN_FILE} Should contain ${output} Token canceled successfully Cancel Token in Unsecure Cluster - ${output} = Execute ozone sh token cancel -t ./ozone.token + ${output} = Execute ozone sh token cancel -t ${TOKEN_FILE} Should Contain ${output} ozone sh token cancel Should Contain ${output} only when security is enabled diff --git a/hadoop-ozone/dist/src/main/smoketest/snapshot/snapshot-acls.robot b/hadoop-ozone/dist/src/main/smoketest/snapshot/snapshot-acls.robot index 54d7f440365c..d95f8e3305b2 100644 --- a/hadoop-ozone/dist/src/main/smoketest/snapshot/snapshot-acls.robot +++ b/hadoop-ozone/dist/src/main/smoketest/snapshot/snapshot-acls.robot @@ -64,10 +64,10 @@ Test reading first snapshot as user2 Execute kdestroy Kinit test user ${USER2} ${USER2}.keytab ${keyDest} = Generate Random String 5 [LOWER] - ${result} = Get key ${FIRST_SNAPSHOT} ${keyDest} + ${result} = Get key ${FIRST_SNAPSHOT} ${TEMP_DIR}/${keyDest} Should contain ${result} PERMISSION_DENIED Test reading second snapshot as user2 ${keyDest} = Generate Random String 5 [LOWER] - ${result} = Get key ${SECOND_SNAPSHOT} ${keyDest} - Should not contain ${result} PERMISSION_DENIED \ No newline at end of file + ${result} = Get key ${SECOND_SNAPSHOT} ${TEMP_DIR}/${keyDest} + Should not contain ${result} PERMISSION_DENIED diff --git a/hadoop-ozone/dist/src/main/smoketest/spnego/web.robot b/hadoop-ozone/dist/src/main/smoketest/spnego/web.robot index 17e34471157c..654f8aef675b 100644 --- a/hadoop-ozone/dist/src/main/smoketest/spnego/web.robot +++ b/hadoop-ozone/dist/src/main/smoketest/spnego/web.robot @@ -23,54 +23,51 @@ Resource ../commonlib.robot Test Timeout 5 minutes *** Variables *** -${OM_URL} http://om:9874 -${OM_DB_CHECKPOINT_URL} ${OM_URL}/dbCheckpoint -${OM_SERVICE_LIST_URL} ${OM_URL}/serviceList - ${SCM} scm -${SCM_URL} http://${SCM}:9876 + +${OM_URL} http://om:9874 ${RECON_URL} http://recon:9888 +${S3G_URL} http://s3g:9878 +${SCM_URL} http://${SCM}:9876 -${SCM_CONF_URL} http://${SCM}:9876/conf -${SCM_JMX_URL} http://${SCM}:9876/jmx -${SCM_STACKS_URL} http://${SCM}:9876/stacks +@{BASE_URLS} ${OM_URL} ${RECON_URL} ${S3G_URL} ${SCM_URL} +@{COMMON_PATHS} conf jmx logLevel logs/ prom stacks +@{CUSTOM_ENDPOINTS} ${OM_URL}/dbCheckpoint ${OM_URL}/serviceList ${SCM_URL}/dbCheckpoint *** Keywords *** -Verify SPNEGO enabled URL - [arguments] ${url} - Run Keyword if '${SECURITY_ENABLED}' == 'true' Execute kdestroy - ${result} = Execute curl --negotiate -u : -v -s -I ${url} - Should contain ${result} 401 Authentication required - - Run Keyword if '${SECURITY_ENABLED}' == 'true' Kinit test user testuser testuser.keytab - ${result} = Execute curl --negotiate -u : -v -s -I ${url} - Should contain ${result} 200 OK - - +Verify SPNEGO URL + [arguments] ${url} ${expected_response} + ${result} = Execute curl --negotiate -u : --silent -o /dev/null -w '\%{http_code}' '${url}' + IF '${result}' != '${expected_response}' + # repeat with verbose mode for debug + Execute curl --negotiate -u : -vvv -o /dev/null '${url}' + Should Be Equal '${result}' '${expected_response}' + END *** Test Cases *** -Test OM portal - Verify SPNEGO enabled URL ${OM_URL} - -Test OM DB Checkpoint - Verify SPNEGO enabled URL ${OM_DB_CHECKPOINT_URL} - -Test OM Service List - Verify SPNEGO enabled URL ${OM_SERVICE_LIST_URL} - -Test SCM portal - Verify SPNEGO enabled URL ${SCM_URL} - -Test SCM conf - Verify SPNEGO enabled URL ${SCM_CONF_URL} - -Test SCM jmx - Verify SPNEGO enabled URL ${SCM_JMX_URL} - -Test SCM stacks - Verify SPNEGO enabled URL ${SCM_STACKS_URL} - -Test Recon portal - Verify SPNEGO enabled URL ${RECON_URL} - +Verify SPNEGO URLs without auth + [setup] Execute kdestroy + [template] Verify SPNEGO URL + + FOR ${BASE_URL} IN @{BASE_URLS} + FOR ${PATH} IN @{COMMON_PATHS} + ${BASE_URL}/${PATH} 401 + END + END + FOR ${URL} IN @{CUSTOM_ENDPOINTS} + ${URL} 401 + END + +Verify SPNEGO URLs with auth + [setup] Kinit test user testuser testuser.keytab + [template] Verify SPNEGO URL + + FOR ${BASE_URL} IN @{BASE_URLS} + FOR ${PATH} IN @{COMMON_PATHS} + ${BASE_URL}/${PATH} 200 + END + END + FOR ${URL} IN @{CUSTOM_ENDPOINTS} + ${URL} 200 + END diff --git a/hadoop-ozone/dist/src/main/smoketest/test.sh b/hadoop-ozone/dist/src/main/smoketest/test.sh index e0a26b079300..1b4e1d0617bd 100755 --- a/hadoop-ozone/dist/src/main/smoketest/test.sh +++ b/hadoop-ozone/dist/src/main/smoketest/test.sh @@ -26,3 +26,5 @@ ${REPLACEMENT} RESULT=$? cp -r "$DIR/../compose/result" "$DIR" exit $RESULT + + diff --git a/hadoop-ozone/dist/src/shell/ozone/ozone b/hadoop-ozone/dist/src/shell/ozone/ozone index dbb18db8e255..99fce8c2d44e 100755 --- a/hadoop-ozone/dist/src/shell/ozone/ozone +++ b/hadoop-ozone/dist/src/shell/ozone/ozone @@ -125,7 +125,7 @@ function ozonecmd_case ;; freon) OZONE_CLASSNAME=org.apache.hadoop.ozone.freon.Freon - OZONE_FREON_OPTS="${OZONE_FREON_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_FREON_OPTS="${OZONE_FREON_OPTS} ${RATIS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-tools" ;; getconf) @@ -144,7 +144,7 @@ function ozonecmd_case sh | shell) OZONE_CLASSNAME=org.apache.hadoop.ozone.shell.OzoneShell ozone_deprecate_envvar HDFS_OM_SH_OPTS OZONE_SH_OPTS - OZONE_SH_OPTS="${OZONE_SH_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_SH_OPTS="${OZONE_SH_OPTS} ${RATIS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-tools" ;; s3) @@ -163,12 +163,12 @@ function ozonecmd_case s3g) OZONE_SUBCMD_SUPPORTDAEMONIZATION="true" OZONE_CLASSNAME='org.apache.hadoop.ozone.s3.Gateway' - OZONE_S3G_OPTS="${OZONE_S3G_OPTS} -Dlog4j.configurationFile=${OZONE_CONF_DIR}/s3g-audit-log4j2.properties ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_S3G_OPTS="${OZONE_S3G_OPTS} ${RATIS_OPTS} -Dlog4j.configurationFile=${OZONE_CONF_DIR}/s3g-audit-log4j2.properties ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-s3gateway" ;; httpfs) OZONE_SUBCMD_SUPPORTDAEMONIZATION="true" - OZONE_OPTS="${OZONE_OPTS} -Dhttpfs.home.dir=${OZONE_HOME} -Dhttpfs.config.dir=${OZONE_CONF_DIR} -Dhttpfs.log.dir=${OZONE_HOME}/log -Dhttpfs.temp.dir=${OZONE_HOME}/temp ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_OPTS="${OZONE_OPTS} ${RATIS_OPTS} -Dhttpfs.home.dir=${OZONE_HOME} -Dhttpfs.config.dir=${OZONE_CONF_DIR} -Dhttpfs.log.dir=${OZONE_HOME}/log -Dhttpfs.temp.dir=${OZONE_HOME}/temp ${OZONE_MODULE_ACCESS_ARGS}" OZONE_CLASSNAME='org.apache.ozone.fs.http.server.HttpFSServerWebServer' OZONE_RUN_ARTIFACT_NAME="ozone-httpfsgateway" ;; @@ -184,12 +184,12 @@ function ozonecmd_case recon) OZONE_SUBCMD_SUPPORTDAEMONIZATION="true" OZONE_CLASSNAME='org.apache.hadoop.ozone.recon.ReconServer' - OZONE_RECON_OPTS="${OZONE_RECON_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_RECON_OPTS="${OZONE_RECON_OPTS} ${RATIS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-recon" ;; fs) OZONE_CLASSNAME=org.apache.hadoop.fs.ozone.OzoneFsShell - OZONE_FS_OPTS="${OZONE_FS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_FS_OPTS="${OZONE_FS_OPTS} ${RATIS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-tools" ;; daemonlog) @@ -214,17 +214,17 @@ function ozonecmd_case ;; admin) OZONE_CLASSNAME=org.apache.hadoop.hdds.cli.OzoneAdmin - OZONE_ADMIN_OPTS="${OZONE_ADMIN_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_ADMIN_OPTS="${OZONE_ADMIN_OPTS} ${RATIS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-tools" ;; debug) OZONE_CLASSNAME=org.apache.hadoop.ozone.debug.OzoneDebug - OZONE_DEBUG_OPTS="${OZONE_DEBUG_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_DEBUG_OPTS="${OZONE_DEBUG_OPTS} ${RATIS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-tools" ;; repair) OZONE_CLASSNAME=org.apache.hadoop.ozone.repair.OzoneRepair - OZONE_DEBUG_OPTS="${OZONE_DEBUG_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" + OZONE_DEBUG_OPTS="${OZONE_DEBUG_OPTS} ${RATIS_OPTS} ${OZONE_MODULE_ACCESS_ARGS}" OZONE_RUN_ARTIFACT_NAME="ozone-tools" ;; checknative) diff --git a/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh b/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh index b21453fa0d6b..84e2b73836e5 100755 --- a/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh +++ b/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh @@ -1412,6 +1412,14 @@ function ozone_java_setup # Extract the major version number JAVA_MAJOR_VERSION=$(echo "$JAVA_VERSION_STRING" | sed -E -n 's/.* version "([^.-]*).*"/\1/p' | cut -d' ' -f1) + # Add JVM parameter (org.apache.ratis.thirdparty.io.netty.tryReflectionSetAccessible=true) + # to allow netty unsafe memory allocation in Java 9+. + RATIS_OPTS="${RATIS_OPTS:-}" + + if [[ "${JAVA_MAJOR_VERSION}" -ge 9 ]]; then + RATIS_OPTS="-Dorg.apache.ratis.thirdparty.io.netty.tryReflectionSetAccessible=true ${RATIS_OPTS}" + fi + ozone_set_module_access_args } diff --git a/hadoop-ozone/fault-injection-test/mini-chaos-tests/pom.xml b/hadoop-ozone/fault-injection-test/mini-chaos-tests/pom.xml index 2fa1826e2704..4548459105fa 100644 --- a/hadoop-ozone/fault-injection-test/mini-chaos-tests/pom.xml +++ b/hadoop-ozone/fault-injection-test/mini-chaos-tests/pom.xml @@ -65,6 +65,13 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + org.apache.maven.plugins + maven-compiler-plugin + + none + + com.github.spotbugs spotbugs-maven-plugin diff --git a/hadoop-ozone/fault-injection-test/network-tests/pom.xml b/hadoop-ozone/fault-injection-test/network-tests/pom.xml index 4040aef19bca..97d10cbf7615 100644 --- a/hadoop-ozone/fault-injection-test/network-tests/pom.xml +++ b/hadoop-ozone/fault-injection-test/network-tests/pom.xml @@ -33,6 +33,13 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + org.apache.maven.plugins + maven-compiler-plugin + + none + + maven-resources-plugin diff --git a/hadoop-ozone/httpfsgateway/pom.xml b/hadoop-ozone/httpfsgateway/pom.xml index 582e6c1034a7..5be2a4be83f6 100644 --- a/hadoop-ozone/httpfsgateway/pom.xml +++ b/hadoop-ozone/httpfsgateway/pom.xml @@ -40,6 +40,10 @@ + + org.apache.ozone + hdds-server-framework + org.apache.ozone ozone-filesystem-common @@ -65,21 +69,6 @@ - - com.sun.jersey - jersey-core - compile - - - com.sun.jersey - jersey-server - compile - - - com.sun.jersey - jersey-servlet - compile - javax.servlet javax.servlet-api @@ -153,6 +142,14 @@ jakarta.xml.bind jakarta.xml.bind-api + + org.glassfish.hk2 + hk2-api + + + org.glassfish.jersey.inject + jersey-hk2 + org.glassfish.jaxb jaxb-runtime @@ -196,6 +193,13 @@ false + + org.apache.maven.plugins + maven-compiler-plugin + + none + + diff --git a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSExceptionProvider.java b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSExceptionProvider.java index 7da02b14bc7f..cfed8c6afd59 100644 --- a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSExceptionProvider.java +++ b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSExceptionProvider.java @@ -18,10 +18,10 @@ package org.apache.ozone.fs.http.server; -import com.sun.jersey.api.container.ContainerException; import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.ozone.lib.service.FileSystemAccessException; import org.apache.ozone.lib.wsrs.ExceptionProvider; +import org.glassfish.jersey.server.ContainerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; diff --git a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSParametersProvider.java b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSParametersProvider.java index 421c7f1fa66d..dd504fcaa09b 100644 --- a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSParametersProvider.java +++ b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSParametersProvider.java @@ -34,7 +34,6 @@ import org.apache.ozone.lib.wsrs.StringParam; import org.apache.hadoop.util.StringUtils; -import javax.ws.rs.ext.Provider; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; @@ -42,9 +41,7 @@ /** * HttpFS ParametersProvider. */ -@Provider @InterfaceAudience.Private -@SuppressWarnings("unchecked") public class HttpFSParametersProvider extends ParametersProvider { private static final Map>[]> PARAMS_DEF diff --git a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServer.java b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServer.java index 0ba313e18b89..88ec7b48957c 100644 --- a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServer.java +++ b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServer.java @@ -111,6 +111,14 @@ enum AccessMode { private static final Logger AUDIT_LOG = LoggerFactory.getLogger("httpfsaudit"); private static final Logger LOG = LoggerFactory.getLogger(HttpFSServer.class); + + private static final HttpFSParametersProvider PARAMETERS_PROVIDER = + new HttpFSParametersProvider(); + + private Parameters getParams(HttpServletRequest request) { + return PARAMETERS_PROVIDER.get(request); + } + private AccessMode accessMode = AccessMode.READWRITE; public HttpFSServer() { @@ -209,7 +217,6 @@ private void enforceRootPath(HttpFSConstants.Operation op, String path) { * * @param uriInfo uri info of the request. * @param op the HttpFS operation of the request. - * @param params the HttpFS parameters of the request. * * @return the request response. * @@ -223,10 +230,9 @@ private void enforceRootPath(HttpFSConstants.Operation op, String path) { @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getRoot(@Context UriInfo uriInfo, @QueryParam(OperationParam.NAME) OperationParam op, - @Context Parameters params, @Context HttpServletRequest request) throws IOException, FileSystemAccessException { - return get("", uriInfo, op, params, request); + return get("", uriInfo, op, request); } private String makeAbsolute(String path) { @@ -239,7 +245,6 @@ private String makeAbsolute(String path) { * @param path the path for operation. * @param uriInfo uri info of the request. * @param op the HttpFS operation of the request. - * @param params the HttpFS parameters of the request. * * @return the request response. * @@ -256,7 +261,6 @@ private String makeAbsolute(String path) { public Response get(@PathParam("path") String path, @Context UriInfo uriInfo, @QueryParam(OperationParam.NAME) OperationParam op, - @Context Parameters params, @Context HttpServletRequest request) throws IOException, FileSystemAccessException, UnsupportedOperationException { @@ -267,6 +271,7 @@ public Response get(@PathParam("path") String path, return Response.status(Response.Status.FORBIDDEN).build(); } UserGroupInformation user = HttpUserGroupInformation.get(); + final Parameters params = getParams(request); Response response; path = makeAbsolute(path); MDC.put(HttpFSConstants.OP_PARAM, op.value().name()); @@ -669,7 +674,6 @@ private URI createOpenRedirectionURL(UriInfo uriInfo) { * * @param path the path for operation. * @param op the HttpFS operation of the request. - * @param params the HttpFS parameters of the request. * * @return the request response. * @@ -684,7 +688,6 @@ private URI createOpenRedirectionURL(UriInfo uriInfo) { @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response delete(@PathParam("path") String path, @QueryParam(OperationParam.NAME) OperationParam op, - @Context Parameters params, @Context HttpServletRequest request) throws IOException, FileSystemAccessException { // Do not allow DELETE commands in read-only mode @@ -692,6 +695,7 @@ public Response delete(@PathParam("path") String path, return Response.status(Response.Status.FORBIDDEN).build(); } UserGroupInformation user = HttpUserGroupInformation.get(); + final Parameters params = getParams(request); Response response; path = makeAbsolute(path); MDC.put(HttpFSConstants.OP_PARAM, op.value().name()); @@ -746,7 +750,6 @@ private Response handleDelete(String path, * @param is the inputstream for the request payload. * @param uriInfo the of the request. * @param op the HttpFS operation of the request. - * @param params the HttpFS parameters of the request. * * @return the request response. * @@ -760,9 +763,9 @@ private Response handleDelete(String path, @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8 }) public Response postRoot(InputStream is, @Context UriInfo uriInfo, @QueryParam(OperationParam.NAME) OperationParam op, - @Context Parameters params, @Context HttpServletRequest request) + @Context HttpServletRequest request) throws IOException, FileSystemAccessException { - return post(is, uriInfo, "/", op, params, request); + return post(is, uriInfo, "/", op, request); } /** @@ -772,7 +775,6 @@ public Response postRoot(InputStream is, @Context UriInfo uriInfo, * @param uriInfo the of the request. * @param path the path for operation. * @param op the HttpFS operation of the request. - * @param params the HttpFS parameters of the request. * * @return the request response. * @@ -790,7 +792,6 @@ public Response post(InputStream is, @Context UriInfo uriInfo, @PathParam("path") String path, @QueryParam(OperationParam.NAME) OperationParam op, - @Context Parameters params, @Context HttpServletRequest request) throws IOException, FileSystemAccessException { // Do not allow POST commands in read-only mode @@ -798,6 +799,7 @@ public Response post(InputStream is, return Response.status(Response.Status.FORBIDDEN).build(); } UserGroupInformation user = HttpUserGroupInformation.get(); + final Parameters params = getParams(request); Response response; path = makeAbsolute(path); MDC.put(HttpFSConstants.OP_PARAM, op.value().name()); @@ -928,7 +930,6 @@ protected URI createUploadRedirectionURL(UriInfo uriInfo, * @param is the inputstream for the request payload. * @param uriInfo the of the request. * @param op the HttpFS operation of the request. - * @param params the HttpFS parameters of the request. * * @return the request response. * @@ -942,9 +943,9 @@ protected URI createUploadRedirectionURL(UriInfo uriInfo, @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8 }) public Response putRoot(InputStream is, @Context UriInfo uriInfo, @QueryParam(OperationParam.NAME) OperationParam op, - @Context Parameters params, @Context HttpServletRequest request) + @Context HttpServletRequest request) throws IOException, FileSystemAccessException { - return put(is, uriInfo, "/", op, params, request); + return put(is, uriInfo, "/", op, request); } /** @@ -954,7 +955,6 @@ public Response putRoot(InputStream is, @Context UriInfo uriInfo, * @param uriInfo the of the request. * @param path the path for operation. * @param op the HttpFS operation of the request. - * @param params the HttpFS parameters of the request. * * @return the request response. * @@ -972,7 +972,6 @@ public Response put(InputStream is, @Context UriInfo uriInfo, @PathParam("path") String path, @QueryParam(OperationParam.NAME) OperationParam op, - @Context Parameters params, @Context HttpServletRequest request) throws IOException, FileSystemAccessException { // Do not allow PUT commands in read-only mode @@ -980,6 +979,7 @@ public Response put(InputStream is, return Response.status(Response.Status.FORBIDDEN).build(); } UserGroupInformation user = HttpUserGroupInformation.get(); + final Parameters params = getParams(request); Response response; path = makeAbsolute(path); MDC.put(HttpFSConstants.OP_PARAM, op.value().name()); diff --git a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServerWebServer.java b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServerWebServer.java index 143bb74e0f39..c194fd0ddaa8 100644 --- a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServerWebServer.java +++ b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/fs/http/server/HttpFSServerWebServer.java @@ -29,7 +29,9 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hdds.annotation.InterfaceAudience; -import org.apache.hadoop.http.HttpServer2; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.hdds.server.http.HttpServer2; +import org.apache.hadoop.hdds.utils.LegacyHadoopConfigurationSource; import org.apache.hadoop.security.AuthenticationFilterInitializer; import org.apache.hadoop.security.authentication.server.ProxyUserAuthenticationFilterInitializer; import org.apache.hadoop.security.authorize.AccessControlList; @@ -71,7 +73,7 @@ public class HttpFSServerWebServer { private final HttpServer2 httpServer; private final String scheme; - HttpFSServerWebServer(Configuration conf, Configuration sslConf) throws + HttpFSServerWebServer(OzoneConfiguration conf, Configuration sslConf) throws Exception { // Override configuration with deprecated environment variables. deprecateEnv("HTTPFS_HTTP_HOSTNAME", conf, HTTP_HOSTNAME_KEY, @@ -122,7 +124,7 @@ public class HttpFSServerWebServer { httpServer = new HttpServer2.Builder() .setName(NAME) .setConf(conf) - .setSSLConf(sslConf) + .setSSLConf(new LegacyHadoopConfigurationSource(sslConf)) .authFilterConfigurationPrefix(HttpFSAuthenticationFilter.CONF_PREFIX) .setACL(new AccessControlList(conf.get(HTTP_ADMINS_KEY, " "))) .addEndpoint(endpoint) @@ -177,7 +179,7 @@ public URL getUrl() { public static void main(String[] args) throws Exception { startupShutdownMessage(HttpFSServerWebServer.class, args, LOG); - Configuration conf = new Configuration(true); + OzoneConfiguration conf = new OzoneConfiguration(); Configuration sslConf = SSLFactory.readSSLConfiguration(conf, SSLFactory.Mode.SERVER); HttpFSServerWebServer webServer = diff --git a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/lib/wsrs/ParametersProvider.java b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/lib/wsrs/ParametersProvider.java index 9cdac336468e..a9bacc78d4a6 100644 --- a/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/lib/wsrs/ParametersProvider.java +++ b/hadoop-ozone/httpfsgateway/src/main/java/org/apache/ozone/lib/wsrs/ParametersProvider.java @@ -18,18 +18,10 @@ package org.apache.ozone.lib.wsrs; -import com.sun.jersey.api.core.HttpContext; -import com.sun.jersey.core.spi.component.ComponentContext; -import com.sun.jersey.core.spi.component.ComponentScope; -import com.sun.jersey.server.impl.inject.AbstractHttpContextInjectable; -import com.sun.jersey.spi.inject.Injectable; -import com.sun.jersey.spi.inject.InjectableProvider; import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.util.StringUtils; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MultivaluedMap; -import java.lang.reflect.Type; +import javax.servlet.http.HttpServletRequest; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; @@ -37,13 +29,11 @@ import java.util.Map; /** - * Jersey provider that parses the request parameters based on the + * Provider that parses the request parameters based on the * given parameter definition. */ @InterfaceAudience.Private -public class ParametersProvider - extends AbstractHttpContextInjectable - implements InjectableProvider { +public class ParametersProvider { private String driverParam; private Class enumClass; @@ -56,34 +46,31 @@ public ParametersProvider(String driverParam, Class enumClass, this.paramsDef = paramsDef; } - @Override - @SuppressWarnings("unchecked") - public Parameters getValue(HttpContext httpContext) { - Map>> map = new HashMap>>(); - Map> queryString - = httpContext.getRequest().getQueryParameters(); - String str = ((MultivaluedMap) queryString). - getFirst(driverParam); + public Parameters get(HttpServletRequest request) { + Map>> map = new HashMap<>(); + + Map queryString = request.getParameterMap(); + String str = queryString.get(driverParam)[0]; if (str == null) { throw new IllegalArgumentException( - MessageFormat.format("Missing Operation parameter [{0}]", - driverParam)); + MessageFormat.format("Missing Operation parameter [{0}]", + driverParam)); } Enum op; try { op = Enum.valueOf(enumClass, StringUtils.toUpperCase(str)); } catch (IllegalArgumentException ex) { throw new IllegalArgumentException( - MessageFormat.format("Invalid Operation [{0}]", str)); + MessageFormat.format("Invalid Operation [{0}]", str)); } if (!paramsDef.containsKey(op)) { throw new IllegalArgumentException( - MessageFormat.format("Unsupported Operation [{0}]", op)); + MessageFormat.format("Unsupported Operation [{0}]", op)); } for (Class> paramClass : paramsDef.get(op)) { Param param = newParam(paramClass); List> paramList = new ArrayList<>(); - List ps = queryString.get(param.getName()); + String[] ps = queryString.get(param.getName()); if (ps != null) { for (String p : ps) { try { @@ -114,15 +101,4 @@ private Param newParam(Class> paramClass) { } } - @Override - public ComponentScope getScope() { - return ComponentScope.PerRequest; - } - - @Override - public Injectable getInjectable(ComponentContext componentContext, - Context context, - Type type) { - return (type.equals(Parameters.class)) ? this : null; - } } diff --git a/hadoop-ozone/httpfsgateway/src/main/resources/webapps/webhdfs/WEB-INF/web.xml b/hadoop-ozone/httpfsgateway/src/main/resources/webapps/webhdfs/WEB-INF/web.xml index 130a1a7028ad..9fa17b3e984d 100644 --- a/hadoop-ozone/httpfsgateway/src/main/resources/webapps/webhdfs/WEB-INF/web.xml +++ b/hadoop-ozone/httpfsgateway/src/main/resources/webapps/webhdfs/WEB-INF/web.xml @@ -20,23 +20,11 @@ webservices-driver - com.sun.jersey.spi.container.servlet.ServletContainer + org.glassfish.jersey.servlet.ServletContainer - com.sun.jersey.config.property.packages + jersey.config.server.provider.packages org.apache.ozone.fs.http.server,org.apache.ozone.lib.wsrs - - - 1 diff --git a/hadoop-ozone/httpfsgateway/src/main/webapp/WEB-INF/web.xml b/hadoop-ozone/httpfsgateway/src/main/webapp/WEB-INF/web.xml index d6cb046969fe..61c99c43bcb0 100644 --- a/hadoop-ozone/httpfsgateway/src/main/webapp/WEB-INF/web.xml +++ b/hadoop-ozone/httpfsgateway/src/main/webapp/WEB-INF/web.xml @@ -20,23 +20,11 @@ webservices-driver - com.sun.jersey.spi.container.servlet.ServletContainer + org.glassfish.jersey.servlet.ServletContainer - com.sun.jersey.config.property.packages + jersey.config.server.provider.packages org.apache.ozone.fs.http.server,org.apache.ozone.lib.wsrs - - - 1 diff --git a/hadoop-ozone/insight/pom.xml b/hadoop-ozone/insight/pom.xml index f5e044ddac2f..ae0bc5cd3aab 100644 --- a/hadoop-ozone/insight/pom.xml +++ b/hadoop-ozone/insight/pom.xml @@ -100,6 +100,43 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> 2048 + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + diff --git a/hadoop-ozone/integration-test/pom.xml b/hadoop-ozone/integration-test/pom.xml index 7de7b2f936ec..e1ba4af83db7 100644 --- a/hadoop-ozone/integration-test/pom.xml +++ b/hadoop-ozone/integration-test/pom.xml @@ -257,6 +257,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> ${basedir}/dev-support/findbugsExcludeFile.xml + + org.apache.maven.plugins + maven-compiler-plugin + + none + + diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java index 382f4b72034c..0abfb1336544 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java @@ -18,6 +18,7 @@ package org.apache.hadoop.fs.ozone; +import java.util.concurrent.CompletableFuture; import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; @@ -33,8 +34,13 @@ import org.apache.hadoop.ozone.TestDataUtil; import org.apache.hadoop.ozone.client.OzoneBucket; import org.apache.hadoop.ozone.client.OzoneClient; +import org.apache.hadoop.ozone.client.OzoneVolume; import org.apache.hadoop.ozone.om.OMMetadataManager; +import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; +import org.apache.hadoop.ozone.om.ratis.OzoneManagerDoubleBuffer; +import org.apache.hadoop.ozone.om.ratis.OzoneManagerStateMachine; +import org.apache.hadoop.ozone.om.request.file.OMFileRequest; import org.apache.hadoop.ozone.om.service.DirectoryDeletingService; import org.apache.hadoop.ozone.om.service.KeyDeletingService; import org.apache.hadoop.ozone.om.OMConfigKeys; @@ -299,6 +305,80 @@ public void testDeleteWithMultiLevels() throws Exception { assertThat(dirDeletingService.getRunCount().get()).isGreaterThan(1); } + @Test + public void testDeleteWithMultiLevelsBlockDoubleBuffer() throws Exception { + Path root = new Path("/rootDirdd"); + Path appRoot = new Path(root, "appRoot"); + + for (int i = 1; i <= 3; i++) { + Path parent = new Path(appRoot, "parentDir" + i); + Path child = new Path(parent, "childFile"); + ContractTestUtils.touch(fs, child); + } + + OMMetadataManager metadataManager = cluster.getOzoneManager().getMetadataManager(); + Table deletedDirTable = metadataManager.getDeletedDirTable(); + Table keyTable = metadataManager.getKeyTable(getFSOBucketLayout()); + Table dirTable = metadataManager.getDirectoryTable(); + + DirectoryDeletingService dirDeletingService = (DirectoryDeletingService) cluster.getOzoneManager().getKeyManager() + .getDirDeletingService(); + + // Before delete + assertTableRowCount(deletedDirTable, 0); + assertTableRowCount(dirTable, 5); + assertTableRowCount(keyTable, 3); + + // stop daemon to simulate blocked double buffer + OzoneManagerStateMachine omStateMachine = cluster.getOzoneManager().getOmRatisServer().getOmStateMachine(); + OzoneManagerDoubleBuffer omDoubleBuffer = omStateMachine.getOzoneManagerDoubleBuffer(); + omDoubleBuffer.awaitFlush(); + omDoubleBuffer.stopDaemon(); + + OzoneVolume volume = client.getObjectStore().getVolume(volumeName); + OzoneBucket bucket = volume.getBucket(bucketName); long volumeId = metadataManager.getVolumeId(volumeName); + + // manually delete dir and add to deleted table. namespace count occupied "1" as manual deletion do not reduce + long bucketId = metadataManager.getBucketId(volumeName, bucketName); + OzoneFileStatus keyStatus = OMFileRequest.getOMKeyInfoIfExists( + metadataManager, volumeName, bucketName, "rootDirdd", 0, + cluster.getOzoneManager().getDefaultReplicationConfig()); + String ozoneDbKey = metadataManager.getOzonePathKey(volumeId, bucketId, keyStatus.getKeyInfo().getParentObjectID(), + keyStatus.getKeyInfo().getFileName()); + deletedDirTable.put(ozoneDbKey, keyStatus.getKeyInfo()); + dirTable.delete(ozoneDbKey); + assertTableRowCount(deletedDirTable, 1); + assertTableRowCount(dirTable, 4); + + System.out.println("starting count: " + bucket.getUsedNamespace()); + + // wait for running 2 more iteration + long currentCount = dirDeletingService.getRunCount().get(); + GenericTestUtils.waitFor(() -> dirDeletingService.getRunCount().get() > currentCount + 2, 1000, + 10000); + + // verify bucket used namespace is not going -ve + assertTrue(volume.getBucket(bucketName).getUsedNamespace() >= 0); + + // re-init double buffer in state machine to resume further processing + omStateMachine.pause(); + omStateMachine.unpause(omStateMachine.getLastAppliedTermIndex().getIndex(), + omStateMachine.getLatestSnapshot().getIndex()); + // flush previous pending transaction manually + omDoubleBuffer.resume(); + CompletableFuture.supplyAsync(() -> { + omDoubleBuffer.flushTransactions(); + return null; + }); + omDoubleBuffer.awaitFlush(); + omDoubleBuffer.stop(); + // verify deletion progress completion + assertTableRowCount(deletedDirTable, 0); + assertTableRowCount(keyTable, 0); + assertTrue(volume.getBucket(bucketName).getUsedNamespace() >= 0); + assertTrue(volume.getBucket(bucketName).getUsedBytes() == 0); + } + @Test public void testDeleteFilesAndSubFiles() throws Exception { diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java index 6af43c3bacde..fb92d91ee711 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java @@ -34,6 +34,7 @@ import org.apache.hadoop.security.authorize.AuthorizationException; import org.apache.hadoop.util.ExitUtil; import org.apache.ozone.test.GenericTestUtils; +import org.apache.ozone.test.tag.Flaky; import org.apache.ratis.util.ExitUtils; import jakarta.annotation.Nonnull; import org.junit.jupiter.api.AfterEach; @@ -184,6 +185,7 @@ private void setSecureConfig() throws IOException { * Test secret key apis in happy case. */ @Test + @Flaky("HDDS-8900") public void testSecretKeyApiSuccess() throws Exception { enableBlockToken(); // set a low rotation period, of 1s, expiry is 3s, expect 3 active keys diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java index f3c922712663..30597fc3e77e 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java @@ -49,6 +49,7 @@ import javax.xml.bind.DatatypeConverter; import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hdds.client.DefaultReplicationConfig; import org.apache.hadoop.hdds.client.ECReplicationConfig; @@ -138,12 +139,15 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.security.UserGroupInformation; import org.apache.ozone.test.GenericTestUtils; +import org.apache.ozone.test.OzoneTestBase; import org.apache.ozone.test.tag.Flaky; import static java.nio.charset.StandardCharsets.UTF_8; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomUtils; + +import static java.util.Collections.singletonMap; import static org.apache.hadoop.hdds.StringUtils.string2Bytes; import static org.apache.hadoop.hdds.client.ReplicationFactor.ONE; import static org.apache.hadoop.hdds.client.ReplicationFactor.THREE; @@ -190,6 +194,7 @@ import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; /** @@ -197,7 +202,7 @@ * Client. */ @TestMethodOrder(MethodOrderer.MethodName.class) -abstract class OzoneRpcClientTests { +abstract class OzoneRpcClientTests extends OzoneTestBase { private static MiniOzoneCluster cluster = null; private static OzoneClient ozClient = null; @@ -794,7 +799,7 @@ public void testInvalidBucketCreation() throws Exception { OzoneVolume volume = store.getVolume(volumeName); OMException omException = assertThrows(OMException.class, () -> volume.createBucket(bucketName)); - assertEquals("Bucket or Volume name has an unsupported character : #", + assertEquals("bucket name has an unsupported character : #", omException.getMessage()); } @@ -1094,6 +1099,223 @@ public void testPutKey() throws IOException { } } + @ParameterizedTest + @EnumSource + void rewriteKey(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + OmKeyArgs keyArgs = toOmKeyArgs(keyDetails); + OmKeyInfo keyInfo = ozoneManager.lookupKey(keyArgs); + + final byte[] newContent = "rewrite value".getBytes(UTF_8); + rewriteKey(bucket, keyDetails, newContent); + + OzoneKeyDetails actualKeyDetails = assertKeyContent(bucket, keyDetails.getName(), newContent); + assertThat(actualKeyDetails.getGeneration()).isGreaterThan(keyDetails.getGeneration()); + assertMetadataUnchanged(keyDetails, actualKeyDetails); + assertMetadataAfterRewrite(keyInfo, ozoneManager.lookupKey(keyArgs)); + } + + @ParameterizedTest + @EnumSource + void overwriteAfterRewrite(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + rewriteKey(bucket, keyDetails, "rewrite".getBytes(UTF_8)); + + final byte[] overwriteContent = "overwrite".getBytes(UTF_8); + OzoneKeyDetails overwriteDetails = createTestKey(bucket, keyDetails.getName(), overwriteContent); + + OzoneKeyDetails actualKeyDetails = assertKeyContent(bucket, keyDetails.getName(), overwriteContent); + assertEquals(overwriteDetails.getGeneration(), actualKeyDetails.getGeneration()); + } + + @ParameterizedTest + @EnumSource + void rewriteAfterRename(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + String newKeyName = "rewriteAfterRename-" + layout; + + bucket.renameKey(keyDetails.getName(), newKeyName); + OzoneKeyDetails renamedKeyDetails = bucket.getKey(newKeyName); + OmKeyArgs keyArgs = toOmKeyArgs(renamedKeyDetails); + OmKeyInfo keyInfo = ozoneManager.lookupKey(keyArgs); + + final byte[] rewriteContent = "rewrite".getBytes(UTF_8); + rewriteKey(bucket, renamedKeyDetails, rewriteContent); + + OzoneKeyDetails actualKeyDetails = assertKeyContent(bucket, newKeyName, rewriteContent); + assertMetadataUnchanged(keyDetails, actualKeyDetails); + assertMetadataAfterRewrite(keyInfo, ozoneManager.lookupKey(keyArgs)); + } + + @ParameterizedTest + @EnumSource + void renameAfterRewrite(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + final byte[] rewriteContent = "rewrite".getBytes(UTF_8); + rewriteKey(bucket, keyDetails, rewriteContent); + OmKeyInfo keyInfo = ozoneManager.lookupKey(toOmKeyArgs(keyDetails)); + + String newKeyName = "renameAfterRewrite-" + layout; + bucket.renameKey(keyDetails.getName(), newKeyName); + + OzoneKeyDetails actualKeyDetails = assertKeyContent(bucket, newKeyName, rewriteContent); + assertMetadataUnchanged(keyDetails, actualKeyDetails); + assertMetadataAfterRewrite(keyInfo, ozoneManager.lookupKey(toOmKeyArgs(actualKeyDetails))); + } + + @ParameterizedTest + @EnumSource + void rewriteFailsDueToOutdatedGeneration(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + OmKeyArgs keyArgs = toOmKeyArgs(keyDetails); + + // overwrite to get new generation + final byte[] overwriteContent = "overwrite".getBytes(UTF_8); + OzoneKeyDetails overwriteDetails = createTestKey(bucket, keyDetails.getName(), overwriteContent); + OmKeyInfo keyInfo = ozoneManager.lookupKey(keyArgs); + + // try to rewrite previous generation + OMException e = assertThrows(OMException.class, () -> rewriteKey(bucket, keyDetails, "rewrite".getBytes(UTF_8))); + assertEquals(KEY_NOT_FOUND, e.getResult()); + assertThat(e).hasMessageContaining("Generation mismatch"); + + OzoneKeyDetails actualKeyDetails = assertKeyContent(bucket, keyDetails.getName(), overwriteContent); + assertEquals(overwriteDetails.getGeneration(), actualKeyDetails.getGeneration()); + assertMetadataUnchanged(overwriteDetails, actualKeyDetails); + assertUnchanged(keyInfo, ozoneManager.lookupKey(keyArgs)); + } + + @ParameterizedTest + @EnumSource + void rewriteFailsDueToOutdatedGenerationAtCommit(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + final byte[] overwriteContent = "overwrite".getBytes(UTF_8); + OmKeyArgs keyArgs = toOmKeyArgs(keyDetails); + OmKeyInfo keyInfo; + + OzoneOutputStream out = null; + final OzoneKeyDetails overwriteDetails; + try { + out = bucket.rewriteKey(keyDetails.getName(), keyDetails.getDataSize(), + keyDetails.getGeneration(), RatisReplicationConfig.getInstance(HddsProtos.ReplicationFactor.ONE), + keyDetails.getMetadata()); + out.write("rewrite".getBytes(UTF_8)); + + overwriteDetails = createTestKey(bucket, keyDetails.getName(), overwriteContent); + keyInfo = ozoneManager.lookupKey(keyArgs); + + OMException e = assertThrows(OMException.class, out::close); + assertEquals(KEY_NOT_FOUND, e.getResult()); + assertThat(e).hasMessageContaining("does not match the expected generation to rewrite"); + } finally { + if (out != null) { + out.close(); + } + } + + OzoneKeyDetails actualKeyDetails = assertKeyContent(bucket, keyDetails.getName(), overwriteContent); + assertEquals(overwriteDetails.getGeneration(), actualKeyDetails.getGeneration()); + assertUnchanged(keyInfo, ozoneManager.lookupKey(keyArgs)); + } + + @ParameterizedTest + @EnumSource + void cannotRewriteDeletedKey(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + bucket.deleteKey(keyDetails.getName()); + + OMException e = assertThrows(OMException.class, () -> rewriteKey(bucket, keyDetails, "rewrite".getBytes(UTF_8))); + assertEquals(KEY_NOT_FOUND, e.getResult()); + assertThat(e).hasMessageContaining("not found"); + } + + @ParameterizedTest + @EnumSource + void cannotRewriteRenamedKey(BucketLayout layout) throws IOException { + OzoneBucket bucket = createBucket(layout); + OzoneKeyDetails keyDetails = createTestKey(bucket); + bucket.renameKey(keyDetails.getName(), "newKeyName-" + layout.name()); + + OMException e = assertThrows(OMException.class, () -> rewriteKey(bucket, keyDetails, "rewrite".getBytes(UTF_8))); + assertEquals(KEY_NOT_FOUND, e.getResult()); + assertThat(e).hasMessageContaining("not found"); + } + + private static void rewriteKey( + OzoneBucket bucket, OzoneKeyDetails keyDetails, byte[] newContent + ) throws IOException { + try (OzoneOutputStream out = bucket.rewriteKey(keyDetails.getName(), keyDetails.getDataSize(), + keyDetails.getGeneration(), RatisReplicationConfig.getInstance(HddsProtos.ReplicationFactor.ONE), + keyDetails.getMetadata())) { + out.write(newContent); + } + } + + private static OzoneKeyDetails assertKeyContent( + OzoneBucket bucket, String keyName, byte[] expectedContent + ) throws IOException { + OzoneKeyDetails updatedKeyDetails = bucket.getKey(keyName); + + try (OzoneInputStream is = bucket.readKey(keyName)) { + byte[] fileContent = new byte[expectedContent.length]; + IOUtils.readFully(is, fileContent); + assertArrayEquals(expectedContent, fileContent); + } + + return updatedKeyDetails; + } + + private OzoneBucket createBucket(BucketLayout layout) throws IOException { + String volumeName = UUID.randomUUID().toString(); + String bucketName = UUID.randomUUID().toString(); + + store.createVolume(volumeName); + OzoneVolume volume = store.getVolume(volumeName); + + BucketArgs args = BucketArgs.newBuilder() + .setBucketLayout(layout) + .build(); + + volume.createBucket(bucketName, args); + return volume.getBucket(bucketName); + } + + private static OmKeyArgs toOmKeyArgs(OzoneKeyDetails keyDetails) { + return new OmKeyArgs.Builder() + .setVolumeName(keyDetails.getVolumeName()) + .setBucketName(keyDetails.getBucketName()) + .setKeyName(keyDetails.getName()) + .build(); + } + + private static void assertUnchanged(OmKeyInfo original, OmKeyInfo current) { + assertEquals(original.getAcls(), current.getAcls()); + assertEquals(original.getMetadata(), current.getMetadata()); + assertEquals(original.getCreationTime(), current.getCreationTime()); + assertEquals(original.getUpdateID(), current.getUpdateID()); + assertEquals(original.getModificationTime(), current.getModificationTime()); + } + + private static void assertMetadataAfterRewrite(OmKeyInfo original, OmKeyInfo updated) { + assertEquals(original.getAcls(), updated.getAcls()); + assertEquals(original.getMetadata(), updated.getMetadata()); + assertEquals(original.getCreationTime(), updated.getCreationTime()); + assertThat(updated.getUpdateID()).isGreaterThan(original.getUpdateID()); + assertThat(updated.getModificationTime()).isGreaterThanOrEqualTo(original.getModificationTime()); + } + + private static void assertMetadataUnchanged(OzoneKeyDetails original, OzoneKeyDetails rewritten) { + assertEquals(original.getOwner(), rewritten.getOwner()); + assertEquals(original.getMetadata(), rewritten.getMetadata()); + } + @Test public void testCheckUsedBytesQuota() throws IOException { String volumeName = UUID.randomUUID().toString(); @@ -1678,6 +1900,7 @@ public void testPutKeyRatisThreeNodes() throws IOException { @Test + @Flaky("HDDS-10886") public void testPutKeyRatisThreeNodesParallel() throws IOException, InterruptedException { String volumeName = UUID.randomUUID().toString(); @@ -3956,15 +4179,28 @@ private void completeMultipartUpload(OzoneBucket bucket, String keyName, assertNotNull(omMultipartUploadCompleteInfo.getHash()); } - private void createTestKey(OzoneBucket bucket, String keyName, - String keyValue) throws IOException { - OzoneOutputStream out = bucket.createKey(keyName, - keyValue.getBytes(UTF_8).length, RATIS, - ONE, new HashMap<>()); - out.write(keyValue.getBytes(UTF_8)); - out.close(); - OzoneKey key = bucket.getKey(keyName); + private OzoneKeyDetails createTestKey(OzoneBucket bucket) throws IOException { + return createTestKey(bucket, getTestName(), UUID.randomUUID().toString()); + } + + private OzoneKeyDetails createTestKey( + OzoneBucket bucket, String keyName, String keyValue + ) throws IOException { + return createTestKey(bucket, keyName, keyValue.getBytes(UTF_8)); + } + + private OzoneKeyDetails createTestKey( + OzoneBucket bucket, String keyName, byte[] bytes + ) throws IOException { + RatisReplicationConfig replication = RatisReplicationConfig.getInstance(HddsProtos.ReplicationFactor.ONE); + Map metadata = singletonMap("key", RandomStringUtils.randomAscii(10)); + try (OzoneOutputStream out = bucket.createKey(keyName, bytes.length, replication, metadata)) { + out.write(bytes); + } + OzoneKeyDetails key = bucket.getKey(keyName); + assertNotNull(key); assertEquals(keyName, key.getName()); + return key; } private void assertKeyRenamedEx(OzoneBucket bucket, String keyName) { diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java index c561dd5cc947..50bbd81ea6b6 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java @@ -82,6 +82,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; +import org.apache.ozone.test.tag.Flaky; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -288,6 +289,7 @@ private static void deleteContainer(MiniOzoneCluster cluster, DatanodeDetails dn @Test + @Flaky("HDDS-11087") public void testECContainerReplication() throws Exception { OzoneConfiguration conf = createConfiguration(false); final Map failedReadChunkCountMap = new ConcurrentHashMap<>(); diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReportHandling.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReportHandling.java new file mode 100644 index 000000000000..c7d142ac2f41 --- /dev/null +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReportHandling.java @@ -0,0 +1,156 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.container; + +import org.apache.hadoop.fs.FileUtil; +import org.apache.hadoop.hdds.client.RatisReplicationConfig; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.scm.container.ContainerID; +import org.apache.hadoop.hdds.scm.container.ContainerManager; +import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException; +import org.apache.hadoop.ozone.HddsDatanodeService; +import org.apache.hadoop.ozone.MiniOzoneCluster; +import org.apache.hadoop.ozone.client.ObjectStore; +import org.apache.hadoop.ozone.client.OzoneBucket; +import org.apache.hadoop.ozone.client.OzoneClient; +import org.apache.hadoop.ozone.client.OzoneVolume; +import org.apache.hadoop.ozone.om.helpers.OmKeyArgs; +import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; +import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; +import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; +import org.apache.ozone.test.GenericTestUtils; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Collections.emptyMap; +import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.THREE; +import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_DEADNODE_INTERVAL; +import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_STALENODE_INTERVAL; +import static org.apache.hadoop.ozone.container.TestHelper.waitForContainerClose; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Tests for container report handling. + */ +public class TestContainerReportHandling { + private static final String VOLUME = "vol1"; + private static final String BUCKET = "bucket1"; + private static final String KEY = "key1"; + + /** + * Tests that a DELETING container moves to the CLOSED state if a non-empty CLOSED replica is reported. To do this, + * the test first creates a key and closes its corresponding container. Then it moves that container to the + * DELETING state using ContainerManager. Then it restarts a Datanode hosting that container, making it send a full + * container report. Then the test waits for the container to move from DELETING to CLOSED. + */ + @Test + void testDeletingContainerTransitionsToClosedWhenNonEmptyReplicaIsReported() throws Exception { + OzoneConfiguration conf = new OzoneConfiguration(); + conf.setTimeDuration(OZONE_SCM_STALENODE_INTERVAL, 3, TimeUnit.SECONDS); + conf.setTimeDuration(OZONE_SCM_DEADNODE_INTERVAL, 6, TimeUnit.SECONDS); + + Path clusterPath = null; + try (MiniOzoneCluster cluster = newCluster(conf)) { + cluster.waitForClusterToBeReady(); + clusterPath = Paths.get(cluster.getBaseDir()); + + try (OzoneClient client = cluster.newClient()) { + // create a container and close it + createTestData(client); + List keyLocations = lookupKey(cluster); + assertThat(keyLocations).isNotEmpty(); + OmKeyLocationInfo keyLocation = keyLocations.get(0); + ContainerID containerID = ContainerID.valueOf(keyLocation.getContainerID()); + waitForContainerClose(cluster, containerID.getId()); + + // move the container to DELETING + ContainerManager containerManager = cluster.getStorageContainerManager().getContainerManager(); + containerManager.updateContainerState(containerID, HddsProtos.LifeCycleEvent.DELETE); + assertEquals(HddsProtos.LifeCycleState.DELETING, containerManager.getContainer(containerID).getState()); + + // restart a DN and wait for the container to get CLOSED. + HddsDatanodeService dn = cluster.getHddsDatanode(keyLocation.getPipeline().getFirstNode()); + cluster.restartHddsDatanode(dn.getDatanodeDetails(), false); + GenericTestUtils.waitFor(() -> { + try { + return containerManager.getContainer(containerID).getState() == HddsProtos.LifeCycleState.CLOSED; + } catch (ContainerNotFoundException e) { + fail(e); + } + return false; + }, 2000, 20000); + + assertEquals(HddsProtos.LifeCycleState.CLOSED, containerManager.getContainer(containerID).getState()); + } + } finally { + if (clusterPath != null) { + System.out.println("Deleting path " + clusterPath); + boolean deleted = FileUtil.fullyDelete(clusterPath.toFile()); + assertTrue(deleted); + } + } + } + + private static MiniOzoneCluster newCluster(OzoneConfiguration conf) + throws IOException { + return MiniOzoneCluster.newBuilder(conf) + .setNumDatanodes(3) + .build(); + } + + private static List lookupKey(MiniOzoneCluster cluster) + throws IOException { + OmKeyArgs keyArgs = new OmKeyArgs.Builder() + .setVolumeName(VOLUME) + .setBucketName(BUCKET) + .setKeyName(KEY) + .build(); + OmKeyInfo keyInfo = cluster.getOzoneManager().lookupKey(keyArgs); + OmKeyLocationInfoGroup locations = keyInfo.getLatestVersionLocations(); + assertNotNull(locations); + return locations.getLocationList(); + } + + private void createTestData(OzoneClient client) throws IOException { + ObjectStore objectStore = client.getObjectStore(); + objectStore.createVolume(VOLUME); + OzoneVolume volume = objectStore.getVolume(VOLUME); + volume.createBucket(BUCKET); + + OzoneBucket bucket = volume.getBucket(BUCKET); + + try (OutputStream out = bucket.createKey(KEY, 0, + RatisReplicationConfig.getInstance(THREE), emptyMap())) { + out.write("Hello".getBytes(UTF_8)); + } + } + +} diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReportHandlingWithHA.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReportHandlingWithHA.java new file mode 100644 index 000000000000..82b89961f96c --- /dev/null +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReportHandlingWithHA.java @@ -0,0 +1,168 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.container; + +import org.apache.hadoop.fs.FileUtil; +import org.apache.hadoop.hdds.client.RatisReplicationConfig; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.scm.container.ContainerID; +import org.apache.hadoop.hdds.scm.container.ContainerManager; +import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException; +import org.apache.hadoop.ozone.HddsDatanodeService; +import org.apache.hadoop.ozone.MiniOzoneCluster; +import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl; +import org.apache.hadoop.ozone.client.ObjectStore; +import org.apache.hadoop.ozone.client.OzoneBucket; +import org.apache.hadoop.ozone.client.OzoneClient; +import org.apache.hadoop.ozone.client.OzoneVolume; +import org.apache.hadoop.ozone.om.helpers.OmKeyArgs; +import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; +import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; +import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; +import org.apache.ozone.test.GenericTestUtils; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Collections.emptyMap; +import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.THREE; +import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_DEADNODE_INTERVAL; +import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_STALENODE_INTERVAL; +import static org.apache.hadoop.ozone.container.TestHelper.waitForContainerClose; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +/** + * Tests for container report handling with SCM High Availability. + */ +public class TestContainerReportHandlingWithHA { + private static final String VOLUME = "vol1"; + private static final String BUCKET = "bucket1"; + private static final String KEY = "key1"; + + /** + * Tests that a DELETING container moves to the CLOSED state if a non-empty CLOSED replica is reported. To do this, + * the test first creates a key and closes its corresponding container. Then it moves that container to the + * DELETING state using ContainerManager. Then it restarts a Datanode hosting that container, making it send a full + * container report. Then the test waits for the container to move from DELETING to CLOSED in all SCMs. + */ + @Test + void testDeletingContainerTransitionsToClosedWhenNonEmptyReplicaIsReportedWithScmHA() throws Exception { + OzoneConfiguration conf = new OzoneConfiguration(); + conf.setTimeDuration(OZONE_SCM_STALENODE_INTERVAL, 3, TimeUnit.SECONDS); + conf.setTimeDuration(OZONE_SCM_DEADNODE_INTERVAL, 6, TimeUnit.SECONDS); + + int numSCM = 3; + Path clusterPath = null; + try (MiniOzoneHAClusterImpl cluster = newHACluster(conf, numSCM)) { + cluster.waitForClusterToBeReady(); + clusterPath = Paths.get(cluster.getBaseDir()); + + try (OzoneClient client = cluster.newClient()) { + // create a container and close it + createTestData(client); + List keyLocations = lookupKey(cluster); + assertThat(keyLocations).isNotEmpty(); + OmKeyLocationInfo keyLocation = keyLocations.get(0); + ContainerID containerID = ContainerID.valueOf(keyLocation.getContainerID()); + waitForContainerClose(cluster, containerID.getId()); + + // move the container to DELETING + ContainerManager containerManager = cluster.getScmLeader().getContainerManager(); + containerManager.updateContainerState(containerID, HddsProtos.LifeCycleEvent.DELETE); + assertEquals(HddsProtos.LifeCycleState.DELETING, containerManager.getContainer(containerID).getState()); + + // restart a DN and wait for the container to get CLOSED in all SCMs + HddsDatanodeService dn = cluster.getHddsDatanode(keyLocation.getPipeline().getFirstNode()); + cluster.restartHddsDatanode(dn.getDatanodeDetails(), false); + ContainerManager[] array = new ContainerManager[numSCM]; + for (int i = 0; i < numSCM; i++) { + array[i] = cluster.getStorageContainerManager(i).getContainerManager(); + } + GenericTestUtils.waitFor(() -> { + try { + for (ContainerManager manager : array) { + if (manager.getContainer(containerID).getState() != HddsProtos.LifeCycleState.CLOSED) { + return false; + } + } + return true; + } catch (ContainerNotFoundException e) { + fail(e); + } + return false; + }, 2000, 20000); + + assertEquals(HddsProtos.LifeCycleState.CLOSED, containerManager.getContainer(containerID).getState()); + } + } finally { + if (clusterPath != null) { + boolean deleted = FileUtil.fullyDelete(clusterPath.toFile()); + assertTrue(deleted); + } + } + } + + private static MiniOzoneHAClusterImpl newHACluster(OzoneConfiguration conf, int numSCM) throws IOException { + return MiniOzoneCluster.newHABuilder(conf) + .setOMServiceId("om-service") + .setSCMServiceId("scm-service") + .setNumOfOzoneManagers(1) + .setNumOfStorageContainerManagers(numSCM) + .build(); + } + + private static List lookupKey(MiniOzoneCluster cluster) + throws IOException { + OmKeyArgs keyArgs = new OmKeyArgs.Builder() + .setVolumeName(VOLUME) + .setBucketName(BUCKET) + .setKeyName(KEY) + .build(); + OmKeyInfo keyInfo = cluster.getOzoneManager().lookupKey(keyArgs); + OmKeyLocationInfoGroup locations = keyInfo.getLatestVersionLocations(); + assertNotNull(locations); + return locations.getLocationList(); + } + + private void createTestData(OzoneClient client) throws IOException { + ObjectStore objectStore = client.getObjectStore(); + objectStore.createVolume(VOLUME); + OzoneVolume volume = objectStore.getVolume(VOLUME); + volume.createBucket(BUCKET); + + OzoneBucket bucket = volume.getBucket(BUCKET); + + try (OutputStream out = bucket.createKey(KEY, 0, + RatisReplicationConfig.getInstance(THREE), emptyMap())) { + out.write("Hello".getBytes(UTF_8)); + } + } + +} diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestHelper.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestHelper.java index 2a33ddc5677f..cb8173b2f075 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestHelper.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestHelper.java @@ -41,8 +41,10 @@ import org.apache.hadoop.hdds.scm.events.SCMEvents; import org.apache.hadoop.hdds.scm.pipeline.Pipeline; import org.apache.hadoop.hdds.scm.pipeline.PipelineNotFoundException; +import org.apache.hadoop.hdds.scm.server.StorageContainerManager; import org.apache.hadoop.ozone.HddsDatanodeService; import org.apache.hadoop.ozone.MiniOzoneCluster; +import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.client.ObjectStore; import org.apache.hadoop.ozone.client.io.BlockDataStreamOutputEntry; @@ -329,14 +331,17 @@ public static void waitForContainerClose(MiniOzoneCluster cluster, Long... containerIdList) throws ContainerNotFoundException, PipelineNotFoundException, TimeoutException, InterruptedException { + StorageContainerManager scm; + if (cluster instanceof MiniOzoneHAClusterImpl) { + MiniOzoneHAClusterImpl haCluster = (MiniOzoneHAClusterImpl) cluster; + scm = haCluster.getScmLeader(); + } else { + scm = cluster.getStorageContainerManager(); + } List pipelineList = new ArrayList<>(); for (long containerID : containerIdList) { - ContainerInfo container = - cluster.getStorageContainerManager().getContainerManager() - .getContainer(ContainerID.valueOf(containerID)); - Pipeline pipeline = - cluster.getStorageContainerManager().getPipelineManager() - .getPipeline(container.getPipelineID()); + ContainerInfo container = scm.getContainerManager().getContainer(ContainerID.valueOf(containerID)); + Pipeline pipeline = scm.getPipelineManager().getPipeline(container.getPipelineID()); pipelineList.add(pipeline); List datanodes = pipeline.getNodes(); @@ -352,9 +357,7 @@ public static void waitForContainerClose(MiniOzoneCluster cluster, // make sure the container gets created first assertFalse(isContainerClosed(cluster, containerID, details)); // send the order to close the container - cluster.getStorageContainerManager().getEventQueue() - .fireEvent(SCMEvents.CLOSE_CONTAINER, - ContainerID.valueOf(containerID)); + scm.getEventQueue().fireEvent(SCMEvents.CLOSE_CONTAINER, ContainerID.valueOf(containerID)); } } int index = 0; diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java index a4a5701f5491..068cb01a9671 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/metrics/TestContainerMetrics.java @@ -18,11 +18,13 @@ package org.apache.hadoop.ozone.container.metrics; import java.io.File; +import java.io.IOException; import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.UUID; +import org.apache.commons.io.FileUtils; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.hdds.DFSConfigKeysLegacy; import org.apache.hadoop.hdds.client.BlockID; @@ -32,32 +34,47 @@ import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandResponseProto; import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.XceiverClientGrpc; +import org.apache.hadoop.hdds.scm.XceiverClientRatis; +import org.apache.hadoop.hdds.scm.XceiverClientSpi; import org.apache.hadoop.hdds.scm.pipeline.MockPipeline; import org.apache.hadoop.hdds.scm.pipeline.Pipeline; import org.apache.hadoop.metrics2.MetricsRecordBuilder; +import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; import org.apache.hadoop.ozone.OzoneConfigKeys; +import org.apache.hadoop.ozone.RatisTestHelper; import org.apache.hadoop.ozone.container.ContainerTestHelper; import org.apache.hadoop.ozone.container.common.ContainerTestUtils; import org.apache.hadoop.ozone.container.common.helpers.ContainerMetrics; import org.apache.hadoop.ozone.container.common.impl.ContainerSet; import org.apache.hadoop.ozone.container.common.impl.HddsDispatcher; +import org.apache.hadoop.ozone.container.common.interfaces.ContainerDispatcher; import org.apache.hadoop.ozone.container.common.interfaces.Handler; import org.apache.hadoop.ozone.container.common.statemachine.StateContext; import org.apache.hadoop.ozone.container.common.transport.server.XceiverServerGrpc; +import org.apache.hadoop.ozone.container.common.transport.server.XceiverServerSpi; +import org.apache.hadoop.ozone.container.common.transport.server.ratis.XceiverServerRatis; import org.apache.hadoop.ozone.container.common.utils.StorageVolumeUtil; import org.apache.hadoop.ozone.container.common.volume.HddsVolume; import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet; import org.apache.hadoop.ozone.container.common.volume.StorageVolume; import org.apache.hadoop.ozone.container.common.volume.VolumeSet; +import org.apache.hadoop.ozone.container.ozoneimpl.ContainerController; import org.apache.ozone.test.GenericTestUtils; import com.google.common.collect.Maps; -import static org.apache.hadoop.hdds.protocol.MockDatanodeDetails.randomDatanodeDetails; import static org.apache.ozone.test.MetricsAsserts.assertCounter; import static org.apache.ozone.test.MetricsAsserts.assertQuantileGauges; import static org.apache.ozone.test.MetricsAsserts.getMetrics; +import static org.apache.ratis.rpc.SupportedRpcType.GRPC; import static org.junit.jupiter.api.Assertions.assertEquals; +import org.apache.ratis.util.function.CheckedBiConsumer; +import org.apache.ratis.util.function.CheckedBiFunction; +import org.apache.ratis.util.function.CheckedConsumer; +import org.apache.ratis.util.function.CheckedFunction; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.io.TempDir; @@ -67,72 +84,126 @@ */ @Timeout(300) public class TestContainerMetrics { + static final String TEST_DIR = GenericTestUtils.getRandomizedTempPath() + File.separator; @TempDir private Path tempDir; + private static final OzoneConfiguration CONF = new OzoneConfiguration(); + private static final int DFS_METRICS_PERCENTILES_INTERVALS = 1; + + @BeforeAll + public static void setup() { + DefaultMetricsSystem.setMiniClusterMode(true); + CONF.setInt(DFSConfigKeysLegacy.DFS_METRICS_PERCENTILES_INTERVALS_KEY, + DFS_METRICS_PERCENTILES_INTERVALS); + CONF.setBoolean(OzoneConfigKeys.HDDS_CONTAINER_RATIS_DATASTREAM_ENABLED, false); + CONF.set(OzoneConfigKeys.OZONE_METADATA_DIRS, TEST_DIR); + + } + + @AfterAll + public static void cleanup() { + // clean up volume dir + File file = new File(TEST_DIR); + if (file.exists()) { + FileUtil.fullyDelete(file); + } + } + + @AfterEach + public void cleanUp() throws IOException { + FileUtils.deleteQuietly(new File(CONF.get(ScmConfigKeys.HDDS_DATANODE_DIR_KEY))); + FileUtils.deleteQuietly(CONF.get(OzoneConfigKeys.HDDS_CONTAINER_RATIS_DATANODE_STORAGE_DIR) == null ? + null : new File(CONF.get(OzoneConfigKeys.HDDS_CONTAINER_RATIS_DATANODE_STORAGE_DIR))); + } @Test public void testContainerMetrics() throws Exception { - XceiverServerGrpc server = null; - XceiverClientGrpc client = null; + runTestClientServer(pipeline -> CONF + .setInt(OzoneConfigKeys.HDDS_CONTAINER_IPC_PORT, + pipeline.getFirstNode() + .getPort(DatanodeDetails.Port.Name.STANDALONE).getValue()), + pipeline -> new XceiverClientGrpc(pipeline, CONF), + (dn, volumeSet) -> new XceiverServerGrpc(dn, CONF, + createDispatcher(dn, volumeSet), null), (dn, p) -> { + }); + } + + @Test + public void testContainerMetricsRatis() throws Exception { + runTestClientServer( + pipeline -> RatisTestHelper.initRatisConf(GRPC, CONF), + pipeline -> XceiverClientRatis.newXceiverClientRatis(pipeline, CONF), + this::newXceiverServerRatis, (dn, p) -> + RatisTestHelper.initXceiverServerRatis(GRPC, dn, p)); + } + + private static MutableVolumeSet createVolumeSet(DatanodeDetails dn, String path) throws IOException { + CONF.set(ScmConfigKeys.HDDS_DATANODE_DIR_KEY, path); + return new MutableVolumeSet( + dn.getUuidString(), CONF, + null, StorageVolume.VolumeType.DATA_VOLUME, null); + } + + private HddsDispatcher createDispatcher(DatanodeDetails dd, VolumeSet volumeSet) { + ContainerSet containerSet = new ContainerSet(1000); + StateContext context = ContainerTestUtils.getMockContext( + dd, CONF); + ContainerMetrics metrics = ContainerMetrics.create(CONF); + Map handlers = Maps.newHashMap(); + for (ContainerProtos.ContainerType containerType : + ContainerProtos.ContainerType.values()) { + handlers.put(containerType, + Handler.getHandlerForContainerType(containerType, CONF, + context.getParent().getDatanodeDetails().getUuidString(), + containerSet, volumeSet, metrics, + c -> { })); + } + HddsDispatcher dispatcher = new HddsDispatcher(CONF, containerSet, + volumeSet, handlers, context, metrics, null); + StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()) + .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile())); + dispatcher.setClusterId(UUID.randomUUID().toString()); + return dispatcher; + } + + static void runTestClientServer( + CheckedConsumer initConf, + CheckedFunction createClient, + CheckedBiFunction createServer, + CheckedBiConsumer initServer) + throws Exception { + XceiverServerSpi server = null; + XceiverClientSpi client = null; long containerID = ContainerTestHelper.getTestContainerID(); - String path = GenericTestUtils.getRandomizedTempPath(); + MutableVolumeSet volumeSet = null; try { - final int interval = 1; - Pipeline pipeline = MockPipeline - .createSingleNodePipeline(); - OzoneConfiguration conf = new OzoneConfiguration(); - conf.setInt(OzoneConfigKeys.HDDS_CONTAINER_IPC_PORT, - pipeline.getFirstNode() - .getPort(DatanodeDetails.Port.Name.STANDALONE).getValue()); - conf.setInt(DFSConfigKeysLegacy.DFS_METRICS_PERCENTILES_INTERVALS_KEY, - interval); - - DatanodeDetails datanodeDetails = randomDatanodeDetails(); - conf.set(ScmConfigKeys.HDDS_DATANODE_DIR_KEY, path); - conf.set(OzoneConfigKeys.OZONE_METADATA_DIRS, path); - VolumeSet volumeSet = new MutableVolumeSet( - datanodeDetails.getUuidString(), conf, - null, StorageVolume.VolumeType.DATA_VOLUME, null); - ContainerSet containerSet = new ContainerSet(1000); - StateContext context = ContainerTestUtils.getMockContext( - datanodeDetails, conf); - ContainerMetrics metrics = ContainerMetrics.create(conf); - Map handlers = Maps.newHashMap(); - for (ContainerProtos.ContainerType containerType : - ContainerProtos.ContainerType.values()) { - handlers.put(containerType, - Handler.getHandlerForContainerType(containerType, conf, - context.getParent().getDatanodeDetails().getUuidString(), - containerSet, volumeSet, metrics, - c -> { })); - } - HddsDispatcher dispatcher = new HddsDispatcher(conf, containerSet, - volumeSet, handlers, context, metrics, null); - StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()) - .forEach(hddsVolume -> hddsVolume.setDbParentDir(tempDir.toFile())); - dispatcher.setClusterId(UUID.randomUUID().toString()); - - server = new XceiverServerGrpc(datanodeDetails, conf, dispatcher, null); - client = new XceiverClientGrpc(pipeline, conf); + final Pipeline pipeline = + MockPipeline.createSingleNodePipeline(); + initConf.accept(pipeline); + DatanodeDetails dn = pipeline.getFirstNode(); + volumeSet = createVolumeSet(dn, TEST_DIR + dn.getUuidString()); + server = createServer.apply(dn, volumeSet); server.start(); + initServer.accept(dn, pipeline); + + client = createClient.apply(pipeline); client.connect(); // Write Chunk BlockID blockID = ContainerTestHelper.getTestBlockID(containerID); - ContainerTestHelper.getWriteChunkRequest( - pipeline, blockID, 1024); - ContainerProtos.ContainerCommandRequestProto writeChunkRequest = + final ContainerProtos.ContainerCommandRequestProto writeChunkRequest = ContainerTestHelper.getWriteChunkRequest( pipeline, blockID, 1024); - ContainerCommandResponseProto response = - client.sendCommand(writeChunkRequest); + ContainerCommandResponseProto response = client.sendCommand(writeChunkRequest); assertEquals(ContainerProtos.Result.SUCCESS, response.getResult()); //Read Chunk - ContainerProtos.ContainerCommandRequestProto readChunkRequest = + final ContainerProtos.ContainerCommandRequestProto readChunkRequest = ContainerTestHelper.getReadChunkRequest(pipeline, writeChunkRequest .getWriteChunk()); response = client.sendCommand(readChunkRequest); @@ -147,11 +218,10 @@ public void testContainerMetrics() throws Exception { assertCounter("bytesWriteChunk", 1024L, containerMetrics); assertCounter("bytesReadChunk", 1024L, containerMetrics); - String sec = interval + "s"; - Thread.sleep((interval + 1) * 1000); + String sec = DFS_METRICS_PERCENTILES_INTERVALS + "s"; + Thread.sleep((DFS_METRICS_PERCENTILES_INTERVALS + 1) * 1000); assertQuantileGauges("WriteChunkNanos" + sec, containerMetrics); - // Check VolumeIOStats metrics List volumes = StorageVolumeUtil.getHddsVolumesList(volumeSet.getVolumesList()); HddsVolume hddsVolume = volumes.get(0); @@ -161,19 +231,30 @@ public void testContainerMetrics() throws Exception { assertCounter("ReadOpCount", 1L, volumeIOMetrics); assertCounter("WriteBytes", 1024L, volumeIOMetrics); assertCounter("WriteOpCount", 1L, volumeIOMetrics); - } finally { + ContainerMetrics.remove(); + if (volumeSet != null) { + volumeSet.shutdown(); + } if (client != null) { client.close(); } if (server != null) { server.stop(); } - // clean up volume dir - File file = new File(path); - if (file.exists()) { - FileUtil.fullyDelete(file); - } } } + + private XceiverServerSpi newXceiverServerRatis(DatanodeDetails dn, MutableVolumeSet volumeSet) + throws IOException { + CONF.setInt(OzoneConfigKeys.HDDS_CONTAINER_RATIS_IPC_PORT, + dn.getPort(DatanodeDetails.Port.Name.RATIS).getValue()); + final String dir = TEST_DIR + dn.getUuid(); + CONF.set(OzoneConfigKeys.HDDS_CONTAINER_RATIS_DATANODE_STORAGE_DIR, dir); + final ContainerDispatcher dispatcher = createDispatcher(dn, + volumeSet); + return XceiverServerRatis.newXceiverServerRatis(dn, CONF, dispatcher, + new ContainerController(new ContainerSet(1000), Maps.newHashMap()), + null, null); + } } diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java index 1f6e33624c18..7af0b5f9aa19 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java @@ -59,12 +59,15 @@ import java.util.Map; import java.util.NavigableMap; import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Stream; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType.STAND_ALONE; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * This class tests `ozone debug ldb` CLI that reads from a RocksDB directory. @@ -96,6 +99,7 @@ public void setup() throws IOException { cmd = new CommandLine(new RDBParser()) .addSubcommand(new DBScanner()) + .addSubcommand(new ValueSchema()) .setOut(pstdout) .setErr(pstderr); @@ -287,6 +291,29 @@ void testScanOfPipelinesWhenNoData() throws IOException { assertEquals("", stderr.toString()); } + @Test + void testSchemaCommand() throws IOException { + // Prepare dummy table + prepareTable(KEY_TABLE, false); + + // Prepare scan args + List completeScanArgs = new ArrayList<>(Arrays.asList( + "--db", dbStore.getDbLocation().getAbsolutePath(), + "value-schema", + "--column-family", KEY_TABLE)); + + int exitCode = cmd.execute(completeScanArgs.toArray(new String[0])); + // Check exit code. Print stderr if not expected + assertEquals(0, exitCode, stderr.toString()); + + // Check stdout + Pattern p = Pattern.compile(".*keyName.*", Pattern.MULTILINE); + Matcher m = p.matcher(stdout.toString()); + assertTrue(m.find()); + // Check stderr + assertEquals("", stderr.toString()); + } + /** * Converts String input to a Map and compares to the given Map input. * @param expected expected result Map diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java index ccf94bef3c80..047b8e553b5e 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMUpgradeFinalization.java @@ -36,12 +36,17 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.ozone.MiniOzoneCluster; import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl; +import org.apache.hadoop.ozone.audit.AuditEventStatus; +import org.apache.hadoop.ozone.audit.AuditLogTestUtils; +import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.client.OzoneClient; import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol; import org.apache.hadoop.ozone.om.ratis.OzoneManagerStateMachine; import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer.StatusAndMessages; import org.apache.ratis.util.LifeCycle; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; /** @@ -49,7 +54,18 @@ * TODO: can be merged into class with other OM tests with per-method cluster */ class TestOMUpgradeFinalization { + static { + AuditLogTestUtils.enableAuditLog(); + } + @BeforeEach + public void setup() throws Exception { + AuditLogTestUtils.truncateAuditLogFile(); + } + @AfterAll + public static void shutdown() { + AuditLogTestUtils.deleteAuditLogFile(); + } @Test void testOMUpgradeFinalizationWithOneOMDown() throws Exception { OzoneConfiguration conf = new OzoneConfiguration(); @@ -70,11 +86,14 @@ void testOMUpgradeFinalizationWithOneOMDown() throws Exception { // OMs. long prepareIndex = omClient.prepareOzoneManager(120L, 5L); assertClusterPrepared(prepareIndex, runningOms); + AuditLogTestUtils.verifyAuditLog(OMAction.UPGRADE_PREPARE, AuditEventStatus.SUCCESS); omClient.cancelOzoneManagerPrepare(); + AuditLogTestUtils.verifyAuditLog(OMAction.UPGRADE_CANCEL, AuditEventStatus.SUCCESS); StatusAndMessages response = omClient.finalizeUpgrade("finalize-test"); System.out.println("Finalization Messages : " + response.msgs()); + AuditLogTestUtils.verifyAuditLog(OMAction.UPGRADE_FINALIZE, AuditEventStatus.SUCCESS); waitForFinalization(omClient); cluster.restartOzoneManager(downedOM, true); diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java index 2f7e1bd5a9d6..cc5bca4d3100 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java @@ -38,6 +38,7 @@ import org.apache.hadoop.ozone.om.OmFailoverProxyUtil; import org.apache.hadoop.ozone.om.OmSnapshot; import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.SstFilteringService; import org.apache.hadoop.ozone.om.exceptions.OMLeaderNotReadyException; import org.apache.hadoop.ozone.om.exceptions.OMNotLeaderException; import org.apache.hadoop.ozone.om.helpers.BucketLayout; @@ -572,7 +573,7 @@ private void checkIfSnapshotGetsProcessedBySFS(OzoneManager ozoneManager) } catch (IOException e) { fail(); } - return snapshotInfo.isSstFiltered(); + return SstFilteringService.isSstFiltered(ozoneManager.getConfiguration(), snapshotInfo); }, 1000, 10000); } diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingService.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingService.java index 472abf42095d..be4ea69095be 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingService.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingService.java @@ -44,6 +44,7 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.service.SnapshotDeletingService; import org.apache.ozone.test.GenericTestUtils; +import org.apache.ozone.test.tag.Flaky; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; @@ -137,6 +138,7 @@ public void teardown() { @Test @Order(2) + @Flaky("HDDS-11130") public void testSnapshotSplitAndMove() throws Exception { if (runIndividualTest) { @@ -220,6 +222,7 @@ public void testMultipleSnapshotKeyReclaim() throws Exception { @SuppressWarnings("checkstyle:MethodLength") @Test @Order(3) + @Flaky("HDDS-11131") public void testSnapshotWithFSO() throws Exception { Table dirTable = om.getMetadataManager().getDirectoryTable(); diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java index fac6764767f6..03df331087b8 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java @@ -39,6 +39,7 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.service.SnapshotDirectoryCleaningService; import org.apache.ozone.test.GenericTestUtils; +import org.apache.ozone.test.tag.Flaky; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -126,6 +127,7 @@ public void cleanup() { @SuppressWarnings("checkstyle:LineLength") @Test + @Flaky("HDDS-11129") public void testExclusiveSizeWithDirectoryDeepClean() throws Exception { Table deletedDirTable = diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java index be94cf42d080..a80d85a29718 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java @@ -55,6 +55,7 @@ import org.apache.hadoop.hdds.scm.node.TestNodeUtil; import org.apache.ozone.test.GenericTestUtils; import org.apache.ozone.test.LambdaTestUtils; +import org.apache.ozone.test.tag.Flaky; import org.hadoop.ozone.recon.schema.ContainerSchemaDefinition.UnHealthyContainerStates; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -221,6 +222,7 @@ void testMissingContainer() throws Exception { @ParameterizedTest @MethodSource("outOfServiceNodeStateArgs") + @Flaky("HDDS-11128") void testNodesInDecommissionOrMaintenance( NodeOperationalState initialState, NodeOperationalState finalState, boolean isMaintenance) throws Exception { diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java index ca8fcae6643b..8656682cd151 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java @@ -476,7 +476,7 @@ private boolean assertTableRowCount(int expectedCount, return count.get() == expectedCount; } - private void syncDataFromOM() { + private void syncDataFromOM() throws IOException { // Sync data from Ozone Manager to Recon. OzoneManagerServiceProviderImpl impl = (OzoneManagerServiceProviderImpl) cluster.getReconServer().getOzoneManagerServiceProvider(); diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneDebugShell.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneDebugShell.java index 15d9746fcb6a..9b1747b4c272 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneDebugShell.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneDebugShell.java @@ -21,6 +21,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hdds.client.ECReplicationConfig; +import org.apache.hadoop.hdds.client.ReplicationConfig; import org.apache.hadoop.hdds.client.ReplicationFactor; import org.apache.hadoop.hdds.client.ReplicationType; import org.apache.hadoop.hdds.conf.OzoneConfiguration; @@ -46,6 +48,8 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import picocli.CommandLine; import java.io.File; @@ -86,7 +90,7 @@ public class TestOzoneDebugShell { protected static void startCluster() throws Exception { // Init HA cluster omServiceId = "om-service-test1"; - final int numDNs = 3; + final int numDNs = 5; cluster = MiniOzoneCluster.newBuilder(conf) .setNumDatanodes(numDNs) .build(); @@ -112,13 +116,14 @@ public static void init() throws Exception { startCluster(); } - @Test - public void testChunkInfoCmdBeforeAfterCloseContainer() throws Exception { + @ParameterizedTest + @ValueSource(booleans = {true, false}) + public void testChunkInfoCmdBeforeAfterCloseContainer(boolean isEcKey) throws Exception { final String volumeName = UUID.randomUUID().toString(); final String bucketName = UUID.randomUUID().toString(); final String keyName = UUID.randomUUID().toString(); - writeKey(volumeName, bucketName, keyName); + writeKey(volumeName, bucketName, keyName, isEcKey); int exitCode = runChunkInfoCommand(volumeName, bucketName, keyName); assertEquals(0, exitCode); @@ -134,7 +139,7 @@ public void testChunkInfoVerifyPathsAreDifferent() throws Exception { final String volumeName = UUID.randomUUID().toString(); final String bucketName = UUID.randomUUID().toString(); final String keyName = UUID.randomUUID().toString(); - writeKey(volumeName, bucketName, keyName); + writeKey(volumeName, bucketName, keyName, false); int exitCode = runChunkInfoAndVerifyPaths(volumeName, bucketName, keyName); assertEquals(0, exitCode); } @@ -150,7 +155,7 @@ public void testLdbCliForOzoneSnapshot() throws Exception { final String bucketName = UUID.randomUUID().toString(); final String keyName = UUID.randomUUID().toString(); - writeKey(volumeName, bucketName, keyName); + writeKey(volumeName, bucketName, keyName, false); String snapshotName = client.getObjectStore().createSnapshot(volumeName, bucketName, "snap1"); @@ -176,15 +181,22 @@ private static String getSnapshotDBPath(String checkPointDir) { OM_DB_NAME + checkPointDir; } - private static void writeKey(String volumeName, String bucketName, - String keyName) throws IOException { + String keyName, boolean isEcKey) throws IOException { + ReplicationConfig repConfig; + if (isEcKey) { + repConfig = new ECReplicationConfig(3, 2); + } else { + repConfig = ReplicationConfig.fromTypeAndFactor(ReplicationType.RATIS, + ReplicationFactor.THREE); + } try (OzoneClient client = OzoneClientFactory.getRpcClient(conf)) { // see HDDS-10091 for making this work with FILE_SYSTEM_OPTIMIZED layout - TestDataUtil.createVolumeAndBucket(client, volumeName, bucketName, BucketLayout.LEGACY); + TestDataUtil.createVolumeAndBucket(client, volumeName, bucketName, + BucketLayout.LEGACY); TestDataUtil.createKey( client.getObjectStore().getVolume(volumeName).getBucket(bucketName), - keyName, ReplicationFactor.THREE, ReplicationType.RATIS, "test"); + keyName, repConfig, "test"); } } diff --git a/hadoop-ozone/interface-client/pom.xml b/hadoop-ozone/interface-client/pom.xml index b92de2f5bc1e..c196dca045da 100644 --- a/hadoop-ozone/interface-client/pom.xml +++ b/hadoop-ozone/interface-client/pom.xml @@ -70,6 +70,13 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> com.salesforce.servicelibs proto-backwards-compatibility + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.xolstice.maven.plugins protobuf-maven-plugin diff --git a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto index 5f5a50d1c86d..86403439041a 100644 --- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto +++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto @@ -1029,6 +1029,14 @@ message KeyArgs { // S3 object tags support repeated hadoop.hdds.KeyValue tags = 22; + + // expectedDataGeneration, when used in key creation indicates that a + // key with the same keyName should exist with the given generation. + // For a key commit to succeed, the original key should still be present with the + // generation unchanged. + // This allows a key to be created an committed atomically if the original has not + // been modified. + optional uint64 expectedDataGeneration = 23; } message KeyLocation { @@ -1113,6 +1121,13 @@ message KeyInfo { optional bool isFile = 19; optional string ownerName = 20; repeated hadoop.hdds.KeyValue tags = 21; + // expectedDataGeneration, when used in key creation indicates that a + // key with the same keyName should exist with the given generation. + // For a key commit to succeed, the original key should still be present with the + // generation unchanged. + // This allows a key to be created an committed atomically if the original has not + // been modified. + optional uint64 expectedDataGeneration = 22; } message BasicKeyInfo { diff --git a/hadoop-ozone/interface-storage/pom.xml b/hadoop-ozone/interface-storage/pom.xml index 8ec4e0d99409..ca7f14f1fa50 100644 --- a/hadoop-ozone/interface-storage/pom.xml +++ b/hadoop-ozone/interface-storage/pom.xml @@ -77,6 +77,43 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + org.xolstice.maven.plugins protobuf-maven-plugin diff --git a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java index 5a8da0106fe8..2e207f1a32c4 100644 --- a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java +++ b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.DBStoreHAManager; @@ -47,8 +46,7 @@ import org.apache.hadoop.hdds.utils.TransactionInfo; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ExpiredMultipartUploadsBucket; import org.apache.hadoop.ozone.snapshot.ListSnapshotResponse; -import org.apache.hadoop.ozone.storage.proto. - OzoneManagerStorageProtos.PersistedUserVolumeInfo; +import org.apache.hadoop.ozone.storage.proto.OzoneManagerStorageProtos.PersistedUserVolumeInfo; import org.apache.hadoop.ozone.security.OzoneTokenIdentifier; import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.hdds.utils.db.Table; @@ -322,13 +320,6 @@ ExpiredOpenKeys getExpiredOpenKeys(Duration expireThreshold, int count, List getExpiredMultipartUploads( Duration expireThreshold, int maxParts) throws IOException; - /** - * Retrieve RWLock for the table. - * @param tableName table name. - * @return ReentrantReadWriteLock - */ - ReentrantReadWriteLock getTableLock(String tableName); - /** * Returns the user Table. * diff --git a/hadoop-ozone/ozone-manager/pom.xml b/hadoop-ozone/ozone-manager/pom.xml index 5af36fb2291d..5f6bc54c5af9 100644 --- a/hadoop-ozone/ozone-manager/pom.xml +++ b/hadoop-ozone/ozone-manager/pom.xml @@ -234,6 +234,48 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-annotation-processing + ${hdds.version} + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + org.apache.ozone.annotations.RequestFeatureValidatorProcessor + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + org.apache.maven.plugins maven-dependency-plugin diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java index 4804b317bc7d..aa8e47d1745b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/audit/OMAction.java @@ -103,7 +103,10 @@ public enum OMAction implements AuditAction { SNAPSHOT_INFO, SET_TIMES, - ABORT_EXPIRED_MULTIPART_UPLOAD; + ABORT_EXPIRED_MULTIPART_UPLOAD, + UPGRADE_PREPARE, + UPGRADE_CANCEL, + UPGRADE_FINALIZE; @Override public String getAction() { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/GrpcOzoneManagerServer.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/GrpcOzoneManagerServer.java index 80085db7c6f1..a83304ade459 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/GrpcOzoneManagerServer.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/GrpcOzoneManagerServer.java @@ -28,7 +28,6 @@ import org.apache.hadoop.hdds.HddsUtils; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; import org.apache.hadoop.ozone.grpc.metrics.GrpcMetricsServerRequestInterceptor; import org.apache.hadoop.ozone.grpc.metrics.GrpcMetricsServerResponseInterceptor; @@ -163,9 +162,8 @@ public void init(OzoneManagerProtocolServerSideTranslatorPB omTranslator, SecurityConfig secConf = new SecurityConfig(omServerConfig); if (secConf.isSecurityEnabled() && secConf.isGrpcTlsEnabled()) { try { - KeyStoresFactory factory = caClient.getServerKeyStoresFactory(); SslContextBuilder sslClientContextBuilder = - SslContextBuilder.forServer(factory.getKeyManagers()[0]); + SslContextBuilder.forServer(caClient.getKeyManager()); SslContextBuilder sslContextBuilder = GrpcSslContexts.configure( sslClientContextBuilder, SslProvider.valueOf(omServerConfig.get(HDDS_GRPC_TLS_PROVIDER, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java index a0967c781ee1..8e9c7eb8b4d7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java @@ -2031,6 +2031,9 @@ private List gatherSubDirsWithIterator(OmKeyInfo parentInfo, parentInfo.getObjectID())) { break; } + if (!metadataManager.getDirectoryTable().isExist(entry.getKey())) { + continue; + } String dirName = OMFileRequest.getAbsolutePath(parentInfo.getKeyName(), dirInfo.getName()); OmKeyInfo omKeyInfo = OMFileRequest.getOmKeyInfo( @@ -2065,6 +2068,9 @@ public List getPendingDeletionSubFiles(long volumeId, parentInfo.getObjectID())) { break; } + if (!metadataManager.getFileTable().isExist(entry.getKey())) { + continue; + } fileInfo.setFileName(fileInfo.getKeyName()); String fullKeyPath = OMFileRequest.getAbsolutePath( parentInfo.getKeyName(), fileInfo.getKeyName()); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMPerformanceMetrics.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMPerformanceMetrics.java index f2f11025158d..a01855d1b63e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMPerformanceMetrics.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMPerformanceMetrics.java @@ -19,6 +19,7 @@ import org.apache.hadoop.metrics2.MetricsSystem; import org.apache.hadoop.metrics2.annotation.Metric; import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; +import org.apache.hadoop.metrics2.lib.MutableGaugeFloat; import org.apache.hadoop.metrics2.lib.MutableRate; /** @@ -113,12 +114,36 @@ public static void unregister() { @Metric(about = "Ratis local command execution latency in nano seconds") private MutableRate validateAndUpdateCacheLatencyNs; + @Metric(about = "average pagination for listKeys") + private MutableRate listKeysAveragePagination; + + @Metric(about = "ops per second for listKeys") + private MutableGaugeFloat listKeysOpsPerSec; + @Metric(about = "ACLs check latency in listKeys") private MutableRate listKeysAclCheckLatencyNs; @Metric(about = "resolveBucketLink latency in listKeys") private MutableRate listKeysResolveBucketLatencyNs; + @Metric(about = "deleteKeyFailure latency in nano seconds") + private MutableRate deleteKeyFailureLatencyNs; + + @Metric(about = "deleteKeySuccess latency in nano seconds") + private MutableRate deleteKeySuccessLatencyNs; + + @Metric(about = "resolveBucketLink latency in deleteKeys") + private MutableRate deleteKeysResolveBucketLatencyNs; + + @Metric(about = "ACLs check latency in deleteKeys") + private MutableRate deleteKeysAclCheckLatencyNs; + + @Metric(about = "resolveBucketLink and ACLs check latency in deleteKey") + private MutableRate deleteKeyResolveBucketAndAclCheckLatencyNs; + + @Metric(about = "readFromRockDb latency in listKeys") + private MutableRate listKeysReadFromRocksDbLatencyNs; + public void addLookupLatency(long latencyInNs) { lookupLatencyNs.add(latencyInNs); } @@ -216,6 +241,14 @@ public MutableRate getValidateAndUpdateCacheLatencyNs() { return validateAndUpdateCacheLatencyNs; } + public void setListKeysAveragePagination(long keyCount) { + listKeysAveragePagination.add(keyCount); + } + + public void setListKeysOpsPerSec(float opsPerSec) { + listKeysOpsPerSec.set(opsPerSec); + } + MutableRate getListKeysAclCheckLatencyNs() { return listKeysAclCheckLatencyNs; } @@ -223,4 +256,28 @@ MutableRate getListKeysAclCheckLatencyNs() { MutableRate getListKeysResolveBucketLatencyNs() { return listKeysResolveBucketLatencyNs; } + + public void setDeleteKeyFailureLatencyNs(long latencyInNs) { + deleteKeyFailureLatencyNs.add(latencyInNs); + } + + public void setDeleteKeySuccessLatencyNs(long latencyInNs) { + deleteKeySuccessLatencyNs.add(latencyInNs); + } + + public void setDeleteKeysResolveBucketLatencyNs(long latencyInNs) { + deleteKeysResolveBucketLatencyNs.add(latencyInNs); + } + + public void setDeleteKeysAclCheckLatencyNs(long latencyInNs) { + deleteKeysAclCheckLatencyNs.add(latencyInNs); + } + + public MutableRate getDeleteKeyResolveBucketAndAclCheckLatencyNs() { + return deleteKeyResolveBucketAndAclCheckLatencyNs; + } + + public void addListKeysReadFromRocksDbLatencyNs(long latencyInNs) { + listKeysReadFromRocksDbLatencyNs.add(latencyInNs); + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java index 6e25dc1f7f03..5edf908a0377 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java @@ -22,7 +22,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; -import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -37,7 +36,6 @@ import java.util.TreeSet; import java.util.UUID; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -107,6 +105,8 @@ import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_FS_SNAPSHOT_MAX_LIMIT; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_FS_SNAPSHOT_MAX_LIMIT_DEFAULT; +import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_DB_MAX_OPEN_FILES; +import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_DB_MAX_OPEN_FILES_DEFAULT; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_CHECKPOINT_DIR_CREATION_POLL_TIMEOUT; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_CHECKPOINT_DIR_CREATION_POLL_TIMEOUT_DEFAULT; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND; @@ -297,11 +297,6 @@ public class OmMetadataManagerImpl implements OMMetadataManager, private boolean ignorePipelineinKey; private Table deletedDirTable; - // Table-level locks that protects table read/write access. Note: - // Don't use this lock for tables other than deletedTable and deletedDirTable. - // This is a stopgap solution. Will remove when HDDS-5905 (HDDS-6483) is done. - private Map tableLockMap = new HashMap<>(); - private OzoneManager ozoneManager; // Epoch is used to generate the objectIDs. The most significant 2 bits of @@ -317,6 +312,7 @@ public class OmMetadataManagerImpl implements OMMetadataManager, private final Map tableCacheMetricsMap = new HashMap<>(); private SnapshotChainManager snapshotChainManager; + private final OMPerformanceMetrics perfMetrics; private final S3Batcher s3Batcher = new S3SecretBatcher(); /** @@ -328,7 +324,15 @@ public class OmMetadataManagerImpl implements OMMetadataManager, */ public OmMetadataManagerImpl(OzoneConfiguration conf, OzoneManager ozoneManager) throws IOException { + this(conf, ozoneManager, null); + } + + public OmMetadataManagerImpl(OzoneConfiguration conf, + OzoneManager ozoneManager, + OMPerformanceMetrics perfMetrics) + throws IOException { this.ozoneManager = ozoneManager; + this.perfMetrics = perfMetrics; this.lock = new OzoneManagerLock(conf); // TODO: This is a temporary check. Once fully implemented, all OM state // change should go through Ratis - be it standalone (for non-HA) or @@ -350,6 +354,7 @@ protected OmMetadataManagerImpl() { OzoneConfiguration conf = new OzoneConfiguration(); this.lock = new OzoneManagerLock(conf); this.omEpoch = 0; + perfMetrics = null; } public static OmMetadataManagerImpl createCheckpointMetadataManager( @@ -384,6 +389,7 @@ private OmMetadataManagerImpl(OzoneConfiguration conf, File dir, String name) setStore(loadDB(conf, dir, name, true, java.util.Optional.of(Boolean.TRUE), Optional.empty())); initializeOmTables(CacheType.PARTIAL_CACHE, false); + perfMetrics = null; } @@ -421,11 +427,7 @@ private OmMetadataManagerImpl(OzoneConfiguration conf, File dir, String name) stop(); throw e; } - } - - @Override - public ReentrantReadWriteLock getTableLock(String tableName) { - return tableLockMap.get(tableName); + perfMetrics = null; } public OzoneManager getOzoneManager() { @@ -558,7 +560,10 @@ public void start(OzoneConfiguration configuration) throws IOException { rocksDBConfiguration.setSyncOption(true); } - this.store = loadDB(configuration, metaDir); + int maxOpenFiles = configuration.getInt(OZONE_OM_DB_MAX_OPEN_FILES, + OZONE_OM_DB_MAX_OPEN_FILES_DEFAULT); + + this.store = loadDB(configuration, metaDir, Optional.of(maxOpenFiles)); initializeOmTables(CacheType.FULL_CACHE, true); } @@ -568,8 +573,13 @@ public void start(OzoneConfiguration configuration) throws IOException { public static DBStore loadDB(OzoneConfiguration configuration, File metaDir) throws IOException { + return loadDB(configuration, metaDir, Optional.empty()); + } + + public static DBStore loadDB(OzoneConfiguration configuration, File metaDir, Optional maxOpenFiles) + throws IOException { return loadDB(configuration, metaDir, OM_DB_NAME, false, - java.util.Optional.empty(), Optional.empty(), true, true); + java.util.Optional.empty(), maxOpenFiles, true, true); } public static DBStore loadDB(OzoneConfiguration configuration, File metaDir, @@ -680,7 +690,6 @@ protected void initializeOmTables(CacheType cacheType, deletedTable = this.store.getTable(DELETED_TABLE, String.class, RepeatedOmKeyInfo.class); checkTableStatus(deletedTable, DELETED_TABLE, addCacheMetrics); - tableLockMap.put(DELETED_TABLE, new ReentrantReadWriteLock(true)); openKeyTable = this.store.getTable(OPEN_KEY_TABLE, String.class, @@ -718,7 +727,6 @@ protected void initializeOmTables(CacheType cacheType, deletedDirTable = this.store.getTable(DELETED_DIR_TABLE, String.class, OmKeyInfo.class); checkTableStatus(deletedDirTable, DELETED_DIR_TABLE, addCacheMetrics); - tableLockMap.put(DELETED_DIR_TABLE, new ReentrantReadWriteLock(true)); transactionInfoTable = this.store.getTable(TRANSACTION_INFO_TABLE, String.class, TransactionInfo.class); @@ -1163,7 +1171,7 @@ public List listBuckets(final String volumeName, public ListKeysResult listKeys(String volumeName, String bucketName, String startKey, String keyPrefix, int maxKeys) throws IOException { - + long startNanos = Time.monotonicNowNanos(); List result = new ArrayList<>(); if (maxKeys <= 0) { return new ListKeysResult(result, false); @@ -1232,11 +1240,11 @@ public ListKeysResult listKeys(String volumeName, String bucketName, cacheKeyMap.put(key, omKeyInfo); } } - + long readFromRDbStartNs, readFromRDbStopNs = 0; // Get maxKeys from DB if it has. - try (TableIterator> keyIter = getKeyTable(getBucketLayout()).iterator()) { + readFromRDbStartNs = Time.monotonicNowNanos(); KeyValue< String, OmKeyInfo > kv; keyIter.seek(seekKey); // we need to iterate maxKeys + 1 here because if skipStartKey is true, @@ -1259,10 +1267,24 @@ public ListKeysResult listKeys(String volumeName, String bucketName, break; } } + readFromRDbStopNs = Time.monotonicNowNanos(); } boolean isTruncated = cacheKeyMap.size() > maxKeys; + if (perfMetrics != null) { + long keyCount; + if (isTruncated) { + keyCount = maxKeys; + } else { + keyCount = cacheKeyMap.size(); + } + perfMetrics.setListKeysAveragePagination(keyCount); + float opsPerSec = + keyCount / ((Time.monotonicNowNanos() - startNanos) / 1000000000.0f); + perfMetrics.setListKeysOpsPerSec(opsPerSec); + perfMetrics.addListKeysReadFromRocksDbLatencyNs(readFromRDbStopNs - readFromRDbStartNs); + } // Finally DB entries and cache entries are merged, then return the count // of maxKeys from the sorted map. currentCount = 0; @@ -1792,7 +1814,7 @@ public List getExpiredMultipartUploads( mpuInfoTableIterator = getMultipartInfoTable().iterator()) { final long expiredCreationTimestamp = - Instant.now().minus(expireThreshold).toEpochMilli(); + expireThreshold.negated().plusMillis(Time.now()).toMillis(); ExpiredMultipartUploadInfo.Builder builder = ExpiredMultipartUploadInfo.newBuilder(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java index 11edd28e9442..0d17851ed1f7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java @@ -41,6 +41,7 @@ import org.apache.hadoop.hdds.StringUtils; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.server.ServerUtils; +import org.apache.hadoop.hdds.utils.db.BatchOperation; import org.apache.hadoop.hdds.utils.db.CodecRegistry; import org.apache.hadoop.hdds.utils.db.DBCheckpoint; import org.apache.hadoop.hdds.utils.db.RDBStore; @@ -447,50 +448,32 @@ public void invalidateCacheEntry(UUID key) { * @return instance of DBCheckpoint */ public static DBCheckpoint createOmSnapshotCheckpoint( - OMMetadataManager omMetadataManager, SnapshotInfo snapshotInfo) + OMMetadataManager omMetadataManager, SnapshotInfo snapshotInfo, BatchOperation batchOperation) throws IOException { RDBStore store = (RDBStore) omMetadataManager.getStore(); final DBCheckpoint dbCheckpoint; - // Acquire active DB deletedDirectoryTable write lock to block - // DirDeletingTask - omMetadataManager.getTableLock(OmMetadataManagerImpl.DELETED_DIR_TABLE) - .writeLock().lock(); - // Acquire active DB deletedTable write lock to block KeyDeletingTask - omMetadataManager.getTableLock(OmMetadataManagerImpl.DELETED_TABLE) - .writeLock().lock(); - boolean snapshotDirExist = false; - - try { - // Create DB checkpoint for snapshot - String checkpointPrefix = store.getDbLocation().getName(); - Path snapshotDirPath = Paths.get(store.getSnapshotsParentDir(), - checkpointPrefix + snapshotInfo.getCheckpointDir()); - if (Files.exists(snapshotDirPath)) { - snapshotDirExist = true; - dbCheckpoint = new RocksDBCheckpoint(snapshotDirPath); - } else { - dbCheckpoint = store.getSnapshot(snapshotInfo.getCheckpointDirName()); - } - - // Clean up active DB's deletedTable right after checkpoint is taken, - // with table write lock held - deleteKeysFromDelKeyTableInSnapshotScope(omMetadataManager, - snapshotInfo.getVolumeName(), snapshotInfo.getBucketName()); - // Clean up deletedDirectoryTable as well - deleteKeysFromDelDirTableInSnapshotScope(omMetadataManager, - snapshotInfo.getVolumeName(), snapshotInfo.getBucketName()); - } finally { - // Release deletedTable write lock - omMetadataManager.getTableLock(OmMetadataManagerImpl.DELETED_TABLE) - .writeLock().unlock(); - // Release deletedDirectoryTable write lock - omMetadataManager.getTableLock(OmMetadataManagerImpl.DELETED_DIR_TABLE) - .writeLock().unlock(); + // Create DB checkpoint for snapshot + String checkpointPrefix = store.getDbLocation().getName(); + Path snapshotDirPath = Paths.get(store.getSnapshotsParentDir(), + checkpointPrefix + snapshotInfo.getCheckpointDir()); + if (Files.exists(snapshotDirPath)) { + snapshotDirExist = true; + dbCheckpoint = new RocksDBCheckpoint(snapshotDirPath); + } else { + dbCheckpoint = store.getSnapshot(snapshotInfo.getCheckpointDirName()); } + // Clean up active DB's deletedTable right after checkpoint is taken, + // There is no need to take any lock as of now, because transactions are flushed sequentially. + deleteKeysFromDelKeyTableInSnapshotScope(omMetadataManager, + snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), batchOperation); + // Clean up deletedDirectoryTable as well + deleteKeysFromDelDirTableInSnapshotScope(omMetadataManager, + snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), batchOperation); + if (dbCheckpoint != null && snapshotDirExist) { LOG.info("Checkpoint : {} for snapshot {} already exists.", dbCheckpoint.getCheckpointLocation(), snapshotInfo.getName()); @@ -512,7 +495,7 @@ public static DBCheckpoint createOmSnapshotCheckpoint( */ private static void deleteKeysFromDelDirTableInSnapshotScope( OMMetadataManager omMetadataManager, String volumeName, - String bucketName) throws IOException { + String bucketName, BatchOperation batchOperation) throws IOException { // Range delete start key (inclusive) final String keyPrefix = getOzonePathKeyForFso(omMetadataManager, @@ -525,7 +508,7 @@ private static void deleteKeysFromDelDirTableInSnapshotScope( if (LOG.isDebugEnabled()) { LOG.debug("Removing key {} from DeletedDirTable", entry.getKey()); } - omMetadataManager.getDeletedDirTable().delete(entry.getKey()); + omMetadataManager.getDeletedDirTable().deleteWithBatch(batchOperation, entry.getKey()); return null; }); } @@ -598,7 +581,7 @@ private static void deleteRangeInclusive( */ private static void deleteKeysFromDelKeyTableInSnapshotScope( OMMetadataManager omMetadataManager, String volumeName, - String bucketName) throws IOException { + String bucketName, BatchOperation batchOperation) throws IOException { // Range delete start key (inclusive) final String keyPrefix = @@ -611,7 +594,7 @@ private static void deleteKeysFromDelKeyTableInSnapshotScope( if (LOG.isDebugEnabled()) { LOG.debug("Removing key {} from DeletedTable", entry.getKey()); } - omMetadataManager.getDeletedTable().delete(entry.getKey()); + omMetadataManager.getDeletedTable().deleteWithBatch(batchOperation, entry.getKey()); return null; }); } @@ -711,6 +694,13 @@ public static String getSnapshotPrefix(String snapshotName) { snapshotName + OM_KEY_PREFIX; } + public static Path getSnapshotPath(OMMetadataManager omMetadataManager, SnapshotInfo snapshotInfo) { + RDBStore store = (RDBStore) omMetadataManager.getStore(); + String checkpointPrefix = store.getDbLocation().getName(); + return Paths.get(store.getSnapshotsParentDir(), + checkpointPrefix + snapshotInfo.getCheckpointDir()); + } + public static String getSnapshotPath(OzoneConfiguration conf, SnapshotInfo snapshotInfo) { return OMStorage.getOmDbDir(conf) + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java index 20d0ab0e53eb..52e5da504038 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java @@ -19,6 +19,7 @@ package org.apache.hadoop.ozone.om; import com.google.common.annotations.VisibleForTesting; +import org.apache.hadoop.hdds.StringUtils; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.BackgroundService; import org.apache.hadoop.hdds.utils.BackgroundTask; @@ -38,6 +39,9 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -69,6 +73,10 @@ public class SstFilteringService extends BackgroundService // multiple times. private static final int SST_FILTERING_CORE_POOL_SIZE = 1; + public static final String SST_FILTERED_FILE = "sstFiltered"; + private static final byte[] SST_FILTERED_FILE_CONTENT = StringUtils.string2Bytes("This file holds information " + + "if a particular snapshot has filtered out the relevant sst files or not.\nDO NOT add, change or delete " + + "any files in this directory unless you know what you are doing.\n"); private final OzoneManager ozoneManager; // Number of files to be batched in an iteration. @@ -78,6 +86,12 @@ public class SstFilteringService extends BackgroundService private AtomicBoolean running; + public static boolean isSstFiltered(OzoneConfiguration ozoneConfiguration, SnapshotInfo snapshotInfo) { + Path sstFilteredFile = Paths.get(OmSnapshotManager.getSnapshotPath(ozoneConfiguration, + snapshotInfo), SST_FILTERED_FILE); + return snapshotInfo.isSstFiltered() || sstFilteredFile.toFile().exists(); + } + public SstFilteringService(long interval, TimeUnit unit, long serviceTimeout, OzoneManager ozoneManager, OzoneConfiguration configuration) { super("SstFilteringService", interval, unit, SST_FILTERING_CORE_POOL_SIZE, @@ -112,33 +126,35 @@ public void resume() { private class SstFilteringTask implements BackgroundTask { + private boolean isSnapshotDeleted(SnapshotInfo snapshotInfo) { + return snapshotInfo == null || snapshotInfo.getSnapshotStatus() == SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED; + } + /** - * Marks the SSTFiltered flag corresponding to the snapshot. - * @param volume Volume name of the snapshot - * @param bucket Bucket name of the snapshot - * @param snapshotName Snapshot name + * Marks the snapshot as SSTFiltered by creating a file in snapshot directory. + * @param snapshotInfo snapshotInfo * @throws IOException */ - private void markSSTFilteredFlagForSnapshot(String volume, String bucket, - String snapshotName) throws IOException { + private void markSSTFilteredFlagForSnapshot(SnapshotInfo snapshotInfo) throws IOException { + // Acquiring read lock to avoid race condition with the snapshot directory deletion occurring + // in OmSnapshotPurgeResponse. Any operation apart from delete can run in parallel along with this operation. + //TODO. Revisit other SNAPSHOT_LOCK and see if we can change write locks to read locks to further optimize it. OMLockDetails omLockDetails = ozoneManager.getMetadataManager().getLock() - .acquireWriteLock(SNAPSHOT_LOCK, volume, bucket, snapshotName); + .acquireReadLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), + snapshotInfo.getName()); boolean acquiredSnapshotLock = omLockDetails.isLockAcquired(); if (acquiredSnapshotLock) { - Table snapshotInfoTable = - ozoneManager.getMetadataManager().getSnapshotInfoTable(); + String snapshotDir = OmSnapshotManager.getSnapshotPath(ozoneManager.getConfiguration(), snapshotInfo); try { - // mark the snapshot as filtered by writing to the file - String snapshotTableKey = SnapshotInfo.getTableKey(volume, bucket, - snapshotName); - SnapshotInfo snapshotInfo = snapshotInfoTable.get(snapshotTableKey); - - snapshotInfo.setSstFiltered(true); - snapshotInfoTable.put(snapshotTableKey, snapshotInfo); + // mark the snapshot as filtered by creating a file. + if (Files.exists(Paths.get(snapshotDir))) { + Files.write(Paths.get(snapshotDir, SST_FILTERED_FILE), SST_FILTERED_FILE_CONTENT); + } } finally { ozoneManager.getMetadataManager().getLock() - .releaseWriteLock(SNAPSHOT_LOCK, volume, bucket, snapshotName); + .releaseReadLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), + snapshotInfo.getBucketName(), snapshotInfo.getName()); } } } @@ -163,12 +179,11 @@ public BackgroundTaskResult call() throws Exception { long snapshotLimit = snapshotLimitPerTask; while (iterator.hasNext() && snapshotLimit > 0 && running.get()) { + Table.KeyValue keyValue = iterator.next(); + String snapShotTableKey = keyValue.getKey(); + SnapshotInfo snapshotInfo = keyValue.getValue(); try { - Table.KeyValue keyValue = iterator.next(); - String snapShotTableKey = keyValue.getKey(); - SnapshotInfo snapshotInfo = keyValue.getValue(); - - if (snapshotInfo.isSstFiltered()) { + if (isSstFiltered(ozoneManager.getConfiguration(), snapshotInfo)) { continue; } @@ -194,6 +209,9 @@ public BackgroundTaskResult call() throws Exception { .lock()) { db.deleteFilesNotMatchingPrefix(columnFamilyNameToPrefixMap); } + markSSTFilteredFlagForSnapshot(snapshotInfo); + snapshotLimit--; + snapshotFilteredCount.getAndIncrement(); } catch (OMException ome) { // FILE_NOT_FOUND is obtained when the snapshot is deleted // In this case, get the snapshotInfo from the db, check if @@ -202,20 +220,22 @@ public BackgroundTaskResult call() throws Exception { SnapshotInfo snapshotInfoToCheck = ozoneManager.getMetadataManager().getSnapshotInfoTable() .get(snapShotTableKey); - if (snapshotInfoToCheck.getSnapshotStatus() == - SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED) { + if (isSnapshotDeleted(snapshotInfoToCheck)) { LOG.info("Snapshot with name: '{}', id: '{}' has been " + "deleted.", snapshotInfo.getName(), snapshotInfo .getSnapshotId()); } } } - markSSTFilteredFlagForSnapshot(snapshotInfo.getVolumeName(), - snapshotInfo.getBucketName(), snapshotInfo.getName()); - snapshotLimit--; - snapshotFilteredCount.getAndIncrement(); } catch (RocksDBException | IOException e) { - LOG.error("Exception encountered while filtering a snapshot", e); + if (isSnapshotDeleted(snapshotInfoTable.get(snapShotTableKey))) { + LOG.info("Exception encountered while filtering a snapshot: {} since it was deleted midway", + snapShotTableKey, e); + } else { + LOG.error("Exception encountered while filtering a snapshot", e); + } + + } } } catch (IOException e) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/helpers/OMAuditLogger.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/helpers/OMAuditLogger.java new file mode 100644 index 000000000000..18ee42756ef2 --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/helpers/OMAuditLogger.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.hadoop.ozone.om.helpers; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.hadoop.ozone.audit.AuditLogger; +import org.apache.hadoop.ozone.audit.AuditMessage; +import org.apache.hadoop.ozone.audit.OMAction; +import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.request.OMClientRequest; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.ratis.server.protocol.TermIndex; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; + +/** + * This class is used for OM Audit logs. + */ +public final class OMAuditLogger { + private OMAuditLogger() { + } + + private static final Map CMD_AUDIT_ACTION_MAP = new HashMap<>(); + private static final Logger LOG = LoggerFactory.getLogger(OMAuditLogger.class); + + static { + init(); + } + + private static void init() { + CMD_AUDIT_ACTION_MAP.put(Type.CreateVolume, OMAction.CREATE_VOLUME); + CMD_AUDIT_ACTION_MAP.put(Type.DeleteVolume, OMAction.DELETE_VOLUME); + CMD_AUDIT_ACTION_MAP.put(Type.CreateBucket, OMAction.CREATE_BUCKET); + CMD_AUDIT_ACTION_MAP.put(Type.DeleteBucket, OMAction.DELETE_BUCKET); + CMD_AUDIT_ACTION_MAP.put(Type.AddAcl, OMAction.ADD_ACL); + CMD_AUDIT_ACTION_MAP.put(Type.RemoveAcl, OMAction.REMOVE_ACL); + CMD_AUDIT_ACTION_MAP.put(Type.SetAcl, OMAction.SET_ACL); + CMD_AUDIT_ACTION_MAP.put(Type.GetDelegationToken, OMAction.GET_DELEGATION_TOKEN); + CMD_AUDIT_ACTION_MAP.put(Type.CancelDelegationToken, OMAction.CANCEL_DELEGATION_TOKEN); + CMD_AUDIT_ACTION_MAP.put(Type.RenewDelegationToken, OMAction.RENEW_DELEGATION_TOKEN); + CMD_AUDIT_ACTION_MAP.put(Type.GetS3Secret, OMAction.GET_S3_SECRET); + CMD_AUDIT_ACTION_MAP.put(Type.SetS3Secret, OMAction.SET_S3_SECRET); + CMD_AUDIT_ACTION_MAP.put(Type.RevokeS3Secret, OMAction.REVOKE_S3_SECRET); + CMD_AUDIT_ACTION_MAP.put(Type.CreateTenant, OMAction.CREATE_TENANT); + CMD_AUDIT_ACTION_MAP.put(Type.DeleteTenant, OMAction.DELETE_TENANT); + CMD_AUDIT_ACTION_MAP.put(Type.TenantAssignUserAccessId, OMAction.TENANT_ASSIGN_USER_ACCESSID); + CMD_AUDIT_ACTION_MAP.put(Type.TenantRevokeUserAccessId, OMAction.TENANT_REVOKE_USER_ACCESSID); + CMD_AUDIT_ACTION_MAP.put(Type.TenantRevokeAdmin, OMAction.TENANT_REVOKE_ADMIN); + CMD_AUDIT_ACTION_MAP.put(Type.CreateSnapshot, OMAction.CREATE_SNAPSHOT); + CMD_AUDIT_ACTION_MAP.put(Type.DeleteSnapshot, OMAction.DELETE_SNAPSHOT); + CMD_AUDIT_ACTION_MAP.put(Type.RenameSnapshot, OMAction.RENAME_SNAPSHOT); + CMD_AUDIT_ACTION_MAP.put(Type.RecoverLease, OMAction.RECOVER_LEASE); + CMD_AUDIT_ACTION_MAP.put(Type.CreateDirectory, OMAction.CREATE_DIRECTORY); + CMD_AUDIT_ACTION_MAP.put(Type.CreateFile, OMAction.CREATE_FILE); + CMD_AUDIT_ACTION_MAP.put(Type.CreateKey, OMAction.ALLOCATE_KEY); + CMD_AUDIT_ACTION_MAP.put(Type.AllocateBlock, OMAction.ALLOCATE_BLOCK); + CMD_AUDIT_ACTION_MAP.put(Type.CommitKey, OMAction.COMMIT_KEY); + CMD_AUDIT_ACTION_MAP.put(Type.DeleteKey, OMAction.DELETE_KEY); + CMD_AUDIT_ACTION_MAP.put(Type.DeleteKeys, OMAction.DELETE_KEYS); + CMD_AUDIT_ACTION_MAP.put(Type.RenameKey, OMAction.RENAME_KEY); + CMD_AUDIT_ACTION_MAP.put(Type.RenameKeys, OMAction.RENAME_KEYS); + CMD_AUDIT_ACTION_MAP.put(Type.InitiateMultiPartUpload, OMAction.INITIATE_MULTIPART_UPLOAD); + CMD_AUDIT_ACTION_MAP.put(Type.CommitMultiPartUpload, OMAction.COMMIT_MULTIPART_UPLOAD_PARTKEY); + CMD_AUDIT_ACTION_MAP.put(Type.AbortMultiPartUpload, OMAction.ABORT_MULTIPART_UPLOAD); + CMD_AUDIT_ACTION_MAP.put(Type.CompleteMultiPartUpload, OMAction.COMPLETE_MULTIPART_UPLOAD); + CMD_AUDIT_ACTION_MAP.put(Type.SetTimes, OMAction.SET_TIMES); + CMD_AUDIT_ACTION_MAP.put(Type.AbortExpiredMultiPartUploads, OMAction.ABORT_EXPIRED_MULTIPART_UPLOAD); + CMD_AUDIT_ACTION_MAP.put(Type.SetVolumeProperty, OMAction.SET_OWNER); + CMD_AUDIT_ACTION_MAP.put(Type.SetBucketProperty, OMAction.UPDATE_BUCKET); + CMD_AUDIT_ACTION_MAP.put(Type.Prepare, OMAction.UPGRADE_PREPARE); + CMD_AUDIT_ACTION_MAP.put(Type.CancelPrepare, OMAction.UPGRADE_CANCEL); + CMD_AUDIT_ACTION_MAP.put(Type.FinalizeUpgrade, OMAction.UPGRADE_FINALIZE); + } + + private static OMAction getAction(OzoneManagerProtocolProtos.OMRequest request) { + Type cmdType = request.getCmdType(); + OMAction omAction = CMD_AUDIT_ACTION_MAP.get(cmdType); + if (null != omAction) { + if (cmdType.equals(Type.SetVolumeProperty)) { + boolean hasQuota = request.getSetVolumePropertyRequest().hasQuotaInBytes(); + if (hasQuota) { + return OMAction.SET_QUOTA; + } + } + if (cmdType.equals(Type.SetBucketProperty)) { + boolean hasBucketOwner = request.getSetBucketPropertyRequest().getBucketArgs().hasOwnerName(); + if (hasBucketOwner) { + return OMAction.SET_OWNER; + } + } + } + return omAction; + } + + public static void log(OMAuditLogger.Builder builder, TermIndex termIndex) { + if (builder.isLog.get()) { + if (null == builder.getAuditMap()) { + builder.setAuditMap(new HashMap<>()); + } + builder.getAuditMap().put("Transaction", "" + termIndex.getIndex()); + builder.getMessageBuilder().withParams(builder.getAuditMap()); + builder.getAuditLogger().logWrite(builder.getMessageBuilder().build()); + } + } + + public static void log(OMAuditLogger.Builder builder) { + if (builder.isLog.get()) { + builder.getMessageBuilder().withParams(builder.getAuditMap()); + builder.getAuditLogger().logWrite(builder.getMessageBuilder().build()); + } + } + + public static void log(OMAuditLogger.Builder builder, OMClientRequest request, OzoneManager om, + TermIndex termIndex, Throwable th) { + if (builder.isLog.get()) { + builder.getAuditLogger().logWrite(builder.getMessageBuilder().build()); + return; + } + + OMAction action = getAction(request.getOmRequest()); + if (null == action) { + // no audit log defined + return; + } + if (builder.getAuditMap() == null) { + builder.setAuditMap(new HashMap<>()); + } + try { + builder.getAuditMap().put("Command", request.getOmRequest().getCmdType().name()); + builder.getAuditMap().put("Transaction", "" + termIndex.getIndex()); + request.buildAuditMessage(action, builder.getAuditMap(), + th, request.getUserInfo()); + builder.setLog(true); + builder.setAuditLogger(om.getAuditLogger()); + log(builder); + } catch (Exception ex) { + LOG.error("Exception occurred while write audit log, ", ex); + } + } + + public static Builder newBuilder() { + return new Builder(); + } + + /** + * Builder class for build AuditMessage. + */ + public static class Builder { + private AuditMessage.Builder messageBuilder = new AuditMessage.Builder(); + private final AtomicBoolean isLog = new AtomicBoolean(false); + private Map auditMap = null; + private AuditLogger auditLogger; + + public OMAuditLogger build() throws IOException { + return new OMAuditLogger(); + } + + public AuditMessage.Builder getMessageBuilder() { + return this.messageBuilder; + } + + public void setLog(boolean flag) { + this.isLog.set(flag); + } + + public void setAuditLogger(AuditLogger auditLogger) { + this.auditLogger = auditLogger; + } + + public AuditLogger getAuditLogger() { + return auditLogger; + } + + public void setAuditMap(Map auditMap) { + this.auditMap = auditMap; + } + + public Map getAuditMap() { + return this.auditMap; + } + } +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java index 857005bd9292..a6fcc40dda17 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java @@ -290,7 +290,7 @@ private void addToBatchTransactionInfoWithTrace(String parentName, * and commit to DB. */ @VisibleForTesting - void flushTransactions() { + public void flushTransactions() { while (isRunning.get() && canFlush()) { flushCurrentBuffer(); } @@ -617,7 +617,7 @@ int getReadyBufferSize() { } @VisibleForTesting - void resume() { + public void resume() { isRunning.set(true); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java index ada061876e39..463afba94218 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java @@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import org.apache.hadoop.hdds.utils.NettyMetrics; import org.apache.hadoop.hdds.utils.TransactionInfo; import org.apache.hadoop.ozone.om.OMConfigKeys; import org.apache.hadoop.ozone.om.OzoneManager; @@ -100,6 +101,8 @@ public class OzoneManagerStateMachine extends BaseStateMachine { /** The last index skipped by {@link #notifyTermIndexUpdated(long, long)}. */ private volatile long lastSkippedIndex = RaftLog.INVALID_LOG_INDEX; + private final NettyMetrics nettyMetrics; + public OzoneManagerStateMachine(OzoneManagerRatisServer ratisServer, boolean isTracingEnabled) throws IOException { this.isTracingEnabled = isTracingEnabled; @@ -120,6 +123,7 @@ public OzoneManagerStateMachine(OzoneManagerRatisServer ratisServer, .setNameFormat(threadPrefix + "InstallSnapshotThread").build(); this.installSnapshotExecutor = HadoopExecutors.newSingleThreadExecutor(installSnapshotThreadFactory); + this.nettyMetrics = NettyMetrics.create(); } /** @@ -620,6 +624,9 @@ public void stop() { ozoneManagerDoubleBuffer.stop(); HadoopExecutors.shutdown(executorService, LOG, 5, TimeUnit.SECONDS); HadoopExecutors.shutdown(installSnapshotExecutor, LOG, 5, TimeUnit.SECONDS); + if (this.nettyMetrics != null) { + this.nettyMetrics.unregister(); + } } /** diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java index b055a1f92f82..8ff59e091d88 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java @@ -27,7 +27,6 @@ import org.apache.hadoop.hdds.conf.ConfigurationSource; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.security.SecurityConfig; -import org.apache.hadoop.hdds.security.ssl.KeyStoresFactory; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; import org.apache.hadoop.hdds.server.ServerUtils; import org.apache.hadoop.hdds.utils.HAUtils; @@ -495,9 +494,7 @@ public static void checkLeaderStatus(OzoneManager ozoneManager) public static GrpcTlsConfig createServerTlsConfig(SecurityConfig conf, CertificateClient caClient) throws IOException { if (conf.isSecurityEnabled() && conf.isGrpcTlsEnabled()) { - KeyStoresFactory serverKeyFactory = caClient.getServerKeyStoresFactory(); - return new GrpcTlsConfig(serverKeyFactory.getKeyManagers()[0], - serverKeyFactory.getTrustManagers()[0], true); + return new GrpcTlsConfig(caClient.getKeyManager(), caClient.getTrustManager(), true); } return null; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java index 6c8a66ee7ea7..25a204ded271 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java @@ -22,6 +22,7 @@ import com.google.common.base.Preconditions; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hdds.utils.TransactionInfo; +import org.apache.hadoop.ozone.om.helpers.OMAuditLogger; import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.ipc.ProtobufRpcEngine; import org.apache.hadoop.ozone.OmUtils; @@ -29,7 +30,6 @@ import org.apache.hadoop.ozone.audit.AuditAction; import org.apache.hadoop.ozone.audit.AuditEventStatus; import org.apache.hadoop.ozone.audit.AuditLogger; -import org.apache.hadoop.ozone.audit.AuditMessage; import org.apache.hadoop.ozone.om.IOmMetadataReader; import org.apache.hadoop.ozone.om.OmMetadataReader; import org.apache.hadoop.ozone.om.OzoneAclUtils; @@ -79,6 +79,11 @@ public abstract class OMClientRequest implements RequestAuditor { private UserGroupInformation userGroupInformation; private InetAddress inetAddress; private final OMLockDetails omLockDetails = new OMLockDetails(); + private final OMAuditLogger.Builder auditBuilder = OMAuditLogger.newBuilder(); + + public OMAuditLogger.Builder getAuditBuilder() { + return auditBuilder; + } /** * Stores the result of request execution in @@ -471,27 +476,29 @@ private String exceptionErrorMessage(Exception ex) { } /** - * Log the auditMessage. + * Mark ready for log audit. * @param auditLogger - * @param auditMessage + * @param builder */ - protected void auditLog(AuditLogger auditLogger, AuditMessage auditMessage) { - auditLogger.logWrite(auditMessage); + protected void markForAudit(AuditLogger auditLogger, OMAuditLogger.Builder builder) { + builder.setLog(true); + builder.setAuditLogger(auditLogger); } @Override - public AuditMessage buildAuditMessage(AuditAction op, + public OMAuditLogger.Builder buildAuditMessage(AuditAction op, Map< String, String > auditMap, Throwable throwable, OzoneManagerProtocolProtos.UserInfo userInfo) { - return new AuditMessage.Builder() + auditBuilder.getMessageBuilder() .setUser(userInfo != null ? userInfo.getUserName() : null) .atIp(userInfo != null ? userInfo.getRemoteAddress() : null) .forOperation(op) .withParams(auditMap) .withResult(throwable != null ? AuditEventStatus.FAILURE : AuditEventStatus.SUCCESS) - .withException(throwable) - .build(); + .withException(throwable); + auditBuilder.setAuditMap(auditMap); + return auditBuilder; } @Override diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/RequestAuditor.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/RequestAuditor.java index 78e67bb8ed5c..9ae6b7e5d508 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/RequestAuditor.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/RequestAuditor.java @@ -26,7 +26,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditAction; -import org.apache.hadoop.ozone.audit.AuditMessage; +import org.apache.hadoop.ozone.om.helpers.OMAuditLogger; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos .KeyArgs; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos @@ -47,8 +47,8 @@ public interface RequestAuditor { * @param userInfo * @return */ - AuditMessage buildAuditMessage(AuditAction op, - Map auditMap, Throwable throwable, UserInfo userInfo); + OMAuditLogger.Builder buildAuditMessage( + AuditAction op, Map auditMap, Throwable throwable, UserInfo userInfo); /** * Build auditMap with specified volume. @@ -82,6 +82,10 @@ default Map buildKeyArgsAuditMap(KeyArgs keyArgs) { auditMap.put(OzoneConsts.REPLICATION_CONFIG, ECReplicationConfig.toString(keyArgs.getEcReplicationConfig())); } + if (keyArgs.hasExpectedDataGeneration()) { + auditMap.put(OzoneConsts.REWRITE_GENERATION, + String.valueOf(keyArgs.getExpectedDataGeneration())); + } for (HddsProtos.KeyValue item : keyArgs.getMetadataList()) { if (ETAG.equals(item.getKey())) { auditMap.put(ETAG, item.getValue()); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java index f2c343e0d161..72c5cf57d99c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java @@ -285,7 +285,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.CREATE_BUCKET, + markForAudit(auditLogger, buildAuditMessage(OMAction.CREATE_BUCKET, omBucketInfo.toAuditMap(), exception, userInfo)); // return response. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java index 48a3c807b9a3..22e710dc9116 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java @@ -215,7 +215,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.DELETE_BUCKET, + markForAudit(auditLogger, buildAuditMessage(OMAction.DELETE_BUCKET, auditMap, exception, userInfo)); // return response. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java index e135b7a25264..2afab85e9ae9 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java @@ -183,7 +183,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.SET_OWNER, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_OWNER, omBucketArgs.toAuditMap(), exception, userInfo)); // return response. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java index 9c7ef1087c10..941b41ca49b3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java @@ -237,7 +237,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.UPDATE_BUCKET, + markForAudit(auditLogger, buildAuditMessage(OMAction.UPDATE_BUCKET, omBucketArgs.toAuditMap(), exception, userInfo)); // return response. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java index 07903f2e3617..c37f83f0666d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java @@ -115,7 +115,7 @@ OMClientResponse onSuccess(OMResponse.Builder omResponse, void onComplete(boolean operationResult, Exception exception, OMMetrics omMetrics, AuditLogger auditLogger, Map auditMap) { - auditLog(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, exception, getOmRequest().getUserInfo())); if (operationResult) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java index 392b3e28034d..018692d9f0cc 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java @@ -113,7 +113,7 @@ OMClientResponse onSuccess(OMResponse.Builder omResponse, void onComplete(boolean operationResult, Exception exception, OMMetrics omMetrics, AuditLogger auditLogger, Map auditMap) { - auditLog(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, exception, getOmRequest().getUserInfo())); if (operationResult) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java index 3e41126313b9..813e5a7db3cb 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java @@ -112,7 +112,7 @@ OMClientResponse onSuccess(OMResponse.Builder omResponse, void onComplete(boolean operationResult, Exception exception, OMMetrics omMetrics, AuditLogger auditLogger, Map auditMap) { - auditLog(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, exception, getOmRequest().getUserInfo())); if (operationResult) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java index 6071110a315d..53d4c83c3a96 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java @@ -240,7 +240,7 @@ dirKeyInfo, missingParentInfos, result, getBucketLayout(), } } - auditLog(auditLogger, buildAuditMessage(OMAction.CREATE_DIRECTORY, + markForAudit(auditLogger, buildAuditMessage(OMAction.CREATE_DIRECTORY, auditMap, exception, userInfo)); logResult(createDirectoryRequest, keyArgs, omMetrics, result, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java index 14c140e95778..46a2ac5f7cc3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java @@ -193,7 +193,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } } - auditLog(auditLogger, buildAuditMessage(OMAction.CREATE_DIRECTORY, + markForAudit(auditLogger, buildAuditMessage(OMAction.CREATE_DIRECTORY, auditMap, exception, userInfo)); logResult(createDirectoryRequest, keyArgs, omMetrics, numKeysCreated, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java index 9b9fb4e7cc5c..c13af319c5c8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java @@ -323,7 +323,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Audit Log outside the lock - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.CREATE_FILE, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java index 6910061c771c..a1c1e5d19e33 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java @@ -241,7 +241,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Audit Log outside the lock - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.CREATE_FILE, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java index 763c8641c0c9..8358a11493b1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java @@ -175,7 +175,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Audit Log outside the lock - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.RECOVER_LEASE, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java index ac4d9ab6244f..695195adbef3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java @@ -261,7 +261,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } } - auditLog(auditLogger, buildAuditMessage(OMAction.ALLOCATE_BLOCK, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.ALLOCATE_BLOCK, auditMap, exception, getOmRequest().getUserInfo())); return omClientResponse; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java index c4bb52f177e9..69d58a3e89be 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java @@ -184,7 +184,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } } - auditLog(auditLogger, buildAuditMessage(OMAction.ALLOCATE_BLOCK, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.ALLOCATE_BLOCK, auditMap, exception, getOmRequest().getUserInfo())); return omClientResponse; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java index 505b6287307f..74f7bb54c16a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java @@ -24,6 +24,8 @@ import java.util.Map; import java.util.Set; import org.apache.commons.lang3.tuple.Pair; +import org.apache.hadoop.hdds.utils.db.cache.CacheKey; +import org.apache.hadoop.hdds.utils.db.cache.CacheValue; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -95,6 +97,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn if (null != omBucketInfo && omBucketInfo.getObjectID() == path.getBucketId()) { omBucketInfo.incrUsedNamespace(-1L); + String ozoneDbKey = omMetadataManager.getOzonePathKey(path.getVolumeId(), + path.getBucketId(), keyInfo.getParentObjectID(), keyInfo.getFileName()); + omMetadataManager.getDirectoryTable().addCacheEntry(new CacheKey<>(ozoneDbKey), + CacheValue.get(termIndex.getIndex())); volBucketInfoMap.putIfAbsent(volBucketPair, omBucketInfo); } } @@ -119,6 +125,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn && omBucketInfo.getObjectID() == path.getBucketId()) { omBucketInfo.incrUsedBytes(-sumBlockLengths(keyInfo)); omBucketInfo.incrUsedNamespace(-1L); + String ozoneDbKey = omMetadataManager.getOzonePathKey(path.getVolumeId(), + path.getBucketId(), keyInfo.getParentObjectID(), keyInfo.getFileName()); + omMetadataManager.getFileTable().addCacheEntry(new CacheKey<>(ozoneDbKey), + CacheValue.get(termIndex.getIndex())); volBucketInfoMap.putIfAbsent(volBucketPair, omBucketInfo); } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java index 5c3593b07839..9c65936c88c7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java @@ -240,6 +240,12 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn throw new OMException("Failed to " + action + " key, as " + dbOpenKey + " entry is not found in the OpenKey table", KEY_NOT_FOUND); } + + validateAtomicRewrite(keyToDelete, omKeyInfo, auditMap); + // Optimistic locking validation has passed. Now set the rewrite fields to null so they are + // not persisted in the key table. + omKeyInfo.setExpectedDataGeneration(null); + omKeyInfo.getMetadata().putAll(KeyValueUtil.getFromProtobuf( commitKeyArgs.getMetadataList())); if (isHSync) { @@ -348,7 +354,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn result == Result.SUCCESS ? "succeeded" : "failed", isHSync, omKeyInfo); if (!isHSync) { - auditLog(auditLogger, buildAuditMessage(OMAction.COMMIT_KEY, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.COMMIT_KEY, auditMap, exception, getOmRequest().getUserInfo())); processResult(commitKeyRequest, volumeName, bucketName, keyName, omMetrics, exception, omKeyInfo, result); @@ -497,4 +503,22 @@ public static OMRequest disallowHsync( } return req; } + + protected void validateAtomicRewrite(OmKeyInfo existing, OmKeyInfo toCommit, Map auditMap) + throws OMException { + if (toCommit.getExpectedDataGeneration() != null) { + // These values are not passed in the request keyArgs, so add them into the auditMap if they are present + // in the open key entry. + auditMap.put(OzoneConsts.REWRITE_GENERATION, String.valueOf(toCommit.getExpectedDataGeneration())); + if (existing == null) { + throw new OMException("Atomic rewrite is not allowed for a new key", KEY_NOT_FOUND); + } + if (!toCommit.getExpectedDataGeneration().equals(existing.getUpdateID())) { + throw new OMException("Cannot commit as current generation (" + existing.getUpdateID() + + ") does not match the expected generation to rewrite (" + toCommit.getExpectedDataGeneration() + ")", + KEY_NOT_FOUND); + } + } + } + } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java index 704e9e91c47d..c955c055064a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java @@ -148,7 +148,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn action = "hsync"; } throw new OMException("Failed to " + action + " key, as " + - dbOpenFileKey + "entry is not found in the OpenKey table", + dbOpenFileKey + " entry is not found in the OpenKey table", KEY_NOT_FOUND); } omKeyInfo.getMetadata().putAll(KeyValueUtil.getFromProtobuf( @@ -176,6 +176,12 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn Map oldKeyVersionsToDeleteMap = null; OmKeyInfo keyToDelete = omMetadataManager.getKeyTable(getBucketLayout()).get(dbFileKey); + + validateAtomicRewrite(keyToDelete, omKeyInfo, auditMap); + // Optimistic locking validation has passed. Now set the rewrite fields to null so they are + // not persisted in the key table. + omKeyInfo.setExpectedDataGeneration(null); + if (null != keyToDelete) { final String clientIdString = String.valueOf(commitKeyRequest.getClientID()); @@ -283,7 +289,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn result == Result.SUCCESS ? "succeeded" : "failed", isHSync, omKeyInfo); if (!isHSync) { - auditLog(auditLogger, buildAuditMessage(OMAction.COMMIT_KEY, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.COMMIT_KEY, auditMap, exception, getOmRequest().getUserInfo())); processResult(commitKeyRequest, volumeName, bucketName, keyName, omMetrics, exception, omKeyInfo, result); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java index e9a9f007197a..d0ed0eacecdd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java @@ -231,6 +231,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn keyName); OmKeyInfo dbKeyInfo = omMetadataManager.getKeyTable(getBucketLayout()) .getIfExist(dbKeyName); + validateAtomicRewrite(dbKeyInfo, keyArgs); OmBucketInfo bucketInfo = getBucketInfo(omMetadataManager, volumeName, bucketName); @@ -354,7 +355,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Audit Log outside the lock - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.ALLOCATE_KEY, auditMap, exception, getOmRequest().getUserInfo())); @@ -440,4 +441,17 @@ public static OMRequest blockCreateKeyWithBucketLayoutFromOldClient( } return req; } + + protected void validateAtomicRewrite(OmKeyInfo dbKeyInfo, KeyArgs keyArgs) + throws OMException { + if (keyArgs.hasExpectedDataGeneration()) { + // If a key does not exist, or if it exists but the updateID do not match, then fail this request. + if (dbKeyInfo == null) { + throw new OMException("Key not found during expected rewrite", OMException.ResultCodes.KEY_NOT_FOUND); + } + if (dbKeyInfo.getUpdateID() != keyArgs.getExpectedDataGeneration()) { + throw new OMException("Generation mismatch during expected rewrite", OMException.ResultCodes.KEY_NOT_FOUND); + } + } + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java index 6fe8c1208586..c9c698330106 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java @@ -120,6 +120,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn dbFileInfo = OMFileRequest.getOmKeyInfoFromFileTable(false, omMetadataManager, dbFileKey, keyName); } + validateAtomicRewrite(dbFileInfo, keyArgs); // Check if a file or directory exists with same key name. if (pathInfoFSO.getDirectoryResult() == DIRECTORY_EXISTS) { @@ -227,7 +228,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Audit Log outside the lock - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.ALLOCATE_KEY, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java index 61e5976f8052..92f193eaf7b1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java @@ -22,6 +22,7 @@ import java.nio.file.InvalidPathException; import java.util.Map; +import org.apache.hadoop.ozone.om.OMPerformanceMetrics; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.ratis.server.protocol.TermIndex; @@ -60,6 +61,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.util.MetricUtil.captureLatencyNs; /** * Handles DeleteKey request. @@ -98,8 +100,9 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { protected KeyArgs resolveBucketAndCheckAcls(OzoneManager ozoneManager, KeyArgs.Builder newKeyArgs) throws IOException { - return resolveBucketAndCheckKeyAcls(newKeyArgs.build(), ozoneManager, - ACLType.DELETE); + return captureLatencyNs( + ozoneManager.getPerfMetrics().getDeleteKeyResolveBucketAndAclCheckLatencyNs(), + () -> resolveBucketAndCheckKeyAcls(newKeyArgs.build(), ozoneManager, ACLType.DELETE)); } @Override @@ -117,7 +120,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn OMMetrics omMetrics = ozoneManager.getMetrics(); omMetrics.incNumKeyDeletes(); - + OMPerformanceMetrics perfMetrics = ozoneManager.getPerfMetrics(); AuditLogger auditLogger = ozoneManager.getAuditLogger(); OzoneManagerProtocolProtos.UserInfo userInfo = getOmRequest().getUserInfo(); @@ -128,7 +131,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn boolean acquiredLock = false; OMClientResponse omClientResponse = null; Result result = null; - + long startNanos = Time.monotonicNowNanos(); try { String objectKey = omMetadataManager.getOzoneKey(volumeName, bucketName, keyName); @@ -183,12 +186,16 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn omBucketInfo.copyObject(), dbOpenKey); result = Result.SUCCESS; + long endNanosDeleteKeySuccessLatencyNs = Time.monotonicNowNanos(); + perfMetrics.setDeleteKeySuccessLatencyNs(endNanosDeleteKeySuccessLatencyNs - startNanos); } catch (IOException | InvalidPathException ex) { result = Result.FAILURE; exception = ex; omClientResponse = new OMKeyDeleteResponse(createErrorOMResponse(omResponse, exception), getBucketLayout()); + long endNanosDeleteKeyFailureLatencyNs = Time.monotonicNowNanos(); + perfMetrics.setDeleteKeyFailureLatencyNs(endNanosDeleteKeyFailureLatencyNs - startNanos); } finally { if (acquiredLock) { mergeOmLockDetails(omMetadataManager.getLock() @@ -200,7 +207,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.DELETE_KEY, auditMap, exception, userInfo)); switch (result) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java index a0b2cfcbb154..4c7d2932f399 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java @@ -194,7 +194,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.DELETE_KEY, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.DELETE_KEY, auditMap, exception, userInfo)); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java index db08951831cb..804e536d21f9 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java @@ -227,7 +227,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } } - auditLog(auditLogger, buildAuditMessage(OMAction.RENAME_KEY, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.RENAME_KEY, auditMap, exception, getOmRequest().getUserInfo())); switch (result) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java index 3d29f6576bdb..72365221d3bd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java @@ -218,7 +218,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } } - auditLog(auditLogger, buildAuditMessage(OMAction.RENAME_KEY, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.RENAME_KEY, auditMap, exception, getOmRequest().getUserInfo())); switch (result) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java index 50bb1053beb8..a90d7a28ff13 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java @@ -775,7 +775,6 @@ protected OmKeyInfo prepareFileInfo( dbKeyInfo.setReplicationConfig(replicationConfig); // Construct a new metadata map from KeyArgs. - // Clear the old one when the key is overwritten. dbKeyInfo.getMetadata().clear(); dbKeyInfo.getMetadata().putAll(KeyValueUtil.getFromProtobuf( keyArgs.getMetadataList())); @@ -786,6 +785,10 @@ protected OmKeyInfo prepareFileInfo( dbKeyInfo.getTags().putAll(KeyValueUtil.getFromProtobuf( keyArgs.getTagsList())); + if (keyArgs.hasExpectedDataGeneration()) { + dbKeyInfo.setExpectedDataGeneration(keyArgs.getExpectedDataGeneration()); + } + dbKeyInfo.setFileEncryptionInfo(encInfo); return dbKeyInfo; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java index e14cfaaad281..78b5c258fa42 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java @@ -160,7 +160,7 @@ protected void onComplete(Result result, Exception exception, auditMap.put(OzoneConsts.KEY, getKeyName()); auditMap.put(OzoneConsts.MODIFICATION_TIME, String.valueOf(getModificationTime())); - auditLog(auditLogger, buildAuditMessage(OMAction.SET_TIMES, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_TIMES, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java index 19e9ed716e4a..418d27f287ad 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java @@ -24,9 +24,11 @@ import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.util.Time; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.OMMetrics; +import org.apache.hadoop.ozone.om.OMPerformanceMetrics; import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.om.ResolvedBucket; import org.apache.hadoop.ozone.om.exceptions.OMException; @@ -101,6 +103,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn OMMetrics omMetrics = ozoneManager.getMetrics(); omMetrics.incNumKeyDeletes(); + OMPerformanceMetrics perfMetrics = ozoneManager.getPerfMetrics(); String volumeName = deleteKeyArgs.getVolumeName(); String bucketName = deleteKeyArgs.getBucketName(); Map auditMap = new LinkedHashMap<>(); @@ -126,9 +129,12 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn .setVolumeName(volumeName).setBucketName(bucketName); boolean deleteStatus = true; + long startNanos = Time.monotonicNowNanos(); try { - ResolvedBucket bucket = - ozoneManager.resolveBucketLink(Pair.of(volumeName, bucketName), this); + long startNanosDeleteKeysResolveBucketLatency = Time.monotonicNowNanos(); + ResolvedBucket bucket = ozoneManager.resolveBucketLink(Pair.of(volumeName, bucketName), this); + perfMetrics.setDeleteKeysResolveBucketLatencyNs( + Time.monotonicNowNanos() - startNanosDeleteKeysResolveBucketLatency); bucket.audit(auditMap); volumeName = bucket.realVolume(); bucketName = bucket.realBucket(); @@ -159,9 +165,11 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn try { // check Acl + long startNanosDeleteKeysAclCheckLatency = Time.monotonicNowNanos(); checkKeyAcls(ozoneManager, volumeName, bucketName, keyName, IAccessAuthorizer.ACLType.DELETE, OzoneObj.ResourceType.KEY, volumeOwner); + perfMetrics.setDeleteKeysAclCheckLatencyNs(Time.monotonicNowNanos() - startNanosDeleteKeysAclCheckLatency); OzoneFileStatus fileStatus = getOzoneKeyStatus( ozoneManager, omMetadataManager, volumeName, bucketName, keyName); addKeyToAppropriateList(omKeyInfoList, omKeyInfo, dirList, @@ -193,7 +201,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn unDeletedKeys, keyToError, deleteStatus, omBucketInfo, volumeId, dbOpenKeys); result = Result.SUCCESS; - + long endNanosDeleteKeySuccessLatencyNs = Time.monotonicNowNanos(); + perfMetrics.setDeleteKeySuccessLatencyNs(endNanosDeleteKeySuccessLatencyNs - startNanos); } catch (IOException | InvalidPathException ex) { result = Result.FAILURE; exception = ex; @@ -213,7 +222,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn .setUnDeletedKeys(unDeletedKeys).build()).build(); omClientResponse = new OMKeysDeleteResponse(omResponse.build(), getBucketLayout()); - + long endNanosDeleteKeyFailureLatencyNs = Time.monotonicNowNanos(); + perfMetrics.setDeleteKeyFailureLatencyNs(endNanosDeleteKeyFailureLatencyNs - startNanos); } finally { if (acquiredLock) { mergeOmLockDetails(omMetadataManager.getLock() @@ -226,7 +236,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn addDeletedKeys(auditMap, deleteKeys, unDeletedKeys.getKeysList()); - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(DELETE_KEYS, auditMap, exception, userInfo)); switch (result) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java index 0b93dd57946e..0d105c1d2279 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java @@ -245,7 +245,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } auditMap = buildAuditMap(auditMap, renamedKeys, unRenamedKeys); - auditLog(auditLogger, buildAuditMessage(OMAction.RENAME_KEYS, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.RENAME_KEYS, auditMap, exception, getOmRequest().getUserInfo())); switch (result) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java index 31fa245fa55b..90a6dfa31ad9 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java @@ -138,7 +138,7 @@ void onComplete(Result result, boolean operationResult, if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequestWithFSO.java index 4efba6d4ee84..854fa60089fb 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequestWithFSO.java @@ -122,7 +122,7 @@ public OMKeyAddAclRequestWithFSO( if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java index 7e4fc04eb39c..00af126e1e43 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java @@ -139,7 +139,7 @@ void onComplete(Result result, boolean operationResult, if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequestWithFSO.java index 6c031dc7e0c5..e4ba84bf4e90 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequestWithFSO.java @@ -131,7 +131,7 @@ void onComplete(Result result, boolean operationResult, if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java index 0e5e1cf3362a..2f50fde5cb98 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java @@ -135,7 +135,7 @@ void onComplete(Result result, boolean operationResult, if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequestWithFSO.java index 97f4a99a6635..2fb2aee0bb74 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequestWithFSO.java @@ -124,7 +124,7 @@ void onComplete(Result result, boolean operationResult, if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java index c290b08939c6..2f985f00f0ed 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java @@ -120,7 +120,7 @@ void onComplete(OzoneObj resolvedOzoneObj, boolean operationResult, Exception ex if (ozoneAcl != null) { auditMap.put(OzoneConsts.ACL, ozoneAcl.toString()); } - auditLog(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java index 7c2666944c57..679c7d42e61d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java @@ -120,7 +120,7 @@ void onComplete(OzoneObj resolvedOzoneObj, boolean operationResult, if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java index 11fc0d150eea..b273e481c5cd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java @@ -116,7 +116,7 @@ void onComplete(OzoneObj resolvedOzoneObj, boolean operationResult, if (ozoneAcls != null) { auditMap.put(OzoneConsts.ACL, ozoneAcls.toString()); } - auditLog(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, exception, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java index 109e63ce7cc3..a2f68a137740 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java @@ -161,7 +161,7 @@ private void auditAbortedMPUs(OzoneManager ozoneManager, Map auditMap = buildKeyArgsAuditMap(keyArgsForAudit); auditMap.put(OzoneConsts.UPLOAD_ID, abortInfo.getOmMultipartKeyInfo() .getUploadID()); - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.ABORT_EXPIRED_MULTIPART_UPLOAD, auditMap, null, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java index f16ef9f8f423..26c559eef6e5 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java @@ -264,7 +264,7 @@ protected void logResult(OzoneManager ozoneManager, Map auditMap, String volumeName, String bucketName, String keyName, Exception exception, Result result) { // audit log - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.INITIATE_MULTIPART_UPLOAD, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java index 400291d7a448..268c92dbd6ec 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java @@ -205,7 +205,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // audit log - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.ABORT_MULTIPART_UPLOAD, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java index 1123b8dba7a6..16ab458a014f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java @@ -320,7 +320,7 @@ private void logResult(OzoneManager ozoneManager, auditMap.put(OzoneConsts.MULTIPART_UPLOAD_PART_NUMBER, String.valueOf(keyArgs.getMultipartNumber())); auditMap.put(OzoneConsts.MULTIPART_UPLOAD_PART_NAME, partName); - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.COMMIT_MULTIPART_UPLOAD_PARTKEY, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java index 1dab110e783a..231c35bb1d2c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java @@ -436,7 +436,7 @@ protected void logResult(OzoneManager ozoneManager, .replaceAll("\\n", " ")); // audit log - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.COMPLETE_MULTIPART_UPLOAD, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/OMSetSecretRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/OMSetSecretRequest.java index aa7fe46992ea..588097231250 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/OMSetSecretRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/OMSetSecretRequest.java @@ -147,7 +147,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn auditMap.put(OzoneConsts.S3_SETSECRET_USER, accessId); // audit log - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.SET_S3_SECRET, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java index 90c27038eb42..bb57a58dd008 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java @@ -214,7 +214,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn auditMap.put(OzoneConsts.S3_GETSECRET_USER, accessId); // audit log - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.GET_S3_SECRET, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3RevokeSecretRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3RevokeSecretRequest.java index 6bc288fd9343..a1077c0e70e1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3RevokeSecretRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3RevokeSecretRequest.java @@ -118,7 +118,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn Map auditMap = new HashMap<>(); auditMap.put(OzoneConsts.S3_REVOKESECRET_USER, kerberosID); - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.REVOKE_S3_SECRET, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java index 3aa1437c1842..15292f61c65c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java @@ -237,7 +237,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn // Audit auditMap.put(OzoneConsts.TENANT, tenantId); - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.TENANT_ASSIGN_ADMIN, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java index 3179a7d0f376..aefd056715e7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java @@ -350,7 +350,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn auditMap.put(OzoneConsts.TENANT, tenantId); auditMap.put("user", userPrincipal); auditMap.put("accessId", accessId); - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.TENANT_ASSIGN_USER_ACCESSID, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java index cbc50b469587..4cab83c0a334 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java @@ -375,13 +375,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn // Perform audit logging auditMap.put(OzoneConsts.TENANT, tenantId); // Note auditMap contains volume creation info - auditLog(ozoneManager.getAuditLogger(), + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage(OMAction.CREATE_TENANT, auditMap, exception, getOmRequest().getUserInfo())); - // Log CREATE_VOLUME as well since a volume is created - auditLog(ozoneManager.getAuditLogger(), - buildAuditMessage(OMAction.CREATE_VOLUME, auditMap, exception, - getOmRequest().getUserInfo())); if (exception == null) { LOG.info("Created tenant '{}' and volume '{}'", tenantId, volumeName); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java index 0508e2fbab4d..fa630183006f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java @@ -226,15 +226,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn // Perform audit logging auditMap.put(OzoneConsts.TENANT, tenantId); - // Audit volume ref count update - if (decVolumeRefCount) { - auditLog(ozoneManager.getAuditLogger(), - buildAuditMessage(OMAction.UPDATE_VOLUME, - buildVolumeAuditMap(volumeName), - exception, getOmRequest().getUserInfo())); - } // Audit tenant deletion - auditLog(ozoneManager.getAuditLogger(), + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage(OMAction.DELETE_TENANT, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java index 89d19d00d278..ba82ab121447 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java @@ -227,7 +227,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn // Audit auditMap.put(OzoneConsts.TENANT, tenantId); - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.TENANT_REVOKE_ADMIN, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java index 74ce1002821f..d2b556784903 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java @@ -247,7 +247,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn auditMap.put(OzoneConsts.TENANT, tenantId); auditMap.put("accessId", accessId); auditMap.put("userPrincipal", userPrincipal); - auditLog(ozoneManager.getAuditLogger(), buildAuditMessage( + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( OMAction.TENANT_REVOKE_USER_ACCESSID, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java index a01b79825b3d..0ee5f6ab6b20 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java @@ -77,7 +77,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { return request; } catch (IOException ioe) { - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.CANCEL_DELEGATION_TOKEN, auditMap, ioe, request.getUserInfo())); throw ioe; @@ -125,7 +125,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn createErrorOMResponse(omResponse, exception)); } - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.CANCEL_DELEGATION_TOKEN, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java index b46085dedba2..8e2c56ab2cde 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java @@ -78,7 +78,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { token = ozoneManager .getDelegationToken(new Text(getDelegationTokenRequest.getRenewer())); } catch (IOException ioe) { - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.GET_DELEGATION_TOKEN, new LinkedHashMap<>(), ioe, request.getUserInfo())); throw ioe; @@ -195,7 +195,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn createErrorOMResponse(omResponse, exception)); } - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.GET_DELEGATION_TOKEN, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java index cf45ec9e606c..7985c762d6f1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java @@ -85,7 +85,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { // Call OM to renew token renewTime = ozoneManager.renewDelegationToken(token); } catch (IOException ioe) { - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.RENEW_DELEGATION_TOKEN, auditMap, ioe, request.getUserInfo())); throw ioe; @@ -181,7 +181,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn createErrorOMResponse(omResponse, exception)); } - auditLog(auditLogger, + markForAudit(auditLogger, buildAuditMessage(OMAction.RENEW_DELEGATION_TOKEN, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java index 25e60a61faab..3aa4151cea32 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java @@ -211,7 +211,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.CREATE_SNAPSHOT, + markForAudit(auditLogger, buildAuditMessage(OMAction.CREATE_SNAPSHOT, snapshotInfo.toAuditMap(), exception, userInfo)); if (exception == null) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java index 5f1b8f142375..a2b00138cf32 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java @@ -214,7 +214,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Perform audit logging outside the lock - auditLog(auditLogger, buildAuditMessage(OMAction.DELETE_SNAPSHOT, + markForAudit(auditLogger, buildAuditMessage(OMAction.DELETE_SNAPSHOT, snapshotInfo.toAuditMap(), exception, userInfo)); final String snapshotPath = snapshotInfo.getSnapshotPath(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java index 9f1875f65d89..8341f875504a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java @@ -223,7 +223,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, } // Perform audit logging outside the lock - auditLog(auditLogger, buildAuditMessage(OMAction.RENAME_SNAPSHOT, + markForAudit(auditLogger, buildAuditMessage(OMAction.RENAME_SNAPSHOT, snapshotOldInfo.toAuditMap(), exception, userInfo)); return omClientResponse; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMCancelPrepareRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMCancelPrepareRequest.java index 507b41f76873..c7b348c06f0b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMCancelPrepareRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMCancelPrepareRequest.java @@ -17,6 +17,10 @@ package org.apache.hadoop.ozone.om.request.upgrade; +import java.util.HashMap; +import org.apache.hadoop.ozone.audit.AuditLogger; +import org.apache.hadoop.ozone.audit.OMAction; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.om.exceptions.OMException; @@ -54,10 +58,13 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn LOG.info("OM {} Received cancel prepare request with log {}", ozoneManager.getOMNodeId(), termIndex); OMRequest omRequest = getOmRequest(); + AuditLogger auditLogger = ozoneManager.getAuditLogger(); + OzoneManagerProtocolProtos.UserInfo userInfo = omRequest.getUserInfo(); OMResponse.Builder responseBuilder = OmResponseUtil.getOMResponseBuilder(omRequest); responseBuilder.setCmdType(Type.CancelPrepare); OMClientResponse response = null; + Exception exception = null; try { UserGroupInformation ugi = createUGIForApi(); @@ -82,12 +89,15 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn LOG.info("OM {} prepare state cancelled at log {}. Returning response {}", ozoneManager.getOMNodeId(), termIndex, omResponse); } catch (IOException e) { + exception = e; LOG.error("Cancel Prepare Request apply failed in {}. ", ozoneManager.getOMNodeId(), e); response = new OMPrepareResponse( createErrorOMResponse(responseBuilder, e)); } + markForAudit(auditLogger, buildAuditMessage(OMAction.UPGRADE_CANCEL, + new HashMap<>(), exception, userInfo)); return response; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java index 8ebf53706cbc..866e7b6c67f3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java @@ -20,8 +20,12 @@ import static org.apache.hadoop.ozone.OzoneConsts.LAYOUT_VERSION_KEY; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.FinalizeUpgrade; +import java.util.HashMap; import org.apache.hadoop.hdds.protocol.proto.HddsProtos .UpgradeFinalizationStatus; +import org.apache.hadoop.ozone.audit.AuditLogger; +import org.apache.hadoop.ozone.audit.OMAction; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; @@ -58,10 +62,13 @@ public OMFinalizeUpgradeRequest(OMRequest omRequest) { @Override public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIndex termIndex) { LOG.trace("Request: {}", getOmRequest()); + AuditLogger auditLogger = ozoneManager.getAuditLogger(); + OzoneManagerProtocolProtos.UserInfo userInfo = getOmRequest().getUserInfo(); OMResponse.Builder responseBuilder = OmResponseUtil.getOMResponseBuilder(getOmRequest()); responseBuilder.setCmdType(FinalizeUpgrade); OMClientResponse response = null; + Exception exception = null; try { if (ozoneManager.getAclsEnabled()) { @@ -103,10 +110,13 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn ozoneManager.getVersionManager().getMetadataLayoutVersion()); LOG.trace("Returning response: {}", response); } catch (IOException e) { + exception = e; response = new OMFinalizeUpgradeResponse( createErrorOMResponse(responseBuilder, e), -1); } + markForAudit(auditLogger, buildAuditMessage(OMAction.UPGRADE_FINALIZE, + new HashMap<>(), exception, userInfo)); return response; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java index a814459050bf..f7c223eae098 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java @@ -17,6 +17,9 @@ package org.apache.hadoop.ozone.om.request.upgrade; +import java.util.HashMap; +import org.apache.hadoop.ozone.audit.AuditLogger; +import org.apache.hadoop.ozone.audit.OMAction; import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.om.exceptions.OMException; @@ -69,12 +72,15 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn LOG.info("OM {} Received prepare request with log {}", ozoneManager.getOMNodeId(), termIndex); OMRequest omRequest = getOmRequest(); + AuditLogger auditLogger = ozoneManager.getAuditLogger(); + OzoneManagerProtocolProtos.UserInfo userInfo = omRequest.getUserInfo(); OzoneManagerProtocolProtos.PrepareRequestArgs args = omRequest.getPrepareRequest().getArgs(); OMResponse.Builder responseBuilder = OmResponseUtil.getOMResponseBuilder(omRequest); responseBuilder.setCmdType(Type.Prepare); OMClientResponse response = null; + Exception exception = null; // Allow double buffer this many seconds to flush all transactions before // returning an error to the caller. @@ -123,6 +129,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn "log index {}", ozoneManager.getOMNodeId(), transactionLogIndex, omResponse, omResponse.getTxnID()); } catch (OMException e) { + exception = e; LOG.error("Prepare Request Apply failed in {}. ", ozoneManager.getOMNodeId(), e); response = new OMPrepareResponse( @@ -130,6 +137,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } catch (InterruptedException | IOException e) { // Set error code so that prepare failure does not cause the OM to // terminate. + exception = e; LOG.error("Prepare Request Apply failed in {}. ", ozoneManager.getOMNodeId(), e); response = new OMPrepareResponse( @@ -149,6 +157,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } } + markForAudit(auditLogger, buildAuditMessage(OMAction.UPGRADE_PREPARE, + new HashMap<>(), exception, userInfo)); return response; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java index 248505cd472e..b9fbb0c927fe 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java @@ -65,7 +65,7 @@ public OMRequest validateRequest(OMRequest request) List validations = registry.validationsFor( conditions(request), request.getCmdType(), PRE_PROCESS); - OMRequest validatedRequest = request.toBuilder().build(); + OMRequest validatedRequest = request; try { for (Method m : validations) { LOG.debug("Running the {} request pre-process validation from {}.{}", @@ -90,7 +90,7 @@ public OMResponse validateResponse(OMRequest request, OMResponse response) List validations = registry.validationsFor( conditions(request), request.getCmdType(), POST_PROCESS); - OMResponse validatedResponse = response.toBuilder().build(); + OMResponse validatedResponse = response; try { for (Method m : validations) { LOG.debug("Running the {} request post-process validation from {}.{}", diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java index 610949e0f8a4..ac09664cc789 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java @@ -18,7 +18,7 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.reflections.Reflections; -import org.reflections.scanners.MethodAnnotationsScanner; +import org.reflections.scanners.Scanners; import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Supplier; import static org.apache.hadoop.ozone.om.request.validation.RequestProcessingPhase.POST_PROCESS; import static org.apache.hadoop.ozone.om.request.validation.RequestProcessingPhase.PRE_PROCESS; @@ -70,7 +71,7 @@ public class ValidatorRegistry { ValidatorRegistry(Collection searchUrls) { Reflections reflections = new Reflections(new ConfigurationBuilder() .setUrls(searchUrls) - .setScanners(new MethodAnnotationsScanner()) + .setScanners(Scanners.MethodsAnnotated) .setParallel(true) ); @@ -157,13 +158,13 @@ void initMaps(Collection describedValidators) { for (ValidationCondition condition : descriptor.conditions()) { EnumMap>> requestTypeMap = getAndInitialize( - condition, newTypeMap(), validators); + condition, this::newTypeMap, validators); EnumMap> phases = getAndInitialize( - descriptor.requestType(), newPhaseMap(), requestTypeMap); + descriptor.requestType(), this::newPhaseMap, requestTypeMap); if (isPreProcessValidator(descriptor)) { - getAndInitialize(PRE_PROCESS, new ArrayList<>(), phases).add(m); + getAndInitialize(PRE_PROCESS, ArrayList::new, phases).add(m); } else if (isPostProcessValidator(descriptor)) { - getAndInitialize(POST_PROCESS, new ArrayList<>(), phases).add(m); + getAndInitialize(POST_PROCESS, ArrayList::new, phases).add(m); } } } @@ -178,13 +179,8 @@ private EnumMap> newPhaseMap() { return new EnumMap<>(RequestProcessingPhase.class); } - private V getAndInitialize(K key, V defaultValue, Map from) { - V inMapValue = from.get(key); - if (inMapValue == null || !from.containsKey(key)) { - from.put(key, defaultValue); - return defaultValue; - } - return inMapValue; + private V getAndInitialize(K key, Supplier defaultSupplier, Map from) { + return from.computeIfAbsent(key, k -> defaultSupplier.get()); } private boolean isPreProcessValidator(RequestFeatureValidator descriptor) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java index 72667e3d43b2..01dbb5ba1e02 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java @@ -189,7 +189,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(ozoneManager.getAuditLogger(), + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage(OMAction.CREATE_VOLUME, auditMap, exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java index 7a5c4be029c6..d2db7ed3d4e8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java @@ -161,7 +161,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(ozoneManager.getAuditLogger(), + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage(OMAction.DELETE_VOLUME, buildVolumeAuditMap(volume), exception, getOmRequest().getUserInfo())); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java index b789ebee9b74..8481f2201fa0 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java @@ -194,7 +194,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.SET_OWNER, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_OWNER, auditMap, exception, userInfo)); // return response after releasing lock. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java index 675d77afa6e7..7a962a0e2b55 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java @@ -172,7 +172,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, TermIn } // Performing audit logging outside of the lock. - auditLog(auditLogger, buildAuditMessage(OMAction.SET_QUOTA, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_QUOTA, auditMap, exception, userInfo)); // return response after releasing lock. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java index 1cc18efd05c8..3eff4da0cafe 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java @@ -136,7 +136,7 @@ void onComplete(Result result, Exception ex, long trxnLogIndex, getOmRequest()); } - auditLog(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap, ex, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java index b283f94c4be2..e0b14b4e2b2b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java @@ -135,7 +135,7 @@ void onComplete(Result result, Exception ex, long trxnLogIndex, LOG.error("Unrecognized Result for OMVolumeRemoveAclRequest: {}", getOmRequest()); } - auditLog(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.REMOVE_ACL, auditMap, ex, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java index 1e75f7582798..687210982f75 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java @@ -133,7 +133,7 @@ void onComplete(Result result, Exception ex, long trxnLogIndex, getOmRequest()); } - auditLog(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, + markForAudit(auditLogger, buildAuditMessage(OMAction.SET_ACL, auditMap, ex, getOmRequest().getUserInfo())); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java index 5b3db25114d9..b917296d826d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java @@ -79,7 +79,7 @@ public void addToDBBatch(OMMetadataManager omMetadataManager, // Create the snapshot checkpoint. Also cleans up some tables. OmSnapshotManager.createOmSnapshotCheckpoint(omMetadataManager, - snapshotInfo); + snapshotInfo, batchOperation); // TODO: [SNAPSHOT] Move to createOmSnapshotCheckpoint and add table lock // Remove all entries from snapshotRenamedTable diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java index d300601b3858..45b0c5e05909 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java @@ -20,10 +20,11 @@ import org.apache.commons.io.FileUtils; import org.apache.hadoop.hdds.utils.db.BatchOperation; -import org.apache.hadoop.hdds.utils.db.RDBStore; import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.OmMetadataManagerImpl; +import org.apache.hadoop.ozone.om.OmSnapshotManager; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; +import org.apache.hadoop.ozone.om.lock.OMLockDetails; import org.apache.hadoop.ozone.om.response.CleanupTableInfo; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; @@ -33,11 +34,11 @@ import jakarta.annotation.Nonnull; import java.io.IOException; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import java.util.Map; import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_INFO_TABLE; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK; /** * Response for OMSnapshotPurgeRequest. @@ -116,15 +117,24 @@ private void updateSnapInfo(OmMetadataManagerImpl metadataManager, */ private void deleteCheckpointDirectory(OMMetadataManager omMetadataManager, SnapshotInfo snapshotInfo) { - RDBStore store = (RDBStore) omMetadataManager.getStore(); - String checkpointPrefix = store.getDbLocation().getName(); - Path snapshotDirPath = Paths.get(store.getSnapshotsParentDir(), - checkpointPrefix + snapshotInfo.getCheckpointDir()); - try { - FileUtils.deleteDirectory(snapshotDirPath.toFile()); - } catch (IOException ex) { - LOG.error("Failed to delete snapshot directory {} for snapshot {}", - snapshotDirPath, snapshotInfo.getTableKey(), ex); + // Acquiring write lock to avoid race condition with sst filtering service which creates a sst filtered file + // inside the snapshot directory. Any operation apart which doesn't create/delete files under this snapshot + // directory can run in parallel along with this operation. + OMLockDetails omLockDetails = omMetadataManager.getLock() + .acquireWriteLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), + snapshotInfo.getName()); + boolean acquiredSnapshotLock = omLockDetails.isLockAcquired(); + if (acquiredSnapshotLock) { + Path snapshotDirPath = OmSnapshotManager.getSnapshotPath(omMetadataManager, snapshotInfo); + try { + FileUtils.deleteDirectory(snapshotDirPath.toFile()); + } catch (IOException ex) { + LOG.error("Failed to delete snapshot directory {} for snapshot {}", + snapshotDirPath, snapshotInfo.getTableKey(), ex); + } finally { + omMetadataManager.getLock().releaseWriteLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), + snapshotInfo.getBucketName(), snapshotInfo.getName()); + } } } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java index d7205b2c1bbf..c8703c3c4c62 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java @@ -154,13 +154,6 @@ public BackgroundTaskResult call() { List> allSubDirList = new ArrayList<>((int) remainNum); - // Acquire active DB deletedDirectoryTable write lock because of the - // deletedDirTable read-write here to avoid interleaving with - // the table range delete operation in createOmSnapshotCheckpoint() - // that is called from OMSnapshotCreateResponse#addToDBBatch. - getOzoneManager().getMetadataManager().getTableLock( - OmMetadataManagerImpl.DELETED_DIR_TABLE).writeLock().lock(); - Table.KeyValue pendingDeletedDirInfo; try (TableIterator> deleteTableIterator = getOzoneManager().getMetadataManager(). @@ -216,10 +209,6 @@ public BackgroundTaskResult call() { } catch (IOException e) { LOG.error("Error while running delete directories and files " + "background task. Will retry at next run.", e); - } finally { - // Release deletedDirectoryTable write lock - getOzoneManager().getMetadataManager().getTableLock( - OmMetadataManagerImpl.DELETED_DIR_TABLE).writeLock().unlock(); } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java index 83991668c9f3..c42854828720 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java @@ -187,12 +187,6 @@ public BackgroundTaskResult call() { final long run = getRunCount().incrementAndGet(); LOG.debug("Running KeyDeletingService {}", run); - // Acquire active DB deletedTable write lock because of the - // deletedTable read-write here to avoid interleaving with - // the table range delete operation in createOmSnapshotCheckpoint() - // that is called from OMSnapshotCreateResponse#addToDBBatch. - manager.getMetadataManager().getTableLock( - OmMetadataManagerImpl.DELETED_TABLE).writeLock().lock(); int delCount = 0; try { // TODO: [SNAPSHOT] HDDS-7968. Reclaim eligible key blocks in @@ -214,10 +208,6 @@ public BackgroundTaskResult call() { } catch (IOException e) { LOG.error("Error while running delete keys background task. Will " + "retry at next run.", e); - } finally { - // Release deletedTable write lock - manager.getMetadataManager().getTableLock( - OmMetadataManagerImpl.DELETED_TABLE).writeLock().unlock(); } try { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java index bb4fc076bdee..99e3903447d4 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java @@ -36,7 +36,6 @@ import org.apache.hadoop.ozone.lock.BootstrapStateHandler; import org.apache.hadoop.ozone.om.OMConfigKeys; import org.apache.hadoop.ozone.om.OmMetadataManagerImpl; -import org.apache.hadoop.ozone.om.KeyManagerImpl; import org.apache.hadoop.ozone.om.OmSnapshot; import org.apache.hadoop.ozone.om.OmSnapshotManager; import org.apache.hadoop.ozone.om.OzoneManager; @@ -100,7 +99,6 @@ public class SnapshotDeletingService extends AbstractKeyDeletingService { private final long snapshotDeletionPerTask; private final int keyLimitPerSnapshot; private final int ratisByteLimit; - private final boolean isSstFilteringServiceEnabled; public SnapshotDeletingService(long interval, long serviceTimeout, OzoneManager ozoneManager, ScmBlockLocationProtocol scmClient) @@ -128,8 +126,6 @@ public SnapshotDeletingService(long interval, long serviceTimeout, this.keyLimitPerSnapshot = conf.getInt( OZONE_SNAPSHOT_KEY_DELETING_LIMIT_PER_TASK, OZONE_SNAPSHOT_KEY_DELETING_LIMIT_PER_TASK_DEFAULT); - - this.isSstFilteringServiceEnabled = ((KeyManagerImpl) ozoneManager.getKeyManager()).isSstFilteringSvcEnabled(); } private class SnapshotDeletingTask implements BackgroundTask { @@ -594,8 +590,7 @@ public void submitRequest(OMRequest omRequest) { @VisibleForTesting boolean shouldIgnoreSnapshot(SnapshotInfo snapInfo) { SnapshotInfo.SnapshotStatus snapshotStatus = snapInfo.getSnapshotStatus(); - return snapshotStatus != SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED - || (isSstFilteringServiceEnabled && !snapInfo.isSstFiltered()); + return snapshotStatus != SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED; } // TODO: Move this util class. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java index 03729aebb509..22fb045706b4 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java @@ -39,6 +39,7 @@ import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.exceptions.OMLeaderNotReadyException; +import org.apache.hadoop.ozone.om.helpers.OMAuditLogger; import org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolPB; import org.apache.hadoop.ozone.om.ratis.OzoneManagerDoubleBuffer; import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer; @@ -218,6 +219,7 @@ private OMResponse internalProcessRequest(OMRequest request) throws this.lastRequestToSubmit = requestToSubmit; } catch (IOException ex) { if (omClientRequest != null) { + OMAuditLogger.log(omClientRequest.getAuditBuilder()); omClientRequest.handleRequestFailure(ozoneManager); } return createErrorResponse(request, ex); @@ -296,7 +298,13 @@ private OMResponse submitRequestDirectlyToOM(OMRequest request) { } else { OMClientRequest omClientRequest = createClientRequest(request, ozoneManager); - request = omClientRequest.preExecute(ozoneManager); + try { + request = omClientRequest.preExecute(ozoneManager); + } catch (IOException ex) { + // log only when audit build is complete as required + OMAuditLogger.log(omClientRequest.getAuditBuilder()); + throw ex; + } final TermIndex termIndex = TransactionInfo.getTermIndex(transactionIndex.incrementAndGet()); omClientResponse = handler.handleWriteRequest(request, termIndex, ozoneManagerDoubleBuffer); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java index 5b8365e5a75b..48ddedd0dfba 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java @@ -41,6 +41,7 @@ import org.apache.hadoop.hdds.scm.protocolPB.OzonePBHelper; import org.apache.hadoop.hdds.utils.FaultInjector; import org.apache.hadoop.ozone.OzoneAcl; +import org.apache.hadoop.ozone.om.helpers.OMAuditLogger; import org.apache.hadoop.ozone.util.PayloadUtils; import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.om.OzoneManagerPrepareState; @@ -393,10 +394,17 @@ public OMClientResponse handleWriteRequestImpl(OMRequest omRequest, TermIndex te injectPause(); OMClientRequest omClientRequest = OzoneManagerRatisUtils.createClientRequest(omRequest, impl); - return captureLatencyNs( - impl.getPerfMetrics().getValidateAndUpdateCacheLatencyNs(), - () -> Objects.requireNonNull(omClientRequest.validateAndUpdateCache(getOzoneManager(), termIndex), - "omClientResponse returned by validateAndUpdateCache cannot be null")); + try { + OMClientResponse omClientResponse = captureLatencyNs( + impl.getPerfMetrics().getValidateAndUpdateCacheLatencyNs(), + () -> Objects.requireNonNull(omClientRequest.validateAndUpdateCache(getOzoneManager(), termIndex), + "omClientResponse returned by validateAndUpdateCache cannot be null")); + OMAuditLogger.log(omClientRequest.getAuditBuilder(), termIndex); + return omClientResponse; + } catch (Throwable th) { + OMAuditLogger.log(omClientRequest.getAuditBuilder(), omClientRequest, getOzoneManager(), termIndex, th); + throw th; + } } @VisibleForTesting diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java index 5239fa009029..b91d9915000a 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmMetadataManager.java @@ -51,7 +51,6 @@ import java.io.File; import java.time.Duration; -import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -777,7 +776,7 @@ private void testGetExpiredMPUs() throws Exception { final Duration expireThreshold = Duration.ofMillis(expireThresholdMillis); final long expiredMPUCreationTime = - Instant.now().minus(expireThreshold).toEpochMilli(); + expireThreshold.negated().plusMillis(Time.now()).toMillis(); // Add expired MPUs to multipartInfoTable. // The method under test does not check for expired open keys in the @@ -785,7 +784,7 @@ private void testGetExpiredMPUs() throws Exception { Set expiredMPUs = new HashSet<>(); for (int i = 0; i < numExpiredMPUs + numUnexpiredMPUs; i++) { final long creationTime = i < numExpiredMPUs ? - expiredMPUCreationTime : Instant.now().toEpochMilli(); + expiredMPUCreationTime : Time.now(); String uploadId = OMMultipartUploadUtils.getMultipartUploadId(); final OmMultipartKeyInfo mpuKeyInfo = OMRequestTestUtils diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java index c865cb7814de..ebc6bc6cb6c4 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java @@ -23,6 +23,7 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.HddsWhiteboxTestUtils; import org.apache.hadoop.hdds.utils.db.DBStore; +import org.apache.hadoop.hdds.utils.db.RDBBatchOperation; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs; @@ -176,9 +177,11 @@ public void testCloseOnEviction() throws IOException { ((OmMetadataManagerImpl) om.getMetadataManager()).getSnapshotChainManager().addSnapshot(first); ((OmMetadataManagerImpl) om.getMetadataManager()).getSnapshotChainManager().addSnapshot(second); + RDBBatchOperation rdbBatchOperation = new RDBBatchOperation(); // create the first snapshot checkpoint OmSnapshotManager.createOmSnapshotCheckpoint(om.getMetadataManager(), - first); + first, rdbBatchOperation); + om.getMetadataManager().getStore().commitBatchOperation(rdbBatchOperation); // retrieve it and setup store mock OmSnapshotManager omSnapshotManager = om.getOmSnapshotManager(); @@ -190,8 +193,10 @@ public void testCloseOnEviction() throws IOException { firstSnapshot.getMetadataManager(), "store", firstSnapshotStore); // create second snapshot checkpoint (which will be used for eviction) + rdbBatchOperation = new RDBBatchOperation(); OmSnapshotManager.createOmSnapshotCheckpoint(om.getMetadataManager(), - second); + second, rdbBatchOperation); + om.getMetadataManager().getStore().commitBatchOperation(rdbBatchOperation); // confirm store not yet closed verify(firstSnapshotStore, times(0)).close(); @@ -634,15 +639,19 @@ public void testCreateSnapshotIdempotent() throws Exception { when(snapshotInfoTable.get(first.getTableKey())).thenReturn(first); // Create first checkpoint for the snapshot checkpoint + RDBBatchOperation rdbBatchOperation = new RDBBatchOperation(); OmSnapshotManager.createOmSnapshotCheckpoint(om.getMetadataManager(), - first); + first, rdbBatchOperation); + om.getMetadataManager().getStore().commitBatchOperation(rdbBatchOperation); assertThat(logCapturer.getOutput()).doesNotContain( "for snapshot " + first.getName() + " already exists."); logCapturer.clearOutput(); // Create checkpoint again for the same snapshot. + rdbBatchOperation = new RDBBatchOperation(); OmSnapshotManager.createOmSnapshotCheckpoint(om.getMetadataManager(), - first); + first, rdbBatchOperation); + om.getMetadataManager().getStore().commitBatchOperation(rdbBatchOperation); assertThat(logCapturer.getOutput()).contains( "for snapshot " + first.getName() + " already exists."); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java index 9d8c13def4bd..636dc6d6cd16 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java @@ -16,8 +16,11 @@ */ package org.apache.hadoop.ozone.om.ratis; +import java.util.concurrent.CompletableFuture; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.TransactionInfo; +import org.apache.hadoop.ozone.audit.AuditLogger; +import org.apache.hadoop.ozone.audit.AuditMessage; import org.apache.hadoop.ozone.om.OMConfigKeys; import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.OmMetadataManagerImpl; @@ -25,6 +28,7 @@ import org.apache.hadoop.ozone.om.OzoneManagerPrepareState; import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.helpers.OMRatisHelper; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PrepareRequestArgs; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.CreateKeyRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; @@ -35,14 +39,19 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.UserInfo; import org.apache.hadoop.security.UserGroupInformation; import org.apache.ratis.proto.RaftProtos; +import org.apache.ratis.protocol.Message; import org.apache.ratis.protocol.exceptions.StateMachineException; import org.apache.ratis.server.protocol.TermIndex; +import org.apache.ratis.server.raftlog.LogProtoUtils; import org.apache.ratis.statemachine.TransactionContext; +import org.apache.ratis.util.ExitUtils; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import java.nio.file.Path; +import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -63,6 +72,7 @@ public class TestOzoneManagerStateMachine { private OzoneManagerStateMachine ozoneManagerStateMachine; private OzoneManagerPrepareState prepareState; + private AuditLogger auditLogger; @BeforeEach public void setup() throws Exception { @@ -81,7 +91,9 @@ public void setup() throws Exception { ozoneManager); when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager); + auditLogger = mock(AuditLogger.class); + when(ozoneManager.getAuditLogger()).thenReturn(auditLogger); prepareState = new OzoneManagerPrepareState(conf); when(ozoneManager.getPrepareState()).thenReturn(prepareState); @@ -220,6 +232,34 @@ public void testPreAppendTransaction() throws Exception { // the pre-append state machine step, so it is tested in other classes. } + @Test + public void testApplyTransactionExceptionAuditLog() throws Exception { + ExitUtils.disableSystemExit(); + // submit a create volume request having null pointer exception + OzoneManagerProtocolProtos.VolumeInfo volInfo = OzoneManagerProtocolProtos.VolumeInfo.newBuilder() + .setAdminName("a").setOwnerName("a").setVolume("a").build(); + OMRequest createVolRequest = OMRequest.newBuilder() + .setCreateVolumeRequest(OzoneManagerProtocolProtos.CreateVolumeRequest.newBuilder().setVolumeInfo(volInfo)) + .setCmdType(Type.CreateVolume).setClientId("123") + .setUserInfo(UserInfo.newBuilder().setUserName("user").setHostName("localhost").setRemoteAddress("127.0.0.1")) + .build(); + TransactionContext submittedTrx = mockTransactionContext(createVolRequest); + Mockito.doAnswer((i) -> { + if (!((AuditMessage) i.getArgument(0)).getFormattedMessage().contains("Transaction=10") || + !((AuditMessage) i.getArgument(0)).getFormattedMessage().contains("Command=CreateVolume")) { + Assertions.fail("transaction and command not found"); + } + // throw another exception to change to new exception to avoid terminate call + throw new OMException("test", OMException.ResultCodes.VOLUME_IS_REFERENCED); + }).when(auditLogger).logWrite(any()); + CompletableFuture messageCompletableFuture = ozoneManagerStateMachine.applyTransaction(submittedTrx); + try { + messageCompletableFuture.get(); + } catch (Exception ex) { + // do nothing + } + } + private TransactionContext mockTransactionContext(OMRequest request) { RaftProtos.StateMachineLogEntryProto logEntry = RaftProtos.StateMachineLogEntryProto.newBuilder() @@ -229,6 +269,8 @@ private TransactionContext mockTransactionContext(OMRequest request) { TransactionContext mockTrx = mock(TransactionContext.class); when(mockTrx.getStateMachineLogEntry()).thenReturn(logEntry); when(mockTrx.getStateMachineContext()).thenReturn(request); + RaftProtos.LogEntryProto logEntryProto = LogProtoUtils.toLogEntryProto(10, 10, 10); + when(mockTrx.getLogEntry()).thenReturn(logEntryProto); return mockTrx; } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java index 9719865db196..0503578d99d4 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; @@ -31,11 +32,13 @@ import org.apache.hadoop.hdds.utils.db.BatchOperation; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.ozone.OmUtils; +import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.OzoneConfigKeys; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils; import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo; import org.apache.hadoop.ozone.om.request.OMRequestTestUtils; @@ -58,9 +61,12 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos .OMRequest; +import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.KEY_NOT_FOUND; +import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.OK; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -116,7 +122,7 @@ public void testValidateAndUpdateCacheWithUnknownBlockId() throws Exception { OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); - assertEquals(OzoneManagerProtocolProtos.Status.OK, + assertEquals(OK, omClientResponse.getOMResponse().getStatus()); // Entry should be deleted from openKey Table. @@ -183,7 +189,7 @@ public void testValidateAndUpdateCache() throws Exception { OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); - assertEquals(OzoneManagerProtocolProtos.Status.OK, + assertEquals(OK, omClientResponse.getOMResponse().getStatus()); // Entry should be deleted from openKey Table. @@ -218,6 +224,68 @@ public void testValidateAndUpdateCache() throws Exception { omKeyInfo.getLatestVersionLocations().getLocationList()); } + @Test + public void testAtomicRewrite() throws Exception { + Table openKeyTable = omMetadataManager.getOpenKeyTable(getBucketLayout()); + Table closedKeyTable = omMetadataManager.getKeyTable(getBucketLayout()); + + OMRequest modifiedOmRequest = doPreExecute(createCommitKeyRequest()); + OMKeyCommitRequest omKeyCommitRequest = getOmKeyCommitRequest(modifiedOmRequest); + KeyArgs keyArgs = modifiedOmRequest.getCommitKeyRequest().getKeyArgs(); + + OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName, + omMetadataManager, omKeyCommitRequest.getBucketLayout()); + + // Append new blocks + List allocatedLocationList = + keyArgs.getKeyLocationsList().stream() + .map(OmKeyLocationInfo::getFromProtobuf) + .collect(Collectors.toList()); + + OmKeyInfo.Builder omKeyInfoBuilder = OMRequestTestUtils.createOmKeyInfo( + volumeName, bucketName, keyName, replicationConfig, new OmKeyLocationInfoGroup(version, new ArrayList<>())); + omKeyInfoBuilder.setExpectedDataGeneration(1L); + OmKeyInfo omKeyInfo = omKeyInfoBuilder.build(); + omKeyInfo.appendNewBlocks(allocatedLocationList, false); + List acls = Collections.singletonList(OzoneAcl.parseAcl("user:foo:rw")); + omKeyInfo.addAcl(acls.get(0)); + + String openKey = addKeyToOpenKeyTable(allocatedLocationList, omKeyInfo); + OmKeyInfo openKeyInfo = openKeyTable.get(openKey); + assertNotNull(openKeyInfo); + assertEquals(acls, openKeyInfo.getAcls()); + // At this stage, we have an openKey, with rewrite generation of 1. + // However there is no closed key entry, so the commit should fail. + OMClientResponse omClientResponse = + omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); + assertEquals(KEY_NOT_FOUND, omClientResponse.getOMResponse().getStatus()); + + // Now add the key to the key table, and try again, but with different generation + omKeyInfoBuilder.setExpectedDataGeneration(null); + omKeyInfoBuilder.setUpdateID(0L); + OmKeyInfo invalidKeyInfo = omKeyInfoBuilder.build(); + closedKeyTable.put(getOzonePathKey(), invalidKeyInfo); + // This should fail as the updateID ia zero and the open key has rewrite generation of 1. + omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); + assertEquals(KEY_NOT_FOUND, omClientResponse.getOMResponse().getStatus()); + + omKeyInfoBuilder.setUpdateID(1L); + OmKeyInfo closedKeyInfo = omKeyInfoBuilder.build(); + + closedKeyTable.delete(getOzonePathKey()); + closedKeyTable.put(getOzonePathKey(), closedKeyInfo); + + // Now the key should commit as the updateID and rewrite Generation match. + omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); + assertEquals(OK, omClientResponse.getOMResponse().getStatus()); + + OmKeyInfo committedKey = closedKeyTable.get(getOzonePathKey()); + assertNull(committedKey.getExpectedDataGeneration()); + // Generation should be changed + assertNotEquals(closedKeyInfo.getGeneration(), committedKey.getGeneration()); + assertEquals(acls, committedKey.getAcls()); + } + @Test public void testValidateAndUpdateCacheWithUncommittedBlocks() throws Exception { @@ -260,7 +328,7 @@ public void testValidateAndUpdateCacheWithUncommittedBlocks() OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); - assertEquals(OzoneManagerProtocolProtos.Status.OK, + assertEquals(OK, omClientResponse.getOMResponse().getStatus()); Map toDeleteKeyList @@ -385,7 +453,7 @@ private Map doKeyCommit(boolean isHSync, OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); - assertEquals(OzoneManagerProtocolProtos.Status.OK, + assertEquals(OK, omClientResponse.getOMResponse().getStatus()); // Key should be present in both OpenKeyTable and KeyTable with HSync commit @@ -550,7 +618,7 @@ public void testValidateAndUpdateCacheWithKeyNotFound() throws Exception { OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L); - assertEquals(OzoneManagerProtocolProtos.Status.KEY_NOT_FOUND, + assertEquals(KEY_NOT_FOUND, omClientResponse.getOMResponse().getStatus()); omKeyInfo = @@ -596,7 +664,7 @@ public void testValidateAndUpdateCacheOnOverwrite() throws Exception { OMClientResponse omClientResponse = omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 102L); - assertEquals(OzoneManagerProtocolProtos.Status.OK, omClientResponse.getOMResponse().getStatus()); + assertEquals(OK, omClientResponse.getOMResponse().getStatus()); // New entry should be created in key Table. omKeyInfo = omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey); @@ -752,6 +820,14 @@ protected String addKeyToOpenKeyTable(List locationList) keyName, clientID); } + @Nonnull + protected String addKeyToOpenKeyTable(List locationList, OmKeyInfo keyInfo) throws Exception { + OMRequestTestUtils.addKeyToTable(true, false, keyInfo, clientID, 0, omMetadataManager); + + return omMetadataManager.getOpenKey(volumeName, bucketName, + keyName, clientID); + } + @Nonnull protected OMKeyCommitRequest getOmKeyCommitRequest(OMRequest omRequest) { return new OMKeyCommitRequest(omRequest, BucketLayout.DEFAULT); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequestWithFSO.java index 48cc52773a33..c3b913b8257c 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequestWithFSO.java @@ -69,30 +69,36 @@ protected String getOzonePathKey() throws IOException { } @Override - protected String addKeyToOpenKeyTable(List locationList) + protected String addKeyToOpenKeyTable(List locationList, OmKeyInfo keyInfo) throws Exception { // need to initialize parentID if (getParentDir() == null) { parentID = getBucketID(); } else { parentID = OMRequestTestUtils.addParentsToDirTable(volumeName, - bucketName, getParentDir(), omMetadataManager); + bucketName, getParentDir(), omMetadataManager); } + keyInfo.setParentObjectID(parentID); + keyInfo.appendNewBlocks(locationList, false); + + String fileName = OzoneFSUtils.getFileName(keyName); + return OMRequestTestUtils.addFileToKeyTable(true, false, + fileName, keyInfo, clientID, txnLogId, omMetadataManager); + + } + + @Override + protected String addKeyToOpenKeyTable(List locationList) + throws Exception { long objectId = 100; OmKeyInfo omKeyInfoFSO = OMRequestTestUtils.createOmKeyInfo(volumeName, bucketName, keyName, RatisReplicationConfig.getInstance(ONE), new OmKeyLocationInfoGroup(version, new ArrayList<>(), false)) .setObjectID(objectId) - .setParentObjectID(parentID) .setUpdateID(100L) .build(); - omKeyInfoFSO.appendNewBlocks(locationList, false); - - String fileName = OzoneFSUtils.getFileName(keyName); - return OMRequestTestUtils.addFileToKeyTable(true, false, - fileName, omKeyInfoFSO, clientID, txnLogId, omMetadataManager); - + return addKeyToOpenKeyTable(locationList, omKeyInfoFSO); } @Nonnull diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java index 166edb552ce6..4bfdd333296d 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -63,6 +62,8 @@ .OMRequest; import org.junit.jupiter.params.provider.ValueSource; +import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.THREE; import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType.EC; import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType.RATIS; @@ -71,6 +72,7 @@ import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ENABLE_FILESYSTEM_PATHS; import static org.apache.hadoop.ozone.om.request.OMRequestTestUtils.addVolumeAndBucketToDB; import static org.apache.hadoop.ozone.om.request.OMRequestTestUtils.createOmKeyInfo; +import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.NOT_A_FILE; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.OK; import static org.assertj.core.api.Assertions.assertThat; @@ -121,9 +123,9 @@ private void preExecuteTest(boolean isMultipartKey, int partNumber, long scmBlockSize = ozoneManager.getScmBlockSize(); for (int i = 0; i <= repConfig.getRequiredNodes(); i++) { doPreExecute(createKeyRequest(isMultipartKey, partNumber, - scmBlockSize * i, repConfig)); + scmBlockSize * i, repConfig, null)); doPreExecute(createKeyRequest(isMultipartKey, partNumber, - scmBlockSize * i + 1, repConfig)); + scmBlockSize * i + 1, repConfig, null)); } } @@ -148,7 +150,7 @@ public void testValidateAndUpdateCache( tags.put("tag-key2", "tag-value2"); OMRequest modifiedOmRequest = - doPreExecute(createKeyRequest(false, 0, Collections.emptyMap(), tags)); + doPreExecute(createKeyRequest(false, 0, emptyMap(), tags)); OMKeyCreateRequest omKeyCreateRequest = getOMKeyCreateRequest(modifiedOmRequest); @@ -197,7 +199,7 @@ public void testValidateAndUpdateCache( // Override same key again modifiedOmRequest = - doPreExecute(createKeyRequest(false, 0, Collections.emptyMap(), tags)); + doPreExecute(createKeyRequest(false, 0, emptyMap(), tags)); id = modifiedOmRequest.getCreateKeyRequest().getClientID(); openKey = getOpenKey(id); @@ -534,7 +536,7 @@ public void testCreationWithoutMetadataFollowedByOverwriteWithMetadata( // Create the key request without any initial metadata OMRequest createRequestWithoutMetadata = createKeyRequest(false, 0, keyName, - null); // Passing 'null' for metadata + null, emptyMap(), emptyList()); // Passing 'null' for metadata OMKeyCreateRequest createOmKeyCreateRequest = new OMKeyCreateRequest(createRequestWithoutMetadata, getBucketLayout()); @@ -557,7 +559,7 @@ public void testCreationWithoutMetadataFollowedByOverwriteWithMetadata( // Overwrite the previously created key with new metadata OMRequest overwriteRequestWithMetadata = - createKeyRequest(false, 0, keyName, overwriteMetadata); + createKeyRequest(false, 0, keyName, overwriteMetadata, emptyMap(), emptyList()); OMKeyCreateRequest overwriteOmKeyCreateRequest = new OMKeyCreateRequest(overwriteRequestWithMetadata, getBucketLayout()); @@ -657,23 +659,23 @@ private OMRequest doPreExecute(OMRequest originalOMRequest) throws Exception { @SuppressWarnings("parameterNumber") protected OMRequest createKeyRequest(boolean isMultipartKey, int partNumber) { - return createKeyRequest(isMultipartKey, partNumber, Collections.emptyMap(), Collections.emptyMap()); + return createKeyRequest(isMultipartKey, partNumber, emptyMap(), emptyMap()); } protected OMRequest createKeyRequest(boolean isMultipartKey, int partNumber, Map metadata, Map tags) { - return createKeyRequest(isMultipartKey, partNumber, keyName, metadata, tags); + return createKeyRequest(isMultipartKey, partNumber, keyName, metadata, tags, emptyList()); } private OMRequest createKeyRequest(boolean isMultipartKey, int partNumber, String keyName) { - return createKeyRequest(isMultipartKey, partNumber, keyName, null); + return createKeyRequest(isMultipartKey, partNumber, keyName, emptyMap()); } protected OMRequest createKeyRequest(boolean isMultipartKey, int partNumber, String keyName, Map metadata) { - return createKeyRequest(isMultipartKey, partNumber, keyName, metadata, null); + return createKeyRequest(isMultipartKey, partNumber, keyName, metadata, emptyMap(), emptyList()); } /** @@ -693,7 +695,8 @@ protected OMRequest createKeyRequest(boolean isMultipartKey, int partNumber, protected OMRequest createKeyRequest(boolean isMultipartKey, int partNumber, String keyName, Map metadata, - Map tags) { + Map tags, + List acls) { KeyArgs.Builder keyArgs = KeyArgs.newBuilder() .setVolumeName(volumeName) .setBucketName(bucketName) @@ -704,6 +707,9 @@ protected OMRequest createKeyRequest(boolean isMultipartKey, int partNumber, .setType(replicationConfig.getReplicationType()) .setLatestVersionLocation(true); + for (OzoneAcl acl : acls) { + keyArgs.addAcls(OzoneAcl.toProtobuf(acl)); + } // Configure for multipart upload, if applicable if (isMultipartKey) { keyArgs.setDataSize(dataSize).setMultipartNumber(partNumber); @@ -733,7 +739,14 @@ protected OMRequest createKeyRequest(boolean isMultipartKey, int partNumber, private OMRequest createKeyRequest( boolean isMultipartKey, int partNumber, long keyLength, - ReplicationConfig repConfig) { + ReplicationConfig repConfig, Long expectedDataGeneration) { + return createKeyRequest(isMultipartKey, partNumber, keyLength, repConfig, + expectedDataGeneration, null); + } + + private OMRequest createKeyRequest( + boolean isMultipartKey, int partNumber, long keyLength, + ReplicationConfig repConfig, Long expectedDataGeneration, Map metaData) { KeyArgs.Builder keyArgs = KeyArgs.newBuilder() .setVolumeName(volumeName).setBucketName(bucketName) @@ -752,8 +765,17 @@ private OMRequest createKeyRequest( if (isMultipartKey) { keyArgs.setMultipartNumber(partNumber); } + if (expectedDataGeneration != null) { + keyArgs.setExpectedDataGeneration(expectedDataGeneration); + } + if (metaData != null) { + metaData.forEach((key, value) -> keyArgs.addMetadata(KeyValue.newBuilder() + .setKey(key) + .setValue(value) + .build())); + } - OzoneManagerProtocolProtos.CreateKeyRequest createKeyRequest = + CreateKeyRequest createKeyRequest = CreateKeyRequest.newBuilder().setKeyArgs(keyArgs).build(); return OMRequest.newBuilder() @@ -935,6 +957,72 @@ public void testKeyCreateInheritParentDefaultAcls( } + @ParameterizedTest + @MethodSource("data") + public void testAtomicRewrite( + boolean setKeyPathLock, boolean setFileSystemPaths) throws Exception { + when(ozoneManager.getOzoneLockProvider()).thenReturn( + new OzoneLockProvider(setKeyPathLock, setFileSystemPaths)); + + OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, omMetadataManager, + OmBucketInfo.newBuilder().setVolumeName(volumeName) + .setBucketName(bucketName) + .setBucketLayout(getBucketLayout())); + + // First, create a key with the rewrite ID - this should fail as no key exists + OMRequest omRequest = createKeyRequest(false, 0, 100, + RatisReplicationConfig.getInstance(THREE), 1L); + omRequest = doPreExecute(omRequest); + OMKeyCreateRequest omKeyCreateRequest = getOMKeyCreateRequest(omRequest); + OMClientResponse response = omKeyCreateRequest.validateAndUpdateCache(ozoneManager, 105L); + assertEquals(KEY_NOT_FOUND, response.getOMResponse().getStatus()); + + // Now pre-create the key in the system so we can rewrite it. + Map metadata = Collections.singletonMap("metakey", "metavalue"); + Map reWriteMetadata = Collections.singletonMap("metakey", "rewriteMetavalue"); + + List acls = Collections.singletonList(OzoneAcl.parseAcl("user:foo:rw")); + OmKeyInfo createdKeyInfo = createAndCheck(keyName, metadata, acls); + // Commit openKey entry. + omMetadataManager.getKeyTable(getBucketLayout()).put(getOzoneKey(), createdKeyInfo); + + // Retrieve the committed key info + OmKeyInfo existingKeyInfo = omMetadataManager.getKeyTable(getBucketLayout()).get(getOzoneKey()); + List existingAcls = existingKeyInfo.getAcls(); + assertEquals(acls, existingAcls); + + // Create a request with a generation which doesn't match the current key + omRequest = createKeyRequest(false, 0, 100, + RatisReplicationConfig.getInstance(THREE), existingKeyInfo.getGeneration() + 1, reWriteMetadata); + omRequest = doPreExecute(omRequest); + omKeyCreateRequest = getOMKeyCreateRequest(omRequest); + response = omKeyCreateRequest.validateAndUpdateCache(ozoneManager, 105L); + // Still fails, as the matching key is not present. + assertEquals(KEY_NOT_FOUND, response.getOMResponse().getStatus()); + + // Now create the key with the correct rewrite generation + omRequest = createKeyRequest(false, 0, 100, + RatisReplicationConfig.getInstance(THREE), existingKeyInfo.getGeneration(), reWriteMetadata); + omRequest = doPreExecute(omRequest); + omKeyCreateRequest = getOMKeyCreateRequest(omRequest); + response = omKeyCreateRequest.validateAndUpdateCache(ozoneManager, 105L); + assertEquals(OK, response.getOMResponse().getStatus()); + + OmKeyInfo openKeyInfo = omMetadataManager.getOpenKeyTable(getBucketLayout()) + .get(getOpenKey(omRequest.getCreateKeyRequest().getClientID())); + + assertEquals(existingKeyInfo.getGeneration(), openKeyInfo.getExpectedDataGeneration()); + // Creation time should remain the same on rewrite. + assertEquals(existingKeyInfo.getCreationTime(), openKeyInfo.getCreationTime()); + // Update ID should change + assertNotEquals(existingKeyInfo.getGeneration(), openKeyInfo.getGeneration()); + assertEquals(metadata, existingKeyInfo.getMetadata()); + // The metadata should not be copied from the existing key. It should be passed in the request. + assertEquals(reWriteMetadata, openKeyInfo.getMetadata()); + // Ensure the ACLS are copied over from the existing key. + assertEquals(existingAcls, openKeyInfo.getAcls()); + } + /** * Leaf file has ACCESS scope acls which inherited * from parent DEFAULT acls. @@ -991,9 +1079,13 @@ private void checkNotAFile(String keyName) throws Exception { assertEquals(NOT_A_FILE, omClientResponse.getOMResponse().getStatus()); } - private void createAndCheck(String keyName) throws Exception { - OMRequest omRequest = createKeyRequest(false, 0, keyName); + createAndCheck(keyName, emptyMap(), emptyList()); + } + + private OmKeyInfo createAndCheck(String keyName, Map metadata, List acls) + throws Exception { + OMRequest omRequest = createKeyRequest(false, 0, keyName, metadata, emptyMap(), acls); OMKeyCreateRequest omKeyCreateRequest = getOMKeyCreateRequest(omRequest); @@ -1006,16 +1098,13 @@ private void createAndCheck(String keyName) throws Exception { assertEquals(OK, omClientResponse.getOMResponse().getStatus()); - checkCreatedPaths(omKeyCreateRequest, omRequest, keyName); + return checkCreatedPaths(omKeyCreateRequest, omRequest, keyName); } - protected void checkCreatedPaths( + protected OmKeyInfo checkCreatedPaths( OMKeyCreateRequest omKeyCreateRequest, OMRequest omRequest, String keyName) throws Exception { keyName = omKeyCreateRequest.validateAndNormalizeKey(true, keyName); - // Check intermediate directories created or not. - Path keyPath = Paths.get(keyName); - checkIntermediatePaths(keyPath); // Check open key entry String openKey = omMetadataManager.getOpenKey(volumeName, bucketName, @@ -1024,6 +1113,7 @@ protected void checkCreatedPaths( omMetadataManager.getOpenKeyTable(omKeyCreateRequest.getBucketLayout()) .get(openKey); assertNotNull(omKeyInfo); + return omKeyInfo; } protected long checkIntermediatePaths(Path keyPath) throws Exception { @@ -1048,7 +1138,7 @@ protected String getOzoneKey() throws IOException { } protected OMKeyCreateRequest getOMKeyCreateRequest(OMRequest omRequest) { - return new OMKeyCreateRequest(omRequest, BucketLayout.DEFAULT); + return new OMKeyCreateRequest(omRequest, getBucketLayout()); } protected OMKeyCreateRequest getOMKeyCreateRequest( diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequestWithFSO.java index 2a25a9b09686..a5181b25a0e6 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequestWithFSO.java @@ -117,7 +117,7 @@ protected void addToKeyTable(String keyName) throws Exception { } @Override - protected void checkCreatedPaths(OMKeyCreateRequest omKeyCreateRequest, + protected OmKeyInfo checkCreatedPaths(OMKeyCreateRequest omKeyCreateRequest, OMRequest omRequest, String keyName) throws Exception { keyName = omKeyCreateRequest.validateAndNormalizeKey(true, keyName, BucketLayout.FILE_SYSTEM_OPTIMIZED); @@ -139,6 +139,7 @@ protected void checkCreatedPaths(OMKeyCreateRequest omKeyCreateRequest, omMetadataManager.getOpenKeyTable(omKeyCreateRequest.getBucketLayout()) .get(openKey); assertNotNull(omKeyInfo); + return omKeyInfo; } @Override @@ -152,6 +153,11 @@ protected long checkIntermediatePaths(Path keyPath) throws Exception { long lastKnownParentId = omBucketInfo.getObjectID(); final long volumeId = omMetadataManager.getVolumeId(volumeName); + if (keyPath == null) { + // The file is at the root of the bucket, so it has no parent folder. The parent is + // the bucket itself. + return lastKnownParentId; + } Iterator elements = keyPath.iterator(); StringBuilder fullKeyPath = new StringBuilder(bucketKey); while (elements.hasNext()) { diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java index fde83d7b7697..05316b613025 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java @@ -121,6 +121,7 @@ public class TestOMKeyRequest { public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); omMetrics = OMMetrics.create(); + metrics = OMPerformanceMetrics.register(); OzoneConfiguration ozoneConfiguration = getOzoneConfiguration(); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); @@ -130,6 +131,7 @@ public void setup() throws Exception { omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, ozoneManager); when(ozoneManager.getMetrics()).thenReturn(omMetrics); + when(ozoneManager.getPerfMetrics()).thenReturn(metrics); when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager); when(ozoneManager.getConfiguration()).thenReturn(ozoneConfiguration); OMLayoutVersionManager lvm = mock(OMLayoutVersionManager.class); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java index a3e83986b531..3997f39d7bd5 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java @@ -162,8 +162,8 @@ public void testPreExecuteFailure(String snapshotName) { bucketName, snapshotName); OMException omException = assertThrows(OMException.class, () -> doPreExecute(omRequest)); - assertEquals("Invalid snapshot name: " + snapshotName, - omException.getMessage()); + assertTrue(omException.getMessage() + .contains("Invalid snapshot name: " + snapshotName)); } @Test diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotDeleteRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotDeleteRequest.java index 03dc7862e35a..5a8bb5d7c0d0 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotDeleteRequest.java @@ -159,8 +159,8 @@ public void testPreExecuteFailure(String deleteSnapshotName) { bucketName, deleteSnapshotName); OMException omException = assertThrows(OMException.class, () -> doPreExecute(omRequest)); - assertEquals("Invalid snapshot name: " + deleteSnapshotName, - omException.getMessage()); + assertTrue(omException.getMessage() + .contains("Invalid snapshot name: " + deleteSnapshotName)); } @Test diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotRenameRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotRenameRequest.java index 14af3e28b8b8..ab2bac1bd0e2 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotRenameRequest.java @@ -60,6 +60,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doNothing; @@ -172,8 +173,7 @@ public void testPreExecuteFailure(String toSnapshotName) { bucketName, currentSnapshotName, toSnapshotName); OMException omException = assertThrows(OMException.class, () -> doPreExecute(omRequest)); - assertEquals("Invalid snapshot name: " + toSnapshotName, - omException.getMessage()); + assertTrue(omException.getMessage().contains("Invalid snapshot name: " + toSnapshotName)); } @Test diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java index 42da7377ea26..3948f4fab805 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java @@ -67,26 +67,23 @@ private static Stream testCasesForIgnoreSnapshotGc() { SnapshotInfo filteredSnapshot = SnapshotInfo.newBuilder().setSstFiltered(true).setName("snap1").build(); SnapshotInfo unFilteredSnapshot = SnapshotInfo.newBuilder().setSstFiltered(false).setName("snap1").build(); return Stream.of( - Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, true, false), - Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, true, true), - Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, true, true), - Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, true, true), - Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, false, false), - Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, false, false), - Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, false, true), - Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, false, true)); + Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, false), + Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, true), + Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, false), + Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, true), + Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, false), + Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_DELETED, false), + Arguments.of(unFilteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, true), + Arguments.of(filteredSnapshot, SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE, true)); } @ParameterizedTest @MethodSource("testCasesForIgnoreSnapshotGc") public void testProcessSnapshotLogicInSDS(SnapshotInfo snapshotInfo, SnapshotInfo.SnapshotStatus status, - boolean sstFilteringServiceEnabled, boolean expectedOutcome) throws IOException { - Mockito.when(keyManager.isSstFilteringSvcEnabled()).thenReturn(sstFilteringServiceEnabled); Mockito.when(omMetadataManager.getSnapshotChainManager()).thenReturn(chainManager); - Mockito.when(ozoneManager.getKeyManager()).thenReturn(keyManager); Mockito.when(ozoneManager.getOmSnapshotManager()).thenReturn(omSnapshotManager); Mockito.when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager); Mockito.when(ozoneManager.getConfiguration()).thenReturn(conf); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java index 1f2380f6fa77..5b1a72a5f8c8 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java @@ -64,6 +64,7 @@ import org.apache.ozone.rocksdiff.DifferSnapshotInfo; import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer; import org.apache.ozone.rocksdiff.RocksDiffUtils; +import org.apache.ozone.test.tag.Flaky; import org.apache.ratis.util.ExitUtils; import org.apache.ratis.util.TimeDuration; import jakarta.annotation.Nonnull; @@ -1274,6 +1275,7 @@ public void testGenerateDiffReportFailure() throws IOException { * startup. */ @Test + @Flaky("HDDS-10490") public void testLoadJobsOnStartUp() throws Exception { for (int i = 0; i < snapshotInfoList.size(); i++) { uploadSnapshotDiffJobToDb(snapshotInfo, snapshotInfoList.get(i), diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java index 31ca16481f4c..58da4303608b 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java @@ -206,7 +206,7 @@ public void testIrrelevantSstFileDeletion() createSnapshot(volumeName, bucketName2, snapshotName1); SnapshotInfo snapshotInfo = om.getMetadataManager().getSnapshotInfoTable() .get(SnapshotInfo.getTableKey(volumeName, bucketName2, snapshotName1)); - assertFalse(snapshotInfo.isSstFiltered()); + assertFalse(SstFilteringService.isSstFiltered(om.getConfiguration(), snapshotInfo)); waitForSnapshotsAtLeast(filteringService, countExistingSnapshots + 1); assertEquals(countExistingSnapshots + 1, filteringService.getSnapshotFilteredCount().get()); @@ -238,8 +238,9 @@ public void testIrrelevantSstFileDeletion() // Need to read the sstFiltered flag which is set in background process and // hence snapshotInfo.isSstFiltered() may not work sometimes. - assertTrue(om.getMetadataManager().getSnapshotInfoTable().get(SnapshotInfo - .getTableKey(volumeName, bucketName2, snapshotName1)).isSstFiltered()); + assertTrue(SstFilteringService.isSstFiltered(om.getConfiguration(), + om.getMetadataManager().getSnapshotInfoTable().get(SnapshotInfo + .getTableKey(volumeName, bucketName2, snapshotName1)))); String snapshotName2 = "snapshot2"; final long count; @@ -313,7 +314,7 @@ public void testActiveAndDeletedSnapshotCleanup() throws Exception { .filter(f -> f.getName().endsWith(SST_FILE_EXTENSION)).count(); // delete snap1 - writeClient.deleteSnapshot(volumeName, bucketNames.get(0), "snap1"); + deleteSnapshot(volumeName, bucketNames.get(0), "snap1"); sstFilteringService.resume(); // Filtering service will only act on snap2 as it is an active snaphot waitForSnapshotsAtLeast(sstFilteringService, countTotalSnapshots); @@ -505,4 +506,9 @@ private void createSnapshot(String volumeName, String bucketName, String snapsho writeClient.createSnapshot(volumeName, bucketName, snapshotName); countTotalSnapshots++; } + + private void deleteSnapshot(String volumeName, String bucketName, String snapshotName) throws IOException { + writeClient.deleteSnapshot(volumeName, bucketName, snapshotName); + countTotalSnapshots--; + } } diff --git a/hadoop-ozone/ozonefs-common/pom.xml b/hadoop-ozone/ozonefs-common/pom.xml index 0543d461ea78..99ab7ba21bf8 100644 --- a/hadoop-ozone/ozonefs-common/pom.xml +++ b/hadoop-ozone/ozonefs-common/pom.xml @@ -32,7 +32,13 @@ - + + org.apache.maven.plugins + maven-compiler-plugin + + none + + diff --git a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java index 109e19d13c9f..890efd56e804 100644 --- a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java +++ b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java @@ -659,20 +659,19 @@ public FileStatusAdapter getFileStatus(String path, URI uri, * valid bucket path or valid snapshot path. * Throws exception in case of failure. */ - private FileStatusAdapter getFileStatusForKeyOrSnapshot( - OFSPath ofsPath, URI uri, Path qualifiedPath, String userName) + private FileStatusAdapter getFileStatusForKeyOrSnapshot(OFSPath ofsPath, URI uri, Path qualifiedPath, String userName) throws IOException { + String volumeName = ofsPath.getVolumeName(); + String bucketName = ofsPath.getBucketName(); String key = ofsPath.getKeyName(); try { - OzoneBucket bucket = getBucket(ofsPath, false); if (ofsPath.isSnapshotPath()) { - OzoneVolume volume = objectStore.getVolume(ofsPath.getVolumeName()); - return getFileStatusAdapterWithSnapshotIndicator( - volume, bucket, uri); + OzoneVolume volume = objectStore.getVolume(volumeName); + OzoneBucket bucket = getBucket(volumeName, bucketName, false); + return getFileStatusAdapterWithSnapshotIndicator(volume, bucket, uri); } else { - OzoneFileStatus status = bucket.getFileStatus(key); - return toFileStatusAdapter(status, userName, uri, qualifiedPath, - ofsPath.getNonKeyPath()); + OzoneFileStatus status = proxy.getOzoneFileStatus(volumeName, bucketName, key); + return toFileStatusAdapter(status, userName, uri, qualifiedPath, ofsPath.getNonKeyPath()); } } catch (OMException e) { if (e.getResult() == OMException.ResultCodes.FILE_NOT_FOUND) { diff --git a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java index 23a921aaa10d..224d94baa5d0 100644 --- a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java +++ b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java @@ -91,6 +91,8 @@ import static org.apache.hadoop.ozone.OzoneConsts.OZONE_OFS_URI_SCHEME; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_EMPTY; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_EMPTY; +import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND; +import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND; /** * The minimal Rooted Ozone Filesystem implementation. @@ -768,13 +770,25 @@ private boolean deleteInSpan(Path f, boolean recursive) throws IOException { private boolean deleteBucket(Path f, boolean recursive, OFSPath ofsPath) throws IOException { + OzoneBucket bucket; + try { + bucket = adapterImpl.getBucket(ofsPath, false); + } catch (OMException ex) { + if (ex.getResult() != BUCKET_NOT_FOUND && ex.getResult() != VOLUME_NOT_FOUND) { + LOG.error("OMException while getting bucket information, considered it as false", ex); + } + return false; + } catch (Exception ex) { + LOG.error("Exception while getting bucket information, considered it as false", ex); + return false; + } // check status of normal bucket try { getFileStatus(f); } catch (FileNotFoundException ex) { // remove orphan link bucket directly - if (isLinkBucket(f, ofsPath)) { - deleteBucketFromVolume(f, ofsPath); + if (bucket.isLink()) { + deleteBucketFromVolume(f, bucket); return true; } LOG.warn("delete: Path does not exist: {}", f); @@ -787,8 +801,8 @@ private boolean deleteBucket(Path f, boolean recursive, OFSPath ofsPath) boolean handleTrailingSlash = f.toString().endsWith(OZONE_URI_DELIMITER); // remove link bucket directly if link and // rm path does not have trailing slash - if (isLinkBucket(f, ofsPath) && !handleTrailingSlash) { - deleteBucketFromVolume(f, ofsPath); + if (bucket.isLink() && !handleTrailingSlash) { + deleteBucketFromVolume(f, bucket); return true; } @@ -799,31 +813,17 @@ private boolean deleteBucket(Path f, boolean recursive, OFSPath ofsPath) // if so, the contents of bucket were deleted and skip delete bucket // otherwise, Handle delete bucket if (!handleTrailingSlash) { - deleteBucketFromVolume(f, ofsPath); + deleteBucketFromVolume(f, bucket); } return result; } - private boolean isLinkBucket(Path f, OFSPath ofsPath) { - try { - OzoneBucket bucket = adapterImpl.getBucket(ofsPath, false); - if (bucket.isLink()) { - return true; - } - } catch (Exception ex) { - LOG.error("Exception while getting bucket link information, " + - "considered it as false", ex); - return false; - } - return false; - } - - private void deleteBucketFromVolume(Path f, OFSPath ofsPath) + private void deleteBucketFromVolume(Path f, OzoneBucket bucket) throws IOException { OzoneVolume volume = - adapterImpl.getObjectStore().getVolume(ofsPath.getVolumeName()); + adapterImpl.getObjectStore().getVolume(bucket.getVolumeName()); try { - volume.deleteBucket(ofsPath.getBucketName()); + volume.deleteBucket(bucket.getName()); } catch (OMException ex) { // bucket is not empty if (ex.getResult() == BUCKET_NOT_EMPTY) { diff --git a/hadoop-ozone/ozonefs-hadoop2/pom.xml b/hadoop-ozone/ozonefs-hadoop2/pom.xml index 8e31b055daa4..fad83ea86c1a 100644 --- a/hadoop-ozone/ozonefs-hadoop2/pom.xml +++ b/hadoop-ozone/ozonefs-hadoop2/pom.xml @@ -66,6 +66,10 @@ org.slf4j slf4j-log4j12 + + com.sun.jersey + * + @@ -112,6 +116,13 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.apache.maven.plugins maven-dependency-plugin diff --git a/hadoop-ozone/ozonefs-hadoop3-client/pom.xml b/hadoop-ozone/ozonefs-hadoop3-client/pom.xml index 4e35e986c155..f27bd411db72 100644 --- a/hadoop-ozone/ozonefs-hadoop3-client/pom.xml +++ b/hadoop-ozone/ozonefs-hadoop3-client/pom.xml @@ -43,6 +43,13 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.apache.maven.plugins maven-dependency-plugin diff --git a/hadoop-ozone/ozonefs-hadoop3/pom.xml b/hadoop-ozone/ozonefs-hadoop3/pom.xml index 6c900c56f86a..ca1c8983f5c1 100644 --- a/hadoop-ozone/ozonefs-hadoop3/pom.xml +++ b/hadoop-ozone/ozonefs-hadoop3/pom.xml @@ -63,6 +63,13 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.apache.maven.plugins maven-dependency-plugin diff --git a/hadoop-ozone/ozonefs-shaded/pom.xml b/hadoop-ozone/ozonefs-shaded/pom.xml index 417a4f9dca3b..df6c724883c9 100644 --- a/hadoop-ozone/ozonefs-shaded/pom.xml +++ b/hadoop-ozone/ozonefs-shaded/pom.xml @@ -81,6 +81,13 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.apache.maven.plugins maven-shade-plugin diff --git a/hadoop-ozone/ozonefs/pom.xml b/hadoop-ozone/ozonefs/pom.xml index f5cda0414c17..33bbb893cfd7 100644 --- a/hadoop-ozone/ozonefs/pom.xml +++ b/hadoop-ozone/ozonefs/pom.xml @@ -32,6 +32,13 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + none + + org.apache.maven.plugins maven-jar-plugin diff --git a/hadoop-ozone/recon-codegen/pom.xml b/hadoop-ozone/recon-codegen/pom.xml index 50c81ae657e9..26a70c459748 100644 --- a/hadoop-ozone/recon-codegen/pom.xml +++ b/hadoop-ozone/recon-codegen/pom.xml @@ -57,4 +57,46 @@ guice + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + + + diff --git a/hadoop-ozone/recon/pom.xml b/hadoop-ozone/recon/pom.xml index 917a691c543a..0e75e0850b0a 100644 --- a/hadoop-ozone/recon/pom.xml +++ b/hadoop-ozone/recon/pom.xml @@ -24,7 +24,7 @@ 4.0.0 ozone-recon - 7.33.6 + 8.15.7 @@ -36,6 +36,43 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.apache.ozone + hdds-config + ${hdds.version} + + + + org.apache.hadoop.hdds.conf.ConfigFileGenerator + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + ban-annotations + + + + Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. + + org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.hdds.scm.metadata.Replicate + org.kohsuke.MetaInfServices + + + + + + + org.codehaus.mojo exec-maven-plugin @@ -204,20 +241,6 @@ org.apache.ozone ozone-common - - - jersey-server - com.sun.jersey - - - jersey-core - com.sun.jersey - - - jersey-servlet - com.sun.jersey - - org.apache.ozone diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java index 6dbc4746acba..ed657931e034 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java @@ -43,6 +43,7 @@ private ReconConstants() { public static final int DISK_USAGE_TOP_RECORDS_LIMIT = 30; public static final String DEFAULT_OPEN_KEY_INCLUDE_NON_FSO = "false"; public static final String DEFAULT_OPEN_KEY_INCLUDE_FSO = "false"; + public static final String DEFAULT_START_PREFIX = "/"; public static final String DEFAULT_FETCH_COUNT = "1000"; public static final String DEFAULT_KEY_SIZE = "0"; public static final String DEFAULT_BATCH_NUMBER = "1"; @@ -50,6 +51,8 @@ private ReconConstants() { public static final String RECON_QUERY_PREVKEY = "prevKey"; public static final String RECON_OPEN_KEY_INCLUDE_NON_FSO = "includeNonFso"; public static final String RECON_OPEN_KEY_INCLUDE_FSO = "includeFso"; + public static final String RECON_OPEN_KEY_DEFAULT_SEARCH_LIMIT = "1000"; + public static final String RECON_OPEN_KEY_SEARCH_DEFAULT_PREV_KEY = ""; public static final String RECON_QUERY_FILTER = "missingIn"; public static final String PREV_CONTAINER_ID_DEFAULT_VALUE = "0"; public static final String PREV_DELETED_BLOCKS_TRANSACTION_ID_DEFAULT_VALUE = diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java index e346b4bc9e79..5c9f6a5f4e12 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconUtils.java @@ -32,10 +32,11 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; -import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.TimeZone; +import java.util.Date; +import java.util.Set; +import java.util.ArrayList; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -595,6 +596,54 @@ public static long convertToEpochMillis(String dateString, String dateFormat, Ti } } + /** + * Finds all subdirectories under a parent directory in an FSO bucket. It builds + * a list of paths for these subdirectories. These sub-directories are then used + * to search for open files in the openFileTable. + * + * How it works: + * - Starts from a parent directory identified by parentId. + * - Looks through all child directories of this parent. + * - For each child, it creates a path that starts with volumeID/bucketID/parentId, + * following our openFileTable format. + * - Adds these paths to a list and explores each child further for more subdirectories. + * + * @param parentId The ID of the parent directory from which to start gathering subdirectories. + * @param subPaths The list to which the paths of subdirectories will be added. + * @param volumeID The ID of the volume containing the parent directory. + * @param bucketID The ID of the bucket containing the parent directory. + * @param reconNamespaceSummaryManager The manager used to retrieve NSSummary objects. + * @throws IOException If an I/O error occurs while fetching NSSummary objects. + */ + public static void gatherSubPaths(long parentId, List subPaths, + long volumeID, long bucketID, + ReconNamespaceSummaryManager reconNamespaceSummaryManager) + throws IOException { + // Fetch the NSSummary object for parentId + NSSummary parentSummary = + reconNamespaceSummaryManager.getNSSummary(parentId); + if (parentSummary == null) { + return; + } + + Set childDirIds = parentSummary.getChildDir(); + for (Long childId : childDirIds) { + // Fetch the NSSummary for each child directory + NSSummary childSummary = + reconNamespaceSummaryManager.getNSSummary(childId); + if (childSummary != null) { + String subPath = + ReconUtils.constructObjectPathWithPrefix(volumeID, bucketID, + childId); + // Add to subPaths + subPaths.add(subPath); + // Recurse into this child directory + gatherSubPaths(childId, subPaths, volumeID, bucketID, + reconNamespaceSummaryManager); + } + } + } + /** * Validates volume or bucket names according to specific rules. * diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/AccessHeatMapEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/AccessHeatMapEndpoint.java index db67dabb03d5..b0a9681c5b86 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/AccessHeatMapEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/AccessHeatMapEndpoint.java @@ -107,4 +107,15 @@ private static void checkIfHeatMapFeatureIsEnabled() { throw new WebApplicationException(Response.Status.NOT_FOUND); } } + + /** + * This API do a health check for HeatMapProvider source if it is initialized + * and returning response. + * @return HealthCheckResponse wrapped in Response object. + */ + @GET + @Path("/healthCheck") + public Response getReadAccessMetaData() { + return Response.ok(heatMapService.doHeatMapHealthCheck()).build(); + } } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/OMDBInsightEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/OMDBInsightEndpoint.java index f4aaf50dfc57..3f95c04fc916 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/OMDBInsightEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/OMDBInsightEndpoint.java @@ -61,7 +61,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.TimeZone; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -1061,7 +1060,8 @@ public Map searchKeysInFSO(ParamInfo paramInfo) subPaths.add(startPrefixObjectPath); // Recursively gather all subpaths - gatherSubPaths(parentId, subPaths, Long.parseLong(names[0]), Long.parseLong(names[1])); + ReconUtils.gatherSubPaths(parentId, subPaths, Long.parseLong(names[0]), + Long.parseLong(names[1]), reconNamespaceSummaryManager); // Iterate over the subpaths and retrieve the files for (String subPath : subPaths) { paramInfo.setStartPrefix(subPath); @@ -1082,49 +1082,6 @@ public Map searchKeysInFSO(ParamInfo paramInfo) return matchedKeys; } - /** - * Finds all subdirectories under a parent directory in an FSO bucket. It builds - * a list of paths for these subdirectories. These sub-directories are then used - * to search for files in the fileTable. - *

- * How it works: - * - Starts from a parent directory identified by parentId. - * - Looks through all child directories of this parent. - * - For each child, it creates a path that starts with volumeID/bucketID/parentId, - * following our fileTable format - * - Adds these paths to a list and explores each child further for more subdirectories. - * - * @param parentId The ID of the directory we start exploring from. - * @param subPaths A list where we collect paths to all subdirectories. - * @param volumeID - * @param bucketID - * @throws IOException If there are problems accessing directory information. - */ - private void gatherSubPaths(long parentId, List subPaths, - long volumeID, long bucketID) throws IOException { - // Fetch the NSSummary object for parentId - NSSummary parentSummary = - reconNamespaceSummaryManager.getNSSummary(parentId); - if (parentSummary == null) { - return; - } - - Set childDirIds = parentSummary.getChildDir(); - for (Long childId : childDirIds) { - // Fetch the NSSummary for each child directory - NSSummary childSummary = - reconNamespaceSummaryManager.getNSSummary(childId); - if (childSummary != null) { - String subPath = - ReconUtils.constructObjectPathWithPrefix(volumeID, bucketID, childId); - // Add to subPaths - subPaths.add(subPath); - // Recurse into this child directory - gatherSubPaths(childId, subPaths, volumeID, bucketID); - } - } - } - /** * Converts a startPrefix path into an objectId path for FSO buckets, using IDs. diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/OMDBInsightSearchEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/OMDBInsightSearchEndpoint.java new file mode 100644 index 000000000000..9cd6fa33d032 --- /dev/null +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/OMDBInsightSearchEndpoint.java @@ -0,0 +1,389 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.recon.api; + +import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; +import org.apache.hadoop.hdds.utils.db.Table; +import org.apache.hadoop.hdds.utils.db.TableIterator; +import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo; +import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; +import org.apache.hadoop.ozone.om.helpers.BucketLayout; +import org.apache.hadoop.ozone.recon.ReconUtils; +import org.apache.hadoop.ozone.recon.api.handlers.BucketHandler; +import org.apache.hadoop.ozone.recon.api.types.KeyEntityInfo; +import org.apache.hadoop.ozone.recon.api.types.KeyInsightInfoResponse; +import org.apache.hadoop.ozone.recon.api.types.NSSummary; +import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; +import org.apache.hadoop.ozone.recon.spi.impl.ReconNamespaceSummaryManagerImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.util.Map; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.ArrayList; + +import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX; +import static org.apache.hadoop.ozone.recon.ReconConstants.DEFAULT_START_PREFIX; +import static org.apache.hadoop.ozone.recon.ReconConstants.RECON_OPEN_KEY_DEFAULT_SEARCH_LIMIT; +import static org.apache.hadoop.ozone.recon.ReconConstants.RECON_OPEN_KEY_SEARCH_DEFAULT_PREV_KEY; +import static org.apache.hadoop.ozone.recon.ReconResponseUtils.noMatchedKeysResponse; +import static org.apache.hadoop.ozone.recon.ReconResponseUtils.createBadRequestResponse; +import static org.apache.hadoop.ozone.recon.ReconResponseUtils.createInternalServerErrorResponse; +import static org.apache.hadoop.ozone.recon.ReconUtils.constructObjectPathWithPrefix; +import static org.apache.hadoop.ozone.recon.ReconUtils.validateNames; +import static org.apache.hadoop.ozone.recon.api.handlers.BucketHandler.getBucketHandler; +import static org.apache.hadoop.ozone.recon.api.handlers.EntityHandler.normalizePath; +import static org.apache.hadoop.ozone.recon.api.handlers.EntityHandler.parseRequestPath; + +/** + * REST endpoint for search implementation in OM DB Insight. + */ +@Path("/keys") +@Produces(MediaType.APPLICATION_JSON) +@AdminOnly +public class OMDBInsightSearchEndpoint { + + private OzoneStorageContainerManager reconSCM; + private final ReconOMMetadataManager omMetadataManager; + private static final Logger LOG = + LoggerFactory.getLogger(OMDBInsightSearchEndpoint.class); + private ReconNamespaceSummaryManagerImpl reconNamespaceSummaryManager; + + + @Inject + public OMDBInsightSearchEndpoint(OzoneStorageContainerManager reconSCM, + ReconOMMetadataManager omMetadataManager, + ReconNamespaceSummaryManagerImpl reconNamespaceSummaryManager) { + this.reconSCM = reconSCM; + this.omMetadataManager = omMetadataManager; + this.reconNamespaceSummaryManager = reconNamespaceSummaryManager; + } + + + /** + * Performs a search for open keys in the Ozone Manager (OM) database using a specified search prefix. + * This endpoint searches across both File System Optimized (FSO) and Object Store (non-FSO) layouts, + * compiling a list of keys that match the given prefix along with their data sizes. + *

+ * The search prefix must start from the bucket level ('/volumeName/bucketName/') or any specific directory + * or key level (e.g., '/volA/bucketA/dir1' for everything under 'dir1' inside 'bucketA' of 'volA'). + * The search operation matches the prefix against the start of keys' names within the OM DB. + *

+ * Example Usage: + * 1. A startPrefix of "/volA/bucketA/" retrieves every key under bucket 'bucketA' in volume 'volA'. + * 2. Specifying "/volA/bucketA/dir1" focuses the search within 'dir1' inside 'bucketA' of 'volA'. + * + * @param startPrefix The prefix for searching keys, starting from the bucket level or any specific path. + * @param limit Limits the number of returned keys. + * @param prevKey The key to start after for the next set of records. + * @return A KeyInsightInfoResponse, containing matching keys and their data sizes. + * @throws IOException On failure to access the OM database or process the operation. + * @throws IllegalArgumentException If the provided startPrefix or other arguments are invalid. + */ + @GET + @Path("/open/search") + public Response searchOpenKeys( + @DefaultValue(DEFAULT_START_PREFIX) @QueryParam("startPrefix") + String startPrefix, + @DefaultValue(RECON_OPEN_KEY_DEFAULT_SEARCH_LIMIT) @QueryParam("limit") + int limit, + @DefaultValue(RECON_OPEN_KEY_SEARCH_DEFAULT_PREV_KEY) @QueryParam("prevKey") String prevKey) throws IOException { + + try { + // Ensure startPrefix is not null or empty and starts with '/' + if (startPrefix == null || startPrefix.length() == 0) { + return createBadRequestResponse( + "Invalid startPrefix: Path must be at the bucket level or deeper."); + } + startPrefix = startPrefix.startsWith("/") ? startPrefix : "/" + startPrefix; + + // Split the path to ensure it's at least at the bucket level + String[] pathComponents = startPrefix.split("/"); + if (pathComponents.length < 3 || pathComponents[2].isEmpty()) { + return createBadRequestResponse( + "Invalid startPrefix: Path must be at the bucket level or deeper."); + } + + // Ensure the limit is non-negative + limit = Math.max(0, limit); + + // Initialize response object + KeyInsightInfoResponse insightResponse = new KeyInsightInfoResponse(); + long replicatedTotal = 0; + long unreplicatedTotal = 0; + boolean keysFound = false; // Flag to track if any keys are found + String lastKey = null; + + // Search for non-fso keys in KeyTable + Table openKeyTable = + omMetadataManager.getOpenKeyTable(BucketLayout.LEGACY); + Map obsKeys = + retrieveKeysFromTable(openKeyTable, startPrefix, limit, prevKey); + for (Map.Entry entry : obsKeys.entrySet()) { + keysFound = true; + KeyEntityInfo keyEntityInfo = + createKeyEntityInfoFromOmKeyInfo(entry.getKey(), entry.getValue()); + insightResponse.getNonFSOKeyInfoList() + .add(keyEntityInfo); // Add to non-FSO list + replicatedTotal += entry.getValue().getReplicatedSize(); + unreplicatedTotal += entry.getValue().getDataSize(); + lastKey = entry.getKey(); // Update lastKey + } + + // Search for fso keys in FileTable + Map fsoKeys = searchOpenKeysInFSO(startPrefix, limit, prevKey); + for (Map.Entry entry : fsoKeys.entrySet()) { + keysFound = true; + KeyEntityInfo keyEntityInfo = + createKeyEntityInfoFromOmKeyInfo(entry.getKey(), entry.getValue()); + insightResponse.getFsoKeyInfoList() + .add(keyEntityInfo); // Add to FSO list + replicatedTotal += entry.getValue().getReplicatedSize(); + unreplicatedTotal += entry.getValue().getDataSize(); + lastKey = entry.getKey(); // Update lastKey + } + + // If no keys were found, return a response indicating that no keys matched + if (!keysFound) { + return noMatchedKeysResponse(startPrefix); + } + + // Set the aggregated totals in the response + insightResponse.setReplicatedDataSize(replicatedTotal); + insightResponse.setUnreplicatedDataSize(unreplicatedTotal); + insightResponse.setLastKey(lastKey); + + // Return the response with the matched keys and their data sizes + return Response.ok(insightResponse).build(); + } catch (IOException e) { + // Handle IO exceptions and return an internal server error response + return createInternalServerErrorResponse( + "Error searching open keys in OM DB: " + e.getMessage()); + } catch (IllegalArgumentException e) { + // Handle illegal argument exceptions and return a bad request response + return createBadRequestResponse( + "Invalid startPrefix: " + e.getMessage()); + } + } + + public Map searchOpenKeysInFSO(String startPrefix, + int limit, String prevKey) + throws IOException, IllegalArgumentException { + Map matchedKeys = new LinkedHashMap<>(); + // Convert the search prefix to an object path for FSO buckets + String startPrefixObjectPath = convertToObjectPath(startPrefix); + String[] names = parseRequestPath(startPrefixObjectPath); + Table openFileTable = + omMetadataManager.getOpenKeyTable(BucketLayout.FILE_SYSTEM_OPTIMIZED); + + // If names.length <= 2, then the search prefix is at the volume or bucket level hence + // no need to find parent or extract id's or find subpaths as the openFileTable is + // suitable for volume and bucket level search + if (names.length > 2 && startPrefixObjectPath.endsWith(OM_KEY_PREFIX)) { + // Fetch the parent ID to search for + long parentId = Long.parseLong(names[names.length - 1]); + + // Fetch the nameSpaceSummary for the parent ID + NSSummary parentSummary = reconNamespaceSummaryManager.getNSSummary(parentId); + if (parentSummary == null) { + return matchedKeys; + } + List subPaths = new ArrayList<>(); + // Add the initial search prefix object path because it can have both openFiles + // and subdirectories with openFiles + subPaths.add(startPrefixObjectPath); + + // Recursively gather all subpaths + ReconUtils.gatherSubPaths(parentId, subPaths, Long.parseLong(names[0]), Long.parseLong(names[1]), + reconNamespaceSummaryManager); + + // Iterate over the subpaths and retrieve the open files + for (String subPath : subPaths) { + matchedKeys.putAll(retrieveKeysFromTable(openFileTable, subPath, limit - matchedKeys.size(), prevKey)); + if (matchedKeys.size() >= limit) { + break; + } + } + return matchedKeys; + } + + // If the search level is at the volume, bucket or key level, directly search the openFileTable + matchedKeys.putAll(retrieveKeysFromTable(openFileTable, startPrefixObjectPath, limit, prevKey)); + return matchedKeys; + } + + /** + * Converts a key prefix into an object path for FSO buckets, using IDs. + * + * This method transforms a user-provided path (e.g., "volume/bucket/dir1") into + * a database-friendly format ("/volumeID/bucketID/ParentId/") by replacing names + * with their corresponding IDs. It simplifies database queries for FSO bucket operations. + * + * Examples: + * - Input: "volume/bucket/key" -> Output: "/volumeID/bucketID/parentDirID/key" + * - Input: "volume/bucket/dir1" -> Output: "/volumeID/bucketID/dir1ID/" + * - Input: "volume/bucket/dir1/key1" -> Output: "/volumeID/bucketID/dir1ID/key1" + * - Input: "volume/bucket/dir1/dir2" -> Output: "/volumeID/bucketID/dir2ID/" + * + * @param prevKeyPrefix The path to be converted. + * @return The object path as "/volumeID/bucketID/ParentId/" or an empty string if an error occurs. + * @throws IOException If database access fails. + * @throws IllegalArgumentException If the provided path is invalid or cannot be converted. + */ + public String convertToObjectPath(String prevKeyPrefix) throws IOException { + try { + String[] names = parseRequestPath(normalizePath(prevKeyPrefix, BucketLayout.FILE_SYSTEM_OPTIMIZED)); + Table openFileTable = omMetadataManager.getOpenKeyTable(BucketLayout.FILE_SYSTEM_OPTIMIZED); + + // Root-Level: Return the original path + if (names.length == 0) { + return prevKeyPrefix; + } + + // Volume-Level: Fetch the volumeID + String volumeName = names[0]; + validateNames(volumeName); + String volumeKey = omMetadataManager.getVolumeKey(volumeName); + long volumeId = omMetadataManager.getVolumeTable().getSkipCache(volumeKey).getObjectID(); + if (names.length == 1) { + return constructObjectPathWithPrefix(volumeId); + } + + // Bucket-Level: Fetch the bucketID + String bucketName = names[1]; + validateNames(bucketName); + String bucketKey = omMetadataManager.getBucketKey(volumeName, bucketName); + OmBucketInfo bucketInfo = omMetadataManager.getBucketTable().getSkipCache(bucketKey); + long bucketId = bucketInfo.getObjectID(); + if (names.length == 2 || bucketInfo.getBucketLayout() != BucketLayout.FILE_SYSTEM_OPTIMIZED) { + return constructObjectPathWithPrefix(volumeId, bucketId); + } + + // Directory or Key-Level: Check both key and directory + BucketHandler handler = + getBucketHandler(reconNamespaceSummaryManager, omMetadataManager, reconSCM, bucketInfo); + + if (names.length >= 3) { + String lastEntiry = names[names.length - 1]; + + // Check if the directory exists + OmDirectoryInfo dirInfo = handler.getDirInfo(names); + if (dirInfo != null && dirInfo.getName().equals(lastEntiry)) { + return constructObjectPathWithPrefix(volumeId, bucketId, dirInfo.getObjectID()) + OM_KEY_PREFIX; + } + + // Check if the key exists + long dirID = handler.getDirObjectId(names, names.length); + String keyKey = constructObjectPathWithPrefix(volumeId, bucketId, dirID) + + OM_KEY_PREFIX + lastEntiry; + OmKeyInfo keyInfo = openFileTable.getSkipCache(keyKey); + if (keyInfo != null && keyInfo.getFileName().equals(lastEntiry)) { + return constructObjectPathWithPrefix(volumeId, bucketId, + keyInfo.getParentObjectID()) + OM_KEY_PREFIX + lastEntiry; + } + + return prevKeyPrefix; + } + } catch (IllegalArgumentException e) { + LOG.error( + "IllegalArgumentException encountered while converting key prefix to object path: {}", + prevKeyPrefix, e); + throw e; + } catch (RuntimeException e) { + LOG.error( + "RuntimeException encountered while converting key prefix to object path: {}", + prevKeyPrefix, e); + return prevKeyPrefix; + } + return prevKeyPrefix; + } + + + /** + * Common method to retrieve keys from a table based on a search prefix and a limit. + * + * @param table The table to retrieve keys from. + * @param startPrefix The search prefix to match keys against. + * @param limit The maximum number of keys to retrieve. + * @param prevKey The key to start after for the next set of records. + * @return A map of keys and their corresponding OmKeyInfo objects. + * @throws IOException If there are problems accessing the table. + */ + private Map retrieveKeysFromTable( + Table table, String startPrefix, int limit, String prevKey) + throws IOException { + Map matchedKeys = new LinkedHashMap<>(); + try (TableIterator> keyIter = table.iterator()) { + // If a previous key is provided, seek to the previous key and skip it. + if (!prevKey.isEmpty()) { + keyIter.seek(prevKey); + if (keyIter.hasNext()) { + // Skip the previous key + keyIter.next(); + } + } else { + // If no previous key is provided, start from the search prefix. + keyIter.seek(startPrefix); + } + while (keyIter.hasNext() && matchedKeys.size() < limit) { + Table.KeyValue entry = keyIter.next(); + String dbKey = entry.getKey(); + if (!dbKey.startsWith(startPrefix)) { + break; // Exit the loop if the key no longer matches the prefix + } + matchedKeys.put(dbKey, entry.getValue()); + } + } catch (IOException exception) { + LOG.error("Error retrieving keys from table for path: {}", startPrefix, exception); + throw exception; + } + return matchedKeys; + } + + /** + * Creates a KeyEntityInfo object from an OmKeyInfo object and the corresponding key. + * + * @param dbKey The key in the database corresponding to the OmKeyInfo object. + * @param keyInfo The OmKeyInfo object to create the KeyEntityInfo from. + * @return The KeyEntityInfo object created from the OmKeyInfo object and the key. + */ + private KeyEntityInfo createKeyEntityInfoFromOmKeyInfo(String dbKey, + OmKeyInfo keyInfo) { + KeyEntityInfo keyEntityInfo = new KeyEntityInfo(); + keyEntityInfo.setKey(dbKey); // Set the DB key + keyEntityInfo.setPath(keyInfo.getKeyName()); // Assuming path is the same as key name + keyEntityInfo.setInStateSince(keyInfo.getCreationTime()); + keyEntityInfo.setSize(keyInfo.getDataSize()); + keyEntityInfo.setReplicatedSize(keyInfo.getReplicatedSize()); + keyEntityInfo.setReplicationConfig(keyInfo.getReplicationConfig()); + return keyEntityInfo; + } + +} diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/HealthCheckResponse.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/HealthCheckResponse.java new file mode 100644 index 000000000000..de4bb8651309 --- /dev/null +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/HealthCheckResponse.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.recon.api.types; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * This is Solr Health Check response for healthCheck API. + */ +public final class HealthCheckResponse { + + /** Health check response message. */ + @JsonProperty("message") + private String message; + + /** Health check status code. */ + @JsonProperty("status") + private int status; + + // Private constructor to prevent direct instantiation + private HealthCheckResponse(Builder builder) { + this.message = builder.message; + this.status = builder.status; + } + + public String getMessage() { + return message; + } + + public int getStatus() { + return status; + } + + /** + * Builder class. + */ + public static class Builder { + + // Required parameters + private String message; + + private int status; + + // Constructor with required parameters + public Builder(String message, int status) { + this.message = message; + this.status = status; + } + + // Build method to create a new Person instance + public HealthCheckResponse build() { + return new HealthCheckResponse(this); + } + } +} diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/HeatMapServiceImpl.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/HeatMapServiceImpl.java index 73868077e53f..4012b8dc0361 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/HeatMapServiceImpl.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/HeatMapServiceImpl.java @@ -24,11 +24,14 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; import org.apache.hadoop.ozone.recon.api.types.EntityReadAccessHeatMapResponse; +import org.apache.hadoop.ozone.recon.api.types.HealthCheckResponse; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.ws.rs.core.Response; + import static org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_HEATMAP_PROVIDER_KEY; import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX; @@ -104,4 +107,11 @@ private String validatePath(String path) { return path; } + public HealthCheckResponse doHeatMapHealthCheck() { + if (null != heatMapProvider) { + return heatMapProvider.doHeatMapHealthCheck(); + } + return new HealthCheckResponse.Builder("HeatMapProviderImpl class not loaded or initialized.", + Response.Status.OK.getStatusCode()).build(); + } } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/IHeatMapProvider.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/IHeatMapProvider.java index 40d9475f5d8d..1e6d64b34da4 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/IHeatMapProvider.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/heatmap/IHeatMapProvider.java @@ -22,9 +22,12 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; import org.apache.hadoop.ozone.recon.api.types.EntityMetaData; +import org.apache.hadoop.ozone.recon.api.types.HealthCheckResponse; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager; +import javax.ws.rs.core.Response; +import java.net.InetSocketAddress; import java.util.List; /** @@ -65,4 +68,12 @@ void init(OzoneConfiguration ozoneConfiguration, ReconOMMetadataManager omMetadataManager, ReconNamespaceSummaryManager namespaceSummaryManager, OzoneStorageContainerManager reconSCM) throws Exception; + + default InetSocketAddress getSolrAddress() { + return null; + } + + default HealthCheckResponse doHeatMapHealthCheck() { + return new HealthCheckResponse.Builder("Healthy", Response.Status.OK.getStatusCode()).build(); + }; } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java index 4b041f6511f6..15fea3574aa7 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/recovery/ReconOmMetadataManagerImpl.java @@ -24,7 +24,6 @@ import java.io.File; import java.io.IOException; -import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.ArrayList; import java.util.List; @@ -72,11 +71,6 @@ public ReconOmMetadataManagerImpl(OzoneConfiguration configuration, this.ozoneConfiguration = configuration; } - @Override - public ReentrantReadWriteLock getTableLock(String tableName) { - return super.getTableLock(tableName); - } - @Override public void start(OzoneConfiguration configuration) throws IOException { LOG.info("Starting ReconOMMetadataManagerImpl"); diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/OzoneManagerServiceProviderImpl.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/OzoneManagerServiceProviderImpl.java index bde89eea1da8..491d631249cd 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/OzoneManagerServiceProviderImpl.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/OzoneManagerServiceProviderImpl.java @@ -38,9 +38,12 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; +import com.google.common.collect.Iterators; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.hadoop.hdds.recon.ReconConfigKeys; import org.apache.hadoop.hdds.utils.db.RocksDatabase; +import org.apache.hadoop.hdds.utils.db.Table; +import org.apache.hadoop.hdds.utils.db.TableIterator; import org.apache.hadoop.hdds.utils.db.managed.ManagedWriteBatch; import org.apache.hadoop.hdds.utils.db.managed.ManagedWriteOptions; import org.apache.hadoop.hdfs.web.URLConnectionFactory; @@ -260,6 +263,23 @@ public void start() { omMetadataManager.start(configuration); } catch (IOException ioEx) { LOG.error("Error starting Recon OM Metadata Manager.", ioEx); + } catch (RuntimeException runtimeException) { + LOG.warn("Unexpected runtime error starting Recon OM Metadata Manager.", runtimeException); + LOG.warn("Trying to delete existing recon OM snapshot DB and fetch new one."); + metrics.incrNumSnapshotRequests(); + LOG.info("Fetching full snapshot from Ozone Manager"); + // Update local Recon OM DB to new snapshot. + try { + boolean success = updateReconOmDBWithNewSnapshot(); + if (success) { + LOG.info("Successfully fetched a full snapshot from Ozone Manager"); + } else { + LOG.error("Failed fetching a full snapshot from Ozone Manager"); + } + } catch (IOException e) { + LOG.error("Unexpected IOException occurred while trying to fetch a full snapshot: {}", e); + throw new RuntimeException(runtimeException); + } } reconTaskController.start(); long initialDelay = configuration.getTimeDuration( @@ -537,6 +557,7 @@ boolean innerGetAndApplyDeltaUpdatesFromOM(long fromSequenceNumber, /** * Based on current state of Recon's OM DB, we either get delta updates or * full snapshot from Ozone Manager. + * @return true or false if sync operation between Recon and OM was successful or failed. */ @VisibleForTesting public boolean syncDataFromOM() { @@ -613,6 +634,7 @@ public boolean syncDataFromOM() { reconContext.updateErrors(ReconContext.ErrorCode.GET_OM_DB_SNAPSHOT_FAILED); } } + printOMDBMetaInfo(); } finally { isSyncDataFromOMRunning.set(false); } @@ -623,6 +645,27 @@ public boolean syncDataFromOM() { return true; } + private void printOMDBMetaInfo() { + printTableCount("fileTable"); + printTableCount("keyTable"); + } + + private void printTableCount(String tableName) { + Table table = omMetadataManager.getTable(tableName); + if (table == null) { + LOG.error("Table {} not found in OM Metadata.", tableName); + return; + } + if (LOG.isDebugEnabled()) { + try (TableIterator> iterator = table.iterator()) { + long count = Iterators.size(iterator); + LOG.debug("{} Table count: {}", tableName, count); + } catch (IOException ioException) { + LOG.error("Unexpected error while iterating table for table count: {}", tableName); + } + } + } + public void checkAndValidateReconDbPermissions() { File dbDir = new File(reconDbDir.getPath()); if (!dbDir.exists()) { diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java index cfaf4bb60a8f..41e6bf962a7e 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/OMDBUpdatesHandler.java @@ -48,8 +48,7 @@ public class OMDBUpdatesHandler extends ManagedWriteBatch.Handler { private Map tablesNames; private OMMetadataManager omMetadataManager; private List omdbUpdateEvents = new ArrayList<>(); - private Map omdbLatestUpdateEvents - = new HashMap<>(); + private Map> omdbLatestUpdateEvents = new HashMap<>(); private OMDBDefinition omdbDefinition; private OmUpdateEventValidator omUpdateEventValidator; @@ -112,6 +111,10 @@ private void processEvent(int cfIndex, byte[] keyBytes, byte[] final Object key = cf.getKeyCodec().fromPersistedFormat(keyBytes); builder.setKey(key); + // Initialize table-specific event map if it does not exist + omdbLatestUpdateEvents.putIfAbsent(tableName, new HashMap<>()); + Map tableEventsMap = omdbLatestUpdateEvents.get(tableName); + // Handle the event based on its type: // - PUT with a new key: Insert the new value. // - PUT with an existing key: Update the existing value. @@ -120,7 +123,7 @@ private void processEvent(int cfIndex, byte[] keyBytes, byte[] // necessary. Table table = omMetadataManager.getTable(tableName); - OMDBUpdateEvent latestEvent = omdbLatestUpdateEvents.get(key); + OMDBUpdateEvent latestEvent = tableEventsMap.get(key); Object oldValue; if (latestEvent != null) { oldValue = latestEvent.getValue(); @@ -184,7 +187,7 @@ private void processEvent(int cfIndex, byte[] keyBytes, byte[] "action = %s", tableName, action)); } omdbUpdateEvents.add(event); - omdbLatestUpdateEvents.put(key, event); + tableEventsMap.put(key, event); } else { // Log and ignore events if key or value types are undetermined. if (LOG.isWarnEnabled()) { diff --git a/hadoop-hdds/config/src/test/resources/META-INF/services/javax.annotation.processing.Processor b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.eslintignore similarity index 84% rename from hadoop-hdds/config/src/test/resources/META-INF/services/javax.annotation.processing.Processor rename to hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.eslintignore index f29efdab384d..bc0a48bc9b3f 100644 --- a/hadoop-hdds/config/src/test/resources/META-INF/services/javax.annotation.processing.Processor +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.eslintignore @@ -4,13 +4,23 @@ # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at -# + # http://www.apache.org/licenses/LICENSE-2.0 -# + # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -org.apache.hadoop.hdds.conf.ConfigFileGenerator +# Ignore node modules and dist/build folders +./node_modules +./build +./dist + +./api + + +# Vite related configs +./vite.config.ts +./vite-env.d.ts \ No newline at end of file diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.eslintrc.json b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.eslintrc.json new file mode 100644 index 000000000000..87c1020ac88b --- /dev/null +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.eslintrc.json @@ -0,0 +1,112 @@ +/** +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at + +* http://www.apache.org/licenses/LICENSE-2.0 + +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +{ + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:@typescript-eslint/recommended", + "plugin:import/typescript", + "prettier" + ], + "plugins": ["react", "@typescript-eslint", "prettier"], + "rules": { + "camelcase": "off", + "space-infix-ops": "warn", + "quotes": [ + "warn", + "single", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_\\w*", + "varsIgnorePattern": "^_\\w*" + } + ], + "object-curly-spacing": [ + "warn", + "always" + ], + "object-property-newline": "warn", + "no-return-assign": "off", + "indent": [ + "warn", + 2, + { + "SwitchCase": 1 + } + ], + "constructor-super": "warn", + "import/no-unassigned-import": "off", + "import/no-unused-modules": [ + 1, + { + "unusedExports": true + } + ], + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": true, + "optionalDependencies": true, + "peerDependencies": true + } + ], + "react/state-in-constructor": "off", + "react/require-default-props": "off", + "react/default-props-match-prop-types": "off", + "react/no-array-index-key": "off", + "promise/prefer-await-to-then": "warn", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/prefer-readonly-parameter-types": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", { + "argsIgnorePattern": "^_\\w*", + "varsIgnorePattern": "^_\\w*" + } + ], + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/interface-name-prefix": ["warn", { "prefixWithI": "always" }] + }, + "settings": { + "import/parsers": { + "@typescript-eslint/parser": [ + ".ts", + ".tsx" + ] + }, + "import/resolver": { + "typescript": {} + }, + "react": { + "version": "16.8.6", + "pragma": "React", + "fragment": "Fragment" + } + }, + "env": { + "browser": true, + "node": true + } + } + \ No newline at end of file diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.prettierrc.js b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.prettierrc.js new file mode 100644 index 000000000000..c0b2a338061f --- /dev/null +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.prettierrc.js @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at + +* http://www.apache.org/licenses/LICENSE-2.0 + +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +const config = { + semi: true, + tabWidth: 2, + printWidth: 100, + singleQuote: true, + trailingComma: "es5", + jsxSingleQuote: true, + bracketSpacing: true, +}; + +export default config; diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.vscode/extensions.json b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.vscode/extensions.json new file mode 100644 index 000000000000..033f6c1512cf --- /dev/null +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + ] +} \ No newline at end of file diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.vscode/settings.json b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.vscode/settings.json new file mode 100644 index 000000000000..2a7da4bb70e5 --- /dev/null +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "typescript.locale": "en", + "typescript.preferences.importModuleSpecifier": "non-relative", + "typescript.suggest.autoImports": true, + "prettier.printWidth": 120, + "prettier.semi": true, + "prettier.tabWidth": 2 +} \ No newline at end of file diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json index 51f65119352f..3362faf62818 100644 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json @@ -744,55 +744,54 @@ "leaderNode": "localhost1.storage.enterprise.com", "datanodes": [ { - "level": 0, - "parent": null, - "cost": 0, - "uuid": "9e4e92da-4abd-461d-b042-dc4fe72e8727", - "uuidString": "9e4e92da-4abd-461d-b042-dc4fe72e8727", - "ipAddress": "172.22.0.5", - "hostName": "ozone_datanode_1.ozone_default", - "ports": [ - { - "name": "REPLICATION", - "value": 9886 - }, - { - "name": "RATIS", - "value": 9858 - }, - { - "name": "RATIS_ADMIN", - "value": 9857 - }, - { - "name": "RATIS_SERVER", - "value": 9856 - }, - { - "name": "RATIS_DATASTREAM", - "value": 9855 - }, - { - "name": "STANDALONE", - "value": 9859 - } - - ], - "certSerialId": null, - "version": null, - "setupTime": 0, - "revision": null, - "buildDate": null, - "persistedOpState": "IN_SERVICE", - "persistedOpStateExpiryEpochSec": 0, - "initialVersion": 0, - "currentVersion": 1, - "signature": -460136136, - "decomissioned": false, - "networkName": "9e4e92da-4abd-461d-b042-dc4fe72e8727", - "networkLocation": "/default-rack", - "networkFullPath": "/default-rack/9e4e92da-4abd-461d-b042-dc4fe72e8727", - "numOfLeaves": 1 + "level": 0, + "parent": null, + "cost": 0, + "uuid": "9e4e92da-4abd-461d-b042-dc4fe72e8727", + "uuidString": "9e4e92da-4abd-461d-b042-dc4fe72e8727", + "ipAddress": "172.22.0.5", + "hostName": "ozone_datanode_1.ozone_default", + "ports": [ + { + "name": "REPLICATION", + "value": 9886 + }, + { + "name": "RATIS", + "value": 9858 + }, + { + "name": "RATIS_ADMIN", + "value": 9857 + }, + { + "name": "RATIS_SERVER", + "value": 9856 + }, + { + "name": "RATIS_DATASTREAM", + "value": 9855 + }, + { + "name": "STANDALONE", + "value": 9859 + } + ], + "certSerialId": null, + "version": null, + "setupTime": 0, + "revision": null, + "buildDate": null, + "persistedOpState": "IN_SERVICE", + "persistedOpStateExpiryEpochSec": 0, + "initialVersion": 0, + "currentVersion": 1, + "signature": -460136136, + "decomissioned": false, + "networkName": "9e4e92da-4abd-461d-b042-dc4fe72e8727", + "networkLocation": "/default-rack", + "networkFullPath": "/default-rack/9e4e92da-4abd-461d-b042-dc4fe72e8727", + "numOfLeaves": 1 } ], "lastLeaderElection": 1578491471528, @@ -1629,11 +1628,11 @@ "blockID": { "containerBlockID": { "containerID": 1, - "localID": 111677748019200007 + "localID": 111677748019200000 }, "blockCommitSequenceId": 18, "containerID": 1, - "localID": 111677748019200007 + "localID": 111677748019200000 }, "length": 3879, "offset": 0, @@ -1642,7 +1641,7 @@ "pipeline": null, "partNumber": 0, "containerID": 1, - "localID": 111677748019200007, + "localID": 111677748019200000, "blockCommitSequenceId": 18 } ], @@ -1652,11 +1651,11 @@ "blockID": { "containerBlockID": { "containerID": 1, - "localID": 111677748019200007 + "localID": 111677748019200000 }, "blockCommitSequenceId": 18, "containerID": 1, - "localID": 111677748019200007 + "localID": 111677748019200000 }, "length": 3879, "offset": 0, @@ -1665,7 +1664,7 @@ "pipeline": null, "partNumber": 0, "containerID": 1, - "localID": 111677748019200007, + "localID": 111677748019200000, "blockCommitSequenceId": 18 } ], @@ -1675,11 +1674,11 @@ "blockID": { "containerBlockID": { "containerID": 1, - "localID": 111677748019200007 + "localID": 111677748019200000 }, "blockCommitSequenceId": 18, "containerID": 1, - "localID": 111677748019200007 + "localID": 111677748019200000 }, "length": 3879, "offset": 0, @@ -1688,7 +1687,7 @@ "pipeline": null, "partNumber": 0, "containerID": 1, - "localID": 111677748019200007, + "localID": 111677748019200000, "blockCommitSequenceId": 18 } ] @@ -1858,6 +1857,15 @@ ], "sizeDirectKey": 0 }, + "replica": { + "status": "OK", + "path": "/s3v/fso-bucket/dir1/key1-fso", + "size": 17289, + "sizeWithReplica": 17289, + "subPathCount": 0, + "subPaths": [], + "sizeDirectKey": -1 + }, "taskStatus": [ { "taskName": "ContainerKeyMapperTask", @@ -2304,8 +2312,7 @@ "quotaInBytes": -1, "quotaInNamespace": -1, "usedNamespace": 3000, - "acls": [ - ] + "acls": [] }, { "volume": "vol4", @@ -2543,7 +2550,7 @@ "label": "", "size": 256, "accessCount": 39202, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2558,7 +2565,7 @@ "label": "", "size": 256, "accessCount": 5675, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2573,7 +2580,7 @@ "label": "", "size": 256, "accessCount": 4867, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2588,7 +2595,7 @@ "label": "", "size": 256, "accessCount": 4655, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2603,7 +2610,7 @@ "label": "", "size": 256, "accessCount": 4606, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2618,7 +2625,7 @@ "label": "", "size": 256, "accessCount": 3832, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2633,7 +2640,7 @@ "label": "", "size": 256, "accessCount": 2369, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2648,7 +2655,7 @@ "label": "", "size": 256, "accessCount": 2228, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2663,7 +2670,7 @@ "label": "", "size": 256, "accessCount": 1984, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2678,7 +2685,7 @@ "label": "", "size": 256, "accessCount": 1895, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2693,7 +2700,7 @@ "label": "", "size": 256, "accessCount": 271, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2708,7 +2715,7 @@ "label": "", "size": 256, "accessCount": 245, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2730,7 +2737,7 @@ "label": "", "size": 256, "accessCount": 1015, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2745,7 +2752,7 @@ "label": "", "size": 256, "accessCount": 839, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2760,7 +2767,7 @@ "label": "", "size": 256, "accessCount": 727, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2782,7 +2789,7 @@ "label": "", "size": 256, "accessCount": 271, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2797,7 +2804,7 @@ "label": "", "size": 256, "accessCount": 237, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2812,7 +2819,7 @@ "label": "", "size": 256, "accessCount": 213, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2834,7 +2841,7 @@ "label": "", "size": 256, "accessCount": 187, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2849,7 +2856,7 @@ "label": "", "size": 256, "accessCount": 185, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2864,7 +2871,7 @@ "label": "", "size": 256, "accessCount": 73, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2886,7 +2893,7 @@ "label": "label1", "size": 0, "accessCount": 3, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2901,7 +2908,7 @@ "label": "label2", "size": 256, "accessCount": 2, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2923,7 +2930,7 @@ "label": "", "size": 256, "accessCount": 2, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2945,7 +2952,7 @@ "label": "", "size": 256, "accessCount": 2, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2967,7 +2974,7 @@ "label": "", "size": 256, "accessCount": 2, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2982,7 +2989,7 @@ "label": "", "size": 256, "accessCount": 1, - "color": 1.0 + "color": 1 } ], "size": 256, @@ -2999,7 +3006,7 @@ "minAccessCount": 1, "maxAccessCount": 39202 }, - "keyHeatmap": { + "keyHeatmap": { "label": "root", "children": [ { @@ -3012,7 +3019,7 @@ "label": "demo2", "size": 256, "accessCount": 84, - "color": 1.0 + "color": 1 }, { "label": "demo35", @@ -3345,7 +3352,7 @@ "label": "demo1", "size": 256, "accessCount": 65, - "color": 1.0 + "color": 1 }, { "label": "demo2", @@ -3366,7 +3373,7 @@ "label": "demo2", "size": 256, "accessCount": 55, - "color": 1.0 + "color": 1 }, { "label": "demo3", @@ -3411,7 +3418,7 @@ "label": "demo6", "size": 256, "accessCount": 49, - "color": 1.0 + "color": 1 }, { "label": "demo2", @@ -3462,7 +3469,7 @@ "label": "demo9", "size": 256, "accessCount": 48, - "color": 1.0 + "color": 1 }, { "label": "demo6", @@ -3549,7 +3556,7 @@ "label": "test_dir/demo1", "size": 256, "accessCount": 45, - "color": 1.0 + "color": 1 }, { "label": "test_dir/demo2", @@ -3570,7 +3577,7 @@ "label": "demo17", "size": 256, "accessCount": 44, - "color": 1.0 + "color": 1 }, { "label": "demo5", @@ -3651,7 +3658,7 @@ "label": "test_dir/demo2", "size": 256, "accessCount": 38, - "color": 1.0 + "color": 1 }, { "label": "test_dir/demo1", @@ -3679,13 +3686,13 @@ "label": ".trash", "size": 256, "accessCount": 24, - "color": 1.0 + "color": 1 }, { "label": ".trash/om", "size": 256, "accessCount": 24, - "color": 1.0 + "color": 1 } ], "size": 512, @@ -3715,7 +3722,7 @@ "label": "enc_path/hive_tpcds/store_sales/test1.dat", "size": 1026, "accessCount": 155074, - "color": 1.0 + "color": 1 }, { "label": "enc_path/hive_tpcds/catalog_sales/test2", @@ -3743,7 +3750,7 @@ "label": "enc_path/hive_tpcds/store_sales/test11.dat", "size": 2500, "accessCount": 155074, - "color": 1.0 + "color": 1 }, { "label": "enc_path/hive_tpcds/catalog_sales/test12", @@ -3769,18 +3776,17 @@ "disabledFeatures": [ "FLAG1" ], - "keysOpenSummary": { "totalUnreplicatedDataSize": 10485760, "totalReplicatedDataSize": 31457280, "totalOpenKeys": 10 }, - "keysdeletePendingSummary":{ - "totalUnreplicatedDataSize": 29291, - "totalReplicatedDataSize": 87873, - "totalDeletedKeys": 3 + "keysdeletePendingSummary": { + "totalUnreplicatedDataSize": 29291, + "totalReplicatedDataSize": 87873, + "totalDeletedKeys": 3 }, - "omMismatch":{ + "omMismatch": { "containerDiscrepancyInfo": [ { "containerId": 1, @@ -3790,7 +3796,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-61374b069adb" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -3802,7 +3807,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-613724nn" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -3810,7 +3814,6 @@ }, "healthy": true } - ], "existsAt": "SCM" }, @@ -3984,7 +3987,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-61374b069adb" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -3996,7 +3998,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-613724nn" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4004,7 +4005,6 @@ }, "healthy": true } - ], "existsAt": "SCM" }, @@ -4208,7 +4208,7 @@ } ] }, - "scmMismatch":{ + "scmMismatch": { "containerDiscrepancyInfo": [ { "containerId": 1, @@ -4218,7 +4218,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-61374b069adb" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4230,7 +4229,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-613724nn" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4238,7 +4236,6 @@ }, "healthy": true } - ], "existsAt": "OM" }, @@ -4412,7 +4409,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-61374b069adb" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4424,7 +4420,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-613724nn" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4432,7 +4427,6 @@ }, "healthy": true } - ], "existsAt": "OM" }, @@ -4606,7 +4600,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-61374b069adb" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4618,7 +4611,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-613724nn" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4626,7 +4618,6 @@ }, "healthy": true } - ], "existsAt": "OM" }, @@ -4800,7 +4791,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-61374b069adb" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4812,7 +4802,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-613724nn" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -4820,7 +4809,6 @@ }, "healthy": true } - ], "existsAt": "OM" }, @@ -4994,7 +4982,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-61374b069adb" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -5006,7 +4993,6 @@ "id": { "id": "1202e6bb-b7c1-4a85-8067-613724nn" }, - "replicationConfig": { "replicationFactor": "ONE", "requiredNodes": 1, @@ -5014,7 +5000,6 @@ }, "healthy": true } - ], "existsAt": "OM" }, @@ -5184,9 +5169,9 @@ }, "nonFSO": { "keysSummary": { - "totalUnreplicatedDataSize": 10485760, - "totalReplicatedDataSize": 31457280, - "totalOpenKeys": 10 + "totalUnreplicatedDataSize": 10485760, + "totalReplicatedDataSize": 31457280, + "totalOpenKeys": 10 }, "nonFSO": [ { @@ -5202,7 +5187,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2439/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2439/110569623850191714", "path": "nonfso 2", "inStateSince": 1686156886632, "size": 268435456, @@ -5214,7 +5199,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2440/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2440/110569623850191715", "path": "nonfso 11", "inStateSince": 1686156886632, "size": 268435456, @@ -5226,7 +5211,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2441/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2441/110569623850191716", "path": "nonfso 12", "inStateSince": 1686156886632, "size": 268435456, @@ -5238,7 +5223,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2440/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2440/110569623850191717", "path": "nonfso 21", "inStateSince": 1686156886632, "size": 268435456, @@ -5247,10 +5232,10 @@ "replicationFactor": "ONE", "requiredNodes": 1, "replicationType": "RATIS" - } + } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2441/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2441/110569623850191718", "path": "nonfso 22", "inStateSince": 1686156886632, "size": 268435456, @@ -5259,7 +5244,7 @@ "replicationFactor": "ONE", "requiredNodes": 1, "replicationType": "RATIS" - } + } } ], "status": "OK" @@ -5279,7 +5264,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2402/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2402/110569623850191714", "path": "2", "inStateSince": 1686156887186, "size": 268435456, @@ -5289,10 +5274,9 @@ "requiredNodes": 1, "replicationType": "RATIS" } - }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2403/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2403/110569623850191715", "path": "3", "inStateSince": 1686156887186, "size": 268435456, @@ -5302,10 +5286,9 @@ "requiredNodes": 1, "replicationType": "RATIS" } - }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2404/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2404/110569623850191716", "path": "4", "inStateSince": 1686156887186, "size": 268435456, @@ -5317,7 +5300,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2405/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2405/110569623850191717", "path": "5", "inStateSince": 1686156887186, "size": 268435456, @@ -5327,10 +5310,9 @@ "requiredNodes": 1, "replicationType": "RATIS" } - }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2406/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2406/110569623850191718", "path": "6", "inStateSince": 1686156887186, "size": 268435456, @@ -5340,10 +5322,9 @@ "requiredNodes": 1, "replicationType": "RATIS" } - }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2407/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2407/110569623850191719", "path": "7", "inStateSince": 1686156887186, "size": 268435456, @@ -5353,10 +5334,9 @@ "requiredNodes": 1, "replicationType": "RATIS" } - }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2408/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2408/110569623850191720", "path": "8", "inStateSince": 1686156887186, "size": 268435456, @@ -5366,10 +5346,9 @@ "requiredNodes": 1, "replicationType": "RATIS" } - }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2409/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2409/110569623850191721", "path": "9", "inStateSince": 1686156887186, "size": 268435456, @@ -5379,7 +5358,6 @@ "requiredNodes": 1, "replicationType": "RATIS" } - }, { "key": "fso 10", @@ -5394,7 +5372,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2411/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2411/110569623850191722", "path": "11", "inStateSince": 1686156886632, "size": 268435456, @@ -5502,7 +5480,7 @@ } }, { - "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2411/110569623850191713", + "key": "/-9223372036854775552/-9223372036854775040/-9223372036852420095/2411/110569623850191723", "path": "21", "inStateSince": 1686156886632, "size": 268435456, @@ -5624,7 +5602,7 @@ ], "status": "OK" }, - "keydeletePending":{ + "keydeletePending": { "keysSummary": { "totalUnreplicatedDataSize": 29291, "totalReplicatedDataSize": 87873, @@ -5636,9 +5614,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036844470271, + "objectID": -9223372036844470000, "updateID": 40429, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List1key1", @@ -5661,9 +5639,9 @@ "updateIDset": true }, { - "objectID": -9223372036844470271, + "objectID": -9223372036844470000, "updateID": 40429, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List1key1", @@ -5686,9 +5664,9 @@ "updateIDset": true }, { - "objectID": -9223372036844470271, + "objectID": -9223372036844470000, "updateID": 40429, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List1key1", @@ -5715,10 +5693,9 @@ { "omKeyInfoList": [ { - - "objectID": -9223372036844470015, + "objectID": -9223372036844470000, "updateID": 40407, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List2Key1", @@ -5745,9 +5722,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036844432639, + "objectID": -9223372036844432000, "updateID": 40601, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List3Key1", @@ -5767,9 +5744,9 @@ "replicatedSize": 30000000 }, { - "objectID": -9223372036844432639, + "objectID": -9223372036844432000, "updateID": 40601, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List3Key1", @@ -5793,9 +5770,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036843970815, + "objectID": -9223372036843971000, "updateID": 42403, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List4Key1", @@ -5817,9 +5794,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036843964159, + "objectID": -9223372036843964000, "updateID": 42443, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List5Key1", @@ -5841,9 +5818,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036843961087, + "objectID": -9223372036843961000, "updateID": 42450, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List6Key1", @@ -5870,9 +5847,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036843959807, + "objectID": -9223372036843959000, "updateID": 42449, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List7Key1", @@ -5899,9 +5876,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036843953919, + "objectID": -9223372036843954000, "updateID": 42467, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List8Key1", @@ -5928,9 +5905,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036843951359, + "objectID": -9223372036843951000, "updateID": 42483, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List9Key1", @@ -5957,9 +5934,9 @@ { "omKeyInfoList": [ { - "objectID": -9223372036843950335, + "objectID": -9223372036843950000, "updateID": 42478, - "parentObjectID": -9223372036844472575, + "parentObjectID": -9223372036844472000, "volumeName": "volume", "bucketName": "bucket1", "keyName": "List10Key1", diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/routes.json b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/routes.json index b2136d074b07..7f3c86684b38 100644 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/routes.json +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/routes.json @@ -4,7 +4,7 @@ "/utilization/fileCount": "/fileSizeCounts", "/utilization/containerCount": "/containerCount", "/namespace/du?path=/&files=true&sortSubpaths=true": "/root", - "/namespace/du?path=/vol:id&files=true&sortSubpaths=true": "/volume", + "/namespace/du?path=/vol:id&files=true&sortSubPaths=true": "/volume", "/namespace/du?path=/vol:id/&files=true&sortSubPaths=true": "/volume", "/namespace/du?path=/dummyVolume&files=true&sortSubPaths=true": "/volume", "/namespace/du?path=/vol:id/bucket:id&files=true&sortSubPaths=true": "/bucket", @@ -15,12 +15,13 @@ "/namespace/du?path=/dummyVolume/dummyBucket/dir:id&files=true&sortSubPaths=true": "/dir", "/namespace/du?path=/dummyVolume/dummyBucket/dir:id/&files=true&sortSubPaths=true": "/dir", "/namespace/du?path=/dummyVolume/dummyBucket/dummyDir&files=true&sortSubPaths=true": "/dir", - "/namespace/du?path=/vol:id/bucket:id/dir:id/key:id*": "/key", - "/namespace/du?path=/dummyVolume/dummyBucket/dummyDir/key:id*": "/key", - "/namespace/du?path=/vol:id/bucket:id/key:id*": "/key", - "/namespace/du?path=/dummyVolume/dummyBucket/key:id*": "/key", + "/namespace/du?path=/vol:id/bucket:id/dir:id/key:id*&sortSubPaths=true": "/key", + "/namespace/du?path=/dummyVolume/dummyBucket/dummyDir/key:id*&sortSubPaths=true": "/key", + "/namespace/du?path=/vol:id/bucket:id/key:id*&sortSubPaths=true": "/key", + "/namespace/du?path=/dummyVolume/dummyBucket/key:id*&sortSubPaths=true": "/key", "/namespace/du?path=/vol1/bucket1/empty&files=true&sortSubPaths=true": "/empty", "/namespace/du?path=/clunky&files=true&sortSubpaths=true": "/clunky", + "/namespace/du?path=/*&replica=true": "/replica", "/namespace/summary?path=*": "/metadata", "/namespace/quota?path=*": "/quota", "/task/status": "/taskStatus", diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/config-overrides.js b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/config-overrides.js deleted file mode 100644 index c63cc972c18b..000000000000 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/config-overrides.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const {override, fixBabelImports, addLessLoader} = require('customize-cra'); - -module.exports = override( - fixBabelImports('import', { - libraryName: 'antd', - libraryDirectory: 'es', - style: true - }), - addLessLoader({ - javascriptEnabled: true, - modifyVars: { - '@primary-color': '#1DA57A' - } - }) -); diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/index.html b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/index.html new file mode 100644 index 000000000000..dde4fc674263 --- /dev/null +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/index.html @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + Ozone Recon + + + +

+ + + + \ No newline at end of file diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json index 41987c00ef35..71bdf85ad1c7 100644 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/package.json @@ -1,51 +1,44 @@ { - "packageManager": "pnpm@7.33.6", + "packageManager": "pnpm@8.15.7", "name": "ozone-recon", - "version": "0.1.0", + "version": "0.2.0", + "keywords": [ + "big", + "data", + "storage", + "distributed", + "apache" + ], "private": true, "dependencies": { - "@ant-design/icons": "^5.2.5", - "@babel/core": "^7.22.10", + "@ant-design/icons": "^4.6.3", "@fontsource/roboto": "^4.5.8", - "@types/classnames": "^2.3.1", - "@types/jest": "24.0.12", - "@types/node": "11.13.9", - "@types/react": "16.8.15", - "@types/react-dom": "16.8.4", - "@types/react-router-dom": "^4.3.5", "ag-charts-community": "^7.3.0", "ag-charts-react": "^7.3.0", - "antd": "^3.26.20", + "antd": "~4.10.3", "axios": "^0.28.0", - "babel-jest": "^24.9.0", - "babel-plugin-import": "^1.13.8", "classnames": "^2.3.2", - "customize-cra": "^0.2.14", + "echarts": "^5.5.0", "filesize": "^6.4.0", "less": "^3.13.1", - "less-loader": "^5.0.0", "moment": "^2.29.4", - "plotly.js": "^2.25.2", "pretty-ms": "^5.1.0", "react": "^16.8.6", - "react-app-rewired": "^2.2.1", "react-dom": "^16.14.0", - "react-plotly.js": "^2.6.0", "react-router": "^5.3.4", "react-router-dom": "^5.3.4", - "react-scripts": "^3.1.2", "react-select": "^3.2.0", - "typescript": "3.5.3" + "typescript": "4.9.5" }, "scripts": { - "start": "react-app-rewired start", - "build": "react-app-rewired --max_old_space_size=4096 build", - "test": "react-app-rewired test", - "eject": "react-scripts eject", + "start": "vite --port=3000", + "build": "vite build", + "serve": "vite preview", + "test": "vitest", "mock:api": "json-server --watch api/db.json --routes api/routes.json --port 9888", "dev": "npm-run-all --parallel mock:api start", - "lint": "xo src/*", - "lint:fix": "xo --fix src/*" + "lint": "eslint src/*", + "lint:fix": "eslint --fix src/*" }, "eslintConfig": { "extends": "react-app" @@ -63,109 +56,23 @@ ] }, "devDependencies": { - "@types/react-plotly.js": "^2.2.4", + "@types/react": "16.8.15", + "@types/react-dom": "16.8.4", + "@types/react-router-dom": "^4.3.5", "@types/react-select": "^3.0.13", - "@typescript-eslint/eslint-plugin": "^2.31.0", - "@typescript-eslint/parser": "^2.31.0", - "eslint": "^6.6.0", - "eslint-config-xo": "^0.29.1", - "eslint-config-xo-react": "^0.23.0", - "eslint-config-xo-typescript": "^0.28.0", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-unicorn": "^19.0.1", + "@typescript-eslint/eslint-plugin": "^5.30.0", + "@typescript-eslint/parser": "^5.30.0", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^7.28.0", + "eslint-config-prettier": "^8.10.0", + "eslint-plugin-prettier": "^3.4.1", "json-server": "^0.15.1", "npm-run-all": "^4.1.5", - "xo": "^0.30.0" - }, - "xo": { - "space": true, - "parser": "@typescript-eslint/parser", - "settings": { - "react": { - "pragma": "React", - "version": "16.8.6" - } - }, - "rules": { - "jsx-quotes": [ - 2, - "prefer-single" - ], - "import/no-unassigned-import": 0, - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/prefer-readonly-parameter-types": "off", - "@typescript-eslint/interface-name-prefix": [ - 2, - "always" - ], - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": true, - "optionalDependencies": true, - "peerDependencies": true - } - ], - "camelcase": 0, - "react/state-in-constructor": 0, - "react/boolean-prop-naming": 0, - "promise/prefer-await-to-then": 0, - "react/require-default-props": 0, - "react/default-props-match-prop-types": 0, - "unicorn/prevent-abbreviations": 0, - "react/no-array-index-key": 0, - "no-return-assign": 0, - "indent": [ - 2, - 2, - { - "SwitchCase": 1 - } - ], - "unicorn/filename-case": [ - "error", - { - "case": "camelCase", - "ignore": [ - "^react-app-env" - ] - } - ], - "import/extensions": [ - "error", - "ignorePackages", - { - "js": "never", - "ts": "never", - "tsx": "never" - } - ], - "no-unused-vars": [ - 2, - { - "argsIgnorePattern": "^_\\w*", - "varsIgnorePattern": "^_\\w*" - } - ], - "eslint-comments/disable-enable-pair": [ - 2, - { - "allowWholeFile": true - } - ] - }, - "env": [ - "node", - "es6", - "mocha", - "jest", - "browser" - ], - "extends": [ - "xo-react/space", - "plugin:@typescript-eslint/recommended" - ] + "prettier": "^2.8.4", + "vite": "4.5.3", + "vite-plugin-svgr": "^4.2.0", + "vite-tsconfig-paths": "^3.6.0", + "vitest": "^1.6.0" }, "proxy": "http://localhost:9888" } diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml index 957a0ed5d152..ccfdcc018622 100644 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/pnpm-lock.yaml @@ -1,12791 +1,4691 @@ -lockfileVersion: 5.4 - -specifiers: - '@ant-design/icons': ^5.2.5 - '@babel/core': ^7.22.10 - '@fontsource/roboto': ^4.5.8 - '@types/classnames': ^2.3.1 - '@types/jest': 24.0.12 - '@types/node': 11.13.9 - '@types/react': 16.8.15 - '@types/react-dom': 16.8.4 - '@types/react-plotly.js': ^2.2.4 - '@types/react-router-dom': ^4.3.5 - '@types/react-select': ^3.0.13 - '@typescript-eslint/eslint-plugin': ^2.31.0 - '@typescript-eslint/parser': ^2.31.0 - ag-charts-community: ^7.3.0 - ag-charts-react: ^7.3.0 - antd: ^3.26.20 - axios: ^0.28.0 - babel-jest: ^24.9.0 - babel-plugin-import: ^1.13.8 - classnames: ^2.3.2 - customize-cra: ^0.2.14 - eslint: ^6.6.0 - eslint-config-xo: ^0.29.1 - eslint-config-xo-react: ^0.23.0 - eslint-config-xo-typescript: ^0.28.0 - eslint-plugin-import: ^2.20.2 - eslint-plugin-react: ^7.19.0 - eslint-plugin-unicorn: ^19.0.1 - filesize: ^6.4.0 - json-server: ^0.15.1 - less: ^3.13.1 - less-loader: ^5.0.0 - moment: ^2.29.4 - npm-run-all: ^4.1.5 - plotly.js: ^2.25.2 - pretty-ms: ^5.1.0 - react: ^16.8.6 - react-app-rewired: ^2.2.1 - react-dom: ^16.14.0 - react-plotly.js: ^2.6.0 - react-router: ^5.3.4 - react-router-dom: ^5.3.4 - react-scripts: ^3.1.2 - react-select: ^3.2.0 - typescript: 3.5.3 - xo: ^0.30.0 +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@ant-design/icons': 5.2.5_wcqkhtmu7mswc6yz4uyexck3ty - '@babel/core': 7.22.11 - '@fontsource/roboto': 4.5.8 - '@types/classnames': 2.3.1 - '@types/jest': 24.0.12 - '@types/node': 11.13.9 - '@types/react': 16.8.15 - '@types/react-dom': 16.8.4 - '@types/react-router-dom': 4.3.5 - ag-charts-community: 7.3.0 - ag-charts-react: 7.3.0_4uflhkpzmxcxyxkuqg2ofty3gq - antd: 3.26.20_wcqkhtmu7mswc6yz4uyexck3ty - axios: 0.28.0 - babel-jest: 24.9.0_@babel+core@7.22.11 - babel-plugin-import: 1.13.8 - classnames: 2.3.2 - customize-cra: 0.2.14 - filesize: 6.4.0 - less: 3.13.1 - less-loader: 5.0.0_less@3.13.1 - moment: 2.29.4 - plotly.js: 2.25.2 - pretty-ms: 5.1.0 - react: 16.14.0 - react-app-rewired: 2.2.1_react-scripts@3.4.4 - react-dom: 16.14.0_react@16.14.0 - react-plotly.js: 2.6.0_qtjenpcawcnnxnr626ndcvhi4u - react-router: 5.3.4_react@16.14.0 - react-router-dom: 5.3.4_react@16.14.0 - react-scripts: 3.4.4_bo7u2dcgnntwwyyxmecoaqdaee - react-select: 3.2.0_wcqkhtmu7mswc6yz4uyexck3ty - typescript: 3.5.3 + '@ant-design/icons': + specifier: ^4.6.3 + version: 4.8.3(react-dom@16.14.0)(react@16.14.0) + '@fontsource/roboto': + specifier: ^4.5.8 + version: 4.5.8 + ag-charts-community: + specifier: ^7.3.0 + version: 7.3.0 + ag-charts-react: + specifier: ^7.3.0 + version: 7.3.0(ag-charts-community@7.3.0)(react-dom@16.14.0)(react@16.14.0) + antd: + specifier: ~4.10.3 + version: 4.10.3(react-dom@16.14.0)(react@16.14.0) + axios: + specifier: ^0.28.0 + version: 0.28.1 + classnames: + specifier: ^2.3.2 + version: 2.5.1 + echarts: + specifier: ^5.5.0 + version: 5.5.0 + filesize: + specifier: ^6.4.0 + version: 6.4.0 + less: + specifier: ^3.13.1 + version: 3.13.1 + moment: + specifier: ^2.29.4 + version: 2.30.1 + pretty-ms: + specifier: ^5.1.0 + version: 5.1.0 + react: + specifier: ^16.8.6 + version: 16.14.0 + react-dom: + specifier: ^16.14.0 + version: 16.14.0(react@16.14.0) + react-router: + specifier: ^5.3.4 + version: 5.3.4(react@16.14.0) + react-router-dom: + specifier: ^5.3.4 + version: 5.3.4(react@16.14.0) + react-select: + specifier: ^3.2.0 + version: 3.2.0(react-dom@16.14.0)(react@16.14.0) + typescript: + specifier: 4.9.5 + version: 4.9.5 devDependencies: - '@types/react-plotly.js': 2.6.0 - '@types/react-select': 3.1.2 - '@typescript-eslint/eslint-plugin': 2.34.0_lil7fcptb6lvwsbapucsn3cnza - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - eslint: 6.8.0 - eslint-config-xo: 0.29.1_eslint@6.8.0 - eslint-config-xo-react: 0.23.0_b53wkfdkpwhrytkwoaulourpvy - eslint-config-xo-typescript: 0.28.0_wp2ytyahinzayi5i5jc7flp7nm - eslint-plugin-import: 2.28.1_tbglwmj7t2rhd43mvxmptakoay - eslint-plugin-react: 7.33.2_eslint@6.8.0 - eslint-plugin-unicorn: 19.0.1_eslint@6.8.0 - json-server: 0.15.1 - npm-run-all: 4.1.5 - xo: 0.30.0 + '@types/react': + specifier: 16.8.15 + version: 16.8.15 + '@types/react-dom': + specifier: 16.8.4 + version: 16.8.4 + '@types/react-router-dom': + specifier: ^4.3.5 + version: 4.3.5 + '@types/react-select': + specifier: ^3.0.13 + version: 3.1.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.30.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.30.0 + version: 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@vitejs/plugin-react': + specifier: ^4.0.0 + version: 4.3.1(vite@4.5.3) + eslint: + specifier: ^7.28.0 + version: 7.32.0 + eslint-config-prettier: + specifier: ^8.10.0 + version: 8.10.0(eslint@7.32.0) + eslint-plugin-prettier: + specifier: ^3.4.1 + version: 3.4.1(eslint-config-prettier@8.10.0)(eslint@7.32.0)(prettier@2.8.8) + json-server: + specifier: ^0.15.1 + version: 0.15.1 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + prettier: + specifier: ^2.8.4 + version: 2.8.8 + vite: + specifier: 4.5.3 + version: 4.5.3(less@3.13.1) + vite-plugin-svgr: + specifier: ^4.2.0 + version: 4.2.0(typescript@4.9.5)(vite@4.5.3) + vite-tsconfig-paths: + specifier: ^3.6.0 + version: 3.6.0(vite@4.5.3) + vitest: + specifier: ^1.6.0 + version: 1.6.0(less@3.13.1) packages: - /@ampproject/remapping/2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - dev: false - - /@ant-design/colors/3.2.2: - resolution: {integrity: sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==} - dependencies: - tinycolor2: 1.6.0 - dev: false + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true - /@ant-design/colors/7.0.0: - resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==} + /@ant-design/colors@5.1.1: + resolution: {integrity: sha512-Txy4KpHrp3q4XZdfgOBqLl+lkQIc3tEvHXOimRN1giX1AEC7mGtyrO9p8iRGJ3FLuVMGa2gNEzQyghVymLttKQ==} dependencies: '@ctrl/tinycolor': 3.6.1 dev: false - /@ant-design/create-react-context/0.2.6_4vyaxm4rsh2mpfdenvlqy7kmya: - resolution: {integrity: sha512-pHUuaE50/WEek4w2Q+QYVieLPIGfXM+nUsGSsg8xO6oHBw7dfd14Ws/6q3/L6eZ60zjUiv3WUlSzpWyCOXLqbQ==} - peerDependencies: - prop-types: '>=15.0.0' - react: ^0.14.0 || >=15.0.0 + /@ant-design/colors@6.0.0: + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} dependencies: - gud: 1.0.0 - prop-types: 15.8.1 - react: 16.14.0 - warning: 4.0.3 + '@ctrl/tinycolor': 3.6.1 dev: false - /@ant-design/css-animation/1.7.3: - resolution: {integrity: sha512-LrX0OGZtW+W6iLnTAqnTaoIsRelYeuLZWsrmBJFUXDALQphPsN8cE5DCsmoSlL0QYb94BQxINiuS70Ar/8BNgA==} + /@ant-design/icons-svg@4.4.2: + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} dev: false - /@ant-design/icons-react/2.0.1_djmcyhfzddxj7qqtb4n7fxfjnq: - resolution: {integrity: sha512-r1QfoltMuruJZqdiKcbPim3d8LNsVPB733U0gZEUSxBLuqilwsW28K2rCTWSMTjmFX7Mfpf+v/wdiFe/XCqThw==} + /@ant-design/icons@4.8.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-HGlIQZzrEbAhpJR6+IGdzfbPym94Owr6JZkJ2QCCnOkPVIWMO2xgIVcOKnl8YcpijIo39V7l2qQL5fmtw56cMw==} + engines: {node: '>=8'} peerDependencies: - '@ant-design/icons': ^2.0.0 - react: 16.x + react: '>=16.0.0' + react-dom: '>=16.0.0' dependencies: - '@ant-design/colors': 3.2.2 - '@ant-design/icons': 2.1.1 - babel-runtime: 6.26.0 + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + lodash: 4.17.21 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /@ant-design/icons-svg/4.3.1: - resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==} - dev: false - - /@ant-design/icons/2.1.1: - resolution: {integrity: sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w==} - dev: false - - /@ant-design/icons/5.2.5_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-9Jc59v5fl5dzmxqLWtRev3dJwU7Ya9ZheoI6XmZjZiQ7PRtk77rC+Rbt7GJzAPPg43RQ4YO53RE1u8n+Et97vQ==} - engines: {node: '>=8'} + /@ant-design/react-slick@0.28.4(react@16.14.0): + resolution: {integrity: sha512-j9eAHTn7GxbXUFNknJoHS2ceAsqrQi2j8XykjZE1IXCD8kJF+t28EvhBLniDpbOsBk/3kjalnhriTfZcjBHNqg==} peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' + react: '>=16.9.0' dependencies: - '@ant-design/colors': 7.0.0 - '@ant-design/icons-svg': 4.3.1 - '@babel/runtime': 7.22.11 - classnames: 2.3.2 - lodash.camelcase: 4.3.0 - rc-util: 5.37.0_wcqkhtmu7mswc6yz4uyexck3ty + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + json2mq: 0.2.0 + lodash: 4.17.21 react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + resize-observer-polyfill: 1.5.1 dev: false - /@babel/code-frame/7.22.10: - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} - engines: {node: '>=6.9.0'} + /@babel/code-frame@7.12.11: + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 + '@babel/highlight': 7.24.7 + dev: true - /@babel/code-frame/7.8.3: - resolution: {integrity: sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==} + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.10 - dev: false + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 - /@babel/compat-data/7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + /@babel/compat-data@7.24.7: + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - dev: false + dev: true - /@babel/core/7.22.11: - resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + /@babel/core@7.24.7: + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.11 - '@babel/helpers': 7.22.11 - '@babel/parser': 7.22.11 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 - convert-source-map: 1.9.0 - debug: 4.3.4 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + convert-source-map: 2.0.0 + debug: 4.3.5 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - - /@babel/core/7.9.0: - resolution: {integrity: sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.9.0 - '@babel/helpers': 7.22.11 - '@babel/parser': 7.22.11 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - lodash: 4.17.21 - resolve: 1.22.4 - semver: 5.7.2 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - dev: false + dev: true - /@babel/generator/7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + /@babel/generator@7.24.7: + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - dev: false - - /@babel/helper-annotate-as-pure/7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: false - /@babel/helper-builder-binary-assignment-operator-visitor/7.22.10: - resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} + /@babel/helper-compilation-targets@7.24.7: + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 - dev: false + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true - /@babel/helper-compilation-targets/7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + /@babel/helper-environment-visitor@7.24.7: + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false + '@babel/types': 7.24.7 - /@babel/helper-create-class-features-plugin/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==} + /@babel/helper-function-name@7.24.7: + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.11 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: false + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 - /@babel/helper-create-class-features-plugin/7.22.11_@babel+core@7.9.0: - resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==} + /@babel/helper-hoist-variables@7.24.7: + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.9.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.9.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: false + '@babel/types': 7.24.7 - /@babel/helper-create-regexp-features-plugin/7.22.9_@babel+core@7.22.11: - resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: false + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color - /@babel/helper-create-regexp-features-plugin/7.22.9_@babel+core@7.9.0: - resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.9.0 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: false - - /@babel/helper-define-polyfill-provider/0.4.2_@babel+core@7.22.11: - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.4 + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 transitivePeerDependencies: - supports-color - dev: false + dev: true - /@babel/helper-environment-visitor/7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-plugin-utils@7.24.7: + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} - dev: false + dev: true - /@babel/helper-function-name/7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.11 - dev: false + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: true - /@babel/helper-hoist-variables/7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + /@babel/helper-split-export-declaration@7.24.7: + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 - dev: false + '@babel/types': 7.24.7 - /@babel/helper-member-expression-to-functions/7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + /@babel/helper-string-parser@7.24.7: + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: false - /@babel/helper-module-imports/7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: false - /@babel/helper-module-transforms/7.22.9_@babel+core@7.22.11: - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + /@babel/helper-validator-option@7.24.7: + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: false + dev: true - /@babel/helper-module-transforms/7.22.9_@babel+core@7.9.0: - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + /@babel/helpers@7.24.7: + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.9.0 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 - dev: false + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + dev: true - /@babel/helper-optimise-call-expression/7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 - dev: false - - /@babel/helper-plugin-utils/7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 - /@babel/helper-remap-async-to-generator/7.22.9_@babel+core@7.22.11: - resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + /@babel/parser@7.24.7: + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.10 - dev: false + '@babel/types': 7.24.7 - /@babel/helper-remap-async-to-generator/7.22.9_@babel+core@7.9.0: - resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + /@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.9.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-wrap-function': 7.22.10 - dev: false + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + dev: true - /@babel/helper-replace-supers/7.22.9_@babel+core@7.22.11: - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + /@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: false + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + dev: true - /@babel/helper-replace-supers/7.22.9_@babel+core@7.9.0: - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + /@babel/runtime@7.24.7: + resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.9.0 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: false + regenerator-runtime: 0.14.1 - /@babel/helper-simple-access/7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + /@babel/template@7.24.7: + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 - dev: false + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 - /@babel/helper-skip-transparent-expression-wrappers/7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + /@babel/traverse@7.24.7: + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 - dev: false + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - /@babel/helper-split-export-declaration/7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/types@7.24.7: + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 - dev: false + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 - /@babel/helper-string-parser/7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} + /@ctrl/tinycolor@3.6.1: + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} dev: false - /@babel/helper-validator-identifier/7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option/7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - dev: false + /@cush/relative@1.0.0: + resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} + dev: true - /@babel/helper-wrap-function/7.22.10: - resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} - engines: {node: '>=6.9.0'} + /@emotion/cache@10.0.29: + resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.5 - '@babel/types': 7.22.11 + '@emotion/sheet': 0.9.4 + '@emotion/stylis': 0.8.5 + '@emotion/utils': 0.11.3 + '@emotion/weak-memoize': 0.2.5 dev: false - /@babel/helpers/7.22.11: - resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} - engines: {node: '>=6.9.0'} + /@emotion/core@10.3.1(react@16.14.0): + resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} + peerDependencies: + react: '>=16.3.0' dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 + '@babel/runtime': 7.24.7 + '@emotion/cache': 10.0.29 + '@emotion/css': 10.0.27 + '@emotion/serialize': 0.11.16 + '@emotion/sheet': 0.9.4 + '@emotion/utils': 0.11.3 + react: 16.14.0 transitivePeerDependencies: - supports-color dev: false - /@babel/highlight/7.22.10: - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - - /@babel/parser/7.22.11: - resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.11 - dev: false - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + /@emotion/css@10.0.27: + resolution: {integrity: sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==} dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 + '@emotion/serialize': 0.11.16 + '@emotion/utils': 0.11.3 + babel-plugin-emotion: 10.2.2 + transitivePeerDependencies: + - supports-color dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.12_@babel+core@7.22.11 + /@emotion/hash@0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.9.0: - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.9.0 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.9.0 + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} dev: false - /@babel/plugin-proposal-class-properties/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@emotion/serialize@0.11.16: + resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} dependencies: - '@babel/core': 7.9.0 - '@babel/helper-create-class-features-plugin': 7.22.11_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.4 + '@emotion/unitless': 0.7.5 + '@emotion/utils': 0.11.3 + csstype: 2.6.21 dev: false - /@babel/plugin-proposal-decorators/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-create-class-features-plugin': 7.22.11_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-decorators': 7.22.10_@babel+core@7.9.0 + /@emotion/sheet@0.9.4: + resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} dev: false - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.9.0: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.9.0 + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} dev: false - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.9.0: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.9.0 + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} dev: false - /@babel/plugin-proposal-nullish-coalescing-operator/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 + /@emotion/utils@0.11.3: + resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} dev: false - /@babel/plugin-proposal-numeric-separator/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.9.0 + /@emotion/weak-memoize@0.2.5: + resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} dev: false - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.9.0: - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.9.0 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.9.0 - dev: false + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.9.0: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.9.0 - dev: false + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-optional-chaining/7.9.0_@babel+core@7.9.0: - resolution: {integrity: sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.9.0 - dev: false + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-private-property-in-object/7.21.0-placeholder-for-preset-env.2_@babel+core@7.22.11: - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - dev: false + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.9.0: - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.22.11: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.9.0: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.22.11: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.22.11: - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-decorators/7.22.10_@babel+core@7.9.0: - resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-flow/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-assertions/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-attributes/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.22.11: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-jsx/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-jsx/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.22.11: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.22.11: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.9.0: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.22.11: - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.22.11: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.9.0: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-typescript/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-unicode-sets-regex/7.18.6_@babel+core@7.22.11: - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-arrow-functions/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-arrow-functions/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-async-generator-functions/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.22.11 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-async-to-generator/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-async-to-generator/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.9.0 - dev: false - - /@babel/plugin-transform-block-scoped-functions/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-block-scoped-functions/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-block-scoping/7.22.10_@babel+core@7.22.11: - resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-block-scoping/7.22.10_@babel+core@7.9.0: - resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-class-properties/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-class-static-block/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-classes/7.22.6_@babel+core@7.22.11: - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.11 - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: false - - /@babel/plugin-transform-classes/7.22.6_@babel+core@7.9.0: - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.9.0 - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: false - - /@babel/plugin-transform-computed-properties/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 - dev: false - - /@babel/plugin-transform-computed-properties/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.5 - dev: false - - /@babel/plugin-transform-destructuring/7.22.10_@babel+core@7.22.11: - resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-destructuring/7.22.10_@babel+core@7.9.0: - resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-dotall-regex/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-dotall-regex/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-duplicate-keys/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-duplicate-keys/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-dynamic-import/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-exponentiation-operator/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-exponentiation-operator/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-export-namespace-from/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-flow-strip-types/7.9.0_@babel+core@7.9.0: - resolution: {integrity: sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5_@babel+core@7.9.0 - dev: false - - /@babel/plugin-transform-for-of/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-for-of/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-function-name/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-function-name/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-json-strings/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-literals/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-literals/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-logical-assignment-operators/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-member-expression-literals/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-member-expression-literals/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-amd/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-amd/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-commonjs/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-commonjs/7.22.11_@babel+core@7.9.0: - resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-systemjs/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-systemjs/7.22.11_@babel+core@7.9.0: - resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-umd/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-modules-umd/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-named-capturing-groups-regex/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-named-capturing-groups-regex/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-new-target/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-new-target/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-nullish-coalescing-operator/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-numeric-separator/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-object-rest-spread/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-object-super/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-object-super/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.9.0 - dev: false - - /@babel/plugin-transform-optional-catch-binding/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-optional-chaining/7.22.12_@babel+core@7.22.11: - resolution: {integrity: sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-parameters/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-parameters/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-private-methods/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.11_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-private-property-in-object/7.22.11_@babel+core@7.22.11: - resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.11_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-property-literals/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-property-literals/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-constant-elements/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-display-name/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-display-name/7.8.3_@babel+core@7.9.0: - resolution: {integrity: sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx-development/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.22.11 - dev: false - - /@babel/plugin-transform-react-jsx-development/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.9.0 - dev: false - - /@babel/plugin-transform-react-jsx-self/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx-source/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.11 - '@babel/types': 7.22.11 - dev: false - - /@babel/plugin-transform-react-jsx/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.9.0 - '@babel/types': 7.22.11 - dev: false - - /@babel/plugin-transform-react-pure-annotations/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-regenerator/7.22.10_@babel+core@7.22.11: - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: false - - /@babel/plugin-transform-regenerator/7.22.10_@babel+core@7.9.0: - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: false - - /@babel/plugin-transform-reserved-words/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-reserved-words/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-runtime/7.9.0_@babel+core@7.9.0: - resolution: {integrity: sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - resolve: 1.22.4 - semver: 5.7.2 - dev: false - - /@babel/plugin-transform-shorthand-properties/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-shorthand-properties/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-spread/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false - - /@babel/plugin-transform-spread/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false - - /@babel/plugin-transform-sticky-regex/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-sticky-regex/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-template-literals/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-template-literals/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-typeof-symbol/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-typeof-symbol/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-typescript/7.22.11_@babel+core@7.9.0: - resolution: {integrity: sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.11_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5_@babel+core@7.9.0 - dev: false - - /@babel/plugin-transform-unicode-escapes/7.22.10_@babel+core@7.22.11: - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-property-regex/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-regex/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-regex/7.22.5_@babel+core@7.9.0: - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-sets-regex/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/preset-env/7.22.10_@babel+core@7.22.11: - resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2_@babel+core@7.22.11 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.11 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.22.11 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.22.11 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-syntax-import-assertions': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-syntax-import-attributes': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.22.11 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.11 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.11 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.11 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.11 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.22.11 - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6_@babel+core@7.22.11 - '@babel/plugin-transform-arrow-functions': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-async-generator-functions': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-async-to-generator': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-block-scoped-functions': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-block-scoping': 7.22.10_@babel+core@7.22.11 - '@babel/plugin-transform-class-properties': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-class-static-block': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-classes': 7.22.6_@babel+core@7.22.11 - '@babel/plugin-transform-computed-properties': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-destructuring': 7.22.10_@babel+core@7.22.11 - '@babel/plugin-transform-dotall-regex': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-duplicate-keys': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-dynamic-import': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-exponentiation-operator': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-export-namespace-from': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-for-of': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-function-name': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-json-strings': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-literals': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-logical-assignment-operators': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-member-expression-literals': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-modules-amd': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-modules-commonjs': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-modules-systemjs': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-modules-umd': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-new-target': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-numeric-separator': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-object-rest-spread': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-object-super': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-optional-catch-binding': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-optional-chaining': 7.22.12_@babel+core@7.22.11 - '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-private-methods': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-private-property-in-object': 7.22.11_@babel+core@7.22.11 - '@babel/plugin-transform-property-literals': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-regenerator': 7.22.10_@babel+core@7.22.11 - '@babel/plugin-transform-reserved-words': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-shorthand-properties': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-spread': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-sticky-regex': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-template-literals': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-typeof-symbol': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-unicode-escapes': 7.22.10_@babel+core@7.22.11 - '@babel/plugin-transform-unicode-property-regex': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-unicode-regex': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-unicode-sets-regex': 7.22.5_@babel+core@7.22.11 - '@babel/preset-modules': 0.1.6-no-external-plugins_@babel+core@7.22.11 - '@babel/types': 7.22.11 - babel-plugin-polyfill-corejs2: 0.4.5_@babel+core@7.22.11 - babel-plugin-polyfill-corejs3: 0.8.3_@babel+core@7.22.11 - babel-plugin-polyfill-regenerator: 0.5.2_@babel+core@7.22.11 - core-js-compat: 3.32.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/preset-env/7.9.0_@babel+core@7.9.0: - resolution: {integrity: sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.9.0 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.9.0 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.9.0 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.9.0 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-proposal-numeric-separator': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.9.0 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.9.0 - '@babel/plugin-proposal-optional-chaining': 7.9.0_@babel+core@7.9.0 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.9.0 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.9.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.9.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.9.0 - '@babel/plugin-transform-arrow-functions': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-async-to-generator': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-block-scoped-functions': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-block-scoping': 7.22.10_@babel+core@7.9.0 - '@babel/plugin-transform-classes': 7.22.6_@babel+core@7.9.0 - '@babel/plugin-transform-computed-properties': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-destructuring': 7.22.10_@babel+core@7.9.0 - '@babel/plugin-transform-dotall-regex': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-duplicate-keys': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-exponentiation-operator': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-for-of': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-function-name': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-literals': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-member-expression-literals': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-modules-amd': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-modules-commonjs': 7.22.11_@babel+core@7.9.0 - '@babel/plugin-transform-modules-systemjs': 7.22.11_@babel+core@7.9.0 - '@babel/plugin-transform-modules-umd': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-new-target': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-object-super': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-property-literals': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-regenerator': 7.22.10_@babel+core@7.9.0 - '@babel/plugin-transform-reserved-words': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-shorthand-properties': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-spread': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-sticky-regex': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-template-literals': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-typeof-symbol': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-unicode-regex': 7.22.5_@babel+core@7.9.0 - '@babel/preset-modules': 0.1.6_@babel+core@7.9.0 - '@babel/types': 7.22.11 - browserslist: 4.21.10 - core-js-compat: 3.32.1 - invariant: 2.2.4 - levenary: 1.1.1 - semver: 5.7.2 - dev: false - - /@babel/preset-modules/0.1.6-no-external-plugins_@babel+core@7.22.11: - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.22.11 - esutils: 2.0.3 - dev: false - - /@babel/preset-modules/0.1.6_@babel+core@7.9.0: - resolution: {integrity: sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.9.0 - '@babel/plugin-transform-dotall-regex': 7.22.5_@babel+core@7.9.0 - '@babel/types': 7.22.11 - esutils: 2.0.3 - dev: false - - /@babel/preset-react/7.22.5_@babel+core@7.22.11: - resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-transform-react-display-name': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-react-jsx-development': 7.22.5_@babel+core@7.22.11 - '@babel/plugin-transform-react-pure-annotations': 7.22.5_@babel+core@7.22.11 - dev: false - - /@babel/preset-react/7.9.1_@babel+core@7.9.0: - resolution: {integrity: sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-react-display-name': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx-development': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx-self': 7.22.5_@babel+core@7.9.0 - '@babel/plugin-transform-react-jsx-source': 7.22.5_@babel+core@7.9.0 - dev: false - - /@babel/preset-typescript/7.9.0_@babel+core@7.9.0: - resolution: {integrity: sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.9.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-typescript': 7.22.11_@babel+core@7.9.0 - dev: false - - /@babel/regjsgen/0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: false - - /@babel/runtime-corejs3/7.22.11: - resolution: {integrity: sha512-NhfzUbdWbiE6fCFypbWCPu6AR8xre31EOPF7wwAIJEvGQ2avov04eymayWinCuyXmV1b0+jzoXP/HYzzUYdvwg==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.32.1 - regenerator-runtime: 0.14.0 - dev: false - - /@babel/runtime/7.22.11: - resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: false - - /@babel/runtime/7.9.0: - resolution: {integrity: sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==} - dependencies: - regenerator-runtime: 0.13.11 - dev: false - - /@babel/template/7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - dev: false - - /@babel/traverse/7.22.11: - resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/types/7.22.11: - resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - dev: false - - /@choojs/findup/0.2.1: - resolution: {integrity: sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==} - hasBin: true - dependencies: - commander: 2.20.3 - dev: false - - /@cnakazawa/watch/1.0.4: - resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} - engines: {node: '>=0.1.95'} - hasBin: true - dependencies: - exec-sh: 0.3.6 - minimist: 1.2.8 - dev: false - - /@csstools/convert-colors/1.4.0: - resolution: {integrity: sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==} - engines: {node: '>=4.0.0'} - dev: false - - /@csstools/normalize.css/10.1.0: - resolution: {integrity: sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==} - dev: false - - /@ctrl/tinycolor/3.6.1: - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} - dev: false - - /@emotion/cache/10.0.29: - resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} - dependencies: - '@emotion/sheet': 0.9.4 - '@emotion/stylis': 0.8.5 - '@emotion/utils': 0.11.3 - '@emotion/weak-memoize': 0.2.5 - dev: false - - /@emotion/core/10.3.1_react@16.14.0: - resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} - peerDependencies: - react: '>=16.3.0' - dependencies: - '@babel/runtime': 7.22.11 - '@emotion/cache': 10.0.29 - '@emotion/css': 10.0.27 - '@emotion/serialize': 0.11.16 - '@emotion/sheet': 0.9.4 - '@emotion/utils': 0.11.3 - react: 16.14.0 - dev: false - - /@emotion/css/10.0.27: - resolution: {integrity: sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==} - dependencies: - '@emotion/serialize': 0.11.16 - '@emotion/utils': 0.11.3 - babel-plugin-emotion: 10.2.2 - dev: false - - /@emotion/hash/0.8.0: - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - dev: false - - /@emotion/memoize/0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - dev: false - - /@emotion/serialize/0.11.16: - resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} - dependencies: - '@emotion/hash': 0.8.0 - '@emotion/memoize': 0.7.4 - '@emotion/unitless': 0.7.5 - '@emotion/utils': 0.11.3 - csstype: 2.6.21 - dev: false - - /@emotion/sheet/0.9.4: - resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} - dev: false - - /@emotion/stylis/0.8.5: - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: false - - /@emotion/unitless/0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: false - - /@emotion/utils/0.11.3: - resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} - dev: false - - /@emotion/weak-memoize/0.2.5: - resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} - dev: false - - /@fontsource/roboto/4.5.8: - resolution: {integrity: sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==} - dev: false - - /@hapi/address/2.1.4: - resolution: {integrity: sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==} - deprecated: Moved to 'npm install @sideway/address' - dev: false - - /@hapi/bourne/1.3.2: - resolution: {integrity: sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==} - deprecated: This version has been deprecated and is no longer supported or maintained - dev: false - - /@hapi/hoek/8.5.1: - resolution: {integrity: sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==} - deprecated: This version has been deprecated and is no longer supported or maintained - dev: false - - /@hapi/joi/15.1.1: - resolution: {integrity: sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==} - deprecated: Switch to 'npm install joi' - dependencies: - '@hapi/address': 2.1.4 - '@hapi/bourne': 1.3.2 - '@hapi/hoek': 8.5.1 - '@hapi/topo': 3.1.6 - dev: false - - /@hapi/topo/3.1.6: - resolution: {integrity: sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==} - deprecated: This version has been deprecated and is no longer supported or maintained - dependencies: - '@hapi/hoek': 8.5.1 - dev: false - - /@jest/console/24.9.0: - resolution: {integrity: sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==} - engines: {node: '>= 6'} - dependencies: - '@jest/source-map': 24.9.0 - chalk: 2.4.2 - slash: 2.0.0 - dev: false - - /@jest/core/24.9.0: - resolution: {integrity: sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==} - engines: {node: '>= 6'} - dependencies: - '@jest/console': 24.9.0 - '@jest/reporters': 24.9.0 - '@jest/test-result': 24.9.0 - '@jest/transform': 24.9.0 - '@jest/types': 24.9.0 - ansi-escapes: 3.2.0 - chalk: 2.4.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 24.9.0 - jest-config: 24.9.0 - jest-haste-map: 24.9.0 - jest-message-util: 24.9.0 - jest-regex-util: 24.9.0 - jest-resolve: 24.9.0 - jest-resolve-dependencies: 24.9.0 - jest-runner: 24.9.0 - jest-runtime: 24.9.0 - jest-snapshot: 24.9.0 - jest-util: 24.9.0 - jest-validate: 24.9.0 - jest-watcher: 24.9.0 - micromatch: 3.1.10 - p-each-series: 1.0.0 - realpath-native: 1.1.0 - rimraf: 2.7.1 - slash: 2.0.0 - strip-ansi: 5.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /@jest/environment/24.9.0: - resolution: {integrity: sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==} - engines: {node: '>= 6'} - dependencies: - '@jest/fake-timers': 24.9.0 - '@jest/transform': 24.9.0 - '@jest/types': 24.9.0 - jest-mock: 24.9.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@jest/fake-timers/24.9.0: - resolution: {integrity: sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==} - engines: {node: '>= 6'} - dependencies: - '@jest/types': 24.9.0 - jest-message-util: 24.9.0 - jest-mock: 24.9.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@jest/reporters/24.9.0: - resolution: {integrity: sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==} - engines: {node: '>= 6'} - dependencies: - '@jest/environment': 24.9.0 - '@jest/test-result': 24.9.0 - '@jest/transform': 24.9.0 - '@jest/types': 24.9.0 - chalk: 2.4.2 - exit: 0.1.2 - glob: 7.2.3 - istanbul-lib-coverage: 2.0.5 - istanbul-lib-instrument: 3.3.0 - istanbul-lib-report: 2.0.8 - istanbul-lib-source-maps: 3.0.6 - istanbul-reports: 2.2.7 - jest-haste-map: 24.9.0 - jest-resolve: 24.9.0 - jest-runtime: 24.9.0 - jest-util: 24.9.0 - jest-worker: 24.9.0 - node-notifier: 5.4.5 - slash: 2.0.0 - source-map: 0.6.1 - string-length: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /@jest/schemas/29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: false - - /@jest/source-map/24.9.0: - resolution: {integrity: sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==} - engines: {node: '>= 6'} - dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.11 - source-map: 0.6.1 - dev: false - - /@jest/test-result/24.9.0: - resolution: {integrity: sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==} - engines: {node: '>= 6'} - dependencies: - '@jest/console': 24.9.0 - '@jest/types': 24.9.0 - '@types/istanbul-lib-coverage': 2.0.4 - dev: false - - /@jest/test-sequencer/24.9.0: - resolution: {integrity: sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==} - engines: {node: '>= 6'} - dependencies: - '@jest/test-result': 24.9.0 - jest-haste-map: 24.9.0 - jest-runner: 24.9.0 - jest-runtime: 24.9.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /@jest/transform/24.9.0: - resolution: {integrity: sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==} - engines: {node: '>= 6'} - dependencies: - '@babel/core': 7.22.11 - '@jest/types': 24.9.0 - babel-plugin-istanbul: 5.2.0 - chalk: 2.4.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 24.9.0 - jest-regex-util: 24.9.0 - jest-util: 24.9.0 - micromatch: 3.1.10 - pirates: 4.0.6 - realpath-native: 1.1.0 - slash: 2.0.0 - source-map: 0.6.1 - write-file-atomic: 2.4.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@jest/types/24.9.0: - resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==} - engines: {node: '>= 6'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 1.1.2 - '@types/yargs': 13.0.12 - dev: false - - /@jridgewell/gen-mapping/0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - dev: false - - /@jridgewell/resolve-uri/3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/set-array/1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/sourcemap-codec/1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false - - /@jridgewell/trace-mapping/0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /@mapbox/geojson-rewind/0.5.2: - resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} - hasBin: true - dependencies: - get-stream: 6.0.1 - minimist: 1.2.8 - dev: false - - /@mapbox/geojson-types/1.0.2: - resolution: {integrity: sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==} - dev: false - - /@mapbox/jsonlint-lines-primitives/2.0.2: - resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} - engines: {node: '>= 0.6'} - dev: false - - /@mapbox/mapbox-gl-supported/1.5.0_mapbox-gl@1.10.1: - resolution: {integrity: sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==} - peerDependencies: - mapbox-gl: '>=0.32.1 <2.0.0' - dependencies: - mapbox-gl: 1.10.1 - dev: false - - /@mapbox/point-geometry/0.1.0: - resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} - dev: false - - /@mapbox/tiny-sdf/1.2.5: - resolution: {integrity: sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==} - dev: false - - /@mapbox/unitbezier/0.0.0: - resolution: {integrity: sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==} - dev: false - - /@mapbox/vector-tile/1.3.1: - resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} - dependencies: - '@mapbox/point-geometry': 0.1.0 - dev: false - - /@mapbox/whoots-js/3.1.0: - resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} - engines: {node: '>=6.0.0'} - dev: false - - /@mrmlnc/readdir-enhanced/2.2.1: - resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} - engines: {node: '>=4'} - dependencies: - call-me-maybe: 1.0.2 - glob-to-regexp: 0.3.0 - - /@nodelib/fs.stat/1.1.3: - resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} - engines: {node: '>= 6'} - - /@plotly/d3-sankey-circular/0.33.1: - resolution: {integrity: sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==} - dependencies: - d3-array: 1.2.4 - d3-collection: 1.0.7 - d3-shape: 1.3.7 - elementary-circuits-directed-graph: 1.3.1 - dev: false - - /@plotly/d3-sankey/0.7.2: - resolution: {integrity: sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==} - dependencies: - d3-array: 1.2.4 - d3-collection: 1.0.7 - d3-shape: 1.3.7 - dev: false - - /@plotly/d3/3.8.1: - resolution: {integrity: sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg==} - dev: false - - /@plotly/point-cluster/3.1.9: - resolution: {integrity: sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==} - dependencies: - array-bounds: 1.0.1 - binary-search-bounds: 2.0.5 - clamp: 1.0.1 - defined: 1.0.1 - dtype: 2.0.0 - flatten-vertex-data: 1.0.2 - is-obj: 1.0.1 - math-log2: 1.0.1 - parse-rect: 1.2.0 - pick-by-alias: 1.2.0 - dev: false - - /@plotly/regl/2.1.2: - resolution: {integrity: sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==} - dev: false - - /@sinclair/typebox/0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: false - - /@sindresorhus/is/0.14.0: - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - dev: true - - /@svgr/babel-plugin-add-jsx-attribute/4.2.0: - resolution: {integrity: sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-plugin-remove-jsx-attribute/4.2.0: - resolution: {integrity: sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-plugin-remove-jsx-empty-expression/4.2.0: - resolution: {integrity: sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-plugin-replace-jsx-attribute-value/4.2.0: - resolution: {integrity: sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-plugin-svg-dynamic-title/4.3.3: - resolution: {integrity: sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-plugin-svg-em-dimensions/4.2.0: - resolution: {integrity: sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-plugin-transform-react-native-svg/4.2.0: - resolution: {integrity: sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-plugin-transform-svg-component/4.2.0: - resolution: {integrity: sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==} - engines: {node: '>=8'} - dev: false - - /@svgr/babel-preset/4.3.3: - resolution: {integrity: sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==} - engines: {node: '>=8'} - dependencies: - '@svgr/babel-plugin-add-jsx-attribute': 4.2.0 - '@svgr/babel-plugin-remove-jsx-attribute': 4.2.0 - '@svgr/babel-plugin-remove-jsx-empty-expression': 4.2.0 - '@svgr/babel-plugin-replace-jsx-attribute-value': 4.2.0 - '@svgr/babel-plugin-svg-dynamic-title': 4.3.3 - '@svgr/babel-plugin-svg-em-dimensions': 4.2.0 - '@svgr/babel-plugin-transform-react-native-svg': 4.2.0 - '@svgr/babel-plugin-transform-svg-component': 4.2.0 - dev: false - - /@svgr/core/4.3.3: - resolution: {integrity: sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==} - engines: {node: '>=8'} - dependencies: - '@svgr/plugin-jsx': 4.3.3 - camelcase: 5.3.1 - cosmiconfig: 5.2.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@svgr/hast-util-to-babel-ast/4.3.2: - resolution: {integrity: sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==} - engines: {node: '>=8'} - dependencies: - '@babel/types': 7.22.11 - dev: false - - /@svgr/plugin-jsx/4.3.3: - resolution: {integrity: sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.22.11 - '@svgr/babel-preset': 4.3.3 - '@svgr/hast-util-to-babel-ast': 4.3.2 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@svgr/plugin-svgo/4.3.1: - resolution: {integrity: sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==} - engines: {node: '>=8'} - dependencies: - cosmiconfig: 5.2.1 - merge-deep: 3.0.3 - svgo: 1.3.2 - dev: false - - /@svgr/webpack/4.3.3: - resolution: {integrity: sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-transform-react-constant-elements': 7.22.5_@babel+core@7.22.11 - '@babel/preset-env': 7.22.10_@babel+core@7.22.11 - '@babel/preset-react': 7.22.5_@babel+core@7.22.11 - '@svgr/core': 4.3.3 - '@svgr/plugin-jsx': 4.3.3 - '@svgr/plugin-svgo': 4.3.1 - loader-utils: 1.4.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@szmarczak/http-timer/1.1.2: - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} - dependencies: - defer-to-connect: 1.1.3 - dev: true - - /@turf/area/6.5.0: - resolution: {integrity: sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==} - dependencies: - '@turf/helpers': 6.5.0 - '@turf/meta': 6.5.0 - dev: false - - /@turf/bbox/6.5.0: - resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==} - dependencies: - '@turf/helpers': 6.5.0 - '@turf/meta': 6.5.0 - dev: false - - /@turf/centroid/6.5.0: - resolution: {integrity: sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==} - dependencies: - '@turf/helpers': 6.5.0 - '@turf/meta': 6.5.0 - dev: false - - /@turf/helpers/6.5.0: - resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} - dev: false - - /@turf/meta/6.5.0: - resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} - dependencies: - '@turf/helpers': 6.5.0 - dev: false - - /@types/babel__core/7.20.1: - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} - dependencies: - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.20.1 - dev: false - - /@types/babel__generator/7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.22.11 - dev: false - - /@types/babel__template/7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.22.11 - '@babel/types': 7.22.11 - dev: false - - /@types/babel__traverse/7.20.1: - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} - dependencies: - '@babel/types': 7.22.11 - dev: false - - /@types/classnames/2.3.1: - resolution: {integrity: sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==} - deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed. - dependencies: - classnames: 2.3.2 - dev: false - - /@types/eslint-visitor-keys/1.0.0: - resolution: {integrity: sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==} - - /@types/glob/7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 11.13.9 - - /@types/history/4.7.11: - resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} - dev: false - - /@types/history/5.0.0: - resolution: {integrity: sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==} - deprecated: This is a stub types definition. history provides its own type definitions, so you do not need this installed. - dependencies: - history: 5.3.0 - dev: false - - /@types/istanbul-lib-coverage/2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: false - - /@types/istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: false - - /@types/istanbul-reports/1.1.2: - resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-lib-report': 3.0.0 - dev: false - - /@types/jest-diff/24.3.0: - resolution: {integrity: sha512-vx1CRDeDUwQ0Pc7v+hS61O1ETA81kD04IMEC0hS1kPyVtHDdZrokAvpF7MT9VI/fVSzicelUZNCepDvhRV1PeA==} - deprecated: This is a stub types definition. jest-diff provides its own type definitions, so you do not need this installed. - dependencies: - jest-diff: 29.6.4 - dev: false - - /@types/jest/24.0.12: - resolution: {integrity: sha512-60sjqMhat7i7XntZckcSGV8iREJyXXI6yFHZkSZvCPUeOnEJ/VP1rU/WpEWQ56mvoh8NhC+sfKAuJRTyGtCOow==} - dependencies: - '@types/jest-diff': 24.3.0 - dev: false - - /@types/json-schema/7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - - /@types/json5/0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - - /@types/keyv/3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 11.13.9 - dev: true - - /@types/minimatch/5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - /@types/node/11.13.9: - resolution: {integrity: sha512-NJ4yuEVw5podZbINp3tEqUIImMSAEHaCXRiWCf3KC32l6hIKf0iPJEh2uZdT0fELfRYk310yLmMXqy2leZQUbg==} - - /@types/normalize-package-data/2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true - - /@types/parse-json/4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - - /@types/plotly.js/2.12.26: - resolution: {integrity: sha512-vP1iaVL4HHYSbugv49pwtLL6D9CSqOnQLjiRRdRYjVMEDbjIWhMgxc49BJAxSUShupiJHDp35e0WJS9SwIB2WA==} - dev: true - - /@types/prop-types/15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - - /@types/q/1.5.5: - resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - dev: false - - /@types/react-dom/16.8.4: - resolution: {integrity: sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==} - dependencies: - '@types/react': 16.8.15 - - /@types/react-plotly.js/2.6.0: - resolution: {integrity: sha512-nJJ57U0/CNDAO+F3dpnMgM8PtjLE/O1I3O6gq4+5Q13uKqrPnHGYOttfdzQJ4D7KYgF609miVzEYakUS2zds8w==} - dependencies: - '@types/plotly.js': 2.12.26 - '@types/react': 16.8.15 - dev: true - - /@types/react-router-dom/4.3.5: - resolution: {integrity: sha512-eFajSUASYbPHg2BDM1G8Btx+YqGgvROPIg6sBhl3O4kbDdYXdFdfrgQFf/pcBuQVObjfT9AL/dd15jilR5DIEA==} - dependencies: - '@types/history': 5.0.0 - '@types/react': 16.8.15 - '@types/react-router': 5.1.20 - dev: false - - /@types/react-router/5.1.20: - resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - dependencies: - '@types/history': 4.7.11 - '@types/react': 16.8.15 - dev: false - - /@types/react-select/3.1.2: - resolution: {integrity: sha512-ygvR/2FL87R2OLObEWFootYzkvm67LRA+URYEAcBuvKk7IXmdsnIwSGm60cVXGaqkJQHozb2Cy1t94tCYb6rJA==} - dependencies: - '@types/react': 16.8.15 - '@types/react-dom': 16.8.4 - '@types/react-transition-group': 4.4.6 - dev: true - - /@types/react-slick/0.23.10: - resolution: {integrity: sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==} - dependencies: - '@types/react': 16.8.15 - dev: false - - /@types/react-transition-group/4.4.6: - resolution: {integrity: sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==} - dependencies: - '@types/react': 16.8.15 - dev: true - - /@types/react/16.8.15: - resolution: {integrity: sha512-dMhzw1rWK+wwJWvPp5Pk12ksSrm/z/C/+lOQbMZ7YfDQYnJ02bc0wtg4EJD9qrFhuxFrf/ywNgwTboucobJqQg==} - dependencies: - '@types/prop-types': 15.7.5 - csstype: 2.6.21 - - /@types/responselike/1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - dependencies: - '@types/node': 11.13.9 - dev: true - - /@types/stack-utils/1.0.1: - resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} - dev: false - - /@types/yargs-parser/21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: false - - /@types/yargs/13.0.12: - resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: false - - /@typescript-eslint/eslint-plugin/2.34.0_lil7fcptb6lvwsbapucsn3cnza: - resolution: {integrity: sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - peerDependencies: - '@typescript-eslint/parser': ^2.0.0 - eslint: ^5.0.0 || ^6.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/experimental-utils': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - eslint: 6.8.0 - functional-red-black-tree: 1.0.1 - regexpp: 3.2.0 - tsutils: 3.21.0_typescript@3.5.3 - typescript: 3.5.3 - transitivePeerDependencies: - - supports-color - - /@typescript-eslint/experimental-utils/2.34.0_gwfevwdfvao4wdn2y246xkx3di: - resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - peerDependencies: - eslint: '*' - dependencies: - '@types/json-schema': 7.0.12 - '@typescript-eslint/typescript-estree': 2.34.0_typescript@3.5.3 - eslint: 6.8.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - transitivePeerDependencies: - - supports-color - - typescript - - /@typescript-eslint/parser/2.34.0_gwfevwdfvao4wdn2y246xkx3di: - resolution: {integrity: sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - peerDependencies: - eslint: ^5.0.0 || ^6.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@types/eslint-visitor-keys': 1.0.0 - '@typescript-eslint/experimental-utils': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - '@typescript-eslint/typescript-estree': 2.34.0_typescript@3.5.3 - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - typescript: 3.5.3 - transitivePeerDependencies: - - supports-color - - /@typescript-eslint/typescript-estree/2.34.0_typescript@3.5.3: - resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - debug: 4.3.4 - eslint-visitor-keys: 1.3.0 - glob: 7.2.3 - is-glob: 4.0.3 - lodash: 4.17.21 - semver: 7.5.4 - tsutils: 3.21.0_typescript@3.5.3 - typescript: 3.5.3 - transitivePeerDependencies: - - supports-color - - /@webassemblyjs/ast/1.8.5: - resolution: {integrity: sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==} - dependencies: - '@webassemblyjs/helper-module-context': 1.8.5 - '@webassemblyjs/helper-wasm-bytecode': 1.8.5 - '@webassemblyjs/wast-parser': 1.8.5 - dev: false - - /@webassemblyjs/floating-point-hex-parser/1.8.5: - resolution: {integrity: sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==} - dev: false - - /@webassemblyjs/helper-api-error/1.8.5: - resolution: {integrity: sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==} - dev: false - - /@webassemblyjs/helper-buffer/1.8.5: - resolution: {integrity: sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==} - dev: false - - /@webassemblyjs/helper-code-frame/1.8.5: - resolution: {integrity: sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==} - dependencies: - '@webassemblyjs/wast-printer': 1.8.5 - dev: false - - /@webassemblyjs/helper-fsm/1.8.5: - resolution: {integrity: sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==} - dev: false - - /@webassemblyjs/helper-module-context/1.8.5: - resolution: {integrity: sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - mamacro: 0.0.3 - dev: false - - /@webassemblyjs/helper-wasm-bytecode/1.8.5: - resolution: {integrity: sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==} - dev: false - - /@webassemblyjs/helper-wasm-section/1.8.5: - resolution: {integrity: sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/helper-buffer': 1.8.5 - '@webassemblyjs/helper-wasm-bytecode': 1.8.5 - '@webassemblyjs/wasm-gen': 1.8.5 - dev: false - - /@webassemblyjs/ieee754/1.8.5: - resolution: {integrity: sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: false - - /@webassemblyjs/leb128/1.8.5: - resolution: {integrity: sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==} - dependencies: - '@xtuc/long': 4.2.2 - dev: false - - /@webassemblyjs/utf8/1.8.5: - resolution: {integrity: sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==} - dev: false - - /@webassemblyjs/wasm-edit/1.8.5: - resolution: {integrity: sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/helper-buffer': 1.8.5 - '@webassemblyjs/helper-wasm-bytecode': 1.8.5 - '@webassemblyjs/helper-wasm-section': 1.8.5 - '@webassemblyjs/wasm-gen': 1.8.5 - '@webassemblyjs/wasm-opt': 1.8.5 - '@webassemblyjs/wasm-parser': 1.8.5 - '@webassemblyjs/wast-printer': 1.8.5 - dev: false - - /@webassemblyjs/wasm-gen/1.8.5: - resolution: {integrity: sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/helper-wasm-bytecode': 1.8.5 - '@webassemblyjs/ieee754': 1.8.5 - '@webassemblyjs/leb128': 1.8.5 - '@webassemblyjs/utf8': 1.8.5 - dev: false - - /@webassemblyjs/wasm-opt/1.8.5: - resolution: {integrity: sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/helper-buffer': 1.8.5 - '@webassemblyjs/wasm-gen': 1.8.5 - '@webassemblyjs/wasm-parser': 1.8.5 - dev: false - - /@webassemblyjs/wasm-parser/1.8.5: - resolution: {integrity: sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/helper-api-error': 1.8.5 - '@webassemblyjs/helper-wasm-bytecode': 1.8.5 - '@webassemblyjs/ieee754': 1.8.5 - '@webassemblyjs/leb128': 1.8.5 - '@webassemblyjs/utf8': 1.8.5 - dev: false - - /@webassemblyjs/wast-parser/1.8.5: - resolution: {integrity: sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/floating-point-hex-parser': 1.8.5 - '@webassemblyjs/helper-api-error': 1.8.5 - '@webassemblyjs/helper-code-frame': 1.8.5 - '@webassemblyjs/helper-fsm': 1.8.5 - '@xtuc/long': 4.2.2 - dev: false - - /@webassemblyjs/wast-printer/1.8.5: - resolution: {integrity: sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==} - dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/wast-parser': 1.8.5 - '@xtuc/long': 4.2.2 - dev: false - - /@xtuc/ieee754/1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: false - - /@xtuc/long/4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: false - - /abab/2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: false - - /abs-svg-path/0.1.1: - resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} - dev: false - - /accepts/1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - /acorn-globals/4.3.4: - resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} - dependencies: - acorn: 6.4.2 - acorn-walk: 6.2.0 - dev: false - - /acorn-jsx/5.3.2_acorn@7.4.1: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 7.4.1 - - /acorn-walk/6.2.0: - resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} - engines: {node: '>=0.4.0'} - dev: false - - /acorn/5.7.4: - resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /acorn/6.4.2: - resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /acorn/7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - - /acorn/8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /add-dom-event-listener/1.1.0: - resolution: {integrity: sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==} - dependencies: - object-assign: 4.1.1 - dev: false - - /address/1.1.2: - resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} - engines: {node: '>= 0.12.0'} - dev: false - - /adjust-sourcemap-loader/3.0.0: - resolution: {integrity: sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==} - engines: {node: '>=8.9'} - dependencies: - loader-utils: 2.0.4 - regex-parser: 2.2.11 - dev: false - - /ag-charts-community/7.3.0: - resolution: {integrity: sha512-118U6YsCMia6iZHaN06zT19rr2SYa92WB73pMVCKQlp2H3c19uKQ6Y6DfKG/nIfNUzFXZLHBwKIdZXsMWJdZww==} - dev: false - - /ag-charts-react/7.3.0_4uflhkpzmxcxyxkuqg2ofty3gq: - resolution: {integrity: sha512-DR8l8IQbRJeutTslqJ8muwsMPdFyJAn/rq17NhQYZ9F4wx0suIAgaUG/We8KEO94qASLX/nhKuvbI/d7M4kJRw==} - peerDependencies: - ag-charts-community: ~7.3.0 - react: ^16.3.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.3.0 || ^17.0.0 || ^18.0.0 - dependencies: - ag-charts-community: 7.3.0 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: false - - /aggregate-error/3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: false - - /ajv-errors/1.0.1_ajv@6.12.6: - resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} - peerDependencies: - ajv: '>=5.0.0' - dependencies: - ajv: 6.12.6 - dev: false - - /ajv-keywords/3.5.2_ajv@6.12.6: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: false - - /ajv/6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /almost-equal/1.1.0: - resolution: {integrity: sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==} - dev: false - - /alphanum-sort/1.0.2: - resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} - dev: false - - /ansi-align/3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: true - - /ansi-colors/3.2.4: - resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} - engines: {node: '>=6'} - dev: false - - /ansi-escapes/3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - dev: false - - /ansi-escapes/4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - - /ansi-html/0.0.7: - resolution: {integrity: sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: false - - /ansi-regex/2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: false - - /ansi-regex/3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - - /ansi-regex/4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - - /ansi-regex/5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles/2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: false - - /ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - - /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: false - - /antd/3.26.20_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-VIous4ofZfxFtd9K1h9MpRX2sDDpj3QcOFi3YgIc9B/uyDli/GlLb8SWKfQfJaMkaxwatIv503dag2Tog+hiEg==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@ant-design/create-react-context': 0.2.6_4vyaxm4rsh2mpfdenvlqy7kmya - '@ant-design/icons': 2.1.1 - '@ant-design/icons-react': 2.0.1_djmcyhfzddxj7qqtb4n7fxfjnq - '@types/react-slick': 0.23.10 - array-tree-filter: 2.1.0 - babel-runtime: 6.26.0 - classnames: 2.2.6 - copy-to-clipboard: 3.3.3 - css-animation: 1.6.1 - dom-closest: 0.2.0 - enquire.js: 2.1.6 - is-mobile: 2.2.2 - lodash: 4.17.21 - moment: 2.29.4 - omit.js: 1.0.2 - prop-types: 15.8.1 - raf: 3.4.1 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-calendar: 9.15.11_wcqkhtmu7mswc6yz4uyexck3ty - rc-cascader: 0.17.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-checkbox: 2.1.8 - rc-collapse: 1.11.8_wcqkhtmu7mswc6yz4uyexck3ty - rc-dialog: 7.6.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-drawer: 3.1.3_react@16.14.0 - rc-dropdown: 2.4.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-editor-mention: 1.1.13_wcqkhtmu7mswc6yz4uyexck3ty - rc-form: 2.4.12_prop-types@15.8.1 - rc-input-number: 4.5.9 - rc-mentions: 0.4.2_ccrd4luiijsxnlhe6bgkvyy2z4 - rc-menu: 7.5.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-notification: 3.3.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-pagination: 1.20.15 - rc-progress: 2.5.3 - rc-rate: 2.5.1 - rc-resize-observer: 0.1.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-select: 9.2.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-slider: 8.7.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-steps: 3.5.0 - rc-switch: 1.9.2_wcqkhtmu7mswc6yz4uyexck3ty - rc-table: 6.10.15_wcqkhtmu7mswc6yz4uyexck3ty - rc-tabs: 9.7.0_react@16.14.0 - rc-time-picker: 3.7.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-tooltip: 3.7.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree: 2.1.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree-select: 2.9.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-upload: 2.9.4 - rc-util: 4.21.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-lazy-load: 3.1.14_wcqkhtmu7mswc6yz4uyexck3ty - react-lifecycles-compat: 3.0.4 - react-slick: 0.25.2_wcqkhtmu7mswc6yz4uyexck3ty - resize-observer-polyfill: 1.5.1 - shallowequal: 1.1.0 - warning: 4.0.3 - dev: false - - /anymatch/2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - dependencies: - micromatch: 3.1.10 - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /anymatch/2.0.0_supports-color@6.1.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - dependencies: - micromatch: 3.1.10_supports-color@6.1.0 - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /anymatch/3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: false - - /aproba/1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - dev: false - - /argparse/1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - - /aria-query/3.0.0: - resolution: {integrity: sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==} - dependencies: - ast-types-flow: 0.0.7 - commander: 2.20.3 - dev: false - - /arity-n/1.0.4: - resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} - dev: false - - /arr-diff/4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - /arr-flatten/1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - /arr-union/3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - - /array-bounds/1.0.1: - resolution: {integrity: sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==} - dev: false - - /array-buffer-byte-length/1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - - /array-equal/1.0.0: - resolution: {integrity: sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==} - dev: false - - /array-find-index/1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - - /array-find/1.0.0: - resolution: {integrity: sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==} - dev: true - - /array-flatten/1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - /array-flatten/2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: false - - /array-includes/3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - is-string: 1.0.7 - - /array-normalize/1.1.4: - resolution: {integrity: sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==} - dependencies: - array-bounds: 1.0.1 - dev: false - - /array-range/1.0.1: - resolution: {integrity: sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==} - dev: false - - /array-rearrange/2.2.2: - resolution: {integrity: sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==} - dev: false - - /array-tree-filter/2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - dev: false - - /array-union/1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - dependencies: - array-uniq: 1.0.3 - - /array-uniq/1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - - /array-unique/0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - - /array.prototype.findlastindex/1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 - dev: true - - /array.prototype.flat/1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - - /array.prototype.flatmap/1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.reduce/1.0.5: - resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: false - - /array.prototype.tosorted/1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 - dev: true - - /arraybuffer.prototype.slice/1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - get-intrinsic: 1.2.1 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - - /arrify/1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - /arrify/2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: true - - /asap/2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: false - - /asn1.js/4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - /asn1.js/5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - - /asn1/0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - - /assert-plus/1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - - /assert/1.5.0: - resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} - dependencies: - object-assign: 4.1.1 - util: 0.10.3 - - /assign-symbols/1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - - /ast-types-flow/0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: false - - /astral-regex/1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - - /async-each/1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - dev: false - - /async-limiter/1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: false - - /async-validator/1.11.5: - resolution: {integrity: sha512-XNtCsMAeAH1pdLMEg1z8/Bb3a8cdCbui9QbJATRFHHHW5kT6+NPI3zSVQUXgikTFITzsg+kYY5NTWhM2Orwt9w==} - dev: false - - /async/2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - dependencies: - lodash: 4.17.21 - dev: false - - /asynciterator.prototype/1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - - /asynckit/0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - /at-least-node/1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /atob/2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - - /autoprefixer/9.8.8: - resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} - hasBin: true - dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001524 - normalize-range: 0.1.2 - num2fraction: 1.2.2 - picocolors: 0.2.1 - postcss: 7.0.39 - postcss-value-parser: 4.2.0 - dev: false - - /available-typed-arrays/1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - - /aws-sign2/0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - /aws4/1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} - - /axios/0.28.0: - resolution: {integrity: sha512-Tu7NYoGY4Yoc7I+Npf9HhUMtEEpV7ZiLH9yndTCoNhcpBH0kwcvFbzYN9/u5QKI5A6uefjsNNWaz5olJVYS62Q==} - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /axobject-query/2.2.0: - resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} - dev: false - - /babel-code-frame/6.26.0: - resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} - dependencies: - chalk: 1.1.3 - esutils: 2.0.3 - js-tokens: 3.0.2 - dev: false - - /babel-eslint/10.1.0_eslint@6.8.0: - resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - peerDependencies: - eslint: '>= 4.12.1' - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.11 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - resolve: 1.22.4 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-extract-comments/1.0.0: - resolution: {integrity: sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==} - engines: {node: '>=4'} - dependencies: - babylon: 6.18.0 - dev: false - - /babel-jest/24.9.0_@babel+core@7.22.11: - resolution: {integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==} - engines: {node: '>= 6'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@jest/transform': 24.9.0 - '@jest/types': 24.9.0 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 5.2.0 - babel-preset-jest: 24.9.0_@babel+core@7.22.11 - chalk: 2.4.2 - slash: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-jest/24.9.0_@babel+core@7.9.0: - resolution: {integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==} - engines: {node: '>= 6'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.9.0 - '@jest/transform': 24.9.0 - '@jest/types': 24.9.0 - '@types/babel__core': 7.20.1 - babel-plugin-istanbul: 5.2.0 - babel-preset-jest: 24.9.0_@babel+core@7.9.0 - chalk: 2.4.2 - slash: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-loader/8.1.0_v5wbdnhwytg3u2hu4ix2bhpzla: - resolution: {integrity: sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==} - engines: {node: '>= 6.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.9.0 - find-cache-dir: 2.1.0 - loader-utils: 1.4.2 - mkdirp: 0.5.6 - pify: 4.0.1 - schema-utils: 2.7.1 - webpack: 4.42.0 - dev: false - - /babel-plugin-emotion/10.2.2: - resolution: {integrity: sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==} - dependencies: - '@babel/helper-module-imports': 7.22.5 - '@emotion/hash': 0.8.0 - '@emotion/memoize': 0.7.4 - '@emotion/serialize': 0.11.16 - babel-plugin-macros: 2.8.0 - babel-plugin-syntax-jsx: 6.18.0 - convert-source-map: 1.9.0 - escape-string-regexp: 1.0.5 - find-root: 1.1.0 - source-map: 0.5.7 - dev: false - - /babel-plugin-import/1.13.8: - resolution: {integrity: sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q==} - dependencies: - '@babel/helper-module-imports': 7.22.5 - dev: false - - /babel-plugin-istanbul/5.2.0: - resolution: {integrity: sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==} - engines: {node: '>=6'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - find-up: 3.0.0 - istanbul-lib-instrument: 3.3.0 - test-exclude: 5.2.3 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-jest-hoist/24.9.0: - resolution: {integrity: sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==} - engines: {node: '>= 6'} - dependencies: - '@types/babel__traverse': 7.20.1 - dev: false - - /babel-plugin-macros/2.8.0: - resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} - dependencies: - '@babel/runtime': 7.9.0 - cosmiconfig: 6.0.0 - resolve: 1.22.4 - dev: false - - /babel-plugin-named-asset-import/0.3.8_@babel+core@7.9.0: - resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} - peerDependencies: - '@babel/core': ^7.1.0 - dependencies: - '@babel/core': 7.9.0 - dev: false - - /babel-plugin-polyfill-corejs2/0.4.5_@babel+core@7.22.11: - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.11 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-polyfill-corejs3/0.8.3_@babel+core@7.22.11: - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.11 - core-js-compat: 3.32.1 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-polyfill-regenerator/0.5.2_@babel+core@7.22.11: - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.11 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-syntax-jsx/6.18.0: - resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} - dev: false - - /babel-plugin-syntax-object-rest-spread/6.13.0: - resolution: {integrity: sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==} - dev: false - - /babel-plugin-transform-object-rest-spread/6.26.0: - resolution: {integrity: sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==} - dependencies: - babel-plugin-syntax-object-rest-spread: 6.13.0 - babel-runtime: 6.26.0 - dev: false - - /babel-plugin-transform-react-remove-prop-types/0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - dev: false - - /babel-preset-jest/24.9.0_@babel+core@7.22.11: - resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} - engines: {node: '>= 6'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.11 - babel-plugin-jest-hoist: 24.9.0 - dev: false - - /babel-preset-jest/24.9.0_@babel+core@7.9.0: - resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} - engines: {node: '>= 6'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.9.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.9.0 - babel-plugin-jest-hoist: 24.9.0 - dev: false - - /babel-preset-react-app/9.1.2: - resolution: {integrity: sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==} - dependencies: - '@babel/core': 7.9.0 - '@babel/plugin-proposal-class-properties': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-proposal-decorators': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-proposal-numeric-separator': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-proposal-optional-chaining': 7.9.0_@babel+core@7.9.0 - '@babel/plugin-transform-flow-strip-types': 7.9.0_@babel+core@7.9.0 - '@babel/plugin-transform-react-display-name': 7.8.3_@babel+core@7.9.0 - '@babel/plugin-transform-runtime': 7.9.0_@babel+core@7.9.0 - '@babel/preset-env': 7.9.0_@babel+core@7.9.0 - '@babel/preset-react': 7.9.1_@babel+core@7.9.0 - '@babel/preset-typescript': 7.9.0_@babel+core@7.9.0 - '@babel/runtime': 7.9.0 - babel-plugin-macros: 2.8.0 - babel-plugin-transform-react-remove-prop-types: 0.4.24 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-runtime/6.26.0: - resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 - dev: false - - /babylon/6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - dev: false - - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base/0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.0 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /basic-auth/2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /batch/0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: false - - /bcrypt-pbkdf/1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - dependencies: - tweetnacl: 0.14.5 - - /big.js/5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: false - - /binary-extensions/1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - dev: false - - /binary-extensions/2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: false - - /binary-search-bounds/2.0.5: - resolution: {integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==} - dev: false - - /bindings/1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true - dependencies: - file-uri-to-path: 1.0.0 - dev: false - optional: true - - /bit-twiddle/1.0.2: - resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} - dev: false - - /bitmap-sdf/1.0.4: - resolution: {integrity: sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==} - dev: false - - /bl/2.2.1: - resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - dev: false - - /bluebird/3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: false - - /bn.js/4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - - /bn.js/5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - /body-parser/1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /body-parser/1.20.2_supports-color@6.1.0: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /bonjour/3.5.0: - resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} - dependencies: - array-flatten: 2.1.2 - deep-equal: 1.1.1 - dns-equal: 1.0.0 - dns-txt: 2.0.2 - multicast-dns: 6.2.3 - multicast-dns-service-types: 1.1.0 - dev: false - - /boolbase/1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: false - - /boxen/3.2.0: - resolution: {integrity: sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==} - engines: {node: '>=6'} - dependencies: - ansi-align: 3.0.1 - camelcase: 5.3.1 - chalk: 2.4.2 - cli-boxes: 2.2.1 - string-width: 3.1.0 - term-size: 1.2.0 - type-fest: 0.3.1 - widest-line: 2.0.1 - dev: true - - /boxen/4.2.0: - resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} - engines: {node: '>=8'} - dependencies: - ansi-align: 3.0.1 - camelcase: 5.3.1 - chalk: 3.0.0 - cli-boxes: 2.2.1 - string-width: 4.2.3 - term-size: 2.2.1 - type-fest: 0.8.1 - widest-line: 3.1.0 - dev: true - - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /braces/2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - /braces/2.3.2_supports-color@6.1.0: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2_supports-color@6.1.0 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /brorand/1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - /browser-process-hrtime/1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: false - - /browser-resolve/1.11.3: - resolution: {integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==} - dependencies: - resolve: 1.1.7 - dev: false - - /browserify-aes/1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - /browserify-cipher/1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - - /browserify-des/1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - dependencies: - cipher-base: 1.0.4 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - /browserify-rsa/4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} - dependencies: - bn.js: 5.2.1 - randombytes: 2.1.0 - - /browserify-sign/4.2.3: - resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} - engines: {node: '>= 0.12'} - dependencies: - bn.js: 5.2.1 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.5.5 - hash-base: 3.0.4 - inherits: 2.0.4 - parse-asn1: 5.1.7 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - - /browserify-zlib/0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - dependencies: - pako: 1.0.11 - - /browserslist/4.10.0: - resolution: {integrity: sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001524 - electron-to-chromium: 1.4.503 - node-releases: 1.1.77 - pkg-up: 3.1.0 - dev: false - - /browserslist/4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001524 - electron-to-chromium: 1.4.503 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11_browserslist@4.21.10 - dev: false - - /bser/2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: false - - /buf-compare/1.0.1: - resolution: {integrity: sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q==} - engines: {node: '>=0.10.0'} - dev: true - - /buffer-from/1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false - - /buffer-indexof/1.1.1: - resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} - dev: false - - /buffer-xor/1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - - /buffer/4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - - /builtin-status-codes/3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - - /bytes/3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - - /bytes/3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - /cacache/12.0.4: - resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} - dependencies: - bluebird: 3.7.2 - chownr: 1.1.4 - figgy-pudding: 3.5.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - infer-owner: 1.0.4 - lru-cache: 5.1.1 - mississippi: 3.0.0 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - promise-inflight: 1.0.1_bluebird@3.7.2 - rimraf: 2.7.1 - ssri: 6.0.2 - unique-filename: 1.1.1 - y18n: 4.0.3 - dev: false - - /cacache/13.0.1: - resolution: {integrity: sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==} - engines: {node: '>= 8'} - dependencies: - chownr: 1.1.4 - figgy-pudding: 3.5.2 - fs-minipass: 2.1.0 - glob: 7.2.3 - graceful-fs: 4.2.11 - infer-owner: 1.0.4 - lru-cache: 5.1.1 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - p-map: 3.0.0 - promise-inflight: 1.0.1 - rimraf: 2.7.1 - ssri: 7.1.1 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - dev: false - - /cache-base/1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.0 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - - /cacheable-request/6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 3.1.0 - lowercase-keys: 2.0.0 - normalize-url: 4.5.1 - responselike: 1.0.2 - dev: true - - /call-bind/1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - - /call-me-maybe/1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - - /caller-callsite/2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - dependencies: - callsites: 2.0.0 - dev: false - - /caller-path/2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 - dev: false - - /callsites/2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - dev: false - - /callsites/3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /camel-case/4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - dev: false - - /camelcase-keys/4.2.0: - resolution: {integrity: sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==} - engines: {node: '>=4'} - dependencies: - camelcase: 4.1.0 - map-obj: 2.0.0 - quick-lru: 1.1.0 - dev: true - - /camelcase/4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - dev: true - - /camelcase/5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - /caniuse-api/3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001524 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - dev: false - - /caniuse-lite/1.0.30001524: - resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} - dev: false - - /canvas-fit/1.5.0: - resolution: {integrity: sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==} - dependencies: - element-size: 1.1.1 - dev: false - - /capture-exit/2.0.0: - resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} - engines: {node: 6.* || 8.* || >= 10.*} - dependencies: - rsvp: 4.8.5 - dev: false - - /case-sensitive-paths-webpack-plugin/2.3.0: - resolution: {integrity: sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==} - engines: {node: '>=4'} - dev: false - - /caseless/0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - /chalk/1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false - - /chalk/2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - /chalk/3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chardet/0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - /chokidar/2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies - dependencies: - anymatch: 2.0.0 - async-each: 1.0.6 - braces: 2.3.2 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /chokidar/2.1.8_supports-color@6.1.0: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies - dependencies: - anymatch: 2.0.0_supports-color@6.1.0 - async-each: 1.0.6 - braces: 2.3.2_supports-color@6.1.0 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1_supports-color@6.1.0 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - dev: false - - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: false - - /chownr/1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /chrome-trace-event/1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: false - - /ci-info/2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - - /cipher-base/1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - /clamp/1.0.1: - resolution: {integrity: sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==} - dev: false - - /class-utils/0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - - /classnames/2.2.6: - resolution: {integrity: sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==} - dev: false - - /classnames/2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: false - - /clean-css/4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} - dependencies: - source-map: 0.6.1 - dev: false - - /clean-regexp/1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /clean-stack/2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: false - - /cli-boxes/2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: true - - /cli-cursor/3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - - /cli-width/2.2.1: - resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} - dev: false - - /cli-width/3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - /cliui/5.0.0: - resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} - dependencies: - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi: 5.1.0 - - /clone-deep/0.2.4: - resolution: {integrity: sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==} - engines: {node: '>=0.10.0'} - dependencies: - for-own: 0.1.5 - is-plain-object: 2.0.4 - kind-of: 3.2.2 - lazy-cache: 1.0.4 - shallow-clone: 0.1.2 - dev: false - - /clone-deep/4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: false - - /clone-response/1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: true - - /clone/2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - dev: false - - /co/4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: false - - /coa/2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} - dependencies: - '@types/q': 1.5.5 - chalk: 2.4.2 - q: 1.5.1 - dev: false - - /collection-visit/1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - - /color-alpha/1.0.4: - resolution: {integrity: sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==} - dependencies: - color-parse: 1.3.8 - dev: false - - /color-convert/1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - - /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-id/1.1.0: - resolution: {integrity: sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==} - dependencies: - clamp: 1.0.1 - dev: false - - /color-name/1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /color-normalize/1.5.0: - resolution: {integrity: sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==} - dependencies: - clamp: 1.0.1 - color-rgba: 2.1.1 - dtype: 2.0.0 - dev: false - - /color-parse/1.3.8: - resolution: {integrity: sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==} - dependencies: - color-name: 1.1.4 - defined: 1.0.1 - is-plain-obj: 1.1.0 - dev: false - - /color-rgba/2.1.1: - resolution: {integrity: sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==} - dependencies: - clamp: 1.0.1 - color-parse: 1.3.8 - color-space: 1.16.0 - dev: false - - /color-space/1.16.0: - resolution: {integrity: sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==} - dependencies: - hsluv: 0.0.3 - mumath: 3.3.4 - dev: false - - /color-string/1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - - /color/3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - dev: false - - /combined-stream/1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - - /commander/2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false - - /commander/4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false - - /common-tags/1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - dev: false - - /commondir/1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - /component-classes/1.2.6: - resolution: {integrity: sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==} - dependencies: - component-indexof: 0.0.3 - dev: false - - /component-emitter/1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - - /component-indexof/0.0.3: - resolution: {integrity: sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==} - dev: false - - /compose-function/3.0.3: - resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} - dependencies: - arity-n: 1.0.4 - dev: false - - /compressible/2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - - /compression/1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /compression/1.7.4_supports-color@6.1.0: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9_supports-color@6.1.0 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /concat-stream/1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - dev: false - - /configstore/4.0.0: - resolution: {integrity: sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==} - engines: {node: '>=6'} - dependencies: - dot-prop: 4.2.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.4.3 - xdg-basedir: 3.0.0 - dev: true - - /configstore/5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} - dependencies: - dot-prop: 5.3.0 - graceful-fs: 4.2.11 - make-dir: 3.1.0 - unique-string: 2.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 4.0.0 - dev: true - - /confusing-browser-globals/1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: false - - /confusing-browser-globals/1.0.9: - resolution: {integrity: sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==} - dev: true - - /connect-history-api-fallback/1.6.0: - resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} - engines: {node: '>=0.8'} - dev: false - - /connect-pause/0.1.1: - resolution: {integrity: sha512-a1gSWQBQD73krFXdUEYJom2RTFrWUL3YvXDCRkyv//GVXc79cdW9MngtRuN9ih4FDKBtfJAJId+BbDuX+1rh2w==} - dev: true - - /console-browserify/1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - - /constants-browserify/1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - - /contains-path/0.1.0: - resolution: {integrity: sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==} - engines: {node: '>=0.10.0'} - dev: false - - /content-disposition/0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - - /content-type/1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - /convert-source-map/0.3.5: - resolution: {integrity: sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==} - dev: false - - /convert-source-map/1.7.0: - resolution: {integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==} - dependencies: - safe-buffer: 5.1.2 - dev: false - - /convert-source-map/1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false - - /cookie-signature/1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - /cookie/0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - - /copy-anything/2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - dependencies: - is-what: 3.14.1 - dev: false - - /copy-concurrently/1.0.5: - resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} - dependencies: - aproba: 1.2.0 - fs-write-stream-atomic: 1.0.10 - iferr: 0.1.5 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: false - - /copy-descriptor/0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - - /copy-to-clipboard/3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - dependencies: - toggle-selection: 1.0.6 - dev: false - - /core-assert/0.2.1: - resolution: {integrity: sha512-IG97qShIP+nrJCXMCgkNZgH7jZQ4n8RpPyPeXX++T6avR/KhLhgLiHKoEn5Rc1KjfycSfA9DMa6m+4C4eguHhw==} - engines: {node: '>=0.10.0'} - dependencies: - buf-compare: 1.0.1 - is-error: 2.2.2 - dev: true - - /core-js-compat/3.32.1: - resolution: {integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==} - dependencies: - browserslist: 4.21.10 - dev: false - - /core-js-pure/3.32.1: - resolution: {integrity: sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ==} - requiresBuild: true - dev: false - - /core-js/1.2.7: - resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - dev: false - - /core-js/2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false - - /core-js/3.32.1: - resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} - requiresBuild: true - dev: false - - /core-util-is/1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - - /core-util-is/1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - /cors/2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - dev: true - - /cosmiconfig/5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 - dev: false - - /cosmiconfig/6.0.0: - resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} - engines: {node: '>=8'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - /country-regex/1.1.0: - resolution: {integrity: sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==} - dev: false - - /create-ecdh/4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - dependencies: - bn.js: 4.12.0 - elliptic: 6.5.4 - - /create-hash/1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - - /create-hmac/1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - /create-react-class/15.7.0: - resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: false - - /cross-spawn/5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn/6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - /cross-spawn/7.0.1: - resolution: {integrity: sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: false - - /crypto-browserify/3.12.0: - resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.3 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - inherits: 2.0.4 - pbkdf2: 3.1.2 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - - /crypto-random-string/1.0.0: - resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} - engines: {node: '>=4'} - dev: true - - /crypto-random-string/2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - dev: true - - /css-animation/1.6.1: - resolution: {integrity: sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==} - dependencies: - babel-runtime: 6.26.0 - component-classes: 1.2.6 - dev: false - - /css-blank-pseudo/0.1.4: - resolution: {integrity: sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - postcss: 7.0.39 - dev: false - - /css-color-names/0.0.4: - resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} - dev: false - - /css-declaration-sorter/4.0.1: - resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} - engines: {node: '>4'} - dependencies: - postcss: 7.0.39 - timsort: 0.3.0 - dev: false - - /css-font-size-keywords/1.0.0: - resolution: {integrity: sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==} - dev: false - - /css-font-stretch-keywords/1.0.1: - resolution: {integrity: sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==} - dev: false - - /css-font-style-keywords/1.0.1: - resolution: {integrity: sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==} - dev: false - - /css-font-weight-keywords/1.0.0: - resolution: {integrity: sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==} - dev: false - - /css-font/1.2.0: - resolution: {integrity: sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==} - dependencies: - css-font-size-keywords: 1.0.0 - css-font-stretch-keywords: 1.0.1 - css-font-style-keywords: 1.0.1 - css-font-weight-keywords: 1.0.0 - css-global-keywords: 1.0.1 - css-system-font-keywords: 1.0.0 - pick-by-alias: 1.2.0 - string-split-by: 1.0.0 - unquote: 1.1.1 - dev: false - - /css-global-keywords/1.0.1: - resolution: {integrity: sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==} - dev: false - - /css-has-pseudo/0.10.0: - resolution: {integrity: sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - postcss: 7.0.39 - postcss-selector-parser: 5.0.0 - dev: false - - /css-loader/3.4.2_webpack@4.42.0: - resolution: {integrity: sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - camelcase: 5.3.1 - cssesc: 3.0.0 - icss-utils: 4.1.1 - loader-utils: 1.4.2 - normalize-path: 3.0.0 - postcss: 7.0.39 - postcss-modules-extract-imports: 2.0.0 - postcss-modules-local-by-default: 3.0.3 - postcss-modules-scope: 2.2.0 - postcss-modules-values: 3.0.0 - postcss-value-parser: 4.2.0 - schema-utils: 2.7.1 - webpack: 4.42.0 - dev: false - - /css-prefers-color-scheme/3.1.1: - resolution: {integrity: sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - postcss: 7.0.39 - dev: false - - /css-select-base-adapter/0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - dev: false - - /css-select/2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} - dependencies: - boolbase: 1.0.0 - css-what: 3.4.2 - domutils: 1.7.0 - nth-check: 1.0.2 - dev: false - - /css-select/4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: false - - /css-system-font-keywords/1.0.0: - resolution: {integrity: sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==} - dev: false - - /css-tree/1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.4 - source-map: 0.6.1 - dev: false - - /css-tree/1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: false - - /css-what/3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} - dev: false - - /css-what/6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false - - /css/2.2.4: - resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} - dependencies: - inherits: 2.0.4 - source-map: 0.6.1 - source-map-resolve: 0.5.3 - urix: 0.1.0 - dev: false - - /csscolorparser/1.0.3: - resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} - dev: false - - /cssdb/4.4.0: - resolution: {integrity: sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==} - dev: false - - /cssesc/2.0.0: - resolution: {integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /cssesc/3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /cssnano-preset-default/4.0.8: - resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} - engines: {node: '>=6.9.0'} - dependencies: - css-declaration-sorter: 4.0.1 - cssnano-util-raw-cache: 4.0.1 - postcss: 7.0.39 - postcss-calc: 7.0.5 - postcss-colormin: 4.0.3 - postcss-convert-values: 4.0.1 - postcss-discard-comments: 4.0.2 - postcss-discard-duplicates: 4.0.2 - postcss-discard-empty: 4.0.1 - postcss-discard-overridden: 4.0.1 - postcss-merge-longhand: 4.0.11 - postcss-merge-rules: 4.0.3 - postcss-minify-font-values: 4.0.2 - postcss-minify-gradients: 4.0.2 - postcss-minify-params: 4.0.2 - postcss-minify-selectors: 4.0.2 - postcss-normalize-charset: 4.0.1 - postcss-normalize-display-values: 4.0.2 - postcss-normalize-positions: 4.0.2 - postcss-normalize-repeat-style: 4.0.2 - postcss-normalize-string: 4.0.2 - postcss-normalize-timing-functions: 4.0.2 - postcss-normalize-unicode: 4.0.1 - postcss-normalize-url: 4.0.1 - postcss-normalize-whitespace: 4.0.2 - postcss-ordered-values: 4.1.2 - postcss-reduce-initial: 4.0.3 - postcss-reduce-transforms: 4.0.2 - postcss-svgo: 4.0.3 - postcss-unique-selectors: 4.0.1 - dev: false - - /cssnano-util-get-arguments/4.0.0: - resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} - engines: {node: '>=6.9.0'} - dev: false - - /cssnano-util-get-match/4.0.0: - resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} - engines: {node: '>=6.9.0'} - dev: false - - /cssnano-util-raw-cache/4.0.1: - resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: false - - /cssnano-util-same-parent/4.0.1: - resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} - engines: {node: '>=6.9.0'} - dev: false - - /cssnano/4.1.11: - resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} - engines: {node: '>=6.9.0'} - dependencies: - cosmiconfig: 5.2.1 - cssnano-preset-default: 4.0.8 - is-resolvable: 1.1.0 - postcss: 7.0.39 - dev: false - - /csso/4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - dependencies: - css-tree: 1.1.3 - dev: false - - /cssom/0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: false - - /cssstyle/1.4.0: - resolution: {integrity: sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==} - dependencies: - cssom: 0.3.8 - dev: false - - /csstype/2.6.21: - resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} - - /csstype/3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false - - /currently-unhandled/0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} - dependencies: - array-find-index: 1.0.2 - dev: true - - /customize-cra/0.2.14: - resolution: {integrity: sha512-LtEMXNzkhnnqGPc1dP5fnPlF1ic1dj34hDbRVJIzfMQgOaGByHhx51fTR7fv7sTPEbCPrOBP777MkCo0GPV57g==} - dependencies: - lodash.flow: 3.5.0 - dev: false - - /cyclist/1.0.2: - resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} - dev: false - - /d/1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - dependencies: - es5-ext: 0.10.64 - type: 1.2.0 - dev: false - - /d3-array/1.2.4: - resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} - dev: false - - /d3-collection/1.0.7: - resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} - dev: false - - /d3-color/1.4.1: - resolution: {integrity: sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==} - dev: false - - /d3-dispatch/1.0.6: - resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} - dev: false - - /d3-force/1.2.1: - resolution: {integrity: sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==} - dependencies: - d3-collection: 1.0.7 - d3-dispatch: 1.0.6 - d3-quadtree: 1.0.7 - d3-timer: 1.0.10 - dev: false - - /d3-format/1.4.5: - resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} - dev: false - - /d3-geo-projection/2.9.0: - resolution: {integrity: sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==} - hasBin: true - dependencies: - commander: 2.20.3 - d3-array: 1.2.4 - d3-geo: 1.12.1 - resolve: 1.22.4 - dev: false - - /d3-geo/1.12.1: - resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} - dependencies: - d3-array: 1.2.4 - dev: false - - /d3-hierarchy/1.1.9: - resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} - dev: false - - /d3-interpolate/3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - dependencies: - d3-color: 1.4.1 - dev: false - - /d3-path/1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: false - - /d3-quadtree/1.0.7: - resolution: {integrity: sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==} - dev: false - - /d3-shape/1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - dependencies: - d3-path: 1.0.9 - dev: false - - /d3-time-format/2.3.0: - resolution: {integrity: sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==} - dependencies: - d3-time: 1.1.0 - dev: false - - /d3-time/1.1.0: - resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} - dev: false - - /d3-timer/1.0.10: - resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} - dev: false - - /damerau-levenshtein/1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: false - - /dashdash/1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - - /data-urls/1.1.0: - resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 7.1.0 - dev: false - - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - - /debug/2.6.9_supports-color@6.1.0: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - supports-color: 6.1.0 - dev: false - - /debug/3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug/3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - - /debug/3.2.7_supports-color@6.1.0: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 6.1.0 - dev: false - - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /debug/4.3.4_supports-color@6.1.0: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 6.1.0 - dev: false - - /decamelize-keys/1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize/1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - /decode-uri-component/0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - - /decompress-response/3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} - dependencies: - mimic-response: 1.0.1 - dev: true - - /deep-equal/1.1.1: - resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} - dependencies: - is-arguments: 1.1.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - object-is: 1.1.5 - object-keys: 1.1.1 - regexp.prototype.flags: 1.5.0 - dev: false - - /deep-extend/0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /deep-is/0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - /deep-strict-equal/0.2.0: - resolution: {integrity: sha512-3daSWyvZ/zwJvuMGlzG1O+Ow0YSadGfb3jsh9xoCutv2tWyB9dA4YvR9L9/fSdDZa2dByYQe+TqapSGUrjnkoA==} - engines: {node: '>=0.10.0'} - dependencies: - core-assert: 0.2.1 - dev: true - - /default-gateway/4.2.0: - resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} - engines: {node: '>=6'} - dependencies: - execa: 1.0.0 - ip-regex: 2.1.0 - dev: false - - /defer-to-connect/1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - dev: true - - /define-properties/1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - - /define-property/0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 0.1.6 - - /define-property/1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.2 - - /define-property/2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.2 - isobject: 3.0.1 - - /defined/1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - dev: false - - /del/4.1.1: - resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} - engines: {node: '>=6'} - dependencies: - '@types/glob': 7.2.0 - globby: 6.1.0 - is-path-cwd: 2.2.0 - is-path-in-cwd: 2.1.0 - p-map: 2.1.0 - pify: 4.0.1 - rimraf: 2.7.1 - dev: false - - /delayed-stream/1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - /depd/1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: false - - /depd/2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - /des.js/1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - /destroy/1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - /detect-kerning/2.1.2: - resolution: {integrity: sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==} - dev: false - - /detect-newline/2.1.0: - resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} - engines: {node: '>=0.10.0'} - dev: false - - /detect-node/2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: false - - /detect-port-alt/1.1.6: - resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} - engines: {node: '>= 4.2.1'} - hasBin: true - dependencies: - address: 1.1.2 - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - dev: false - - /diff-sequences/24.9.0: - resolution: {integrity: sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==} - engines: {node: '>= 6'} - dev: false - - /diff-sequences/29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: false - - /diffie-hellman/5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - dependencies: - bn.js: 4.12.0 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - - /dir-glob/2.0.0: - resolution: {integrity: sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==} - engines: {node: '>=4'} - dependencies: - arrify: 1.0.1 - path-type: 3.0.0 - dev: false - - /dir-glob/2.2.2: - resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} - engines: {node: '>=4'} - dependencies: - path-type: 3.0.0 - dev: true - - /dns-equal/1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: false - - /dns-packet/1.3.4: - resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} - dependencies: - ip: 1.1.9 - safe-buffer: 5.2.1 - dev: false - - /dns-txt/2.0.2: - resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} - dependencies: - buffer-indexof: 1.1.1 - dev: false - - /doctrine/1.5.0: - resolution: {integrity: sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - isarray: 1.0.0 - dev: false - - /doctrine/2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - - /doctrine/3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /dom-align/1.12.4: - resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} - dev: false - - /dom-closest/0.2.0: - resolution: {integrity: sha512-6neTn1BtJlTSt+XSISXpnOsF1uni1CHsP/tmzZMGWxasYFHsBOqrHPnzmneqEgKhpagnfnfSfbvRRW0xFsBHAA==} - dependencies: - dom-matches: 2.0.0 - dev: false - - /dom-converter/0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - dependencies: - utila: 0.4.0 - dev: false - - /dom-helpers/5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - dependencies: - '@babel/runtime': 7.22.11 - csstype: 3.1.2 - dev: false - - /dom-matches/2.0.0: - resolution: {integrity: sha512-2VI856xEDCLXi19W+4BechR5/oIS6bKCKqcf16GR8Pg7dGLJ/eBOWVbCmQx2ISvYH6wTNx5Ef7JTOw1dRGRx6A==} - dev: false - - /dom-scroll-into-view/1.2.1: - resolution: {integrity: sha512-LwNVg3GJOprWDO+QhLL1Z9MMgWe/KAFLxVWKzjRTxNSPn8/LLDIfmuG71YHznXCqaqTjvHJDYO1MEAgX6XCNbQ==} - dev: false - - /dom-serializer/0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - dev: false - - /dom-serializer/1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: false - - /domain-browser/1.2.0: - resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} - engines: {node: '>=0.4', npm: '>=1.2'} - - /domelementtype/1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - dev: false - - /domelementtype/2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: false - - /domexception/1.0.1: - resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} - dependencies: - webidl-conversions: 4.0.2 - dev: false - - /domhandler/4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: false - - /domutils/1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - dev: false - - /domutils/2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: false - - /dot-case/3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dev: false - - /dot-prop/4.2.1: - resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} - engines: {node: '>=4'} - dependencies: - is-obj: 1.0.1 - dev: true - - /dot-prop/5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - - /dotenv-expand/5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: false - - /dotenv/8.2.0: - resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} - engines: {node: '>=8'} - dev: false - - /draft-js/0.10.5_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==} - peerDependencies: - react: ^0.14.0 || ^15.0.0-rc || ^16.0.0-rc || ^16.0.0 - react-dom: ^0.14.0 || ^15.0.0-rc || ^16.0.0-rc || ^16.0.0 - dependencies: - fbjs: 0.8.18 - immutable: 3.7.6 - object-assign: 4.1.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: false - - /draw-svg-path/1.0.0: - resolution: {integrity: sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==} - dependencies: - abs-svg-path: 0.1.1 - normalize-svg-path: 0.1.0 - dev: false - - /dtype/2.0.0: - resolution: {integrity: sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==} - engines: {node: '>= 0.8.0'} - dev: false - - /dup/1.0.0: - resolution: {integrity: sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==} - dev: false - - /duplexer/0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: false - - /duplexer3/0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - dev: true - - /duplexify/3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.1 - dev: false - - /earcut/2.2.4: - resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} - dev: false - - /ecc-jsbn/0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - /ee-first/1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - /electron-to-chromium/1.4.503: - resolution: {integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==} - dev: false - - /element-size/1.1.1: - resolution: {integrity: sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==} - dev: false - - /elementary-circuits-directed-graph/1.3.1: - resolution: {integrity: sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==} - dependencies: - strongly-connected-components: 1.0.1 - dev: false - - /elliptic/6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - /elliptic/6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - /emoji-regex/7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emojis-list/2.1.0: - resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==} - engines: {node: '>= 0.10'} - dev: false - - /emojis-list/3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: false - - /encodeurl/1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - /encoding/0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - dependencies: - iconv-lite: 0.6.3 - dev: false - - /end-of-stream/1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - - /enhance-visitors/1.0.0: - resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} - engines: {node: '>=4.0.0'} - dependencies: - lodash: 4.17.21 - dev: true - - /enhanced-resolve/0.9.1: - resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} - engines: {node: '>=0.6'} - dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.2.0 - tapable: 0.1.10 - dev: true - - /enhanced-resolve/4.5.0: - resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} - engines: {node: '>=6.9.0'} - dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.5.0 - tapable: 1.1.3 - dev: false - - /enquire.js/2.1.6: - resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==} - dev: false - - /entities/2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: false - - /env-editor/0.4.2: - resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} - engines: {node: '>=8'} - dev: true - - /errno/0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - dependencies: - prr: 1.0.1 - dev: false - - /error-ex/1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - - /errorhandler/1.5.1: - resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} - engines: {node: '>= 0.8'} - dependencies: - accepts: 1.3.8 - escape-html: 1.0.3 - dev: true - - /es-abstract/1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - - /es-array-method-boxes-properly/1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: false - - /es-iterator-helpers/1.0.14: - resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} - dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-set-tostringtag: 2.0.1 - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - iterator.prototype: 1.1.0 - safe-array-concat: 1.0.0 - dev: true - - /es-set-tostringtag/2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - - /es-shim-unscopables/1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - - /es-to-primitive/1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - /es5-ext/0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - esniff: 2.0.1 - next-tick: 1.1.0 - dev: false - - /es6-iterator/2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.64 - es6-symbol: 3.1.3 - dev: false - - /es6-symbol/3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} - dependencies: - d: 1.0.1 - ext: 1.7.0 - dev: false - - /es6-weak-map/2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - dev: false - - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false - - /escape-goat/2.1.1: - resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} - engines: {node: '>=8'} - dev: true - - /escape-html/1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - /escape-string-regexp/1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp/2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: false - - /escodegen/1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - dev: false - - /eslint-ast-utils/1.1.0: - resolution: {integrity: sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==} - engines: {node: '>=4'} - dependencies: - lodash.get: 4.4.2 - lodash.zip: 4.2.0 - dev: true - - /eslint-config-prettier/6.15.0_eslint@6.8.0: - resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} - hasBin: true - peerDependencies: - eslint: '>=3.14.1' - dependencies: - eslint: 6.8.0 - get-stdin: 6.0.0 - dev: true - - /eslint-config-react-app/5.2.1_5cdtexgyysibsc4gajt5g5gw4a: - resolution: {integrity: sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==} - peerDependencies: - '@typescript-eslint/eslint-plugin': 2.x - '@typescript-eslint/parser': 2.x - babel-eslint: 10.x - eslint: 6.x - eslint-plugin-flowtype: 3.x || 4.x - eslint-plugin-import: 2.x - eslint-plugin-jsx-a11y: 6.x - eslint-plugin-react: 7.x - eslint-plugin-react-hooks: 1.x || 2.x - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0_lil7fcptb6lvwsbapucsn3cnza - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - babel-eslint: 10.1.0_eslint@6.8.0 - confusing-browser-globals: 1.0.11 - eslint: 6.8.0 - eslint-plugin-flowtype: 4.6.0_eslint@6.8.0 - eslint-plugin-import: 2.20.1_tbglwmj7t2rhd43mvxmptakoay - eslint-plugin-jsx-a11y: 6.2.3_eslint@6.8.0 - eslint-plugin-react: 7.19.0_eslint@6.8.0 - eslint-plugin-react-hooks: 1.7.0_eslint@6.8.0 - typescript: 3.5.3 - dev: false - - /eslint-config-xo-react/0.23.0_b53wkfdkpwhrytkwoaulourpvy: - resolution: {integrity: sha512-yBNoMF6COjJLRijlWksC1Jws6CGWHMgTfR/PAReCdZUo5cg/ZsyNeZx/fntyU4SbARwW2RvuezMeKle+jI5yoA==} - engines: {node: '>=10'} - peerDependencies: - eslint: '>=6' - eslint-plugin-react: '>=7.18.3' - eslint-plugin-react-hooks: '>=2.3.0' - dependencies: - eslint: 6.8.0 - eslint-plugin-react: 7.33.2_eslint@6.8.0 - dev: true - - /eslint-config-xo-typescript/0.28.0_wp2ytyahinzayi5i5jc7flp7nm: - resolution: {integrity: sha512-q+mBhTikLjrPOszx6gezd6ZxrbrSHeBp/Z8gGgPowBYvBYG78llfQZxOcsbKN6aM8+S/OFAJP9bk5w/roLDFTA==} - engines: {node: '>=8'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '>=2.29.0' - eslint: '>=6.6.0' - typescript: '>=3.5.3' - dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0_lil7fcptb6lvwsbapucsn3cnza - eslint: 6.8.0 - typescript: 3.5.3 - dev: true - - /eslint-config-xo/0.29.1_eslint@6.8.0: - resolution: {integrity: sha512-RDjeKh8CV0/EH4utW/6uOkwJJOOU+rX3uE5eUBOamcLNe4lNjyo8kSt3B6DzAm1L/1tWGikI7LFNVY9gG7PDQw==} - engines: {node: '>=10'} - peerDependencies: - eslint: '>=6.8.0' - dependencies: - confusing-browser-globals: 1.0.9 - eslint: 6.8.0 - dev: true - - /eslint-formatter-pretty/3.0.1: - resolution: {integrity: sha512-hhQ/ASD4i6BAEalcEfUxesFtJFftT8xFsimCzUpPbTzygJ4J17yCGcJ3XKCB2g7XTJTv0pi7rVTadfHVmtfSRA==} - engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 3.0.0 - eslint-rule-docs: 1.1.235 - log-symbols: 3.0.0 - plur: 3.1.1 - string-width: 4.2.3 - supports-hyperlinks: 2.3.0 - dev: true - - /eslint-import-resolver-node/0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.0 - resolve: 1.22.4 - transitivePeerDependencies: - - supports-color - - /eslint-import-resolver-webpack/0.12.2_b6377bcr3argvnmxmq6ha6uyl4: - resolution: {integrity: sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ==} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - webpack: '>=1.11.0' - dependencies: - array-find: 1.0.0 - debug: 2.6.9 - enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.28.1_nyzdfmuow6rxbwmj7f5rv6jdzi - find-root: 1.1.0 - has: 1.0.3 - interpret: 1.4.0 - lodash: 4.17.21 - node-libs-browser: 2.2.1 - resolve: 1.22.4 - semver: 5.7.2 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-loader/3.0.3_s4p5obgc5rn2wrc7rinrdszb4m: - resolution: {integrity: sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==} - engines: {node: '>= 8.9.0'} - deprecated: This loader has been deprecated. Please use eslint-webpack-plugin - peerDependencies: - eslint: ^5.0.0 || ^6.0.0 - webpack: ^4.0.0 || ^5.0.0 - dependencies: - eslint: 6.8.0 - fs-extra: 8.1.0 - loader-fs-cache: 1.0.3 - loader-utils: 1.4.2 - object-hash: 2.2.0 - schema-utils: 2.7.1 - webpack: 4.42.0 - dev: false - - /eslint-module-utils/2.8.0_dliihslfikp2yunuxqn7usg75u: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - debug: 3.2.7 - eslint: 6.8.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - /eslint-module-utils/2.8.0_u6c2fbgtynoaem5i4yx7pfetge: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - debug: 3.2.7 - eslint: 6.8.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.12.2_b6377bcr3argvnmxmq6ha6uyl4 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-ava/10.5.0_eslint@6.8.0: - resolution: {integrity: sha512-2I0Ze8ZtwbSlLdnzms4bsa6PxxOxGMIJ9d4yy7aRy3yc5zEO2wHJLic8l3Lrct73hb5ML+PLt5VRqvdV87xWdQ==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - peerDependencies: - eslint: '>=6.2.0' - dependencies: - deep-strict-equal: 0.2.0 - enhance-visitors: 1.0.0 - eslint: 6.8.0 - espree: 7.3.1 - espurify: 2.1.1 - import-modules: 2.1.0 - micro-spelling-correcter: 1.1.1 - pkg-dir: 4.2.0 - resolve-from: 5.0.0 - dev: true - - /eslint-plugin-es/3.0.1_eslint@6.8.0: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 6.8.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true - - /eslint-plugin-eslint-comments/3.2.0_eslint@6.8.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - escape-string-regexp: 1.0.5 - eslint: 6.8.0 - ignore: 5.2.4 - dev: true - - /eslint-plugin-flowtype/4.6.0_eslint@6.8.0: - resolution: {integrity: sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==} - engines: {node: '>=4'} - peerDependencies: - eslint: '>=6.1.0' - dependencies: - eslint: 6.8.0 - lodash: 4.17.21 - dev: false - - /eslint-plugin-import/2.20.1_tbglwmj7t2rhd43mvxmptakoay: - resolution: {integrity: sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: 2.x - 6.x - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - contains-path: 0.1.0 - debug: 2.6.9 - doctrine: 1.5.0 - eslint: 6.8.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0_dliihslfikp2yunuxqn7usg75u - has: 1.0.3 - minimatch: 3.1.2 - object.values: 1.1.6 - read-pkg-up: 2.0.0 - resolve: 1.22.4 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: false - - /eslint-plugin-import/2.28.1_nyzdfmuow6rxbwmj7f5rv6jdzi: - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 6.8.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0_u6c2fbgtynoaem5i4yx7pfetge - has: 1.0.3 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-import/2.28.1_tbglwmj7t2rhd43mvxmptakoay: - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 6.8.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0_dliihslfikp2yunuxqn7usg75u - has: 1.0.3 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - semver: 6.3.1 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-jsx-a11y/6.2.3_eslint@6.8.0: - resolution: {integrity: sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 - dependencies: - '@babel/runtime': 7.22.11 - aria-query: 3.0.0 - array-includes: 3.1.6 - ast-types-flow: 0.0.7 - axobject-query: 2.2.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 7.0.3 - eslint: 6.8.0 - has: 1.0.3 - jsx-ast-utils: 2.4.1 - dev: false - - /eslint-plugin-no-use-extend-native/0.5.0: - resolution: {integrity: sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==} - engines: {node: '>=6.0.0'} - dependencies: - is-get-set-prop: 1.0.0 - is-js-type: 2.0.0 - is-obj-prop: 1.0.0 - is-proto-prop: 2.0.0 - dev: true - - /eslint-plugin-node/11.1.0_eslint@6.8.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 6.8.0 - eslint-plugin-es: 3.0.1_eslint@6.8.0 - eslint-utils: 2.1.0 - ignore: 5.2.4 - minimatch: 3.1.2 - resolve: 1.22.4 - semver: 6.3.1 - dev: true - - /eslint-plugin-prettier/3.4.1_swjbyd5hjbhpq3h73cryknwgoy: - resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} - engines: {node: '>=6.0.0'} - peerDependencies: - eslint: '>=5.0.0' - eslint-config-prettier: '*' - prettier: '>=1.13.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - dependencies: - eslint: 6.8.0 - eslint-config-prettier: 6.15.0_eslint@6.8.0 - prettier: 2.0.4 - prettier-linter-helpers: 1.0.0 - dev: true - - /eslint-plugin-promise/4.3.1: - resolution: {integrity: sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==} - engines: {node: '>=6'} - dev: true - - /eslint-plugin-react-hooks/1.7.0_eslint@6.8.0: - resolution: {integrity: sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==} - engines: {node: '>=7'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - dependencies: - eslint: 6.8.0 - dev: false - - /eslint-plugin-react/7.19.0_eslint@6.8.0: - resolution: {integrity: sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - dependencies: - array-includes: 3.1.6 - doctrine: 2.1.0 - eslint: 6.8.0 - has: 1.0.3 - jsx-ast-utils: 2.4.1 - object.entries: 1.1.7 - object.fromentries: 2.0.6 - object.values: 1.1.6 - prop-types: 15.8.1 - resolve: 1.22.4 - semver: 6.3.0 - string.prototype.matchall: 4.0.8 - xregexp: 4.4.1 - dev: false - - /eslint-plugin-react/7.33.2_eslint@6.8.0: - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.14 - eslint: 6.8.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.1 - string.prototype.matchall: 4.0.8 - dev: true - - /eslint-plugin-unicorn/19.0.1_eslint@6.8.0: - resolution: {integrity: sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==} - engines: {node: '>=10'} - peerDependencies: - eslint: '>=6.8.0' - dependencies: - ci-info: 2.0.0 - clean-regexp: 1.0.0 - eslint: 6.8.0 - eslint-ast-utils: 1.1.0 - eslint-template-visitor: 1.1.0_eslint@6.8.0 - eslint-utils: 2.1.0 - import-modules: 2.1.0 - lodash: 4.17.21 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - reserved-words: 0.1.2 - safe-regex: 2.1.1 - semver: 7.5.4 - dev: true - - /eslint-rule-docs/1.1.235: - resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} - dev: true - - /eslint-scope/4.0.3: - resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} - engines: {node: '>=4.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope/5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - /eslint-template-visitor/1.1.0_eslint@6.8.0: - resolution: {integrity: sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==} - peerDependencies: - eslint: ^6.4.0 - dependencies: - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - multimap: 1.1.0 - dev: true - - /eslint-utils/1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - - /eslint-utils/2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - - /eslint-visitor-keys/1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - - /eslint/6.8.0: - resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - hasBin: true - dependencies: - '@babel/code-frame': 7.22.10 - ajv: 6.12.6 - chalk: 2.4.2 - cross-spawn: 6.0.5 - debug: 4.3.4 - doctrine: 3.0.0 - eslint-scope: 5.1.1 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - esquery: 1.5.0 - esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 12.4.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - inquirer: 7.3.3 - is-glob: 4.0.3 - js-yaml: 3.14.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.21 - minimatch: 3.1.2 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 6.3.1 - strip-ansi: 5.2.0 - strip-json-comments: 3.1.1 - table: 5.4.6 - text-table: 0.2.0 - v8-compile-cache: 2.4.0 - transitivePeerDependencies: - - supports-color - - /esniff/2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.1 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.2 - dev: false - - /espree/6.2.1: - resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} - engines: {node: '>=6.0.0'} - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 - eslint-visitor-keys: 1.3.0 - - /espree/7.3.1: - resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 - eslint-visitor-keys: 1.3.0 - dev: true - - /esprima/4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - /espurify/2.1.1: - resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} - dev: true - - /esquery/1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse/4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse/4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - /estraverse/5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /esutils/2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - /etag/1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - /event-emitter/0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.64 - dev: false - - /eventemitter3/4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false - - /eventlistener/0.0.1: - resolution: {integrity: sha512-hXZ5N9hmp3n7ovmVgG+2vIO6KcjSU10/d0A1Ixcf0i29dxCwAGTNGrSJCfLmlvmgQD8FYzyp//S8+Hpq4Nd7uA==} - dev: false - - /events/3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - /eventsource/1.1.2: - resolution: {integrity: sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==} - engines: {node: '>=0.12.0'} - dev: false - - /evp_bytestokey/1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - - /exec-sh/0.3.6: - resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} - dev: false - - /execa/0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - - /execa/1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: false - - /exit/0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: false - - /expand-brackets/2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - /expand-brackets/2.1.4_supports-color@6.1.0: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - dependencies: - debug: 2.6.9_supports-color@6.1.0 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /expect/24.9.0: - resolution: {integrity: sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==} - engines: {node: '>= 6'} - dependencies: - '@jest/types': 24.9.0 - ansi-styles: 3.2.1 - jest-get-type: 24.9.0 - jest-matcher-utils: 24.9.0 - jest-message-util: 24.9.0 - jest-regex-util: 24.9.0 - transitivePeerDependencies: - - supports-color - dev: false - - /express-urlrewrite/1.4.0: - resolution: {integrity: sha512-PI5h8JuzoweS26vFizwQl6UTF25CAHSggNv0J25Dn/IKZscJHWZzPrI5z2Y2jgOzIaw2qh8l6+/jUcig23Z2SA==} - dependencies: - debug: 4.3.4 - path-to-regexp: 1.8.0 - transitivePeerDependencies: - - supports-color - dev: true - - /express/4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /express/4.19.2_supports-color@6.1.0: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2_supports-color@6.1.0 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0_supports-color@6.1.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0_supports-color@6.1.0 - serve-static: 1.15.0_supports-color@6.1.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /ext/1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.2 - dev: false - - /extend-shallow/2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - - /extend-shallow/3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - - /extend/3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - /external-editor/3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - /extglob/2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - /extglob/2.0.4_supports-color@6.1.0: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4_supports-color@6.1.0 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false - - /extsprintf/1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - /falafel/2.2.5: - resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} - engines: {node: '>=0.4.0'} - dependencies: - acorn: 7.4.1 - isarray: 2.0.5 - dev: false - - /fast-deep-equal/3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-diff/1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true - - /fast-glob/2.2.7: - resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} - engines: {node: '>=4.0.0'} - dependencies: - '@mrmlnc/readdir-enhanced': 2.2.1 - '@nodelib/fs.stat': 1.1.3 - glob-parent: 3.1.0 - is-glob: 4.0.3 - merge2: 1.4.1 - micromatch: 3.1.10 - transitivePeerDependencies: - - supports-color - - /fast-isnumeric/1.1.4: - resolution: {integrity: sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==} - dependencies: - is-string-blank: 1.0.1 - dev: false - - /fast-json-stable-stringify/2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein/2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /faye-websocket/0.10.0: - resolution: {integrity: sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==} - engines: {node: '>=0.4.0'} - dependencies: - websocket-driver: 0.6.5 - dev: false - - /faye-websocket/0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - dependencies: - websocket-driver: 0.7.4 - dev: false - - /fb-watchman/2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: false - - /fbjs/0.8.18: - resolution: {integrity: sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==} - dependencies: - core-js: 1.2.7 - isomorphic-fetch: 2.2.1 - loose-envify: 1.4.0 - object-assign: 4.1.1 - promise: 7.3.1 - setimmediate: 1.0.5 - ua-parser-js: 0.7.35 - dev: false - - /figgy-pudding/3.5.2: - resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} - dev: false - - /figures/3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - - /file-entry-cache/5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} - dependencies: - flat-cache: 2.0.1 - - /file-loader/4.3.0_webpack@4.42.0: - resolution: {integrity: sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^4.0.0 - dependencies: - loader-utils: 1.4.2 - schema-utils: 2.7.1 - webpack: 4.42.0 - dev: false - - /file-uri-to-path/1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] requiresBuild: true - dev: false - optional: true - - /filesize/6.0.1: - resolution: {integrity: sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==} - engines: {node: '>= 0.4.0'} - dev: false - - /filesize/6.4.0: - resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} - engines: {node: '>= 0.4.0'} - dev: false - - /fill-range/4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - - /fill-range/7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /finalhandler/1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /finalhandler/1.2.0_supports-color@6.1.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9_supports-color@6.1.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /find-cache-dir/0.1.1: - resolution: {integrity: sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==} - engines: {node: '>=0.10.0'} - dependencies: - commondir: 1.0.1 - mkdirp: 0.5.6 - pkg-dir: 1.0.0 - dev: false - - /find-cache-dir/2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - dev: false - - /find-cache-dir/3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - /find-root/1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - /find-up/1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - dev: false - - /find-up/2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - dependencies: - locate-path: 2.0.0 - - /find-up/3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - - /find-up/4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - /flat-cache/2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - dependencies: - flatted: 2.0.2 - rimraf: 2.6.3 - write: 1.0.3 - - /flatted/2.0.2: - resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - - /flatten-vertex-data/1.0.2: - resolution: {integrity: sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==} - dependencies: - dtype: 2.0.0 - dev: false - - /flatten/1.0.3: - resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} - deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - dev: false - - /flush-write-stream/1.1.1: - resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false - - /follow-redirects/1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - - /follow-redirects/1.15.6_debug@4.3.4: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4_supports-color@6.1.0 - dev: false - - /font-atlas/2.1.0: - resolution: {integrity: sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==} - dependencies: - css-font: 1.2.0 - dev: false - - /font-measure/1.2.2: - resolution: {integrity: sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==} - dependencies: - css-font: 1.2.0 - dev: false - - /for-each/0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - - /for-in/0.1.8: - resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==} - engines: {node: '>=0.10.0'} - dev: false - - /for-in/1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - /for-own/0.1.5: - resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - dev: false - - /forever-agent/0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - /fork-ts-checker-webpack-plugin/3.1.1_my6p5jmkoidlu47hwmqgdrj2vm: - resolution: {integrity: sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==} - engines: {node: '>=6.11.5', yarn: '>=1.0.0'} - peerDependencies: - eslint: '>= 6' - typescript: '>= 2.7' - vue-template-compiler: '*' - webpack: '>= 4' - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - dependencies: - babel-code-frame: 6.26.0 - chalk: 2.4.2 - chokidar: 3.5.3 - eslint: 6.8.0 - micromatch: 3.1.10 - minimatch: 3.1.2 - semver: 5.7.2 - tapable: 1.1.3 - typescript: 3.5.3 - webpack: 4.42.0 - worker-rpc: 0.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /form-data/2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - /form-data/4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /forwarded/0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - /fragment-cache/0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - dependencies: - map-cache: 0.2.2 - - /fresh/0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - /from2/2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false - - /fs-extra/4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: false - - /fs-extra/7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: false - - /fs-extra/8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: false - - /fs-extra/9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 dev: true - - /fs-minipass/2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false - - /fs-write-stream-atomic/1.0.10: - resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} - dependencies: - graceful-fs: 4.2.11 - iferr: 0.1.5 - imurmurhash: 0.1.4 - readable-stream: 2.3.8 - dev: false - - /fs.realpath/1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents/1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.17.0 - dev: false optional: true - /fsevents/2.1.2: - resolution: {integrity: sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - deprecated: '"Please update to latest v2.3 or v2.2"' + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] requiresBuild: true - dev: false + dev: true optional: true - /fsevents/2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - /function.prototype.name/1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - functions-have-names: 1.2.3 - - /functional-red-black-tree/1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - - /functions-have-names/1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - /gensync/1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false - - /geojson-vt/3.2.1: - resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} - dev: false - - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - /get-canvas-context/1.0.2: - resolution: {integrity: sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==} - dev: false - - /get-intrinsic/1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - - /get-own-enumerable-property-symbols/3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: false - - /get-set-props/0.1.0: - resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} - engines: {node: '>=0.10.0'} + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /get-stdin/6.0.0: - resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} - engines: {node: '>=4'} + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /get-stdin/7.0.0: - resolution: {integrity: sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==} - engines: {node: '>=8'} + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /get-stream/3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /get-stream/4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - - /get-stream/5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /get-stream/6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: false - - /get-symbol-description/1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - - /get-value/2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - - /getpass/0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - dependencies: - assert-plus: 1.0.0 - - /gl-mat4/1.2.0: - resolution: {integrity: sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==} - dev: false - - /gl-matrix/3.4.3: - resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} - dev: false - - /gl-text/1.3.1: - resolution: {integrity: sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==} - dependencies: - bit-twiddle: 1.0.2 - color-normalize: 1.5.0 - css-font: 1.2.0 - detect-kerning: 2.1.2 - es6-weak-map: 2.0.3 - flatten-vertex-data: 1.0.2 - font-atlas: 2.1.0 - font-measure: 1.2.2 - gl-util: 3.1.3 - is-plain-obj: 1.1.0 - object-assign: 4.1.1 - parse-rect: 1.2.0 - parse-unit: 1.0.1 - pick-by-alias: 1.2.0 - regl: 2.1.0 - to-px: 1.0.1 - typedarray-pool: 1.2.0 - dev: false - - /gl-util/3.1.3: - resolution: {integrity: sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==} - dependencies: - is-browser: 2.1.0 - is-firefox: 1.0.3 - is-plain-obj: 1.1.0 - number-is-integer: 1.0.1 - object-assign: 4.1.1 - pick-by-alias: 1.2.0 - weak-map: 1.0.8 - dev: false - - /glob-parent/3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - - /glob-parent/5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp/0.3.0: - resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} - - /glob/7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /global-dirs/0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - dependencies: - ini: 1.3.8 + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /global-dirs/2.1.0: - resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} - engines: {node: '>=8'} - dependencies: - ini: 1.3.7 + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /global-modules/2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - dependencies: - global-prefix: 3.0.0 - dev: false - - /global-prefix/3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - dev: false - - /globals/11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false - - /globals/12.4.0: - resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.8.1 - - /globalthis/1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.0 - - /globby/6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: false - - /globby/8.0.2: - resolution: {integrity: sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==} - engines: {node: '>=4'} - dependencies: - array-union: 1.0.2 - dir-glob: 2.0.0 - fast-glob: 2.2.7 - glob: 7.2.3 - ignore: 3.3.10 - pify: 3.0.0 - slash: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /globby/9.2.0: - resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} - engines: {node: '>=6'} - dependencies: - '@types/glob': 7.2.0 - array-union: 1.0.2 - dir-glob: 2.2.2 - fast-glob: 2.2.7 - glob: 7.2.3 - ignore: 4.0.6 - pify: 4.0.1 - slash: 2.0.0 - transitivePeerDependencies: - - supports-color + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /glsl-inject-defines/1.0.3: - resolution: {integrity: sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==} - dependencies: - glsl-token-inject-block: 1.1.0 - glsl-token-string: 1.0.1 - glsl-tokenizer: 2.1.5 - dev: false - - /glsl-resolve/0.0.1: - resolution: {integrity: sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==} - dependencies: - resolve: 0.6.3 - xtend: 2.2.0 - dev: false - - /glsl-token-assignments/2.0.2: - resolution: {integrity: sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==} - dev: false - - /glsl-token-defines/1.0.0: - resolution: {integrity: sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==} - dependencies: - glsl-tokenizer: 2.1.5 - dev: false - - /glsl-token-depth/1.1.2: - resolution: {integrity: sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==} - dev: false - - /glsl-token-descope/1.0.2: - resolution: {integrity: sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==} - dependencies: - glsl-token-assignments: 2.0.2 - glsl-token-depth: 1.1.2 - glsl-token-properties: 1.0.1 - glsl-token-scope: 1.1.2 - dev: false - - /glsl-token-inject-block/1.1.0: - resolution: {integrity: sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==} - dev: false - - /glsl-token-properties/1.0.1: - resolution: {integrity: sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==} - dev: false - - /glsl-token-scope/1.1.2: - resolution: {integrity: sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==} - dev: false - - /glsl-token-string/1.0.1: - resolution: {integrity: sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==} - dev: false - - /glsl-token-whitespace-trim/1.0.0: - resolution: {integrity: sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==} - dev: false - - /glsl-tokenizer/2.1.5: - resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} - dependencies: - through2: 0.6.5 - dev: false - - /glslify-bundle/5.1.1: - resolution: {integrity: sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==} - dependencies: - glsl-inject-defines: 1.0.3 - glsl-token-defines: 1.0.0 - glsl-token-depth: 1.1.2 - glsl-token-descope: 1.0.2 - glsl-token-scope: 1.1.2 - glsl-token-string: 1.0.1 - glsl-token-whitespace-trim: 1.0.0 - glsl-tokenizer: 2.1.5 - murmurhash-js: 1.0.0 - shallow-copy: 0.0.1 - dev: false - - /glslify-deps/1.3.2: - resolution: {integrity: sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==} - dependencies: - '@choojs/findup': 0.2.1 - events: 3.3.0 - glsl-resolve: 0.0.1 - glsl-tokenizer: 2.1.5 - graceful-fs: 4.2.11 - inherits: 2.0.4 - map-limit: 0.0.1 - resolve: 1.22.4 - dev: false - - /glslify/7.1.1: - resolution: {integrity: sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==} - hasBin: true - dependencies: - bl: 2.2.1 - concat-stream: 1.6.2 - duplexify: 3.7.1 - falafel: 2.2.5 - from2: 2.3.0 - glsl-resolve: 0.0.1 - glsl-token-whitespace-trim: 1.0.0 - glslify-bundle: 5.1.1 - glslify-deps: 1.3.2 - minimist: 1.2.8 - resolve: 1.22.4 - stack-trace: 0.0.9 - static-eval: 2.1.0 - through2: 2.0.5 - xtend: 4.0.2 - dev: false - - /gopd/1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - - /got/9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} - dependencies: - '@sindresorhus/is': 0.14.0 - '@szmarczak/http-timer': 1.1.2 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.0 - cacheable-request: 6.1.0 - decompress-response: 3.3.0 - duplexer3: 0.1.5 - get-stream: 4.1.0 - lowercase-keys: 1.0.1 - mimic-response: 1.0.1 - p-cancelable: 1.1.0 - to-readable-stream: 1.0.0 - url-parse-lax: 3.0.0 + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /graceful-fs/4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /grid-index/1.1.0: - resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} - dev: false - - /growly/1.3.0: - resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} - dev: false - - /gud/1.0.0: - resolution: {integrity: sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==} - dev: false - - /gzip-size/5.1.1: - resolution: {integrity: sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==} - engines: {node: '>=6'} - dependencies: - duplexer: 0.1.2 - pify: 4.0.1 - dev: false - - /hammerjs/2.0.8: - resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} - engines: {node: '>=0.8.0'} - dev: false - - /handle-thing/2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: false - - /har-schema/2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - /har-validator/5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - - /harmony-reflect/1.6.2: - resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - dev: false - - /has-ansi/2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false - - /has-bigints/1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - /has-flag/3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /has-hover/1.0.1: - resolution: {integrity: sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==} - dependencies: - is-browser: 2.1.0 - dev: false - - /has-passive-events/1.0.0: - resolution: {integrity: sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==} - dependencies: - is-browser: 2.1.0 - dev: false - - /has-property-descriptors/1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.1 - - /has-proto/1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - /has-symbols/1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - /has-tostringtag/1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - - /has-value/0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - - /has-value/1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - /has-values/0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true - /has-values/1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true - /has-yarn/2.1.0: - resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} - engines: {node: '>=8'} + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true dev: true + optional: true - /has/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hash-base/3.0.4: - resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hash-base/3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hash.js/1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true - /he/1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: false + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hex-color-regex/1.1.0: - resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} - dev: false + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /history/4.10.1: - resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} - dependencies: - '@babel/runtime': 7.22.11 - loose-envify: 1.4.0 - resolve-pathname: 3.0.0 - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - value-equal: 1.0.1 - dev: false + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /history/5.3.0: - resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} - dependencies: - '@babel/runtime': 7.22.11 - dev: false + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hmac-drbg/1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hoist-non-react-statics/2.5.5: - resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} - dev: false + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hoist-non-react-statics/3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hosted-git-info/2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hpack.js/2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - dev: false + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /hsl-regex/1.0.0: - resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} - dev: false + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true - /hsla-regex/1.0.0: - resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} - dev: false + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true - /hsluv/0.0.3: - resolution: {integrity: sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==} - dev: false + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true - /html-encoding-sniffer/1.0.2: - resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} - dependencies: - whatwg-encoding: 1.0.5 - dev: false + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true - /html-entities/1.4.0: - resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} - dev: false + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true - /html-escaper/2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: false + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true - /html-minifier-terser/5.1.1: - resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} - engines: {node: '>=6'} - hasBin: true - dependencies: - camel-case: 4.1.2 - clean-css: 4.2.4 - commander: 4.1.1 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 4.8.1 - dev: false + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /html-webpack-plugin/4.0.0-beta.11_webpack@4.42.0: - resolution: {integrity: sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==} - engines: {node: '>=6.9'} - deprecated: please switch to a stable version - peerDependencies: - webpack: ^4.0.0 - dependencies: - html-minifier-terser: 5.1.1 - loader-utils: 1.4.2 - lodash: 4.17.21 - pretty-error: 2.1.2 - tapable: 1.1.3 - util.promisify: 1.0.0 - webpack: 4.42.0 - dev: false + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /htmlparser2/6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - dev: false + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true - /http-cache-semantics/4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true dev: true + optional: true - /http-deceiver/1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: false + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /http-errors/1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - dev: false + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /http-errors/2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + /@eslint-community/eslint-utils@4.4.0(eslint@7.32.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 + eslint: 7.32.0 + eslint-visitor-keys: 3.4.3 + dev: true - /http-parser-js/0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: false + /@eslint-community/regexpp@4.10.1: + resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true - /http-proxy-middleware/0.19.1_tmpgdztspuwvsxzgjkhoqk7duq: - resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} - engines: {node: '>=4.0.0'} + /@eslint/eslintrc@0.4.3: + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - http-proxy: 1.18.1_debug@4.3.4 - is-glob: 4.0.3 - lodash: 4.17.21 - micromatch: 3.1.10_supports-color@6.1.0 + ajv: 6.12.6 + debug: 4.3.5 + espree: 7.3.1 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 transitivePeerDependencies: - - debug - supports-color - dev: false + dev: true - /http-proxy/1.18.1_debug@4.3.4: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6_debug@4.3.4 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug + /@fontsource/roboto@4.5.8: + resolution: {integrity: sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==} dev: false - /http-signature/1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.17.0 - - /https-browserify/1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - - /iconv-lite/0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + /@humanwhocodes/config-array@0.5.0: + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: - safer-buffer: 2.1.2 + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true - /iconv-lite/0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead + dev: true - /icss-utils/4.1.1: - resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} - engines: {node: '>= 6'} + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: - postcss: 7.0.39 - dev: false + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true - /identity-obj-proxy/3.0.0: - resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} - engines: {node: '>=4'} + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - harmony-reflect: 1.6.2 - dev: false - - /ieee754/1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - /iferr/0.1.5: - resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} - dev: false - - /ignore/3.3.10: - resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} - dev: false - - /ignore/4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - - /ignore/5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} + '@sinclair/typebox': 0.27.8 dev: true - /image-size/0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: false - optional: true - - /immer/1.10.0: - resolution: {integrity: sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==} - dev: false - - /immutable/3.7.6: - resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} - engines: {node: '>=0.8.0'} - dev: false - - /import-cwd/2.1.0: - resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} - engines: {node: '>=4'} + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} dependencies: - import-from: 2.1.0 - dev: false + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - /import-fresh/2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} - dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 - dev: false + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - /import-fresh/3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 - /import-from/2.1.0: - resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} - engines: {node: '>=4'} + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: - resolve-from: 3.0.0 - dev: false + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true - /import-lazy/2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} dev: true - /import-local/2.0.0: - resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} - engines: {node: '>=6'} - hasBin: true + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: - pkg-dir: 3.0.0 - resolve-cwd: 2.0.0 - dev: false - - /import-modules/2.1.0: - resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} - engines: {node: '>=8'} + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 dev: true - /imurmurhash/0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /indent-string/3.2.0: - resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} - engines: {node: '>=4'} + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true dev: true + optional: true - /indent-string/4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: false - - /indexes-of/1.0.1: - resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} - dev: false - - /infer-owner/1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: false - - /inflight/1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true dependencies: - once: 1.4.0 - wrappy: 1.0.2 + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true - /inherits/2.0.1: - resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + /@rollup/rollup-android-arm-eabi@4.18.0: + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true - /inherits/2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + /@rollup/rollup-android-arm64@4.18.0: + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /inherits/2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /@rollup/rollup-darwin-arm64@4.18.0: + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /ini/1.3.7: - resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==} + /@rollup/rollup-darwin-x64@4.18.0: + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /ini/1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + /@rollup/rollup-linux-arm-gnueabihf@4.18.0: + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true - /inquirer/7.0.4: - resolution: {integrity: sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==} - engines: {node: '>=6.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 2.4.2 - cli-cursor: 3.1.0 - cli-width: 2.2.1 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 5.2.0 - through: 2.3.8 - dev: false + /@rollup/rollup-linux-arm-musleabihf@4.18.0: + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true - /inquirer/7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 + /@rollup/rollup-linux-arm64-gnu@4.18.0: + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /internal-ip/4.3.0: - resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} - engines: {node: '>=6'} - dependencies: - default-gateway: 4.2.0 - ipaddr.js: 1.9.1 - dev: false + /@rollup/rollup-linux-arm64-musl@4.18.0: + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /internal-slot/1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 + /@rollup/rollup-linux-powerpc64le-gnu@4.18.0: + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /interpret/1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + /@rollup/rollup-linux-riscv64-gnu@4.18.0: + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true dev: true + optional: true - /invariant/2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 - dev: false + /@rollup/rollup-linux-s390x-gnu@4.18.0: + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /ip-regex/2.1.0: - resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} - engines: {node: '>=4'} - dev: false + /@rollup/rollup-linux-x64-gnu@4.18.0: + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /ip/1.1.9: - resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} - dev: false + /@rollup/rollup-linux-x64-musl@4.18.0: + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /ipaddr.js/1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + /@rollup/rollup-win32-arm64-msvc@4.18.0: + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /irregular-plurals/2.0.0: - resolution: {integrity: sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==} - engines: {node: '>=6'} + /@rollup/rollup-win32-ia32-msvc@4.18.0: + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + requiresBuild: true dev: true + optional: true - /is-absolute-url/2.1.0: - resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} - engines: {node: '>=0.10.0'} - dev: false + /@rollup/rollup-win32-x64-msvc@4.18.0: + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /is-absolute-url/3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - dev: false + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true - /is-absolute/1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 + /@sindresorhus/is@0.14.0: + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} dev: true - /is-accessor-descriptor/0.1.6: - resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} - engines: {node: '>=0.10.0'} + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.7): + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - kind-of: 3.2.2 + '@babel/core': 7.24.7 + dev: true - /is-accessor-descriptor/1.0.0: - resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} - engines: {node: '>=0.10.0'} + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.7): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - kind-of: 6.0.3 + '@babel/core': 7.24.7 + dev: true - /is-arguments/1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.7): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false + '@babel/core': 7.24.7 + dev: true - /is-array-buffer/3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.7): + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - - /is-arrayish/0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - /is-arrayish/0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false + '@babel/core': 7.24.7 + dev: true - /is-async-function/2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.7): + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - has-tostringtag: 1.0.0 + '@babel/core': 7.24.7 dev: true - /is-bigint/1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.7): + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - has-bigints: 1.0.2 + '@babel/core': 7.24.7 + dev: true - /is-binary-path/1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} + /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.7): + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - binary-extensions: 1.13.1 - dev: false + '@babel/core': 7.24.7 + dev: true - /is-binary-path/2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.7): + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - binary-extensions: 2.2.0 - dev: false + '@babel/core': 7.24.7 + dev: true - /is-boolean-object/1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + /@svgr/babel-preset@8.1.0(@babel/core@7.24.7): + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - /is-browser/2.1.0: - resolution: {integrity: sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==} - dev: false - - /is-buffer/1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - /is-callable/1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + '@babel/core': 7.24.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.7) + dev: true - /is-ci/2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true + /@svgr/core@8.1.0(typescript@4.9.5): + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} dependencies: - ci-info: 2.0.0 + '@babel/core': 7.24.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.7) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@4.9.5) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true - /is-color-stop/1.1.0: - resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} + /@svgr/hast-util-to-babel-ast@8.0.0: + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} dependencies: - css-color-names: 0.0.4 - hex-color-regex: 1.1.0 - hsl-regex: 1.0.0 - hsla-regex: 1.0.0 - rgb-regex: 1.0.1 - rgba-regex: 1.0.0 - dev: false + '@babel/types': 7.24.7 + entities: 4.5.0 + dev: true - /is-core-module/2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' dependencies: - has: 1.0.3 + '@babel/core': 7.24.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.7) + '@svgr/core': 8.1.0(typescript@4.9.5) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true - /is-data-descriptor/0.1.4: - resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} - engines: {node: '>=0.10.0'} + /@szmarczak/http-timer@1.1.2: + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} dependencies: - kind-of: 3.2.2 + defer-to-connect: 1.1.3 + dev: true - /is-data-descriptor/1.0.0: - resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} - engines: {node: '>=0.10.0'} + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - kind-of: 6.0.3 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + dev: true - /is-date-object/1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - has-tostringtag: 1.0.0 + '@babel/types': 7.24.7 + dev: true - /is-descriptor/0.1.6: - resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} - engines: {node: '>=0.10.0'} + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - is-accessor-descriptor: 0.1.6 - is-data-descriptor: 0.1.4 - kind-of: 5.1.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + dev: true - /is-descriptor/1.0.2: - resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} - engines: {node: '>=0.10.0'} + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - is-accessor-descriptor: 1.0.0 - is-data-descriptor: 1.0.0 - kind-of: 6.0.3 + '@babel/types': 7.24.7 + dev: true - /is-directory/0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - dev: false + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true - /is-docker/2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: false + /@types/history@4.7.11: + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + dev: true - /is-error/2.2.2: - resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} + /@types/history@5.0.0: + resolution: {integrity: sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==} + deprecated: This is a stub types definition. history provides its own type definitions, so you do not need this installed. + dependencies: + history: 5.3.0 dev: true - /is-extendable/0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true - /is-extendable/1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - is-plain-object: 2.0.4 - - /is-extglob/2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + '@types/node': 20.14.8 + dev: true - /is-finalizationregistry/1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + /@types/node@20.14.8: + resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} dependencies: - call-bind: 1.0.2 + undici-types: 5.26.5 dev: true - /is-finite/1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: false - /is-firefox/1.0.3: - resolution: {integrity: sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==} - engines: {node: '>=0.10.0'} - dev: false + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: true - /is-fullwidth-code-point/2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + /@types/react-dom@16.8.4: + resolution: {integrity: sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==} + dependencies: + '@types/react': 16.8.15 + dev: true - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + /@types/react-router-dom@4.3.5: + resolution: {integrity: sha512-eFajSUASYbPHg2BDM1G8Btx+YqGgvROPIg6sBhl3O4kbDdYXdFdfrgQFf/pcBuQVObjfT9AL/dd15jilR5DIEA==} + dependencies: + '@types/history': 5.0.0 + '@types/react': 16.8.15 + '@types/react-router': 5.1.20 + dev: true - /is-generator-fn/2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: false + /@types/react-router@5.1.20: + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + dependencies: + '@types/history': 4.7.11 + '@types/react': 16.8.15 + dev: true - /is-generator-function/1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + /@types/react-select@3.1.2: + resolution: {integrity: sha512-ygvR/2FL87R2OLObEWFootYzkvm67LRA+URYEAcBuvKk7IXmdsnIwSGm60cVXGaqkJQHozb2Cy1t94tCYb6rJA==} dependencies: - has-tostringtag: 1.0.0 + '@types/react': 16.8.15 + '@types/react-dom': 16.8.4 + '@types/react-transition-group': 4.4.10 dev: true - /is-get-set-prop/1.0.0: - resolution: {integrity: sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==} + /@types/react-transition-group@4.4.10: + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} dependencies: - get-set-props: 0.1.0 - lowercase-keys: 1.0.1 + '@types/react': 16.8.15 dev: true - /is-glob/3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} + /@types/react@16.8.15: + resolution: {integrity: sha512-dMhzw1rWK+wwJWvPp5Pk12ksSrm/z/C/+lOQbMZ7YfDQYnJ02bc0wtg4EJD9qrFhuxFrf/ywNgwTboucobJqQg==} dependencies: - is-extglob: 2.1.1 + '@types/prop-types': 15.7.12 + csstype: 2.6.21 + dev: true - /is-glob/4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - is-extglob: 2.1.1 + '@types/node': 20.14.8 + dev: true - /is-iexplorer/1.0.0: - resolution: {integrity: sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==} - engines: {node: '>=0.10.0'} - dev: false + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + dev: true - /is-installed-globally/0.1.0: - resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} - engines: {node: '>=4'} + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - global-dirs: 0.1.1 - is-path-inside: 1.0.1 + '@eslint-community/regexpp': 4.10.1 + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + debug: 4.3.5 + eslint: 7.32.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.2 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color dev: true - /is-installed-globally/0.3.2: - resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==} - engines: {node: '>=8'} + /@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - global-dirs: 2.1.0 - is-path-inside: 3.0.3 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.3.5 + eslint: 7.32.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color dev: true - /is-js-type/2.0.0: - resolution: {integrity: sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==} + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - js-types: 1.0.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /is-map/2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + /@typescript-eslint/type-utils@5.62.0(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + debug: 4.3.5 + eslint: 7.32.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color dev: true - /is-mobile/2.2.2: - resolution: {integrity: sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==} - dev: false - - /is-mobile/4.0.0: - resolution: {integrity: sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==} - dev: false - - /is-negated-glob/1.0.0: - resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} - engines: {node: '>=0.10.0'} + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /is-negative-zero/2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - - /is-npm/3.0.0: - resolution: {integrity: sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==} - engines: {node: '>=8'} + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.2 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color dev: true - /is-npm/4.0.0: - resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==} - engines: {node: '>=8'} + /@typescript-eslint/utils@5.62.0(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + eslint: 7.32.0 + eslint-scope: 5.1.1 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript dev: true - /is-number-object/1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - has-tostringtag: 1.0.0 + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true - /is-number/3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} + /@vitejs/plugin-react@4.3.1(vite@4.5.3): + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 dependencies: - kind-of: 3.2.2 - - /is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 4.5.3(less@3.13.1) + transitivePeerDependencies: + - supports-color + dev: true - /is-obj-prop/1.0.0: - resolution: {integrity: sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==} + /@vitest/expect@1.6.0: + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} dependencies: - lowercase-keys: 1.0.1 - obj-props: 1.4.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 dev: true - /is-obj/1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - - /is-obj/2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - /is-path-cwd/2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: false - - /is-path-in-cwd/2.1.0: - resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} - engines: {node: '>=6'} + /@vitest/runner@1.6.0: + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} dependencies: - is-path-inside: 2.1.0 - dev: false + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true - /is-path-inside/1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} + /@vitest/snapshot@1.6.0: + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - path-is-inside: 1.0.2 + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 dev: true - /is-path-inside/2.1.0: - resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} - engines: {node: '>=6'} + /@vitest/spy@1.6.0: + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} dependencies: - path-is-inside: 1.0.2 - dev: false - - /is-path-inside/3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + tinyspy: 2.2.1 dev: true - /is-plain-obj/1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - /is-plain-object/2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + /@vitest/utils@1.6.0: + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} dependencies: - isobject: 3.0.1 - - /is-promise/2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 dev: true - /is-proto-prop/2.0.0: - resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} dependencies: - lowercase-keys: 1.0.1 - proto-props: 2.0.0 + mime-types: 2.1.35 + negotiator: 0.6.3 dev: true - /is-regex/1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + /acorn-jsx@5.3.2(acorn@7.4.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - /is-regexp/1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - dev: false + acorn: 7.4.1 + dev: true - /is-relative/1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} dependencies: - is-unc-path: 1.0.0 + acorn: 8.12.0 dev: true - /is-resolvable/1.1.0: - resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} - dev: false - - /is-root/2.1.0: - resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} - engines: {node: '>=6'} - dev: false - - /is-set/2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true dev: true - /is-shared-array-buffer/1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - - /is-stream/1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} + /acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true - /is-string-blank/1.0.1: - resolution: {integrity: sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==} + /ag-charts-community@7.3.0: + resolution: {integrity: sha512-118U6YsCMia6iZHaN06zT19rr2SYa92WB73pMVCKQlp2H3c19uKQ6Y6DfKG/nIfNUzFXZLHBwKIdZXsMWJdZww==} dev: false - /is-string/1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + /ag-charts-react@7.3.0(ag-charts-community@7.3.0)(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-DR8l8IQbRJeutTslqJ8muwsMPdFyJAn/rq17NhQYZ9F4wx0suIAgaUG/We8KEO94qASLX/nhKuvbI/d7M4kJRw==} + peerDependencies: + ag-charts-community: ~7.3.0 + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.3.0 || ^17.0.0 || ^18.0.0 dependencies: - has-tostringtag: 1.0.0 - - /is-svg-path/1.0.2: - resolution: {integrity: sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==} + ag-charts-community: 7.3.0 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /is-symbol/1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: - has-symbols: 1.0.3 + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true - /is-typed-array/1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + /ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} dependencies: - which-typed-array: 1.1.11 - - /is-typedarray/1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true - /is-unc-path/1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: - unc-path-regex: 0.1.2 + string-width: 4.2.3 dev: true - /is-weakmap/2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} dev: true - /is-weakref/1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true - /is-weakset/2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} dev: true - /is-what/3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: false + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true - /is-windows/1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true - /is-wsl/1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 - /is-wsl/2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: - is-docker: 2.2.1 - dev: false - - /is-yarn-global/0.3.0: - resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + color-convert: 2.0.1 dev: true - /isarray/0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true - /isarray/1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true - /isarray/2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + /antd@4.10.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-J/IZvW15MwTmUxK/AWFkSU51T1Hyn4e0GchJWlIe7+FrPpLoTgLf9/Cx3mgxiooHfE9OfvnYvvRli1VxHH6H0Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/colors': 5.1.1 + '@ant-design/icons': 4.8.3(react-dom@16.14.0)(react@16.14.0) + '@ant-design/react-slick': 0.28.4(react@16.14.0) + '@babel/runtime': 7.24.7 + array-tree-filter: 2.1.0 + classnames: 2.5.1 + copy-to-clipboard: 3.3.3 + lodash: 4.17.21 + moment: 2.30.1 + rc-cascader: 1.4.3(react-dom@16.14.0)(react@16.14.0) + rc-checkbox: 2.3.2(react-dom@16.14.0)(react@16.14.0) + rc-collapse: 3.1.4(react-dom@16.14.0)(react@16.14.0) + rc-dialog: 8.5.3(react-dom@16.14.0)(react@16.14.0) + rc-drawer: 4.2.2(react-dom@16.14.0)(react@16.14.0) + rc-dropdown: 3.2.5(react-dom@16.14.0)(react@16.14.0) + rc-field-form: 1.17.4(react-dom@16.14.0)(react@16.14.0) + rc-image: 5.0.2(react-dom@16.14.0)(react@16.14.0) + rc-input-number: 6.1.3(react-dom@16.14.0)(react@16.14.0) + rc-mentions: 1.5.3(react-dom@16.14.0)(react@16.14.0) + rc-menu: 8.10.8(react-dom@16.14.0)(react@16.14.0) + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-notification: 4.5.7(react-dom@16.14.0)(react@16.14.0) + rc-pagination: 3.1.17(react-dom@16.14.0)(react@16.14.0) + rc-picker: 2.5.19(react-dom@16.14.0)(react@16.14.0) + rc-progress: 3.1.4(react-dom@16.14.0)(react@16.14.0) + rc-rate: 2.9.3(react-dom@16.14.0)(react@16.14.0) + rc-resize-observer: 1.4.0(react-dom@16.14.0)(react@16.14.0) + rc-select: 12.1.13(react-dom@16.14.0)(react@16.14.0) + rc-slider: 9.7.5(react-dom@16.14.0)(react@16.14.0) + rc-steps: 4.1.4(react-dom@16.14.0)(react@16.14.0) + rc-switch: 3.2.2(react-dom@16.14.0)(react@16.14.0) + rc-table: 7.12.5(react-dom@16.14.0)(react@16.14.0) + rc-tabs: 11.7.3(react-dom@16.14.0)(react@16.14.0) + rc-textarea: 0.3.7(react-dom@16.14.0)(react@16.14.0) + rc-tooltip: 5.0.2(react-dom@16.14.0)(react@16.14.0) + rc-tree: 4.1.5(react-dom@16.14.0)(react@16.14.0) + rc-tree-select: 4.3.3(react-dom@16.14.0)(react@16.14.0) + rc-upload: 3.3.4(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + scroll-into-view-if-needed: 2.2.31 + warning: 4.0.3 + dev: false - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true - /isobject/2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: - isarray: 1.0.0 + sprintf-js: 1.0.3 + dev: true - /isobject/3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true - /isomorphic-fetch/2.2.1: - resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==} + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} dependencies: - node-fetch: 1.7.3 - whatwg-fetch: 3.6.17 - dev: false + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true - /isstream/0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true - /istanbul-lib-coverage/2.0.5: - resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} - engines: {node: '>=6'} + /array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} dev: false - /istanbul-lib-instrument/3.3.0: - resolution: {integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==} - engines: {node: '>=6'} - dependencies: - '@babel/generator': 7.22.10 - '@babel/parser': 7.22.11 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.11 - istanbul-lib-coverage: 2.0.5 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true - /istanbul-lib-report/2.0.8: - resolution: {integrity: sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==} - engines: {node: '>=6'} + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} dependencies: - istanbul-lib-coverage: 2.0.5 - make-dir: 2.1.0 - supports-color: 6.1.0 - dev: false + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true - /istanbul-lib-source-maps/3.0.6: - resolution: {integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==} - engines: {node: '>=6'} + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 2.0.5 - make-dir: 2.1.0 - rimraf: 2.7.1 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: false + safer-buffer: 2.1.2 + dev: true - /istanbul-reports/2.2.7: - resolution: {integrity: sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==} - engines: {node: '>=6'} - dependencies: - html-escaper: 2.0.2 - dev: false + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true - /iterator.prototype/1.1.0: - resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} - dependencies: - define-properties: 1.2.0 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - has-tostringtag: 1.0.0 - reflect.getprototypeof: 1.0.3 + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /jest-changed-files/24.9.0: - resolution: {integrity: sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==} - engines: {node: '>= 6'} - dependencies: - '@jest/types': 24.9.0 - execa: 1.0.0 - throat: 4.1.0 - dev: false + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true - /jest-cli/24.9.0: - resolution: {integrity: sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==} - engines: {node: '>= 6'} - hasBin: true - dependencies: - '@jest/core': 24.9.0 - '@jest/test-result': 24.9.0 - '@jest/types': 24.9.0 - chalk: 2.4.2 - exit: 0.1.2 - import-local: 2.0.0 - is-ci: 2.0.0 - jest-config: 24.9.0 - jest-util: 24.9.0 - jest-validate: 24.9.0 - prompts: 2.4.2 - realpath-native: 1.1.0 - yargs: 13.3.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + /async-validator@3.5.2: + resolution: {integrity: sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==} dev: false - /jest-config/24.9.0: - resolution: {integrity: sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==} - engines: {node: '>= 6'} - dependencies: - '@babel/core': 7.22.11 - '@jest/test-sequencer': 24.9.0 - '@jest/types': 24.9.0 - babel-jest: 24.9.0_@babel+core@7.22.11 - chalk: 2.4.2 - glob: 7.2.3 - jest-environment-jsdom: 24.9.0 - jest-environment-node: 24.9.0 - jest-get-type: 24.9.0 - jest-jasmine2: 24.9.0 - jest-regex-util: 24.9.0 - jest-resolve: 24.9.0 - jest-util: 24.9.0 - jest-validate: 24.9.0 - micromatch: 3.1.10 - pretty-format: 24.9.0 - realpath-native: 1.1.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /jest-diff/24.9.0: - resolution: {integrity: sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==} - engines: {node: '>= 6'} + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} dependencies: - chalk: 2.4.2 - diff-sequences: 24.9.0 - jest-get-type: 24.9.0 - pretty-format: 24.9.0 - dev: false + possible-typed-array-names: 1.0.0 + dev: true - /jest-diff/29.6.4: - resolution: {integrity: sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.6.3 - dev: false + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true - /jest-docblock/24.9.0: - resolution: {integrity: sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==} - engines: {node: '>= 6'} - dependencies: - detect-newline: 2.1.0 - dev: false + /aws4@1.13.0: + resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + dev: true - /jest-each/24.9.0: - resolution: {integrity: sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==} - engines: {node: '>= 6'} + /axios@0.28.1: + resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==} dependencies: - '@jest/types': 24.9.0 - chalk: 2.4.2 - jest-get-type: 24.9.0 - jest-util: 24.9.0 - pretty-format: 24.9.0 + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 transitivePeerDependencies: - - supports-color + - debug dev: false - /jest-environment-jsdom-fourteen/1.0.1: - resolution: {integrity: sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==} + /babel-plugin-emotion@10.2.2: + resolution: {integrity: sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==} dependencies: - '@jest/environment': 24.9.0 - '@jest/fake-timers': 24.9.0 - '@jest/types': 24.9.0 - jest-mock: 24.9.0 - jest-util: 24.9.0 - jsdom: 14.1.0 + '@babel/helper-module-imports': 7.24.7 + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.4 + '@emotion/serialize': 0.11.16 + babel-plugin-macros: 2.8.0 + babel-plugin-syntax-jsx: 6.18.0 + convert-source-map: 1.9.0 + escape-string-regexp: 1.0.5 + find-root: 1.1.0 + source-map: 0.5.7 transitivePeerDependencies: - - bufferutil - supports-color - - utf-8-validate dev: false - /jest-environment-jsdom/24.9.0: - resolution: {integrity: sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==} - engines: {node: '>= 6'} + /babel-plugin-macros@2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@jest/environment': 24.9.0 - '@jest/fake-timers': 24.9.0 - '@jest/types': 24.9.0 - jest-mock: 24.9.0 - jest-util: 24.9.0 - jsdom: 11.12.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + '@babel/runtime': 7.24.7 + cosmiconfig: 6.0.0 + resolve: 1.22.8 dev: false - /jest-environment-node/24.9.0: - resolution: {integrity: sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==} - engines: {node: '>= 6'} - dependencies: - '@jest/environment': 24.9.0 - '@jest/fake-timers': 24.9.0 - '@jest/types': 24.9.0 - jest-mock: 24.9.0 - jest-util: 24.9.0 - transitivePeerDependencies: - - supports-color + /babel-plugin-syntax-jsx@6.18.0: + resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} dev: false - /jest-get-type/24.9.0: - resolution: {integrity: sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==} - engines: {node: '>= 6'} - dev: false + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true - /jest-get-type/29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: false + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true - /jest-haste-map/24.9.0: - resolution: {integrity: sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==} - engines: {node: '>= 6'} + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: - '@jest/types': 24.9.0 - anymatch: 2.0.0 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - invariant: 2.2.4 - jest-serializer: 24.9.0 - jest-util: 24.9.0 - jest-worker: 24.9.0 - micromatch: 3.1.10 - sane: 4.1.0 - walker: 1.0.8 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - dev: false + tweetnacl: 0.14.5 + dev: true - /jest-jasmine2/24.9.0: - resolution: {integrity: sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==} - engines: {node: '>= 6'} + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: - '@babel/traverse': 7.22.11 - '@jest/environment': 24.9.0 - '@jest/test-result': 24.9.0 - '@jest/types': 24.9.0 - chalk: 2.4.2 - co: 4.6.0 - expect: 24.9.0 - is-generator-fn: 2.1.0 - jest-each: 24.9.0 - jest-matcher-utils: 24.9.0 - jest-message-util: 24.9.0 - jest-runtime: 24.9.0 - jest-snapshot: 24.9.0 - jest-util: 24.9.0 - pretty-format: 24.9.0 - throat: 4.1.0 + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: false + dev: true - /jest-leak-detector/24.9.0: - resolution: {integrity: sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==} - engines: {node: '>= 6'} + /boxen@3.2.0: + resolution: {integrity: sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==} + engines: {node: '>=6'} dependencies: - jest-get-type: 24.9.0 - pretty-format: 24.9.0 - dev: false + ansi-align: 3.0.1 + camelcase: 5.3.1 + chalk: 2.4.2 + cli-boxes: 2.2.1 + string-width: 3.1.0 + term-size: 1.2.0 + type-fest: 0.3.1 + widest-line: 2.0.1 + dev: true - /jest-matcher-utils/24.9.0: - resolution: {integrity: sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==} - engines: {node: '>= 6'} + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: - chalk: 2.4.2 - jest-diff: 24.9.0 - jest-get-type: 24.9.0 - pretty-format: 24.9.0 - dev: false + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true - /jest-message-util/24.9.0: - resolution: {integrity: sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==} - engines: {node: '>= 6'} + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: - '@babel/code-frame': 7.22.10 - '@jest/test-result': 24.9.0 - '@jest/types': 24.9.0 - '@types/stack-utils': 1.0.1 - chalk: 2.4.2 - micromatch: 3.1.10 - slash: 2.0.0 - stack-utils: 1.0.5 - transitivePeerDependencies: - - supports-color - dev: false + balanced-match: 1.0.2 + dev: true - /jest-mock/24.9.0: - resolution: {integrity: sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==} - engines: {node: '>= 6'} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} dependencies: - '@jest/types': 24.9.0 - dev: false + fill-range: 7.1.1 + dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@24.9.0: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + /browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true dependencies: - jest-resolve: 24.9.0 - dev: false + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.810 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.1) + dev: true - /jest-regex-util/24.9.0: - resolution: {integrity: sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==} - engines: {node: '>= 6'} - dev: false + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true - /jest-resolve-dependencies/24.9.0: - resolution: {integrity: sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==} - engines: {node: '>= 6'} - dependencies: - '@jest/types': 24.9.0 - jest-regex-util: 24.9.0 - jest-snapshot: 24.9.0 - transitivePeerDependencies: - - supports-color - dev: false + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true - /jest-resolve/24.9.0: - resolution: {integrity: sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==} - engines: {node: '>= 6'} - dependencies: - '@jest/types': 24.9.0 - browser-resolve: 1.11.3 - chalk: 2.4.2 - jest-pnp-resolver: 1.2.3_jest-resolve@24.9.0 - realpath-native: 1.1.0 - dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true - /jest-runner/24.9.0: - resolution: {integrity: sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==} - engines: {node: '>= 6'} + /cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} dependencies: - '@jest/console': 24.9.0 - '@jest/environment': 24.9.0 - '@jest/test-result': 24.9.0 - '@jest/types': 24.9.0 - chalk: 2.4.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 24.9.0 - jest-docblock: 24.9.0 - jest-haste-map: 24.9.0 - jest-jasmine2: 24.9.0 - jest-leak-detector: 24.9.0 - jest-message-util: 24.9.0 - jest-resolve: 24.9.0 - jest-runtime: 24.9.0 - jest-util: 24.9.0 - jest-worker: 24.9.0 - source-map-support: 0.5.21 - throat: 4.1.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + dev: true - /jest-runtime/24.9.0: - resolution: {integrity: sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==} - engines: {node: '>= 6'} - hasBin: true + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: - '@jest/console': 24.9.0 - '@jest/environment': 24.9.0 - '@jest/source-map': 24.9.0 - '@jest/transform': 24.9.0 - '@jest/types': 24.9.0 - '@types/yargs': 13.0.12 - chalk: 2.4.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-config: 24.9.0 - jest-haste-map: 24.9.0 - jest-message-util: 24.9.0 - jest-mock: 24.9.0 - jest-regex-util: 24.9.0 - jest-resolve: 24.9.0 - jest-snapshot: 24.9.0 - jest-util: 24.9.0 - jest-validate: 24.9.0 - realpath-native: 1.1.0 - slash: 2.0.0 - strip-bom: 3.0.0 - yargs: 13.3.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true - /jest-serializer/24.9.0: - resolution: {integrity: sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==} - engines: {node: '>= 6'} - dev: false + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - /jest-snapshot/24.9.0: - resolution: {integrity: sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==} - engines: {node: '>= 6'} - dependencies: - '@babel/types': 7.22.11 - '@jest/types': 24.9.0 - chalk: 2.4.2 - expect: 24.9.0 - jest-diff: 24.9.0 - jest-get-type: 24.9.0 - jest-matcher-utils: 24.9.0 - jest-message-util: 24.9.0 - jest-resolve: 24.9.0 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - pretty-format: 24.9.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true - /jest-util/24.9.0: - resolution: {integrity: sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==} - engines: {node: '>= 6'} - dependencies: - '@jest/console': 24.9.0 - '@jest/fake-timers': 24.9.0 - '@jest/source-map': 24.9.0 - '@jest/test-result': 24.9.0 - '@jest/types': 24.9.0 - callsites: 3.1.0 - chalk: 2.4.2 - graceful-fs: 4.2.11 - is-ci: 2.0.0 - mkdirp: 0.5.6 - slash: 2.0.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: false + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true - /jest-validate/24.9.0: - resolution: {integrity: sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==} - engines: {node: '>= 6'} - dependencies: - '@jest/types': 24.9.0 - camelcase: 5.3.1 - chalk: 2.4.2 - jest-get-type: 24.9.0 - leven: 3.1.0 - pretty-format: 24.9.0 - dev: false + /caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + dev: true - /jest-watch-typeahead/0.4.2: - resolution: {integrity: sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==} - dependencies: - ansi-escapes: 4.3.2 - chalk: 2.4.2 - jest-regex-util: 24.9.0 - jest-watcher: 24.9.0 - slash: 3.0.0 - string-length: 3.1.0 - strip-ansi: 5.2.0 - transitivePeerDependencies: - - supports-color - dev: false + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true - /jest-watcher/24.9.0: - resolution: {integrity: sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==} - engines: {node: '>= 6'} + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} dependencies: - '@jest/test-result': 24.9.0 - '@jest/types': 24.9.0 - '@types/yargs': 13.0.12 - ansi-escapes: 3.2.0 - chalk: 2.4.2 - jest-util: 24.9.0 - string-length: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true - /jest-worker/24.9.0: - resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} - engines: {node: '>= 6'} + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: - merge-stream: 2.0.0 - supports-color: 6.1.0 - dev: false + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 - /jest-worker/25.5.0: - resolution: {integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==} - engines: {node: '>= 8.3'} + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: - merge-stream: 2.0.0 + ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: false + dev: true - /jest/24.9.0: - resolution: {integrity: sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==} - engines: {node: '>= 6'} - hasBin: true + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: - import-local: 2.0.0 - jest-cli: 24.9.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + get-func-name: 2.0.2 + dev: true - /jju/1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true - /js-tokens/3.0.2: - resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false - /js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-types/1.0.0: - resolution: {integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==} - engines: {node: '>=0.10.0'} + /cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} dev: true - /js-yaml/3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + /cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - /jsbn/0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + dev: true - /jsdom/11.12.0: - resolution: {integrity: sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==} - dependencies: - abab: 2.0.6 - acorn: 5.7.4 - acorn-globals: 4.3.4 - array-equal: 1.0.0 - cssom: 0.3.8 - cssstyle: 1.4.0 - data-urls: 1.1.0 - domexception: 1.0.1 - escodegen: 1.14.3 - html-encoding-sniffer: 1.0.2 - left-pad: 1.3.0 - nwsapi: 2.2.7 - parse5: 4.0.0 - pn: 1.1.0 - request: 2.88.2 - request-promise-native: 1.0.9_request@2.88.2 - sax: 1.2.4 - symbol-tree: 3.2.4 - tough-cookie: 2.5.0 - w3c-hr-time: 1.0.2 - webidl-conversions: 4.0.2 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 6.5.0 - ws: 5.2.3 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true - /jsdom/14.1.0: - resolution: {integrity: sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==} - engines: {node: '>=8'} + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: - abab: 2.0.6 - acorn: 6.4.2 - acorn-globals: 4.3.4 - array-equal: 1.0.0 - cssom: 0.3.8 - cssstyle: 1.4.0 - data-urls: 1.1.0 - domexception: 1.0.1 - escodegen: 1.14.3 - html-encoding-sniffer: 1.0.2 - nwsapi: 2.2.7 - parse5: 5.1.0 - pn: 1.1.0 - request: 2.88.2 - request-promise-native: 1.0.9_request@2.88.2 - saxes: 3.1.11 - symbol-tree: 3.2.4 - tough-cookie: 2.5.0 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 1.1.2 - webidl-conversions: 4.0.2 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 7.1.0 - ws: 6.2.2 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + color-name: 1.1.3 - /jsesc/0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: false + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true - /jsesc/2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: false + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /json-buffer/3.0.0: - resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /json-parse-better-errors/1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 - /json-parse-even-better-errors/2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true - /json-parse-helpfulerror/1.0.3: - resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} dependencies: - jju: 1.4.0 + mime-db: 1.52.0 dev: true - /json-schema-traverse/0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-schema/0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - /json-server/0.15.1: - resolution: {integrity: sha512-6Vc6tC1uLasnMd6Ksnq+4gSQcRqLuSJ/yLoIG4fr4P8f5dAR1gbCqgaVRlk8jfRune0NXcrfDrz7liwAD2WEeQ==} - engines: {node: '>=8'} - hasBin: true + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} dependencies: - body-parser: 1.20.2 - chalk: 2.4.2 - compression: 1.7.4 - connect-pause: 0.1.1 - cors: 2.8.5 - errorhandler: 1.5.1 - express: 4.19.2 - express-urlrewrite: 1.4.0 - json-parse-helpfulerror: 1.0.3 - lodash: 4.17.21 - lodash-id: 0.14.1 - lowdb: 1.0.0 - method-override: 3.0.0 - morgan: 1.10.0 - nanoid: 2.1.11 - object-assign: 4.1.1 - please-upgrade-node: 3.2.0 - pluralize: 8.0.0 - request: 2.88.2 - server-destroy: 1.0.1 - update-notifier: 3.0.1 - yargs: 14.2.3 + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 transitivePeerDependencies: - supports-color dev: true - /json-stable-stringify-without-jsonify/1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /json-stable-stringify/1.0.2: - resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} - dependencies: - jsonify: 0.0.1 - dev: false - - /json-stringify-safe/5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - /json2mq/0.2.0: - resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} - dependencies: - string-convert: 0.2.1 + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} dev: false - /json3/3.3.3: - resolution: {integrity: sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==} - dev: false + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true - /json5/1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 + /confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + dev: true - /json5/2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + /configstore@4.0.0: + resolution: {integrity: sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==} engines: {node: '>=6'} - hasBin: true - - /jsonfile/4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: false - - /jsonfile/6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 - optionalDependencies: + dot-prop: 4.2.1 graceful-fs: 4.2.11 + make-dir: 1.3.0 + unique-string: 1.0.0 + write-file-atomic: 2.4.3 + xdg-basedir: 3.0.0 dev: true - /jsonify/0.0.1: - resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - dev: false - - /jsprim/1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 + /connect-pause@0.1.1: + resolution: {integrity: sha512-a1gSWQBQD73krFXdUEYJom2RTFrWUL3YvXDCRkyv//GVXc79cdW9MngtRuN9ih4FDKBtfJAJId+BbDuX+1rh2w==} + dev: true - /jsx-ast-utils/2.4.1: - resolution: {integrity: sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==} - engines: {node: '>=4.0'} + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} dependencies: - array-includes: 3.1.6 - object.assign: 4.1.4 - dev: false + safe-buffer: 5.2.1 + dev: true - /jsx-ast-utils/3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - dependencies: - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - object.assign: 4.1.4 - object.values: 1.1.6 + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} dev: true - /kdbush/3.0.0: - resolution: {integrity: sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==} + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: false - /keyv/3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} - dependencies: - json-buffer: 3.0.0 + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /killable/1.0.1: - resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} - dev: false + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true - /kind-of/2.0.1: - resolution: {integrity: sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: false + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: true - /kind-of/3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} dependencies: - is-buffer: 1.1.6 + is-what: 3.14.1 - /kind-of/4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: - is-buffer: 1.1.6 - - /kind-of/5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - - /kind-of/6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - /kleur/3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + toggle-selection: 1.0.6 dev: false - /last-call-webpack-plugin/3.0.0: - resolution: {integrity: sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==} - dependencies: - lodash: 4.17.21 - webpack-sources: 1.4.3 - dev: false + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true - /latest-version/5.1.0: - resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} - engines: {node: '>=8'} + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} dependencies: - package-json: 6.5.0 + object-assign: 4.1.1 + vary: 1.1.2 dev: true - /lazy-cache/0.2.7: - resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==} - engines: {node: '>=0.10.0'} - dev: false - - /lazy-cache/1.0.4: - resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} - engines: {node: '>=0.10.0'} - dev: false - - /left-pad/1.3.0: - resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} - deprecated: use String.prototype.padStart() + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 dev: false - /less-loader/5.0.0_less@3.13.1: - resolution: {integrity: sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==} - engines: {node: '>= 4.8.0'} + /cosmiconfig@8.3.6(typescript@4.9.5): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} peerDependencies: - less: ^2.3.1 || ^3.0.0 - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true dependencies: - clone: 2.1.2 - less: 3.13.1 - loader-utils: 1.4.2 - pify: 4.0.1 - dev: false + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 4.9.5 + dev: true - /less/3.13.1: - resolution: {integrity: sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==} - engines: {node: '>=6'} - hasBin: true + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: - copy-anything: 2.0.6 - tslib: 1.14.1 - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 - mime: 1.6.0 - native-request: 1.1.0 - source-map: 0.6.1 - dev: false + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true - /leven/3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: false + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true - /levenary/1.1.1: - resolution: {integrity: sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==} - engines: {node: '>= 6'} + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: - leven: 3.1.0 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-random-string@1.0.0: + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} + dev: true + + /csstype@2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dev: false - /levn/0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 + assert-plus: 1.0.0 + dev: true - /line-column-path/2.0.0: - resolution: {integrity: sha512-nz3A+vi4bElhwd62E9+Qk/f9BDYLSzD/4Hy1rir0I4GnMxSTezSymzANyph5N1PgRZ3sSbA+yR5hOuXxc71a0Q==} - engines: {node: '>=8'} + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} dependencies: - type-fest: 0.4.1 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 dev: true - /lines-and-columns/1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - /load-json-file/2.0.0: - resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==} - engines: {node: '>=4'} + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - strip-bom: 3.0.0 - dev: false + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true - /load-json-file/4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true - /loader-fs-cache/1.0.3: - resolution: {integrity: sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==} + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} dependencies: - find-cache-dir: 0.1.1 - mkdirp: 0.5.6 + '@babel/runtime': 7.24.7 dev: false - /loader-runner/2.4.0: - resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + /dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} dev: false - /loader-utils/1.2.3: - resolution: {integrity: sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==} - engines: {node: '>=4.0.0'} + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - big.js: 5.2.2 - emojis-list: 2.1.0 - json5: 1.0.2 - dev: false + ms: 2.0.0 + dev: true - /loader-utils/1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 - dev: false + ms: 2.0.0 + dev: true - /loader-utils/2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - dev: false + ms: 2.1.2 + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true - /locate-path/2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 + mimic-response: 1.0.1 + dev: true - /locate-path/3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - - /locate-path/5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - - /lodash-id/0.14.1: - resolution: {integrity: sha512-ikQPBTiq/d5m6dfKQlFdIXFzvThPi2Be9/AHxktOnDSfSxE1j9ICbBT5Elk1ke7HSTgM38LHTpmJovo9/klnLg==} - engines: {node: '>= 4'} + type-detect: 4.0.8 dev: true - /lodash._reinterpolate/3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - dev: false - - /lodash.camelcase/4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /lodash.debounce/4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: false - - /lodash.flow/3.5.0: - resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} - dev: false - - /lodash.get/4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} dev: true - /lodash.memoize/4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: false - - /lodash.merge/4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: false + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true - /lodash.sortby/4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false + /defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + dev: true - /lodash.template/4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - dev: false + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true - /lodash.templatesettings/4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: - lodash._reinterpolate: 3.0.0 - dev: false + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true - /lodash.throttle/4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: false + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - /lodash.uniq/4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: false + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true - /lodash.zip/4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true - /lodash/4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true - /log-symbols/3.0.0: - resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: - chalk: 2.4.2 + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 dev: true - /loglevel/1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} - engines: {node: '>= 0.6.0'} + /dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} dev: false - /loose-envify/1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - js-tokens: 4.0.0 + '@babel/runtime': 7.24.7 + csstype: 3.1.3 + dev: false - /loud-rejection/1.6.0: - resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} - engines: {node: '>=0.10.0'} + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: - currently-unhandled: 0.4.1 - signal-exit: 3.0.7 + no-case: 3.0.4 + tslib: 2.6.3 dev: true - /lowdb/1.0.0: - resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} + /dot-prop@4.2.1: + resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} engines: {node: '>=4'} dependencies: - graceful-fs: 4.2.11 - is-promise: 2.2.2 - lodash: 4.17.21 - pify: 3.0.0 - steno: 0.4.4 + is-obj: 1.0.1 dev: true - /lower-case/2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.6.2 - dev: false - - /lowercase-keys/1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} + /duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} dev: true - /lowercase-keys/2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /lru-cache/4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + jsbn: 0.1.1 + safer-buffer: 2.1.2 dev: true - /lru-cache/5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + /echarts@5.5.0: + resolution: {integrity: sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==} dependencies: - yallist: 3.1.1 + tslib: 2.3.0 + zrender: 5.5.0 dev: false - /lru-cache/6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true - /make-dir/1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 + /electron-to-chromium@1.4.810: + resolution: {integrity: sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==} dev: true - /make-dir/2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: false + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + dev: true - /make-dir/3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: - semver: 6.3.1 + once: 1.4.0 + dev: true - /makeerror/1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} dependencies: - tmpl: 1.0.5 - dev: false + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: true - /mamacro/0.0.3: - resolution: {integrity: sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==} - dev: false + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true - /map-cache/0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + optional: true - /map-limit/0.0.1: - resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: - once: 1.3.3 - dev: false + is-arrayish: 0.2.1 - /map-obj/1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + /errorhandler@1.5.1: + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 dev: true - /map-obj/2.0.0: - resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} - engines: {node: '>=4'} + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 dev: true - /map-visit/1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} dependencies: - object-visit: 1.0.1 - - /mapbox-gl/1.10.1: - resolution: {integrity: sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==} - engines: {node: '>=6.4.0'} - dependencies: - '@mapbox/geojson-rewind': 0.5.2 - '@mapbox/geojson-types': 1.0.2 - '@mapbox/jsonlint-lines-primitives': 2.0.2 - '@mapbox/mapbox-gl-supported': 1.5.0_mapbox-gl@1.10.1 - '@mapbox/point-geometry': 0.1.0 - '@mapbox/tiny-sdf': 1.2.5 - '@mapbox/unitbezier': 0.0.0 - '@mapbox/vector-tile': 1.3.1 - '@mapbox/whoots-js': 3.1.0 - csscolorparser: 1.0.3 - earcut: 2.2.4 - geojson-vt: 3.2.1 - gl-matrix: 3.4.3 - grid-index: 1.1.0 - minimist: 1.2.8 - murmurhash-js: 1.0.0 - pbf: 3.2.1 - potpack: 1.0.2 - quickselect: 2.0.0 - rw: 1.3.3 - supercluster: 7.1.5 - tinyqueue: 2.0.3 - vt-pbf: 3.1.3 - dev: false + get-intrinsic: 1.2.4 + dev: true - /math-log2/1.0.1: - resolution: {integrity: sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==} - engines: {node: '>=0.10.0'} - dev: false + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true - /md5.js/1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 + es-errors: 1.3.0 + dev: true - /mdn-data/2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: false + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true - /mdn-data/2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - dev: false + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true - /media-typer/0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true - /memoize-one/5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: false + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true - /memory-fs/0.2.0: - resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} dev: true - /memory-fs/0.4.1: - resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} + /eslint-config-prettier@8.10.0(eslint@7.32.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - dev: false + eslint: 7.32.0 + dev: true - /memory-fs/0.5.0: - resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0)(eslint@7.32.0)(prettier@2.8.8): + resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - dev: false - - /memorystream/0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} + eslint: 7.32.0 + eslint-config-prettier: 8.10.0(eslint@7.32.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 dev: true - /meow/5.0.0: - resolution: {integrity: sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==} - engines: {node: '>=6'} + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} dependencies: - camelcase-keys: 4.2.0 - decamelize-keys: 1.1.1 - loud-rejection: 1.6.0 - minimist-options: 3.0.2 - normalize-package-data: 2.5.0 - read-pkg-up: 3.0.0 - redent: 2.0.0 - trim-newlines: 2.0.0 - yargs-parser: 10.1.0 + esrecurse: 4.3.0 + estraverse: 4.3.0 dev: true - /merge-deep/3.0.3: - resolution: {integrity: sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==} - engines: {node: '>=0.10.0'} + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} dependencies: - arr-union: 3.1.0 - clone-deep: 0.2.4 - kind-of: 3.2.2 - dev: false + eslint-visitor-keys: 1.3.0 + dev: true - /merge-descriptors/1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true - /merge2/1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - /method-override/3.0.0: - resolution: {integrity: sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==} - engines: {node: '>= 0.10'} + /eslint@7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + hasBin: true dependencies: - debug: 3.1.0 - methods: 1.1.2 - parseurl: 1.3.3 - vary: 1.1.2 + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.3 + '@humanwhocodes/config-array': 0.5.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + enquirer: 2.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.6.2 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.8.2 + text-table: 0.2.0 + v8-compile-cache: 2.4.0 transitivePeerDependencies: - supports-color dev: true - /methods/1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - /micro-spelling-correcter/1.1.1: - resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} + /espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 dev: true - /microevent.ts/0.1.1: - resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} - dev: false + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true - /micromatch/3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + estraverse: 5.3.0 + dev: true - /micromatch/3.1.10_supports-color@6.1.0: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2_supports-color@6.1.0 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4_supports-color@6.1.0 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13_supports-color@6.1.0 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: false + estraverse: 5.3.0 + dev: true - /micromatch/4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} dev: true - /miller-rabin/4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true - /mime-db/1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true - /mime-types/2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - mime-db: 1.52.0 - - /mime/1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + '@types/estree': 1.0.5 + dev: true - /mime/2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true - /mimic-fn/2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true - /mimic-response/1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + /execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 dev: true - /mini-css-extract-plugin/0.9.0_webpack@4.42.0: - resolution: {integrity: sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==} - engines: {node: '>= 6.9.0'} - peerDependencies: - webpack: ^4.4.0 + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} dependencies: - loader-utils: 1.4.2 - normalize-url: 1.9.1 - schema-utils: 1.0.0 - webpack: 4.42.0 - webpack-sources: 1.4.3 - dev: false + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true - /mini-store/2.0.0: - resolution: {integrity: sha512-EG0CuwpQmX+XL4QVS0kxNwHW5ftSbhygu1qxQH0pipugjnPkbvkalCdQbEihMwtQY6d3MTN+MS0q+aurs+RfLQ==} + /express-urlrewrite@1.4.0: + resolution: {integrity: sha512-PI5h8JuzoweS26vFizwQl6UTF25CAHSggNv0J25Dn/IKZscJHWZzPrI5z2Y2jgOzIaw2qh8l6+/jUcig23Z2SA==} dependencies: - hoist-non-react-statics: 2.5.5 - prop-types: 15.8.1 - react-lifecycles-compat: 3.0.4 - shallowequal: 1.1.0 - dev: false - - /minimalistic-assert/1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - /minimalistic-crypto-utils/1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + debug: 4.3.5 + path-to-regexp: 1.8.0 + transitivePeerDependencies: + - supports-color + dev: true - /minimatch/3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} dependencies: - brace-expansion: 1.1.11 - dev: false + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true - /minimatch/3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true - /minimist-options/3.0.2: - resolution: {integrity: sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==} - engines: {node: '>= 4'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} dev: true - /minimist/1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true - /minipass-collect/1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true - /minipass-flush/1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} dependencies: - minipass: 3.3.6 - dev: false + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + dev: true - /minipass-pipeline/1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: false + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true - /minipass/3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: false + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true - /mississippi/3.0.0: - resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} - engines: {node: '>=4.0.0'} + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: - concat-stream: 1.6.2 - duplexify: 3.7.1 - end-of-stream: 1.4.4 - flush-write-stream: 1.1.1 - from2: 2.3.0 - parallel-transform: 1.2.0 - pump: 3.0.0 - pumpify: 1.5.1 - stream-each: 1.2.3 - through2: 2.0.5 - dev: false + reusify: 1.0.4 + dev: true - /mixin-deep/1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 + flat-cache: 3.2.0 + dev: true - /mixin-object/2.0.1: - resolution: {integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 0.1.8 - is-extendable: 0.1.1 + /filesize@6.4.0: + resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} + engines: {node: '>= 0.4.0'} dev: false - /mkdirp/0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} dependencies: - minimist: 1.2.8 - - /moment/2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - dev: false + to-regex-range: 5.0.1 + dev: true - /morgan/1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} - engines: {node: '>= 0.8.0'} + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} dependencies: - basic-auth: 2.0.1 debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.0.2 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 transitivePeerDependencies: - supports-color dev: true - /mouse-change/1.4.0: - resolution: {integrity: sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==} - dependencies: - mouse-event: 1.0.5 - dev: false - - /mouse-event-offset/3.0.2: - resolution: {integrity: sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==} - dev: false - - /mouse-event/1.0.5: - resolution: {integrity: sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==} + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: false - /mouse-wheel/1.2.0: - resolution: {integrity: sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==} + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} dependencies: - right-now: 1.0.0 - signum: 1.0.0 - to-px: 1.0.1 - dev: false + locate-path: 3.0.0 + dev: true - /move-concurrently/1.0.1: - resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - aproba: 1.2.0 - copy-concurrently: 1.0.5 - fs-write-stream-atomic: 1.0.10 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: false - - /ms/2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - /ms/2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true - /ms/2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true - /multicast-dns-service-types/1.1.0: - resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true dev: false - /multicast-dns/6.2.3: - resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} - hasBin: true + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: - dns-packet: 1.3.4 - thunky: 1.1.0 - dev: false - - /multimap/1.1.0: - resolution: {integrity: sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==} + is-callable: 1.2.7 dev: true - /mumath/3.3.4: - resolution: {integrity: sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==} - deprecated: Redundant dependency in your project. + /foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} dependencies: - almost-equal: 1.1.0 - dev: false - - /murmurhash-js/1.0.0: - resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} - dev: false - - /mutationobserver-shim/0.3.7: - resolution: {integrity: sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ==} - dev: false - - /mute-stream/0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - /nan/2.17.0: - resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} - requiresBuild: true - dev: false - optional: true + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true - /nanoid/2.1.11: - resolution: {integrity: sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==} + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /nanomatch/1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true - /nanomatch/1.2.13_supports-color@6.1.0: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@6.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 dev: false - /native-promise-only/0.8.1: - resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==} - dev: false + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true - /native-request/1.1.0: - resolution: {integrity: sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==} + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] requiresBuild: true - dev: false + dev: true optional: true - /natural-compare/1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /needle/2.9.1: - resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} - engines: {node: '>= 4.4.x'} - hasBin: true + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} dependencies: - debug: 3.2.7 - iconv-lite: 0.4.24 - sax: 1.2.4 - transitivePeerDependencies: - - supports-color - dev: false + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + dev: true - /negotiator/0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true - /neo-async/2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: false + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true - /next-tick/1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: false + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true - /nice-try/1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true - /no-case/3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.6.2 - dev: false + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true - /node-fetch/1.7.3: - resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: - encoding: 0.1.13 - is-stream: 1.1.0 - dev: false - - /node-forge/0.10.0: - resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} - engines: {node: '>= 6.0.0'} - dev: false + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true - /node-int64/0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: false + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: true - /node-libs-browser/2.2.1: - resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} - dependencies: - assert: 1.5.0 - browserify-zlib: 0.2.0 - buffer: 4.9.2 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - crypto-browserify: 3.12.0 - domain-browser: 1.2.0 - events: 3.3.0 - https-browserify: 1.0.0 - os-browserify: 0.3.0 - path-browserify: 0.0.1 - process: 0.11.10 - punycode: 1.4.1 - querystring-es3: 0.2.1 - readable-stream: 2.3.8 - stream-browserify: 2.0.2 - stream-http: 2.8.3 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.0 - url: 0.11.1 - util: 0.11.1 - vm-browserify: 1.1.2 - - /node-notifier/5.4.5: - resolution: {integrity: sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==} - dependencies: - growly: 1.3.0 - is-wsl: 1.1.0 - semver: 5.7.2 - shellwords: 0.1.1 - which: 1.3.1 - dev: false + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true - /node-releases/1.1.77: - resolution: {integrity: sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==} - dev: false + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true - /node-releases/2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: false + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true - /normalize-package-data/2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.4 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true - /normalize-path/2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: - remove-trailing-separator: 1.1.0 - dev: false + assert-plus: 1.0.0 + dev: true - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true - /normalize-range/0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false + /glob-regex@0.3.2: + resolution: {integrity: sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==} + dev: true - /normalize-svg-path/0.1.0: - resolution: {integrity: sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==} - dev: false + /glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.0 + minimatch: 9.0.4 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + dev: true - /normalize-svg-path/1.1.0: - resolution: {integrity: sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==} + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: - svg-arc-to-cubic-bezier: 3.2.0 - dev: false + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true - /normalize-url/1.9.1: - resolution: {integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==} + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: - object-assign: 4.1.1 - prepend-http: 1.0.4 - query-string: 4.3.4 - sort-keys: 1.1.2 - dev: false + ini: 1.3.8 + dev: true - /normalize-url/3.3.0: - resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} - engines: {node: '>=6'} - dev: false + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} - /normalize-url/4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 dev: true - /npm-run-all/4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.1 - string.prototype.padend: 3.1.4 + define-properties: 1.2.1 + gopd: 1.0.1 dev: true - /npm-run-path/2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: - path-key: 2.0.1 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true - /nth-check/1.0.2: - resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} - dependencies: - boolbase: 1.0.0 - dev: false + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true - /nth-check/2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - boolbase: 1.0.0 - dev: false - - /num2fraction/1.2.2: - resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} - dev: false + get-intrinsic: 1.2.4 + dev: true - /number-is-integer/1.0.1: - resolution: {integrity: sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==} - engines: {node: '>=0.10.0'} + /got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} dependencies: - is-finite: 1.1.0 - dev: false - - /nwsapi/2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: false + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: true - /oauth-sign/0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /obj-props/1.4.0: - resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} - engines: {node: '>=0.10.0'} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /object-assign/4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true - /object-copy/0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - - /object-hash/2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - dev: false + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true - /object-inspect/1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true - /object-is/1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: false + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - /object-keys/1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true - /object-visit/1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - isobject: 3.0.1 + es-define-property: 1.0.0 + dev: true - /object.assign/4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 + dev: true - /object.entries/1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + dev: true - /object.fromentries/2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - /object.getownpropertydescriptors/2.1.6: - resolution: {integrity: sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==} - engines: {node: '>= 0.8'} - dependencies: - array.prototype.reduce: 1.0.5 - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - safe-array-concat: 1.0.0 - dev: false - - /object.groupby/1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 + has-symbols: 1.0.3 dev: true - /object.hasown/1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} - dependencies: - define-properties: 1.2.0 - es-abstract: 1.22.1 + /has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} dev: true - /object.pick/1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - - /object.values/1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - /obuf/1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: false + function-bind: 1.1.2 - /omit.js/1.0.2: - resolution: {integrity: sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==} + /history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - babel-runtime: 6.26.0 + '@babel/runtime': 7.24.7 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + value-equal: 1.0.1 dev: false - /on-finished/2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + /history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} dependencies: - ee-first: 1.1.1 + '@babel/runtime': 7.24.7 dev: true - /on-finished/2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - - /on-headers/1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - - /once/1.3.3: - resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: - wrappy: 1.0.2 + react-is: 16.13.1 dev: false - /once/1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime/5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true - /open-editor/2.0.1: - resolution: {integrity: sha512-B3KdD7Pl8jYdpBSBBbdYaqVUI3whQjLl1G1+CvhNc8+d7GzKRUq+VuCIx1thxGiqD2oBGRvsZz7QWrBsFP2yVA==} - engines: {node: '>=8'} - dependencies: - env-editor: 0.4.2 - line-column-path: 2.0.0 - open: 6.4.0 + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true - /open/6.4.0: - resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} - engines: {node: '>=8'} + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} dependencies: - is-wsl: 1.1.0 + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 dev: true - /open/7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: false + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + dev: true - /opn/5.5.0: - resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} - engines: {node: '>=4'} - dependencies: - is-wsl: 1.1.0 - dev: false + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true - /optimize-css-assets-webpack-plugin/5.0.3_webpack@4.42.0: - resolution: {integrity: sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==} - peerDependencies: - webpack: ^4.0.0 + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} dependencies: - cssnano: 4.1.11 - last-call-webpack-plugin: 3.0.0 - webpack: 4.42.0 - dev: false + safer-buffer: 2.1.2 + dev: true - /optionator/0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 + /ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true - /os-browserify/0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true - /os-tmpdir/1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + optional: true - /p-cancelable/1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - dev: true - - /p-each-series/1.0.0: - resolution: {integrity: sha512-J/e9xiZZQNrt+958FFzJ+auItsBGq+UrQ7nE89AUP7UOTtjHnkISANXLdayhVzh538UnLMCSlf13lFfRIAKQOA==} - engines: {node: '>=4'} dependencies: - p-reduce: 1.0.0 - dev: false + parent-module: 1.0.1 + resolve-from: 4.0.0 - /p-finally/1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + /import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} + dev: true - /p-limit/1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - dependencies: - p-try: 1.0.0 + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true - /p-limit/2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: - p-try: 2.2.0 + once: 1.4.0 + wrappy: 1.0.2 + dev: true - /p-locate/2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - dependencies: - p-limit: 1.3.0 + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true - /p-locate/3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true - /p-locate/4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} dependencies: - p-limit: 2.3.0 + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true - /p-map/2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: false + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true - /p-map/3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: - aggregate-error: 3.1.0 - dev: false + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true - /p-reduce/1.0.0: - resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==} - engines: {node: '>=4'} - dev: false + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /p-reduce/2.1.0: - resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} - engines: {node: '>=8'} + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 dev: true - /p-retry/3.0.1: - resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} - engines: {node: '>=6'} + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: - retry: 0.12.0 - dev: false - - /p-try/1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true - /p-try/2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true - /package-json/6.5.0: - resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} - engines: {node: '>=8'} + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true dependencies: - got: 9.6.0 - registry-auth-token: 4.2.2 - registry-url: 5.1.0 - semver: 6.3.1 + ci-info: 2.0.0 dev: true - /pako/1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - - /parallel-transform/1.2.0: - resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + /is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} dependencies: - cyclist: 1.0.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false + hasown: 2.0.2 - /param-case/3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - dev: false + is-typed-array: 1.1.13 + dev: true - /parent-module/1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: - callsites: 3.1.0 + has-tostringtag: 1.0.2 + dev: true - /parenthesis/3.1.8: - resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} - dev: false + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true - /parse-asn1/5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} - dependencies: - asn1.js: 5.4.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.2 - safe-buffer: 5.2.1 + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true - /parse-asn1/5.1.7: - resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} - engines: {node: '>= 0.10'} - dependencies: - asn1.js: 4.10.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - hash-base: 3.0.4 - pbkdf2: 3.1.2 - safe-buffer: 5.2.1 + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true - /parse-json/2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: - error-ex: 1.3.2 - dev: false + is-extglob: 2.1.1 + dev: true - /parse-json/4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + /is-installed-globally@0.1.0: + resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} engines: {node: '>=4'} dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 + global-dirs: 0.1.1 + is-path-inside: 1.0.1 + dev: true - /parse-json/5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.10 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true - /parse-ms/2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} - engines: {node: '>=6'} - dev: false + /is-npm@3.0.0: + resolution: {integrity: sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==} + engines: {node: '>=8'} + dev: true - /parse-rect/1.2.0: - resolution: {integrity: sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==} + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: - pick-by-alias: 1.2.0 - dev: false + has-tostringtag: 1.0.2 + dev: true - /parse-svg-path/0.1.2: - resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} - dev: false + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true - /parse-unit/1.0.1: - resolution: {integrity: sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==} - dev: false + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true - /parse5/4.0.0: - resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} - dev: false + /is-path-inside@1.0.1: + resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} + engines: {node: '>=0.10.0'} + dependencies: + path-is-inside: 1.0.2 + dev: true - /parse5/5.1.0: - resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==} - dev: false + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true - /parseurl/1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true - /pascal-case/3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dev: false + call-bind: 1.0.7 + dev: true - /pascalcase/0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} + dev: true - /path-browserify/0.0.1: - resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - /path-dirname/1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true - /path-exists/2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: - pinkie-promise: 2.0.1 - dev: false + has-symbols: 1.0.3 + dev: true - /path-exists/3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: true - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true - /path-is-absolute/1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + dev: true - /path-is-inside/1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - /path-key/2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} + /is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + dev: true - /path-key/3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: false + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - /path-parse/1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true - /path-to-regexp/0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true - /path-to-regexp/1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - dependencies: - isarray: 0.0.1 + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true - /path-type/2.0.0: - resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==} - engines: {node: '>=4'} + /jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} dependencies: - pify: 2.3.0 - dev: false + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true - /path-type/3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true - /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + dev: true - /pbf/3.2.1: - resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: - ieee754: 1.2.1 - resolve-protobuf-schema: 2.1.0 - dev: false + argparse: 1.0.10 + esprima: 4.0.1 + dev: true - /pbkdf2/3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 + argparse: 2.0.1 + dev: true - /performance-now/2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true - /pick-by-alias/1.2.0: - resolution: {integrity: sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==} - dev: false + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true - /picocolors/0.2.1: - resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - dev: false + /json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: true - /picocolors/1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true - /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true - /pidtree/0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-parse-helpfulerror@1.0.3: + resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} + dependencies: + jju: 1.4.0 dev: true - /pify/2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true - /pify/3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true - /pify/4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true - /pinkie-promise/2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + /json-server@0.15.1: + resolution: {integrity: sha512-6Vc6tC1uLasnMd6Ksnq+4gSQcRqLuSJ/yLoIG4fr4P8f5dAR1gbCqgaVRlk8jfRune0NXcrfDrz7liwAD2WEeQ==} + engines: {node: '>=8'} + hasBin: true dependencies: - pinkie: 2.0.4 - dev: false + body-parser: 1.20.2 + chalk: 2.4.2 + compression: 1.7.4 + connect-pause: 0.1.1 + cors: 2.8.5 + errorhandler: 1.5.1 + express: 4.19.2 + express-urlrewrite: 1.4.0 + json-parse-helpfulerror: 1.0.3 + lodash: 4.17.21 + lodash-id: 0.14.1 + lowdb: 1.0.0 + method-override: 3.0.0 + morgan: 1.10.0 + nanoid: 2.1.11 + object-assign: 4.1.1 + please-upgrade-node: 3.2.0 + pluralize: 8.0.0 + request: 2.88.2 + server-destroy: 1.0.1 + update-notifier: 3.0.1 + yargs: 14.2.3 + transitivePeerDependencies: + - supports-color + dev: true - /pinkie/2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true - /pirates/4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: false + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true - /pkg-dir/1.0.0: - resolution: {integrity: sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==} - engines: {node: '>=0.10.0'} + /json2mq@0.2.0: + resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} dependencies: - find-up: 1.1.2 + string-convert: 0.2.1 dev: false - /pkg-dir/3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - dev: false + hasBin: true + dev: true - /pkg-dir/4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} dependencies: - find-up: 4.1.0 + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true - /pkg-up/3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} + /keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} dependencies: - find-up: 3.0.0 - dev: false + json-buffer: 3.0.0 + dev: true - /please-upgrade-node/3.2.0: - resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: - semver-compare: 1.0.0 + json-buffer: 3.0.1 dev: true - /plotly.js/2.25.2: - resolution: {integrity: sha512-Pf6dPYGl21W7A3FTgLQ52fpgvrqGhCPDT3+612bxwg4QXlvxhnoFwvuhT1BRW/l2nbYGpRoUH79K54yf2vCMVQ==} - dependencies: - '@plotly/d3': 3.8.1 - '@plotly/d3-sankey': 0.7.2 - '@plotly/d3-sankey-circular': 0.33.1 - '@turf/area': 6.5.0 - '@turf/bbox': 6.5.0 - '@turf/centroid': 6.5.0 - canvas-fit: 1.5.0 - color-alpha: 1.0.4 - color-normalize: 1.5.0 - color-parse: 1.3.8 - color-rgba: 2.1.1 - country-regex: 1.1.0 - d3-force: 1.2.1 - d3-format: 1.4.5 - d3-geo: 1.12.1 - d3-geo-projection: 2.9.0 - d3-hierarchy: 1.1.9 - d3-interpolate: 3.0.1 - d3-time: 1.1.0 - d3-time-format: 2.3.0 - fast-isnumeric: 1.1.4 - gl-mat4: 1.2.0 - gl-text: 1.3.1 - glslify: 7.1.1 - has-hover: 1.0.1 - has-passive-events: 1.0.0 - is-mobile: 4.0.0 - mapbox-gl: 1.10.1 - mouse-change: 1.4.0 - mouse-event-offset: 3.0.2 - mouse-wheel: 1.2.0 - native-promise-only: 0.8.1 - parse-svg-path: 0.1.2 - point-in-polygon: 1.1.0 - polybooljs: 1.2.0 - probe-image-size: 7.2.3 - regl: /@plotly/regl/2.1.2 - regl-error2d: 2.0.12 - regl-line2d: 3.1.2 - regl-scatter2d: 3.2.9 - regl-splom: 1.0.14 - strongly-connected-components: 1.0.1 - superscript-text: 1.0.0 - svg-path-sdf: 1.1.3 - tinycolor2: 1.6.0 - to-px: 1.0.1 - topojson-client: 3.1.0 - webgl-context: 2.2.0 - world-calendars: 1.0.3 - transitivePeerDependencies: - - supports-color - dev: false + /latest-version@5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} + engines: {node: '>=8'} + dependencies: + package-json: 6.5.0 + dev: true - /plur/3.1.1: - resolution: {integrity: sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==} + /less@3.13.1: + resolution: {integrity: sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==} engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + tslib: 1.14.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + native-request: 1.1.0 + source-map: 0.6.1 + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: - irregular-plurals: 2.0.0 + prelude-ls: 1.2.1 + type-check: 0.4.0 dev: true - /pluralize/8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 dev: true - /pn/1.1.0: - resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} - dev: false + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.1 + pkg-types: 1.1.1 + dev: true - /pnp-webpack-plugin/1.6.4_typescript@3.5.3: - resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.1.6_typescript@3.5.3 - transitivePeerDependencies: - - typescript - dev: false + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true - /point-in-polygon/1.1.0: - resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} - dev: false + /lodash-id@0.14.1: + resolution: {integrity: sha512-ikQPBTiq/d5m6dfKQlFdIXFzvThPi2Be9/AHxktOnDSfSxE1j9ICbBT5Elk1ke7HSTgM38LHTpmJovo9/klnLg==} + engines: {node: '>= 4'} + dev: true - /polybooljs/1.2.0: - resolution: {integrity: sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ==} - dev: false + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /portfinder/1.0.32_supports-color@6.1.0: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true dependencies: - async: 2.6.4 - debug: 3.2.7_supports-color@6.1.0 - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color + js-tokens: 4.0.0 dev: false - /posix-character-classes/0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /lowdb@1.0.0: + resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + is-promise: 2.2.2 + lodash: 4.17.21 + pify: 3.0.0 + steno: 0.4.4 + dev: true + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.3 + dev: true + + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + dev: true - /postcss-attribute-case-insensitive/4.0.2: - resolution: {integrity: sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==} - dependencies: - postcss: 7.0.39 - postcss-selector-parser: 6.0.13 - dev: false + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true - /postcss-browser-comments/3.0.0_browserslist@4.21.10: - resolution: {integrity: sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==} - engines: {node: '>=8.0.0'} - peerDependencies: - browserslist: ^4 - dependencies: - browserslist: 4.21.10 - postcss: 7.0.39 - dev: false + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + dev: true - /postcss-calc/7.0.5: - resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: - postcss: 7.0.39 - postcss-selector-parser: 6.0.13 - postcss-value-parser: 4.2.0 - dev: false + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true - /postcss-color-functional-notation/2.0.1: - resolution: {integrity: sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==} - engines: {node: '>=6.0.0'} + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + yallist: 3.1.1 + dev: true - /postcss-color-gray/5.0.0: - resolution: {integrity: sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==} - engines: {node: '>=6.0.0'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: - '@csstools/convert-colors': 1.4.0 - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true - /postcss-color-hex-alpha/5.0.3: - resolution: {integrity: sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==} - engines: {node: '>=6.0.0'} + /make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + pify: 3.0.0 + dev: true - /postcss-color-mod-function/3.0.3: - resolution: {integrity: sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==} - engines: {node: '>=6.0.0'} + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true dependencies: - '@csstools/convert-colors': 1.4.0 - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + pify: 4.0.1 + semver: 5.7.2 + optional: true - /postcss-color-rebeccapurple/4.0.1: - resolution: {integrity: sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true - /postcss-colormin/4.0.3: - resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} - engines: {node: '>=6.9.0'} - dependencies: - browserslist: 4.21.10 - color: 3.2.1 - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} dev: false - /postcss-convert-values/4.0.1: - resolution: {integrity: sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true - /postcss-custom-media/7.0.8: - resolution: {integrity: sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - dev: false + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true - /postcss-custom-properties/8.0.11: - resolution: {integrity: sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true - /postcss-custom-selectors/5.1.2: - resolution: {integrity: sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - postcss-selector-parser: 5.0.0 - dev: false + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true - /postcss-dir-pseudo-class/5.0.0: - resolution: {integrity: sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==} - engines: {node: '>=4.0.0'} + /method-override@3.0.0: + resolution: {integrity: sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==} + engines: {node: '>= 0.10'} dependencies: - postcss: 7.0.39 - postcss-selector-parser: 5.0.0 - dev: false + debug: 3.1.0 + methods: 1.1.2 + parseurl: 1.3.3 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true - /postcss-discard-comments/4.0.2: - resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: false + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true - /postcss-discard-duplicates/4.0.2: - resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} - engines: {node: '>=6.9.0'} + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} dependencies: - postcss: 7.0.39 - dev: false + braces: 3.0.3 + picomatch: 2.3.1 + dev: true - /postcss-discard-empty/4.0.1: - resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: false + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - /postcss-discard-overridden/4.0.1: - resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} - engines: {node: '>=6.9.0'} + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} dependencies: - postcss: 7.0.39 - dev: false + mime-db: 1.52.0 - /postcss-double-position-gradients/1.0.0: - resolution: {integrity: sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true - /postcss-env-function/2.0.2: - resolution: {integrity: sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true - /postcss-flexbugs-fixes/4.1.0: - resolution: {integrity: sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==} - dependencies: - postcss: 7.0.39 - dev: false + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true - /postcss-focus-visible/4.0.0: - resolution: {integrity: sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==} - engines: {node: '>=6.0.0'} + /mini-store@3.0.6(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - postcss: 7.0.39 + hoist-non-react-statics: 3.3.2 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + shallowequal: 1.1.0 dev: false - /postcss-focus-within/3.0.0: - resolution: {integrity: sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==} - engines: {node: '>=6.0.0'} + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: - postcss: 7.0.39 - dev: false + brace-expansion: 1.1.11 + dev: true - /postcss-font-variant/4.0.1: - resolution: {integrity: sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==} + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: - postcss: 7.0.39 - dev: false + brace-expansion: 2.0.1 + dev: true - /postcss-gap-properties/2.0.0: - resolution: {integrity: sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - dev: false + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true - /postcss-image-set-function/3.0.1: - resolution: {integrity: sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true - /postcss-initial/3.0.4: - resolution: {integrity: sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==} + /mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} dependencies: - postcss: 7.0.39 - dev: false + acorn: 8.12.0 + pathe: 1.1.2 + pkg-types: 1.1.1 + ufo: 1.5.3 + dev: true - /postcss-lab-function/2.0.1: - resolution: {integrity: sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==} - engines: {node: '>=6.0.0'} - dependencies: - '@csstools/convert-colors': 1.4.0 - postcss: 7.0.39 - postcss-values-parser: 2.0.1 + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} dev: false - /postcss-load-config/2.1.2: - resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} - engines: {node: '>= 4'} + /morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} dependencies: - cosmiconfig: 5.2.1 - import-cwd: 2.1.0 - dev: false + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + dev: true - /postcss-loader/3.0.0: - resolution: {integrity: sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==} - engines: {node: '>= 6'} - dependencies: - loader-utils: 1.4.2 - postcss: 7.0.39 - postcss-load-config: 2.1.2 - schema-utils: 1.0.0 - dev: false + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true - /postcss-logical/3.0.0: - resolution: {integrity: sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - dev: false + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /postcss-media-minmax/4.0.0: - resolution: {integrity: sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - dev: false + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true - /postcss-merge-longhand/4.0.11: - resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} - engines: {node: '>=6.9.0'} + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: - css-color-names: 0.0.4 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - stylehacks: 4.0.3 - dev: false + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true - /postcss-merge-rules/4.0.3: - resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} - engines: {node: '>=6.9.0'} - dependencies: - browserslist: 4.21.10 - caniuse-api: 3.0.0 - cssnano-util-same-parent: 4.0.1 - postcss: 7.0.39 - postcss-selector-parser: 3.1.2 - vendors: 1.0.4 - dev: false + /nanoid@2.1.11: + resolution: {integrity: sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==} + dev: true - /postcss-minify-font-values/4.0.2: - resolution: {integrity: sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true - /postcss-minify-gradients/4.0.2: - resolution: {integrity: sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-arguments: 4.0.0 - is-color-stop: 1.1.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + /native-request@1.1.0: + resolution: {integrity: sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==} + requiresBuild: true + optional: true - /postcss-minify-params/4.0.2: - resolution: {integrity: sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==} - engines: {node: '>=6.9.0'} - dependencies: - alphanum-sort: 1.0.2 - browserslist: 4.21.10 - cssnano-util-get-arguments: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - uniqs: 2.0.0 - dev: false + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true - /postcss-minify-selectors/4.0.2: - resolution: {integrity: sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==} - engines: {node: '>=6.9.0'} - dependencies: - alphanum-sort: 1.0.2 - has: 1.0.3 - postcss: 7.0.39 - postcss-selector-parser: 3.1.2 - dev: false + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true - /postcss-modules-extract-imports/2.0.0: - resolution: {integrity: sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==} - engines: {node: '>= 6'} - dependencies: - postcss: 7.0.39 - dev: false + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true - /postcss-modules-local-by-default/3.0.3: - resolution: {integrity: sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==} - engines: {node: '>= 6'} - dependencies: - icss-utils: 4.1.1 - postcss: 7.0.39 - postcss-selector-parser: 6.0.13 - postcss-value-parser: 4.2.0 - dev: false + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true - /postcss-modules-scope/2.2.0: - resolution: {integrity: sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==} - engines: {node: '>= 6'} + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: - postcss: 7.0.39 - postcss-selector-parser: 6.0.13 - dev: false + lower-case: 2.0.2 + tslib: 2.6.3 + dev: true - /postcss-modules-values/3.0.0: - resolution: {integrity: sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==} - dependencies: - icss-utils: 4.1.1 - postcss: 7.0.39 - dev: false + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true - /postcss-nesting/7.0.1: - resolution: {integrity: sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==} - engines: {node: '>=6.0.0'} + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: - postcss: 7.0.39 - dev: false + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true - /postcss-normalize-charset/4.0.1: - resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} - engines: {node: '>=6.9.0'} + /normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + dev: true + + /npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true dependencies: - postcss: 7.0.39 - dev: false + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.6 + dev: true - /postcss-normalize-display-values/4.0.2: - resolution: {integrity: sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==} - engines: {node: '>=6.9.0'} + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} dependencies: - cssnano-util-get-match: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + path-key: 2.0.1 + dev: true - /postcss-normalize-positions/4.0.2: - resolution: {integrity: sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==} - engines: {node: '>=6.9.0'} + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - cssnano-util-get-arguments: 4.0.0 - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + path-key: 4.0.0 + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true - /postcss-normalize-repeat-style/4.0.2: - resolution: {integrity: sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-arguments: 4.0.0 - cssnano-util-get-match: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} - /postcss-normalize-string/4.0.2: - resolution: {integrity: sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==} - engines: {node: '>=6.9.0'} - dependencies: - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + dev: true - /postcss-normalize-timing-functions/4.0.2: - resolution: {integrity: sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-match: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true - /postcss-normalize-unicode/4.0.1: - resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} - engines: {node: '>=6.9.0'} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} dependencies: - browserslist: 4.21.10 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true - /postcss-normalize-url/4.0.1: - resolution: {integrity: sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==} - engines: {node: '>=6.9.0'} + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} dependencies: - is-absolute-url: 2.1.0 - normalize-url: 3.3.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + ee-first: 1.1.1 + dev: true - /postcss-normalize-whitespace/4.0.2: - resolution: {integrity: sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==} - engines: {node: '>=6.9.0'} + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + ee-first: 1.1.1 + dev: true - /postcss-normalize/8.0.1: - resolution: {integrity: sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==} - engines: {node: '>=8.0.0'} - dependencies: - '@csstools/normalize.css': 10.1.0 - browserslist: 4.21.10 - postcss: 7.0.39 - postcss-browser-comments: 3.0.0_browserslist@4.21.10 - sanitize.css: 10.0.0 - dev: false + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true - /postcss-ordered-values/4.1.2: - resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} - engines: {node: '>=6.9.0'} + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: - cssnano-util-get-arguments: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + wrappy: 1.0.2 + dev: true - /postcss-overflow-shorthand/2.0.0: - resolution: {integrity: sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==} - engines: {node: '>=6.0.0'} + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} dependencies: - postcss: 7.0.39 - dev: false + mimic-fn: 4.0.0 + dev: true - /postcss-page-break/2.0.0: - resolution: {integrity: sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} dependencies: - postcss: 7.0.39 - dev: false + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true - /postcss-place/4.0.1: - resolution: {integrity: sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==} - engines: {node: '>=6.0.0'} - dependencies: - postcss: 7.0.39 - postcss-values-parser: 2.0.1 - dev: false + /p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + dev: true - /postcss-preset-env/6.7.0: - resolution: {integrity: sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==} - engines: {node: '>=6.0.0'} - dependencies: - autoprefixer: 9.8.8 - browserslist: 4.21.10 - caniuse-lite: 1.0.30001524 - css-blank-pseudo: 0.1.4 - css-has-pseudo: 0.10.0 - css-prefers-color-scheme: 3.1.1 - cssdb: 4.4.0 - postcss: 7.0.39 - postcss-attribute-case-insensitive: 4.0.2 - postcss-color-functional-notation: 2.0.1 - postcss-color-gray: 5.0.0 - postcss-color-hex-alpha: 5.0.3 - postcss-color-mod-function: 3.0.3 - postcss-color-rebeccapurple: 4.0.1 - postcss-custom-media: 7.0.8 - postcss-custom-properties: 8.0.11 - postcss-custom-selectors: 5.1.2 - postcss-dir-pseudo-class: 5.0.0 - postcss-double-position-gradients: 1.0.0 - postcss-env-function: 2.0.2 - postcss-focus-visible: 4.0.0 - postcss-focus-within: 3.0.0 - postcss-font-variant: 4.0.1 - postcss-gap-properties: 2.0.0 - postcss-image-set-function: 3.0.1 - postcss-initial: 3.0.4 - postcss-lab-function: 2.0.1 - postcss-logical: 3.0.0 - postcss-media-minmax: 4.0.0 - postcss-nesting: 7.0.1 - postcss-overflow-shorthand: 2.0.0 - postcss-page-break: 2.0.0 - postcss-place: 4.0.1 - postcss-pseudo-class-any-link: 6.0.0 - postcss-replace-overflow-wrap: 3.0.0 - postcss-selector-matches: 4.0.0 - postcss-selector-not: 4.0.1 - dev: false + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true - /postcss-pseudo-class-any-link/6.0.0: - resolution: {integrity: sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==} - engines: {node: '>=6.0.0'} + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} dependencies: - postcss: 7.0.39 - postcss-selector-parser: 5.0.0 - dev: false + p-try: 2.2.0 + dev: true - /postcss-reduce-initial/4.0.3: - resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} - engines: {node: '>=6.9.0'} + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} dependencies: - browserslist: 4.21.10 - caniuse-api: 3.0.0 - has: 1.0.3 - postcss: 7.0.39 - dev: false + yocto-queue: 1.0.0 + dev: true - /postcss-reduce-transforms/4.0.2: - resolution: {integrity: sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==} - engines: {node: '>=6.9.0'} + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} dependencies: - cssnano-util-get-match: 4.0.0 - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: false + p-limit: 2.3.0 + dev: true - /postcss-replace-overflow-wrap/3.0.0: - resolution: {integrity: sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==} - dependencies: - postcss: 7.0.39 - dev: false + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true - /postcss-safe-parser/4.0.1: - resolution: {integrity: sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==} - engines: {node: '>=6.0.0'} + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: true + + /package-json@6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} + engines: {node: '>=8'} dependencies: - postcss: 7.0.39 - dev: false + got: 9.6.0 + registry-auth-token: 4.2.2 + registry-url: 5.1.0 + semver: 6.3.1 + dev: true - /postcss-selector-matches/4.0.0: - resolution: {integrity: sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==} + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: - balanced-match: 1.0.2 - postcss: 7.0.39 - dev: false + callsites: 3.1.0 - /postcss-selector-not/4.0.1: - resolution: {integrity: sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==} + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} dependencies: - balanced-match: 1.0.2 - postcss: 7.0.39 - dev: false + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true - /postcss-selector-parser/3.1.2: - resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - dot-prop: 5.3.0 - indexes-of: 1.0.1 - uniq: 1.0.1 - dev: false + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 - /postcss-selector-parser/5.0.0: - resolution: {integrity: sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 2.0.0 - indexes-of: 1.0.1 - uniq: 1.0.1 + /parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} dev: false - /postcss-selector-parser/6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false + dev: true - /postcss-svgo/4.0.3: - resolution: {integrity: sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - svgo: 1.3.2 - dev: false + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true - /postcss-unique-selectors/4.0.1: - resolution: {integrity: sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==} - engines: {node: '>=6.9.0'} - dependencies: - alphanum-sort: 1.0.2 - postcss: 7.0.39 - uniqs: 2.0.0 - dev: false + /path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: true - /postcss-value-parser/3.3.1: - resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} - dev: false + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true - /postcss-value-parser/4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /postcss-values-parser/2.0.1: - resolution: {integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==} - engines: {node: '>=6.14.4'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} dependencies: - flatten: 1.0.3 - indexes-of: 1.0.1 - uniq: 1.0.1 - dev: false + lru-cache: 10.2.2 + minipass: 7.1.2 + dev: true - /postcss/7.0.21: - resolution: {integrity: sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==} - engines: {node: '>=6.0.0'} + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} dependencies: - chalk: 2.4.2 - source-map: 0.6.1 - supports-color: 6.1.0 - dev: false + isarray: 0.0.1 - /postcss/7.0.39: - resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} - engines: {node: '>=6.0.0'} + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} dependencies: - picocolors: 0.2.1 - source-map: 0.6.1 - dev: false + pify: 3.0.0 + dev: true - /potpack/1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} - dev: false + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} - /prelude-ls/1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true - /prepend-http/1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - dev: false + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true - /prepend-http/2.0.0: - resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} - engines: {node: '>=4'} + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true - /prettier-linter-helpers/1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.3.0 + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} dev: true - /prettier/2.0.4: - resolution: {integrity: sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==} - engines: {node: '>=10.13.0'} + /pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} hasBin: true dev: true - /pretty-bytes/5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: false + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true - /pretty-error/2.1.2: - resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} - dependencies: - lodash: 4.17.21 - renderkid: 2.0.7 - dev: false + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + requiresBuild: true + optional: true - /pretty-format/24.9.0: - resolution: {integrity: sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - dependencies: - '@jest/types': 24.9.0 - ansi-regex: 4.1.1 - ansi-styles: 3.2.1 - react-is: 16.13.1 - dev: false + dev: true - /pretty-format/29.6.3: - resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: false + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + dev: true - /pretty-ms/5.1.0: - resolution: {integrity: sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==} - engines: {node: '>=8'} + /please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} dependencies: - parse-ms: 2.1.0 - dev: false + semver-compare: 1.0.0 + dev: true - /probe-image-size/7.2.3: - resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} - dependencies: - lodash.merge: 4.6.2 - needle: 2.9.1 - stream-parser: 0.3.1 - transitivePeerDependencies: - - supports-color - dev: false + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true - /process-nextick-args/2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true - /process/0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: true - /progress/2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true - /promise-inflight/1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: false + /prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + dev: true - /promise-inflight/1.0.1_bluebird@3.7.2: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} dependencies: - bluebird: 3.7.2 - dev: false + fast-diff: 1.3.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true - /promise/7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - asap: 2.0.6 - dev: false + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + dev: true - /promise/8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + /pretty-ms@5.1.0: + resolution: {integrity: sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==} + engines: {node: '>=8'} dependencies: - asap: 2.0.6 + parse-ms: 2.1.0 dev: false - /prompts/2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: false + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true - /prop-types/15.8.1: + /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - - /proto-props/2.0.0: - resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} - engines: {node: '>=4'} - dev: true - - /protocol-buffers-schema/3.6.0: - resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} dev: false - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + dev: true - /proxy-from-env/1.1.0: + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false - /prr/1.0.1: + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: false + requiresBuild: true + optional: true - /pseudomap/1.0.2: + /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true - /psl/1.9.0: + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true - /public-encrypt/4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - dependencies: - bn.js: 4.12.0 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - parse-asn1: 5.1.6 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - /pump/2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 + dev: true - /pumpify/1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - dev: false - - /punycode/1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - - /punycode/2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - - /pupa/2.1.1: - resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} - engines: {node: '>=8'} - dependencies: - escape-goat: 2.1.1 dev: true - /q/1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: false - - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.4 - - /qs/6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 + dev: true - /qs/6.5.3: + /qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} - - /query-string/4.3.4: - resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} - engines: {node: '>=0.10.0'} - dependencies: - object-assign: 4.1.1 - strict-uri-encode: 1.1.0 - dev: false - - /querystring-es3/0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - - /querystringify/2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /quick-lru/1.1.0: - resolution: {integrity: sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==} - engines: {node: '>=4'} dev: true - /quickselect/2.0.0: - resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} - dev: false - - /raf/3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - dependencies: - performance-now: 2.1.0 - dev: false - - /randombytes/2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - - /randomfill/1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + dev: true - /raw-body/2.5.2: + /raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} dependencies: @@ -12793,511 +4693,502 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: true - /rc-align/2.4.5: - resolution: {integrity: sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==} + /rc-align@4.0.15(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 dom-align: 1.12.4 - prop-types: 15.8.1 - rc-util: 4.21.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + resize-observer-polyfill: 1.5.1 dev: false - /rc-animate/2.11.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==} + /rc-cascader@1.4.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-Q4l9Mv8aaISJ+giVnM9IaXxDeMqHUGLvi4F+LksS6pHlaKlN4awop/L+IMjIXpL+ug/ojaCyv/ixcVopJYYCVA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - css-animation: 1.6.1 - prop-types: 15.8.1 - raf: 3.4.1 - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + array-tree-filter: 2.1.0 + rc-trigger: 5.3.4(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-lifecycles-compat: 3.0.4 + react-dom: 16.14.0(react@16.14.0) + warning: 4.0.3 dev: false - /rc-animate/3.1.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-8wg2Zg3EETy0k/9kYuis30NJNQg1D6/WSQwnCiz6SvyxQXNet/rVraRz3bPngwY6rcU2nlRvoShiYOorXyF7Sg==} + /rc-checkbox@2.3.2(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@ant-design/css-animation': 1.7.3 - classnames: 2.3.2 - raf: 3.4.1 - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - dev: false - - /rc-calendar/9.15.11_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-qv0VXfAAnysMWJigxaP6se4bJHvr17D9qsLbi8BOpdgEocsS0RkgY1IUiFaOVYKJDy/EyLC447O02sV/y5YYBg==} - dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - moment: 2.29.4 - prop-types: 15.8.1 - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - react-lifecycles-compat: 3.0.4 - transitivePeerDependencies: - - react - - react-dom - dev: false - - /rc-cascader/0.17.5_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-WYMVcxU0+Lj+xLr4YYH0+yXODumvNXDcVEs5i7L1mtpWwYkubPV/zbQpn+jGKFCIW/hOhjkU4J1db8/P/UKE7A==} - dependencies: - array-tree-filter: 2.1.0 - prop-types: 15.8.1 - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - react-lifecycles-compat: 3.0.4 - shallow-equal: 1.2.1 - warning: 4.0.3 - transitivePeerDependencies: - - react - - react-dom + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-checkbox/2.1.8: - resolution: {integrity: sha512-6qOgh0/by0nVNASx6LZnhRTy17Etcgav+IrI7kL9V9kcDZ/g7K14JFlqrtJ3NjDq/Kyn+BPI1st1XvbkhfaJeg==} + /rc-collapse@3.1.4(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-WayrhswKMwuJab9xbqFxXTgV0m6X8uOPEO6zm/GJ5YJiJ/wIh/Dd2VtWeI06HYUEnTFv0HNcYv+zWbB+p6OD2A==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - react-lifecycles-compat: 3.0.4 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + shallowequal: 1.1.0 dev: false - /rc-collapse/1.11.8_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-8EhfPyScTYljkbRuIoHniSwZagD5UPpZ3CToYgoNYWC85L2qCbPYF7+OaC713FOrIkp6NbfNqXsITNxmDAmxog==} + /rc-dialog@8.5.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-zoamT8L6+rBwnwjPlrZRxiHCHQXrTcWZD3a6ruoqEdUKP1KgO0eSjMDH9WlF3WEPYMVnb2G5SrjHrhnwgPDu5w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - classnames: 2.3.2 - css-animation: 1.6.1 - prop-types: 15.8.1 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - react-is: 16.13.1 - react-lifecycles-compat: 3.0.4 - shallowequal: 1.1.0 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-dialog/7.6.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-KUKf+2eZ4YL+lnXMG3hR4ZtIhC9glfH27NtTVz3gcoDIPAf3uUvaXVRNoDCiSi+OGKLyIb/b6EoidFh6nQC5Wg==} + /rc-drawer@4.2.2(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-zw48FATkAmJrEnfeRWiMqvKAzqGzUDLN1UXlluB7q7GgbR6mJFvc+QsmNrgxsFuMz86Lh9mKSIi7rXlPINmuzw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-drawer/3.1.3_react@16.14.0: - resolution: {integrity: sha512-2z+RdxmzXyZde/1OhVMfDR1e/GBswFeWSZ7FS3Fdd0qhgVdpV1wSzILzzxRaT481ItB5hOV+e8pZT07vdJE8kg==} + /rc-dropdown@3.2.5(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-dVO2eulOSbEf+F4OyhCY5iGiMVhUYY/qeXxL7Ex2jDBt/xc89jU07mNoowV6aWxwVOc70pxEINff0oM2ogjluA==} peerDependencies: react: '*' + react-dom: '*' dependencies: - classnames: 2.3.2 - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-trigger: 5.3.4(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-lifecycles-compat: 3.0.4 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-dropdown/2.4.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-p0XYn0wrOpAZ2fUGE6YJ6U8JBNc5ASijznZ6dkojdaEfQJAeZtV9KMEewhxkVlxGSbbdXe10ptjBlTEW9vEwEg==} + /rc-field-form@1.17.4(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-QI9fe0F9YAmEX946lQpxTs6Qc/FwaLeakWquiBNEmhtqurj/qDdrv+eLb4TfnHTjkdyxU3G7p901WEuuBrrdkA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>= 16.9.0' + react-dom: '>= 16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - react-lifecycles-compat: 3.0.4 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + async-validator: 3.5.2 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-editor-core/0.8.10_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-T3aHpeMCIYA1sdAI7ynHHjXy5fqp83uPlD68ovZ0oClTSc3tbHmyCxXlA+Ti4YgmcpCYv7avF6a+TIbAka53kw==} + /rc-image@5.0.2(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-bNCOGxo9ICe2S+MuVQtxVjk2esL0QJX4YcUB10S98z8CWO1sswySH6inH69YU778aCXs8/nKhtZMUmiU1To0bQ==} peerDependencies: - react: '>=15.0.0' - react-dom: '>=15.0.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - draft-js: 0.10.5_wcqkhtmu7mswc6yz4uyexck3ty - immutable: 3.7.6 - lodash: 4.17.21 - prop-types: 15.8.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-dialog: 8.5.3(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - setimmediate: 1.0.5 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-editor-mention/1.1.13_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-3AOmGir91Fi2ogfRRaXLtqlNuIwQpvla7oUnGHS1+3eo7b+fUp5IlKcagqtwUBB5oDNofoySXkLBxzWvSYNp/Q==} + /rc-input-number@6.1.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-qCLWK9NuuKGTsPXjRU/XvSOX7EKdnHlOpg59nPjYSDdH/czsAHZyYq50O6b6RF2TMPOjVpmsZQoMjNJYcnn6JA==} peerDependencies: - react: '>=15.x' - react-dom: '>=15.x' - dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - dom-scroll-into-view: 1.2.1 - draft-js: 0.10.5_wcqkhtmu7mswc6yz4uyexck3ty - immutable: 3.7.6 - prop-types: 15.8.1 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-editor-core: 0.8.10_wcqkhtmu7mswc6yz4uyexck3ty + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-form/2.4.12_prop-types@15.8.1: - resolution: {integrity: sha512-sHfyWRrnjCHkeCYfYAGop2GQBUC6CKMPcJF9h/gL/vTmZB/RN6fNOGKjXrXjFbwFwKXUWBoPtIDDDmXQW9xNdw==} + /rc-mentions@1.5.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-NG/KB8YiKBCJPHHvr/QapAb4f9YzLJn7kDHtmI1K6t7ZMM5YgrjIxNNhoRKKP9zJvb9PdPts69Hbg4ZMvLVIFQ==} peerDependencies: - prop-types: ^15.0 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - async-validator: 1.11.5 - babel-runtime: 6.26.0 - create-react-class: 15.7.0 - dom-scroll-into-view: 1.2.1 - hoist-non-react-statics: 3.3.2 - lodash: 4.17.21 - prop-types: 15.8.1 - rc-util: 4.21.1 - react-is: 16.13.1 - warning: 4.0.3 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-menu: 8.10.8(react-dom@16.14.0)(react@16.14.0) + rc-textarea: 0.3.7(react-dom@16.14.0)(react@16.14.0) + rc-trigger: 5.3.4(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-hammerjs/0.6.10: - resolution: {integrity: sha512-Vgh9qIudyN5CHRop4M+v+xUniQBFWXKrsJxQRVtJOi2xgRrCeI52/bkpaL5HWwUhqTK9Ayq0n7lYTItT6ld5rg==} + /rc-menu@8.10.8(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-0gnSR0nmR/60NnK+72EGd+QheHyPSQ3wYg1TwX1zl0JJ9Gm0purFFykCXVv/G0Jynpt0QySPAos+bpHpjMZdoQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - hammerjs: 2.0.8 - prop-types: 15.8.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + mini-store: 3.0.6(react-dom@16.14.0)(react@16.14.0) + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-trigger: 5.3.4(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + resize-observer-polyfill: 1.5.1 + shallowequal: 1.1.0 dev: false - /rc-input-number/4.5.9: - resolution: {integrity: sha512-wAT4EBpLDW4+27c935k4F1JLk+gnhyGBkpzBmtkNvIHLG8yTndZSJ2bFfSYfkA6C82IxmAztXs3ffCeUd/rkbg==} + /rc-motion@2.9.2(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - rc-util: 4.21.1 - rmc-feedback: 2.0.0 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-mentions/0.4.2_ccrd4luiijsxnlhe6bgkvyy2z4: - resolution: {integrity: sha512-DTZurQzacLXOfVuiHydGzqkq7cFMHXF18l2jZ9PhWUn2cqvOSY3W4osN0Pq29AOMOBpcxdZCzgc7Lb0r/bgkDw==} + /rc-notification@4.5.7(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-zhTGUjBIItbx96SiRu3KVURcLOydLUHZCPpYEn1zvh+re//Tnq/wSxN4FKgp38n4HOgHSVxcLEeSxBMTeBBDdw==} + engines: {node: '>=8.x'} peerDependencies: - react: '*' + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - '@ant-design/create-react-context': 0.2.6_4vyaxm4rsh2mpfdenvlqy7kmya - classnames: 2.3.2 - rc-menu: 7.5.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-lifecycles-compat: 3.0.4 - transitivePeerDependencies: - - prop-types - - react-dom + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-menu/7.5.5_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-4YJXJgrpUGEA1rMftXN7bDhrV5rPB8oBJoHqT+GVXtIWCanfQxEnM3fmhHQhatL59JoAFMZhJaNzhJIk4FUWCQ==} + /rc-overflow@1.3.2(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} peerDependencies: - react: '*' - react-dom: '*' + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - classnames: 2.3.2 - dom-scroll-into-view: 1.2.1 - mini-store: 2.0.0 - mutationobserver-shim: 0.3.7 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - resize-observer-polyfill: 1.5.1 - shallowequal: 1.1.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-notification/3.3.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-U5+f4BmBVfMSf3OHSLyRagsJ74yKwlrQAtbbL5ijoA0F2C60BufwnOcHG18tVprd7iaIjzZt1TKMmQSYSvgrig==} + /rc-pagination@3.1.17(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-/BQ5UxcBnW28vFAcP2hfh+Xg15W0QZn8TWYwdCApchMH1H0CxiaUUcULP8uXcFM1TygcdKWdt3JqsL9cTAfdkQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-pagination/1.20.15: - resolution: {integrity: sha512-/Xr4/3GOa1DtL8iCYl7qRUroEMrRDhZiiuHwcVFfSiwa9LYloMlUWcOJsnr8LN6A7rLPdm3/CHStUNeYd+2pKw==} + /rc-picker@2.5.19(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-u6myoCu/qiQ0vLbNzSzNrzTQhs7mldArCpPHrEI6OUiifs+IPXmbesqSm0zilJjfzrZJLgYeyyOMSznSlh0GKA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - react-lifecycles-compat: 3.0.4 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + date-fns: 2.30.0 + dayjs: 1.11.11 + moment: 2.30.1 + rc-trigger: 5.3.4(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + shallowequal: 1.1.0 dev: false - /rc-progress/2.5.3: - resolution: {integrity: sha512-K2fa4CnqGehLZoMrdmBeZ86ONSTVcdk5FlqetbwJ3R/+42XfqhwQVOjWp2MH4P7XSQOMAGcNOy1SFfCP3415sg==} + /rc-progress@3.1.4(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-XBAif08eunHssGeIdxMXOmRQRULdHaDdIFENQ578CMb4dyewahmmfJRyab+hw4KH4XssEzzYOkAInTLS7JJG+Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - prop-types: 15.8.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-rate/2.5.1: - resolution: {integrity: sha512-3iJkNJT8xlHklPCdeZtUZmJmRVUbr6AHRlfSsztfYTXVlHrv2TcPn3XkHsH+12j812WVB7gvilS2j3+ffjUHXg==} + /rc-rate@2.9.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-2THssUSnRhtqIouQIIXqsZGzRczvp4WsH4WvGuhiwm+LG2fVpDUJliP9O1zeDOZvYfBE/Bup4SgHun/eCkbjgQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - classnames: 2.3.2 - prop-types: 15.8.1 - rc-util: 4.21.1 - react-lifecycles-compat: 3.0.4 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-resize-observer/0.1.3_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-uzOQEwx83xdQSFOkOAM7x7GHIQKYnrDV4dWxtCxyG1BS1pkfJ4EvDeMfsvAJHSYkQXVBu+sgRHGbRtLG3qiuUg==} + /rc-resize-observer@1.4.0(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} peerDependencies: - react: ^16.0.0 - react-dom: ^16.0.0 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - classnames: 2.3.2 - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + react-dom: 16.14.0(react@16.14.0) resize-observer-polyfill: 1.5.1 dev: false - /rc-select/9.2.3_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-WhswxOMWiNnkXRbxyrj0kiIvyCfo/BaRPaYbsDetSIAU2yEDwKHF798blCP5u86KLOBKBvtxWLFCkSsQw1so5w==} + /rc-select@12.1.13(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-cPI+aesP6dgCAaey4t4upDbEukJe+XN0DK6oO/6flcCX5o28o7KNZD7JAiVtC/6fCwqwI/kSs7S/43dvHmBl+A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - component-classes: 1.2.6 - dom-scroll-into-view: 1.2.1 - prop-types: 15.8.1 - raf: 3.4.1 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-menu: 7.5.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - react-lifecycles-compat: 3.0.4 - warning: 4.0.3 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-overflow: 1.3.2(react-dom@16.14.0)(react@16.14.0) + rc-trigger: 5.3.4(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + rc-virtual-list: 3.14.3(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-slider/8.7.1_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-WMT5mRFUEcrLWwTxsyS8jYmlaMsTVCZIGENLikHsNv+tE8ThU2lCoPfi/xFNUfJFNFSBFP3MwPez9ZsJmNp13g==} + /rc-slider@9.7.5(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-LV/MWcXFjco1epPbdw1JlLXlTgmWpB9/Y/P2yinf8Pg3wElHxA9uajN21lJiWtZjf5SCUekfSP6QMJfDo4t1hg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - rc-tooltip: 3.7.3_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - react-lifecycles-compat: 3.0.4 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-tooltip: 5.0.2(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) shallowequal: 1.1.0 - warning: 4.0.3 - transitivePeerDependencies: - - react - - react-dom dev: false - /rc-steps/3.5.0: - resolution: {integrity: sha512-2Vkkrpa7PZbg7qPsqTNzVDov4u78cmxofjjnIHiGB9+9rqKS8oTLPzbW2uiWDr3Lk+yGwh8rbpGO1E6VAgBCOg==} + /rc-steps@4.1.4(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-qoCqKZWSpkh/b03ASGx1WhpKnuZcRWmvuW+ZUu4mvMdfvFzVxblTwUM+9aBd0mlEUFmt6GW8FXhMpHkK3Uzp3w==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - lodash: 4.17.21 - prop-types: 15.8.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-switch/1.9.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-qaK7mY4FLDKy99Hq3A1tf8CcqfzKtHp9LPX8WTnZ0MzdHCTneSARb1XD7Eqeu8BactasYGsi2bF9p18Q+/5JEw==} + /rc-switch@3.2.2(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==} peerDependencies: - react: ^16.0.0 - react-dom: ^16.0.0 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - classnames: 2.3.2 - prop-types: 15.8.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-lifecycles-compat: 3.0.4 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-table/6.10.15_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-LAr0M/gqt+irOjvPNBLApmQ0CUHNOfKsEBhu1uIuB3OlN1ynA9z+sdoTQyNd9+8NSl0MYnQOOfhtLChAY7nU0A==} + /rc-table@7.12.5(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-XV4m5h0W+NjGkNzvp5ahOhYHyNG8oPNV9pTLre2EsfmyStXUJBICyfkNID7WZulMdCehv/Wa3MdqXwZ4EsJchw==} + engines: {node: '>=8.x'} peerDependencies: - react: ^16.0.0 - react-dom: ^16.0.0 + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - classnames: 2.3.2 - component-classes: 1.2.6 - lodash: 4.17.21 - mini-store: 2.0.0 - prop-types: 15.8.1 - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-lifecycles-compat: 3.0.4 + react-dom: 16.14.0(react@16.14.0) shallowequal: 1.1.0 dev: false - /rc-tabs/9.7.0_react@16.14.0: - resolution: {integrity: sha512-kvmgp8/MfLzFZ06hWHignqomFQ5nF7BqKr5O1FfhE4VKsGrep52YSF/1MvS5oe0NPcI9XGNS2p751C5v6cYDpQ==} + /rc-tabs@11.7.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-5nd2NVss9TprPRV9r8N05SjQyAE7zDrLejxFLcbJ+BdLxSwnGnk3ws/Iq0smqKZUnPQC0XEvnpF3+zlllUUT2w==} + engines: {node: '>=8.x'} peerDependencies: - react: '>=15.0.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - '@ant-design/create-react-context': 0.2.6_4vyaxm4rsh2mpfdenvlqy7kmya - babel-runtime: 6.26.0 - classnames: 2.3.2 - lodash: 4.17.21 - prop-types: 15.8.1 - raf: 3.4.1 - rc-hammerjs: 0.6.10 - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-dropdown: 3.2.5(react-dom@16.14.0)(react@16.14.0) + rc-menu: 8.10.8(react-dom@16.14.0)(react@16.14.0) + rc-resize-observer: 1.4.0(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-lifecycles-compat: 3.0.4 - resize-observer-polyfill: 1.5.1 - warning: 4.0.3 - dev: false - - /rc-time-picker/3.7.3_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-Lv1Mvzp9fRXhXEnRLO4nW6GLNxUkfAZ3RsiIBsWjGjXXvMNjdr4BX/ayElHAFK0DoJqOhm7c5tjmIYpEOwcUXg==} - dependencies: - classnames: 2.3.2 - moment: 2.29.4 - prop-types: 15.8.1 - raf: 3.4.1 - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - react-lifecycles-compat: 3.0.4 - transitivePeerDependencies: - - react - - react-dom + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-tooltip/3.7.3_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-dE2ibukxxkrde7wH9W8ozHKUO4aQnPZ6qBHtrTH9LoO836PjDdiaWO73fgPB05VfJs9FbZdmGPVEbXCeOP99Ww==} + /rc-textarea@0.3.7(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - prop-types: 15.8.1 - rc-trigger: 2.6.5_wcqkhtmu7mswc6yz4uyexck3ty - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + shallowequal: 1.1.0 dev: false - /rc-tree-select/2.9.4_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-0HQkXAN4XbfBW20CZYh3G+V+VMrjX42XRtDCpyv6PDUm5vikC0Ob682ZBCVS97Ww2a5Hf6Ajmu0ahWEdIEpwhg==} + /rc-tooltip@5.0.2(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-A4FejSG56PzYtSNUU4H1pVzfhtkV/+qMT2clK0CsSj+9mbc4USEtpWeX6A/jjVL+goBOMKj8qlH7BCZmZWh/Nw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - classnames: 2.3.2 - dom-scroll-into-view: 1.2.1 - prop-types: 15.8.1 - raf: 3.4.1 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-tree: 2.1.4_wcqkhtmu7mswc6yz4uyexck3ty - rc-trigger: 3.0.0_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - react-lifecycles-compat: 3.0.4 - shallowequal: 1.1.0 - warning: 4.0.3 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + rc-trigger: 5.3.4(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-tree/2.1.4_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-Xey794Iavgs8YldFlXcZLOhfcIhlX5Oz/yfKufknBXf2AlZCOkc7aHqSM9uTF7fBPtTGPhPxNEfOqHfY7b7xng==} + /rc-tree-select@4.3.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-0tilOHLJA6p+TNg4kD559XnDX3PTEYuoSF7m7ryzFLAYvdEEPtjn0QZc5z6L0sMKBiBlj8a2kf0auw8XyHU3lA==} peerDependencies: react: '*' react-dom: '*' dependencies: - '@ant-design/create-react-context': 0.2.6_4vyaxm4rsh2mpfdenvlqy7kmya - classnames: 2.3.2 - prop-types: 15.8.1 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-select: 12.1.13(react-dom@16.14.0)(react@16.14.0) + rc-tree: 4.1.5(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-lifecycles-compat: 3.0.4 - warning: 4.0.3 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-trigger/2.6.5_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==} + /rc-tree@4.1.5(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - rc-align: 2.4.5 - rc-animate: 2.11.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - react-lifecycles-compat: 3.0.4 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + rc-virtual-list: 3.14.3(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-trigger/3.0.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-hQxbbJpo23E2QnYczfq3Ec5J5tVl2mUDhkqxrEsQAqk16HfADQg+iKNWzEYXyERSncdxfnzYuaBgy764mNRzTA==} + /rc-trigger@5.3.4(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - raf: 3.4.1 - rc-align: 2.4.5 - rc-animate: 3.1.1_wcqkhtmu7mswc6yz4uyexck3ty - rc-util: 4.21.1 - transitivePeerDependencies: - - react - - react-dom + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-align: 4.0.15(react-dom@16.14.0)(react@16.14.0) + rc-motion: 2.9.2(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-upload/2.9.4: - resolution: {integrity: sha512-WXt0HGxXyzLrPV6iec/96Rbl/6dyrAW8pKuY6wwD7yFYwfU5bjgKjv7vC8KNMJ6wzitFrZjnoiogNL3dF9dj3Q==} + /rc-upload@3.3.4(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-v2sirR4JL31UTHD/f0LGUdd+tpFaOVUTPeIEjAXRP9kRN8TFhqOgcXl5ixtyqj90FmtRUmKmafCv0EmhBQUHqQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - prop-types: 15.8.1 - warning: 4.0.3 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc-util/4.21.1: - resolution: {integrity: sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==} + /rc-util@5.43.0(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - add-dom-event-listener: 1.1.0 - prop-types: 15.8.1 - react-is: 16.13.1 - react-lifecycles-compat: 3.0.4 - shallowequal: 1.1.0 + '@babel/runtime': 7.24.7 + react: 16.14.0 + react-dom: 16.14.0(react@16.14.0) + react-is: 18.3.1 dev: false - /rc-util/5.37.0_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-cPMV8DzaHI1KDaS7XPRXAf4J7mtBqjvjikLpQieaeOO7+cEbqY2j7Kso/T0R0OiEZTNcLS/8Zl9YrlXiO9UbjQ==} + /rc-virtual-list@3.14.3(react-dom@16.14.0)(react@16.14.0): + resolution: {integrity: sha512-6+6wiEhdqakNBnbRJymgMlh+90qpkgqherTRo1l1cX7mK6F9hWsazPczmP0lA+64yhC9/t+M9Dh5pjvDWimn8A==} + engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-resize-observer: 1.4.0(react-dom@16.14.0)(react@16.14.0) + rc-util: 5.43.0(react-dom@16.14.0)(react@16.14.0) react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-is: 16.13.1 + react-dom: 16.14.0(react@16.14.0) dev: false - /rc/1.2.8: + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -13307,71 +5198,7 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-app-polyfill/1.0.6: - resolution: {integrity: sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==} - engines: {node: '>=6'} - dependencies: - core-js: 3.32.1 - object-assign: 4.1.1 - promise: 8.3.0 - raf: 3.4.1 - regenerator-runtime: 0.13.11 - whatwg-fetch: 3.6.17 - dev: false - - /react-app-rewired/2.2.1_react-scripts@3.4.4: - resolution: {integrity: sha512-uFQWTErXeLDrMzOJHKp0h8P1z0LV9HzPGsJ6adOtGlA/B9WfT6Shh4j2tLTTGlXOfiVx6w6iWpp7SOC5pvk+gA==} - hasBin: true - peerDependencies: - react-scripts: '>=2.1.3' - dependencies: - react-scripts: 3.4.4_bo7u2dcgnntwwyyxmecoaqdaee - semver: 5.7.2 - dev: false - - /react-dev-utils/10.2.1_my6p5jmkoidlu47hwmqgdrj2vm: - resolution: {integrity: sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==} - engines: {node: '>=8.10'} - peerDependencies: - typescript: '>=2.7' - webpack: '>=4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@babel/code-frame': 7.8.3 - address: 1.1.2 - browserslist: 4.10.0 - chalk: 2.4.2 - cross-spawn: 7.0.1 - detect-port-alt: 1.1.6 - escape-string-regexp: 2.0.0 - filesize: 6.0.1 - find-up: 4.1.0 - fork-ts-checker-webpack-plugin: 3.1.1_my6p5jmkoidlu47hwmqgdrj2vm - global-modules: 2.0.0 - globby: 8.0.2 - gzip-size: 5.1.1 - immer: 1.10.0 - inquirer: 7.0.4 - is-root: 2.1.0 - loader-utils: 1.2.3 - open: 7.4.2 - pkg-up: 3.1.0 - react-error-overlay: 6.0.11 - recursive-readdir: 2.2.2 - shell-quote: 1.7.2 - strip-ansi: 6.0.0 - text-table: 0.2.0 - typescript: 3.5.3 - webpack: 4.42.0 - transitivePeerDependencies: - - eslint - - supports-color - - vue-template-compiler - dev: false - - /react-dom/16.14.0_react@16.14.0: + /react-dom@16.14.0(react@16.14.0): resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} peerDependencies: react: ^16.14.0 @@ -13383,11 +5210,7 @@ packages: scheduler: 0.19.1 dev: false - /react-error-overlay/6.0.11: - resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} - dev: false - - /react-input-autosize/3.0.0_react@16.14.0: + /react-input-autosize@3.0.0(react@16.14.0): resolution: {integrity: sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==} peerDependencies: react: ^16.3.0 || ^17.0.0 @@ -13396,63 +5219,39 @@ packages: react: 16.14.0 dev: false - /react-is/16.13.1: + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - /react-is/18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false - - /react-lazy-load/3.1.14_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-7tsOItf2HmEwhEWMaA/a2XlShuya7rBxqWAR0TPMO1XSf6ybxSDI2bMV8M6vtWkveX9TlSpb0qLB7NMMpDHVDQ==} - peerDependencies: - react: ^0.14.0 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 - react-dom: ^0.14.0 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 - dependencies: - eventlistener: 0.0.1 - lodash.debounce: 4.0.8 - lodash.throttle: 4.1.1 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 dev: false - /react-lifecycles-compat/3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - dev: false + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - /react-plotly.js/2.6.0_qtjenpcawcnnxnr626ndcvhi4u: - resolution: {integrity: sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==} - peerDependencies: - plotly.js: '>1.34.0' - react: '>0.13.0' - dependencies: - plotly.js: 2.25.2 - prop-types: 15.8.1 - react: 16.14.0 - dev: false + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true - /react-router-dom/5.3.4_react@16.14.0: + /react-router-dom@5.3.4(react@16.14.0): resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.24.7 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 16.14.0 - react-router: 5.3.4_react@16.14.0 - tiny-invariant: 1.3.1 + react-router: 5.3.4(react@16.14.0) + tiny-invariant: 1.3.3 tiny-warning: 1.0.3 dev: false - /react-router/5.3.4_react@16.14.0: + /react-router@5.3.4(react@16.14.0): resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.24.7 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -13460,141 +5259,45 @@ packages: prop-types: 15.8.1 react: 16.14.0 react-is: 16.13.1 - tiny-invariant: 1.3.1 + tiny-invariant: 1.3.3 tiny-warning: 1.0.3 dev: false - /react-scripts/3.4.4_bo7u2dcgnntwwyyxmecoaqdaee: - resolution: {integrity: sha512-7J7GZyF/QvZkKAZLneiOIhHozvOMHey7hO9cdO9u68jjhGZlI8hDdOm6UyuHofn6Ajc9Uji5I6Psm/nKNuWdyw==} - engines: {node: '>=8.10'} - hasBin: true - peerDependencies: - eslint: '*' - react: '*' - typescript: ^3.2.1 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@babel/core': 7.9.0 - '@svgr/webpack': 4.3.3 - '@typescript-eslint/eslint-plugin': 2.34.0_lil7fcptb6lvwsbapucsn3cnza - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - babel-eslint: 10.1.0_eslint@6.8.0 - babel-jest: 24.9.0_@babel+core@7.9.0 - babel-loader: 8.1.0_v5wbdnhwytg3u2hu4ix2bhpzla - babel-plugin-named-asset-import: 0.3.8_@babel+core@7.9.0 - babel-preset-react-app: 9.1.2 - camelcase: 5.3.1 - case-sensitive-paths-webpack-plugin: 2.3.0 - css-loader: 3.4.2_webpack@4.42.0 - dotenv: 8.2.0 - dotenv-expand: 5.1.0 - eslint: 6.8.0 - eslint-config-react-app: 5.2.1_5cdtexgyysibsc4gajt5g5gw4a - eslint-loader: 3.0.3_s4p5obgc5rn2wrc7rinrdszb4m - eslint-plugin-flowtype: 4.6.0_eslint@6.8.0 - eslint-plugin-import: 2.20.1_tbglwmj7t2rhd43mvxmptakoay - eslint-plugin-jsx-a11y: 6.2.3_eslint@6.8.0 - eslint-plugin-react: 7.19.0_eslint@6.8.0 - eslint-plugin-react-hooks: 1.7.0_eslint@6.8.0 - file-loader: 4.3.0_webpack@4.42.0 - fs-extra: 8.1.0 - html-webpack-plugin: 4.0.0-beta.11_webpack@4.42.0 - identity-obj-proxy: 3.0.0 - jest: 24.9.0 - jest-environment-jsdom-fourteen: 1.0.1 - jest-resolve: 24.9.0 - jest-watch-typeahead: 0.4.2 - mini-css-extract-plugin: 0.9.0_webpack@4.42.0 - optimize-css-assets-webpack-plugin: 5.0.3_webpack@4.42.0 - pnp-webpack-plugin: 1.6.4_typescript@3.5.3 - postcss-flexbugs-fixes: 4.1.0 - postcss-loader: 3.0.0 - postcss-normalize: 8.0.1 - postcss-preset-env: 6.7.0 - postcss-safe-parser: 4.0.1 - react: 16.14.0 - react-app-polyfill: 1.0.6 - react-dev-utils: 10.2.1_my6p5jmkoidlu47hwmqgdrj2vm - resolve: 1.15.0 - resolve-url-loader: 3.1.2 - sass-loader: 8.0.2_webpack@4.42.0 - semver: 6.3.0 - style-loader: 0.23.1 - terser-webpack-plugin: 2.3.8_webpack@4.42.0 - ts-pnp: 1.1.6_typescript@3.5.3 - typescript: 3.5.3 - url-loader: 2.3.0_k66lquhotssodpycel5qq5nq34 - webpack: 4.42.0 - webpack-dev-server: 3.11.0_webpack@4.42.0 - webpack-manifest-plugin: 2.2.0_webpack@4.42.0 - workbox-webpack-plugin: 4.3.1_webpack@4.42.0 - optionalDependencies: - fsevents: 2.1.2 - transitivePeerDependencies: - - bluebird - - bufferutil - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-sass - - sass - - supports-color - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-command - dev: false - - /react-select/3.2.0_wcqkhtmu7mswc6yz4uyexck3ty: + /react-select@3.2.0(react-dom@16.14.0)(react@16.14.0): resolution: {integrity: sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.24.7 '@emotion/cache': 10.0.29 - '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/core': 10.3.1(react@16.14.0) '@emotion/css': 10.0.27 memoize-one: 5.2.1 prop-types: 15.8.1 react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-input-autosize: 3.0.0_react@16.14.0 - react-transition-group: 4.4.5_wcqkhtmu7mswc6yz4uyexck3ty - dev: false - - /react-slick/0.25.2_wcqkhtmu7mswc6yz4uyexck3ty: - resolution: {integrity: sha512-8MNH/NFX/R7zF6W/w+FS5VXNyDusF+XDW1OU0SzODEU7wqYB+ZTGAiNJ++zVNAVqCAHdyCybScaUB+FCZOmBBw==} - peerDependencies: - react: ^0.14.0 || ^15.0.1 || ^16.0.0 - react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 - dependencies: - classnames: 2.3.2 - enquire.js: 2.1.6 - json2mq: 0.2.0 - lodash.debounce: 4.0.8 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - resize-observer-polyfill: 1.5.1 + react-dom: 16.14.0(react@16.14.0) + react-input-autosize: 3.0.0(react@16.14.0) + react-transition-group: 4.4.5(react-dom@16.14.0)(react@16.14.0) + transitivePeerDependencies: + - supports-color dev: false - /react-transition-group/4.4.5_wcqkhtmu7mswc6yz4uyexck3ty: + /react-transition-group@4.4.5(react-dom@16.14.0)(react@16.14.0): resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.24.7 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + react-dom: 16.14.0(react@16.14.0) dev: false - /react/16.14.0: + /react@16.14.0: resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} engines: {node: '>=0.10.0'} dependencies: @@ -13603,375 +5306,64 @@ packages: prop-types: 15.8.1 dev: false - /read-pkg-up/2.0.0: - resolution: {integrity: sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==} - engines: {node: '>=4'} - dependencies: - find-up: 2.1.0 - read-pkg: 2.0.0 - dev: false - - /read-pkg-up/3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - dev: true - - /read-pkg-up/4.0.0: - resolution: {integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - read-pkg: 3.0.0 - dev: false - - /read-pkg-up/7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg/2.0.0: - resolution: {integrity: sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 2.0.0 - normalize-package-data: 2.5.0 - path-type: 2.0.0 - dev: false - - /read-pkg/3.0.0: + /read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - - /read-pkg/5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /readable-stream/1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /readable-stream/2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - /readable-stream/3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readdirp/2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10 - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /readdirp/2.2.1_supports-color@6.1.0: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10_supports-color@6.1.0 - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - dev: false - - /readdirp/3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: false - - /realpath-native/1.1.0: - resolution: {integrity: sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==} - engines: {node: '>=4'} - dependencies: - util.promisify: 1.1.2 - dev: false - - /recursive-readdir/2.2.2: - resolution: {integrity: sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==} - engines: {node: '>=0.10.0'} - dependencies: - minimatch: 3.0.4 - dev: false - - /redent/2.0.0: - resolution: {integrity: sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==} - engines: {node: '>=4'} - dependencies: - indent-string: 3.2.0 - strip-indent: 2.0.0 dev: true - /reflect.getprototypeof/1.0.3: - resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} - engines: {node: '>= 0.4'} + /recrawl-sync@2.2.3: + resolution: {integrity: sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 + '@cush/relative': 1.0.0 + glob-regex: 0.3.2 + slash: 3.0.0 + sucrase: 3.35.0 + tslib: 1.14.1 dev: true - /regenerate-unicode-properties/10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - dev: false - - /regenerate/1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: false - - /regenerator-runtime/0.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: false - - /regenerator-runtime/0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false - - /regenerator-runtime/0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: false - - /regenerator-transform/0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.9.0 - dev: false - - /regex-not/1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - - /regex-parser/2.2.11: - resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} - dev: false - - /regexp-tree/0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - /regexp.prototype.flags/1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - - /regexpp/2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} + dev: true - /regexpu-core/5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: false - - /registry-auth-token/4.2.2: + /registry-auth-token@4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} dependencies: rc: 1.2.8 dev: true - /registry-url/5.1.0: + /registry-url@5.1.0: resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} engines: {node: '>=8'} dependencies: rc: 1.2.8 dev: true - /regjsparser/0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: false - - /regl-error2d/2.0.12: - resolution: {integrity: sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==} - dependencies: - array-bounds: 1.0.1 - color-normalize: 1.5.0 - flatten-vertex-data: 1.0.2 - object-assign: 4.1.1 - pick-by-alias: 1.2.0 - to-float32: 1.1.0 - update-diff: 1.1.0 - dev: false - - /regl-line2d/3.1.2: - resolution: {integrity: sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==} - dependencies: - array-bounds: 1.0.1 - array-find-index: 1.0.2 - array-normalize: 1.1.4 - color-normalize: 1.5.0 - earcut: 2.2.4 - es6-weak-map: 2.0.3 - flatten-vertex-data: 1.0.2 - glslify: 7.1.1 - object-assign: 4.1.1 - parse-rect: 1.2.0 - pick-by-alias: 1.2.0 - to-float32: 1.1.0 - dev: false - - /regl-scatter2d/3.2.9: - resolution: {integrity: sha512-PNrXs+xaCClKpiB2b3HZ2j3qXQXhC5kcTh/Nfgx9rLO0EpEhab0BSQDqAsbdbpdf+pSHSJvbgitB7ulbGeQ+Fg==} - dependencies: - '@plotly/point-cluster': 3.1.9 - array-range: 1.0.1 - array-rearrange: 2.2.2 - clamp: 1.0.1 - color-id: 1.1.0 - color-normalize: 1.5.0 - color-rgba: 2.1.1 - flatten-vertex-data: 1.0.2 - glslify: 7.1.1 - is-iexplorer: 1.0.0 - object-assign: 4.1.1 - parse-rect: 1.2.0 - pick-by-alias: 1.2.0 - to-float32: 1.1.0 - update-diff: 1.1.0 - dev: false - - /regl-splom/1.0.14: - resolution: {integrity: sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==} - dependencies: - array-bounds: 1.0.1 - array-range: 1.0.1 - color-alpha: 1.0.4 - flatten-vertex-data: 1.0.2 - parse-rect: 1.2.0 - pick-by-alias: 1.2.0 - raf: 3.4.1 - regl-scatter2d: 3.2.9 - dev: false - - /regl/2.1.0: - resolution: {integrity: sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==} - dev: false - - /relateurl/0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: false - - /remove-trailing-separator/1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: false - - /renderkid/2.0.7: - resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 3.0.1 - dev: false - - /repeat-element/1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - - /repeat-string/1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - /request-promise-core/1.1.4_request@2.88.2: - resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} - engines: {node: '>=0.10.0'} - peerDependencies: - request: ^2.34 - dependencies: - lodash: 4.17.21 - request: 2.88.2 - dev: false - - /request-promise-native/1.0.9_request@2.88.2: - resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} - engines: {node: '>=0.12.0'} - deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 - peerDependencies: - request: ^2.34 - dependencies: - request: 2.88.2 - request-promise-core: 1.1.4_request@2.88.2 - stealthy-require: 1.1.1 - tough-cookie: 2.5.0 - dev: false - - /request/2.88.2: + /request@2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} engines: {node: '>= 6'} deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 - aws4: 1.12.0 + aws4: 1.13.0 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -13990,379 +5382,172 @@ packages: tough-cookie: 2.5.0 tunnel-agent: 0.6.0 uuid: 3.4.0 + dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + dev: true - /require-main-filename/2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - - /requires-port/1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /reserved-words/0.1.2: - resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==} - dev: true - - /resize-observer-polyfill/1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false - - /resolve-cwd/2.0.0: - resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} - engines: {node: '>=4'} - dependencies: - resolve-from: 3.0.0 - dev: false - - /resolve-cwd/3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from/3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: false - - /resolve-from/4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /resolve-from/5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve-pathname/3.0.0: - resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} - dev: false - - /resolve-protobuf-schema/2.1.0: - resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} - dependencies: - protocol-buffers-schema: 3.6.0 - dev: false - - /resolve-url-loader/3.1.2: - resolution: {integrity: sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==} - engines: {node: '>=6.0.0'} - dependencies: - adjust-sourcemap-loader: 3.0.0 - camelcase: 5.3.1 - compose-function: 3.0.3 - convert-source-map: 1.7.0 - es6-iterator: 2.0.3 - loader-utils: 1.2.3 - postcss: 7.0.21 - rework: 1.0.1 - rework-visit: 1.0.0 - source-map: 0.6.1 - dev: false - - /resolve-url/0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true - /resolve/0.6.3: - resolution: {integrity: sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==} - dev: false + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true - /resolve/1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} dev: false - /resolve/1.15.0: - resolution: {integrity: sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==} - dependencies: - path-parse: 1.0.7 - dev: false + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} - /resolve/1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + /resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + dev: false - /resolve/2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike/1.0.2: + /responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: lowercase-keys: 1.0.1 dev: true - /restore-cursor/3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - /ret/0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - - /retry/0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: false - - /rework-visit/1.0.0: - resolution: {integrity: sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==} - dev: false - - /rework/1.0.1: - resolution: {integrity: sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==} - dependencies: - convert-source-map: 0.3.5 - css: 2.2.4 - dev: false - - /rgb-regex/1.0.1: - resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} - dev: false - - /rgba-regex/1.0.0: - resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} - dev: false - - /right-now/1.0.0: - resolution: {integrity: sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==} - dev: false + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true - /rimraf/2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 + dev: true - /rimraf/2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /ripemd160/2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - - /rmc-feedback/2.0.0: - resolution: {integrity: sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==} - dependencies: - babel-runtime: 6.26.0 - classnames: 2.3.2 - dev: false - - /rsvp/4.8.5: - resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} - engines: {node: 6.* || >= 7.*} - dev: false - - /run-async/2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + optionalDependencies: + fsevents: 2.3.3 + dev: true - /run-queue/1.0.3: - resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} + /rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true dependencies: - aproba: 1.2.0 - dev: false - - /rw/1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + dev: true - /rxjs/6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: - tslib: 1.14.1 + queue-microtask: 1.2.3 + dev: true - /safe-array-concat/1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 + dev: true - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true - /safe-regex-test/1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.7 + es-errors: 1.3.0 is-regex: 1.1.4 - - /safe-regex/1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - dependencies: - ret: 0.1.15 - - /safe-regex/2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.27 dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true - /sane/4.1.0: - resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} - engines: {node: 6.* || 8.* || >= 10.*} - deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added - hasBin: true - dependencies: - '@cnakazawa/watch': 1.0.4 - anymatch: 2.0.0 - capture-exit: 2.0.0 - exec-sh: 0.3.6 - execa: 1.0.0 - fb-watchman: 2.0.2 - micromatch: 3.1.10 - minimist: 1.2.8 - walker: 1.0.8 - transitivePeerDependencies: - - supports-color - dev: false - - /sanitize.css/10.0.0: - resolution: {integrity: sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==} - dev: false - - /sass-loader/8.0.2_webpack@4.42.0: - resolution: {integrity: sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==} - engines: {node: '>= 8.9.0'} - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 - sass: ^1.3.0 - webpack: ^4.36.0 || ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - dependencies: - clone-deep: 4.0.1 - loader-utils: 1.4.2 - neo-async: 2.6.2 - schema-utils: 2.7.1 - semver: 6.3.0 - webpack: 4.42.0 - dev: false - - /sax/1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: false - - /saxes/3.1.11: - resolution: {integrity: sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==} - engines: {node: '>=8'} - dependencies: - xmlchars: 2.2.0 - dev: false - - /scheduler/0.19.1: + /scheduler@0.19.1: resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 dev: false - /schema-utils/1.0.0: - resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} - engines: {node: '>= 4'} - dependencies: - ajv: 6.12.6 - ajv-errors: 1.0.1_ajv@6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: false - - /schema-utils/2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} dependencies: - '@types/json-schema': 7.0.12 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: false - - /select-hose/2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: false - - /selfsigned/1.10.14: - resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} - dependencies: - node-forge: 0.10.0 + compute-scroll-into-view: 1.0.20 dev: false - /semver-compare/1.0.0: + /semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} dev: true - /semver-diff/2.1.0: + /semver-diff@2.1.0: resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} engines: {node: '>=0.10.0'} dependencies: semver: 5.7.2 dev: true - /semver-diff/3.1.1: - resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: true - - /semver/5.7.2: + /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: false - - /semver/6.3.1: + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + dev: true - /semver/7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 + dev: true - /send/0.18.0: + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: @@ -14383,49 +5568,7 @@ packages: - supports-color dev: true - /send/0.18.0_supports-color@6.1.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9_supports-color@6.1.0 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /serialize-javascript/4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} - dependencies: - randombytes: 2.1.0 - dev: false - - /serve-index/1.9.1_supports-color@6.1.0: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9_supports-color@6.1.0 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /serve-static/1.15.0: + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: @@ -14437,321 +5580,160 @@ packages: - supports-color dev: true - /serve-static/1.15.0_supports-color@6.1.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0_supports-color@6.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /server-destroy/1.0.1: + /server-destroy@1.0.1: resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} dev: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true - /set-value/2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - - /setimmediate/1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - /setprototypeof/1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: false - - /setprototypeof/1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - /sha.js/2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - /shallow-clone/0.1.2: - resolution: {integrity: sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==} - engines: {node: '>=0.10.0'} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} dependencies: - is-extendable: 0.1.1 - kind-of: 2.0.1 - lazy-cache: 0.2.7 - mixin-object: 2.0.1 - dev: false + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true - /shallow-clone/3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} dependencies: - kind-of: 6.0.3 - dev: false - - /shallow-copy/0.0.1: - resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} - dev: false + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true - /shallow-equal/1.2.1: - resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} - dev: false + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true - /shallowequal/1.1.0: + /shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} dev: false - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 + dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - dev: false + dev: true - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} + dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: false - - /shell-quote/1.7.2: - resolution: {integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==} - dev: false + dev: true - /shell-quote/1.8.1: + /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true - /shellwords/0.1.1: - resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} - dev: false - - /side-channel/1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - - /signal-exit/3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - /signum/1.0.0: - resolution: {integrity: sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==} - dev: false - - /simple-swizzle/0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false - - /sisteransi/1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false - - /slash/1.0.0: - resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} - engines: {node: '>=0.10.0'} - dev: false - - /slash/2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - - /slash/3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - /slice-ansi/2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - - /snapdragon-node/2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - /snapdragon-util/3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - - /snapdragon/0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - - /snapdragon/0.8.2_supports-color@6.1.0: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - dependencies: - base: 0.11.2 - debug: 2.6.9_supports-color@6.1.0 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /sockjs-client/1.4.0_supports-color@6.1.0: - resolution: {integrity: sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==} - dependencies: - debug: 3.2.7_supports-color@6.1.0 - eventsource: 1.1.2 - faye-websocket: 0.11.4 - inherits: 2.0.4 - json3: 3.3.3 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - dev: false - - /sockjs/0.3.20: - resolution: {integrity: sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==} - dependencies: - faye-websocket: 0.10.0 - uuid: 3.4.0 - websocket-driver: 0.6.5 - dev: false - - /sort-keys/1.1.2: - resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} - engines: {node: '>=0.10.0'} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: - is-plain-obj: 1.1.0 - dev: false + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + dev: true - /source-list-map/2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - dev: false + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true - /source-map-resolve/0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true - /source-map-support/0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: false + dot-case: 3.0.4 + tslib: 2.6.3 + dev: true - /source-map-url/0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true - /source-map/0.5.7: + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} + dev: false - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: false + requiresBuild: true + optional: true - /spdx-correct/3.2.0: + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.18 + dev: true - /spdx-exceptions/2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - - /spdx-license-ids/3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - - /spdy-transport/3.0.0_supports-color@6.1.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - dependencies: - debug: 4.3.4_supports-color@6.1.0 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - dev: false - - /spdy/4.0.2_supports-color@6.1.0: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - dependencies: - debug: 4.3.4_supports-color@6.1.0 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0_supports-color@6.1.0 - transitivePeerDependencies: - - supports-color - dev: false + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.18 + dev: true - /split-string/3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 + /spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true - /sshpk/1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} hasBin: true dependencies: @@ -14764,136 +5746,32 @@ packages: jsbn: 0.1.1 safer-buffer: 2.1.2 tweetnacl: 0.14.5 + dev: true - /ssri/6.0.2: - resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} - dependencies: - figgy-pudding: 3.5.2 - dev: false - - /ssri/7.1.1: - resolution: {integrity: sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==} - engines: {node: '>= 8'} - dependencies: - figgy-pudding: 3.5.2 - minipass: 3.3.6 - dev: false - - /stable/0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - dev: false - - /stack-trace/0.0.9: - resolution: {integrity: sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==} - dev: false - - /stack-utils/1.0.5: - resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 2.0.0 - dev: false - - /static-eval/2.1.0: - resolution: {integrity: sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==} - dependencies: - escodegen: 1.14.3 - dev: false - - /static-extend/0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - - /statuses/1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: false + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + dev: true - /stealthy-require/1.1.1: - resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} - engines: {node: '>=0.10.0'} - dev: false + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true - /steno/0.4.4: + /steno@0.4.4: resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==} dependencies: graceful-fs: 4.2.11 dev: true - /stream-browserify/2.0.2: - resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - - /stream-each/1.2.3: - resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} - dependencies: - end-of-stream: 1.4.4 - stream-shift: 1.0.1 - dev: false - - /stream-http/2.8.3: - resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 2.3.8 - to-arraybuffer: 1.0.1 - xtend: 4.0.2 - - /stream-parser/0.3.1: - resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} - dependencies: - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - dev: false - - /stream-shift/1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} - dev: false - - /strict-uri-encode/1.1.0: - resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} - engines: {node: '>=0.10.0'} - dev: false - - /string-convert/0.2.1: + /string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} dev: false - /string-length/2.0.0: - resolution: {integrity: sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ==} - engines: {node: '>=4'} - dependencies: - astral-regex: 1.0.0 - strip-ansi: 4.0.0 - dev: false - - /string-length/3.1.0: - resolution: {integrity: sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==} - engines: {node: '>=8'} - dependencies: - astral-regex: 1.0.0 - strip-ansi: 5.2.0 - dev: false - - /string-split-by/1.0.0: - resolution: {integrity: sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==} - dependencies: - parenthesis: 3.1.8 - dev: false - - /string-width/2.1.1: + /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} dependencies: @@ -14901,792 +5779,418 @@ packages: strip-ansi: 4.0.0 dev: true - /string-width/3.1.0: + /string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: emoji-regex: 7.0.3 is-fullwidth-code-point: 2.0.0 strip-ansi: 5.2.0 + dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + dev: true - /string.prototype.matchall/4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.0 - side-channel: 1.0.4 + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true - /string.prototype.padend/3.1.4: - resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + /string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trim/1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - /string.prototype.trimend/1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - /string.prototype.trimstart/1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - /string_decoder/0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - - /string_decoder/1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - - /string_decoder/1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true - /stringify-object/3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - dev: false + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true - /strip-ansi/3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: - ansi-regex: 2.1.1 - dev: false + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true - /strip-ansi/4.0.0: + /strip-ansi@4.0.0: resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} engines: {node: '>=4'} dependencies: ansi-regex: 3.0.1 + dev: true - /strip-ansi/5.2.0: + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 + dev: true - /strip-ansi/6.0.0: - resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: false + dev: true - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} dependencies: - ansi-regex: 5.0.1 + ansi-regex: 6.0.1 + dev: true - /strip-bom/3.0.0: + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + dev: true - /strip-comments/1.0.2: - resolution: {integrity: sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==} - engines: {node: '>=4'} - dependencies: - babel-extract-comments: 1.0.0 - babel-plugin-transform-object-rest-spread: 6.26.0 - dev: false - - /strip-eof/1.0.0: + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} + dev: true - /strip-indent/2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + dev: true - /strongly-connected-components/1.0.1: - resolution: {integrity: sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==} - dev: false - - /style-loader/0.23.1: - resolution: {integrity: sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==} - engines: {node: '>= 0.12.0'} - dependencies: - loader-utils: 1.4.2 - schema-utils: 1.0.0 - dev: false - - /stylehacks/4.0.3: - resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} - engines: {node: '>=6.9.0'} + /strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} dependencies: - browserslist: 4.21.10 - postcss: 7.0.39 - postcss-selector-parser: 3.1.2 - dev: false + js-tokens: 9.0.0 + dev: true - /supercluster/7.1.5: - resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==} + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: - kdbush: 3.0.0 - dev: false - - /superscript-text/1.0.0: - resolution: {integrity: sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==} - dev: false - - /supports-color/2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: false + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.2 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - /supports-color/6.1.0: - resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} - engines: {node: '>=6'} - dependencies: - has-flag: 3.0.0 - dev: false - - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - - /supports-hyperlinks/2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svg-arc-to-cubic-bezier/3.2.0: - resolution: {integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==} - dev: false - - /svg-parser/2.0.4: + /svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - dev: false - - /svg-path-bounds/1.0.2: - resolution: {integrity: sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==} - dependencies: - abs-svg-path: 0.1.1 - is-svg-path: 1.0.2 - normalize-svg-path: 1.1.0 - parse-svg-path: 0.1.2 - dev: false - - /svg-path-sdf/1.1.3: - resolution: {integrity: sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==} - dependencies: - bitmap-sdf: 1.0.4 - draw-svg-path: 1.0.0 - is-svg-path: 1.0.2 - parse-svg-path: 0.1.2 - svg-path-bounds: 1.0.2 - dev: false - - /svgo/1.3.2: - resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} - engines: {node: '>=4.0.0'} - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. - hasBin: true - dependencies: - chalk: 2.4.2 - coa: 2.0.2 - css-select: 2.1.0 - css-select-base-adapter: 0.1.1 - css-tree: 1.0.0-alpha.37 - csso: 4.2.0 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - object.values: 1.1.6 - sax: 1.2.4 - stable: 0.1.8 - unquote: 1.1.1 - util.promisify: 1.0.1 - dev: false - - /symbol-tree/3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: false - - /table/5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} - dependencies: - ajv: 6.12.6 - lodash: 4.17.21 - slice-ansi: 2.1.0 - string-width: 3.1.0 - - /tapable/0.1.10: - resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} - engines: {node: '>=0.6'} - dev: true - - /tapable/1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: false - - /term-size/1.2.0: - resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} - engines: {node: '>=4'} - dependencies: - execa: 0.7.0 dev: true - /term-size/2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: true - - /terser-webpack-plugin/1.4.5_webpack@4.42.0: - resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} - engines: {node: '>= 6.9.0'} - peerDependencies: - webpack: ^4.0.0 - dependencies: - cacache: 12.0.4 - find-cache-dir: 2.1.0 - is-wsl: 1.1.0 - schema-utils: 1.0.0 - serialize-javascript: 4.0.0 - source-map: 0.6.1 - terser: 4.8.1 - webpack: 4.42.0 - webpack-sources: 1.4.3 - worker-farm: 1.7.0 - dev: false - - /terser-webpack-plugin/2.3.8_webpack@4.42.0: - resolution: {integrity: sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - cacache: 13.0.1 - find-cache-dir: 3.3.2 - jest-worker: 25.5.0 - p-limit: 2.3.0 - schema-utils: 2.7.1 - serialize-javascript: 4.0.0 - source-map: 0.6.1 - terser: 4.8.1 - webpack: 4.42.0 - webpack-sources: 1.4.3 - transitivePeerDependencies: - - bluebird - dev: false - - /terser/4.8.1: - resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - acorn: 8.10.0 - commander: 2.20.3 - source-map: 0.6.1 - source-map-support: 0.5.21 - dev: false - - /test-exclude/5.2.3: - resolution: {integrity: sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==} - engines: {node: '>=6'} - dependencies: - glob: 7.2.3 - minimatch: 3.1.2 - read-pkg-up: 4.0.0 - require-main-filename: 2.0.0 - dev: false - - /text-table/0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /throat/4.1.0: - resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} - dev: false - - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /through2/0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + /table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} dependencies: - readable-stream: 1.0.34 - xtend: 4.0.2 - dev: false + ajv: 8.16.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true - /through2/2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + /term-size@1.2.0: + resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} + engines: {node: '>=4'} dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: false + execa: 0.7.0 + dev: true - /thunky/1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: false + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true - /timers-browserify/2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} dependencies: - setimmediate: 1.0.5 + thenify: 3.3.1 + dev: true - /timsort/0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: false + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true - /tiny-invariant/1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} dev: false - /tiny-warning/1.0.3: + /tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} dev: false - /tinycolor2/1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - dev: false - - /tinyqueue/2.0.3: - resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} - dev: false - - /tmp/0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - - /tmpl/1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: false + /tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + dev: true - /to-absolute-glob/2.0.2: - resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} - engines: {node: '>=0.10.0'} - dependencies: - is-absolute: 1.0.0 - is-negated-glob: 1.0.0 + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} dev: true - /to-arraybuffer/1.0.1: - resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: false - - /to-float32/1.1.0: - resolution: {integrity: sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==} - dev: false - - /to-object-path/0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - - /to-px/1.0.1: - resolution: {integrity: sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==} - dependencies: - parse-unit: 1.0.1 - dev: false - /to-readable-stream/1.0.0: + /to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} dev: true - /to-regex-range/2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + dev: true - /to-regex/3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - - /toggle-selection/1.0.6: + /toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + dev: true - /topojson-client/3.1.0: - resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} - hasBin: true - dependencies: - commander: 2.20.3 - dev: false - - /tough-cookie/2.5.0: + /tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} dependencies: psl: 1.9.0 - punycode: 2.3.0 - - /tr46/1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - dependencies: - punycode: 2.3.0 - dev: false + punycode: 2.3.1 + dev: true - /trim-newlines/2.0.0: - resolution: {integrity: sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==} - engines: {node: '>=4'} + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-pnp/1.1.6_typescript@3.5.3: - resolution: {integrity: sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==} + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 3.5.3 - dev: false - - /tsconfig-paths/3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 + json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} dev: false - /tsutils/3.21.0_typescript@3.5.3: + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + dev: true + + /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 3.5.3 - - /tty-browserify/0.0.0: - resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} + typescript: 4.9.5 + dev: true - /tunnel-agent/0.6.0: + /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 + dev: true - /tweetnacl/0.14.5: + /tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true - /type-check/0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: - prelude-ls: 1.1.2 - - /type-fest/0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - /type-fest/0.3.1: - resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} - engines: {node: '>=6'} + prelude-ls: 1.2.1 dev: true - /type-fest/0.4.1: - resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} - engines: {node: '>=6'} + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} dev: true - /type-fest/0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} dev: true - /type-fest/0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + /type-fest@0.3.1: + resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} + engines: {node: '>=6'} + dev: true - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + dev: true - /type/1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: false - - /type/2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: false - - /typed-array-buffer/1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true - /typed-array-byte-length/1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true - /typed-array-byte-offset/1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true - /typed-array-length/1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 for-each: 0.3.3 - is-typed-array: 1.1.12 - - /typedarray-pool/1.2.0: - resolution: {integrity: sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==} - dependencies: - bit-twiddle: 1.0.2 - dup: 1.0.0 - dev: false - - /typedarray-to-buffer/3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 dev: true - /typedarray/0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: false - - /typescript/3.5.3: - resolution: {integrity: sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==} + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - /ua-parser-js/0.7.35: - resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} - dev: false + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - - /unc-path-regex/0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} dev: true - /unicode-canonical-property-names-ecmascript/2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: false - - /unicode-match-property-ecmascript/2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: false - - /unicode-match-property-value-ecmascript/2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: false - - /unicode-property-aliases-ecmascript/2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: false - - /union-value/1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - - /uniq/1.0.1: - resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} - dev: false - - /uniqs/2.0.0: - resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} - dev: false - - /unique-filename/1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - dependencies: - unique-slug: 2.0.2 - dev: false - - /unique-slug/2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} - dependencies: - imurmurhash: 0.1.4 - dev: false + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true - /unique-string/1.0.0: + /unique-string@1.0.0: resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} engines: {node: '>=4'} dependencies: crypto-random-string: 1.0.0 dev: true - /unique-string/2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - dependencies: - crypto-random-string: 2.0.0 - dev: true - - /universalify/0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false - - /universalify/2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + dev: true - /unquote/1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} - dev: false - - /unset-value/1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - - /upath/1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - dev: false - - /update-browserslist-db/1.0.11_browserslist@4.21.10: - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.0.16(browserslist@4.23.1): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: false - - /update-diff/1.1.0: - resolution: {integrity: sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==} - dev: false + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + dev: true - /update-notifier/3.0.1: + /update-notifier@3.0.1: resolution: {integrity: sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==} engines: {node: '>=8'} dependencies: @@ -15704,422 +6208,243 @@ packages: xdg-basedir: 3.0.0 dev: true - /update-notifier/4.1.3: - resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==} - engines: {node: '>=8'} - dependencies: - boxen: 4.2.0 - chalk: 3.0.0 - configstore: 5.0.1 - has-yarn: 2.1.0 - import-lazy: 2.1.0 - is-ci: 2.0.0 - is-installed-globally: 0.3.2 - is-npm: 4.0.0 - is-yarn-global: 0.3.0 - latest-version: 5.1.0 - pupa: 2.1.1 - semver-diff: 3.1.1 - xdg-basedir: 4.0.0 - dev: true - - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 - - /urix/0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - /url-loader/2.3.0_k66lquhotssodpycel5qq5nq34: - resolution: {integrity: sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==} - engines: {node: '>= 8.9.0'} - peerDependencies: - file-loader: '*' - webpack: ^4.0.0 - peerDependenciesMeta: - file-loader: - optional: true - dependencies: - file-loader: 4.3.0_webpack@4.42.0 - loader-utils: 1.4.2 - mime: 2.6.0 - schema-utils: 2.7.1 - webpack: 4.42.0 - dev: false + punycode: 2.3.1 + dev: true - /url-parse-lax/3.0.0: + /url-parse-lax@3.0.0: resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} engines: {node: '>=4'} dependencies: prepend-http: 2.0.0 dev: true - /url-parse/1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /url/0.11.1: - resolution: {integrity: sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==} - dependencies: - punycode: 1.4.1 - qs: 6.11.2 - - /use/3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - - /util-deprecate/1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /util.promisify/1.0.0: - resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} - dependencies: - define-properties: 1.2.0 - object.getownpropertydescriptors: 2.1.6 - dev: false - - /util.promisify/1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} - dependencies: - define-properties: 1.2.0 - es-abstract: 1.22.1 - has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.6 - dev: false - - /util.promisify/1.1.2: - resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - for-each: 0.3.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.6 - safe-array-concat: 1.0.0 - dev: false - - /util/0.10.3: - resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} - dependencies: - inherits: 2.0.1 - - /util/0.11.1: - resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} - dependencies: - inherits: 2.0.3 - - /utila/0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: false - - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + dev: true - /uuid/3.4.0: + /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true + dev: true - /v8-compile-cache/2.4.0: + /v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + dev: true - /value-equal/1.0.1: + /value-equal@1.0.1: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} dev: false - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + dev: true - /vendors/1.0.4: - resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} - dev: false - - /verror/1.10.0: + /verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 + dev: true - /vm-browserify/1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - - /vt-pbf/3.1.3: - resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} - dependencies: - '@mapbox/point-geometry': 0.1.0 - '@mapbox/vector-tile': 1.3.1 - pbf: 3.2.1 - dev: false - - /w3c-hr-time/1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. - dependencies: - browser-process-hrtime: 1.0.0 - dev: false - - /w3c-xmlserializer/1.1.2: - resolution: {integrity: sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==} - dependencies: - domexception: 1.0.1 - webidl-conversions: 4.0.2 - xml-name-validator: 3.0.0 - dev: false - - /walker/1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: false - - /warning/4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /watchpack-chokidar2/2.0.1: - resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} - requiresBuild: true + /vite-node@1.6.0(less@3.13.1): + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true dependencies: - chokidar: 2.1.8 + cac: 6.7.14 + debug: 4.3.5 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.3.1(less@3.13.1) transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss - supports-color - dev: false - optional: true + - terser + dev: true - /watchpack/1.7.5: - resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} + /vite-plugin-svgr@4.2.0(typescript@4.9.5)(vite@4.5.3): + resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} + peerDependencies: + vite: ^2.6.0 || 3 || 4 || 5 dependencies: - graceful-fs: 4.2.11 - neo-async: 2.6.2 - optionalDependencies: - chokidar: 3.5.3 - watchpack-chokidar2: 2.0.1 + '@rollup/pluginutils': 5.1.0 + '@svgr/core': 8.1.0(typescript@4.9.5) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) + vite: 4.5.3(less@3.13.1) transitivePeerDependencies: + - rollup - supports-color - dev: false - - /wbuf/1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - dependencies: - minimalistic-assert: 1.0.1 - dev: false - - /weak-map/1.0.8: - resolution: {integrity: sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==} - dev: false + - typescript + dev: true - /webgl-context/2.2.0: - resolution: {integrity: sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==} + /vite-tsconfig-paths@3.6.0(vite@4.5.3): + resolution: {integrity: sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==} + peerDependencies: + vite: '>2.0.0-0' dependencies: - get-canvas-context: 1.0.2 - dev: false - - /webidl-conversions/4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: false + debug: 4.3.5 + globrex: 0.1.2 + recrawl-sync: 2.2.3 + tsconfig-paths: 4.2.0 + vite: 4.5.3(less@3.13.1) + transitivePeerDependencies: + - supports-color + dev: true - /webpack-dev-middleware/3.7.3_webpack@4.42.0: - resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} - engines: {node: '>= 6'} + /vite@4.5.3(less@3.13.1): + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true dependencies: - memory-fs: 0.4.1 - mime: 2.6.0 - mkdirp: 0.5.6 - range-parser: 1.2.1 - webpack: 4.42.0 - webpack-log: 2.0.0 - dev: false + esbuild: 0.18.20 + less: 3.13.1 + postcss: 8.4.38 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true - /webpack-dev-server/3.11.0_webpack@4.42.0: - resolution: {integrity: sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==} - engines: {node: '>= 6.11.5'} + /vite@5.3.1(less@3.13.1): + resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - webpack-cli: '*' + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 peerDependenciesMeta: - webpack-cli: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: optional: true dependencies: - ansi-html: 0.0.7 - bonjour: 3.5.0 - chokidar: 2.1.8_supports-color@6.1.0 - compression: 1.7.4_supports-color@6.1.0 - connect-history-api-fallback: 1.6.0 - debug: 4.3.4_supports-color@6.1.0 - del: 4.1.1 - express: 4.19.2_supports-color@6.1.0 - html-entities: 1.4.0 - http-proxy-middleware: 0.19.1_tmpgdztspuwvsxzgjkhoqk7duq - import-local: 2.0.0 - internal-ip: 4.3.0 - ip: 1.1.9 - is-absolute-url: 3.0.3 - killable: 1.0.1 - loglevel: 1.8.1 - opn: 5.5.0 - p-retry: 3.0.1 - portfinder: 1.0.32_supports-color@6.1.0 - schema-utils: 1.0.0 - selfsigned: 1.10.14 - semver: 6.3.0 - serve-index: 1.9.1_supports-color@6.1.0 - sockjs: 0.3.20 - sockjs-client: 1.4.0_supports-color@6.1.0 - spdy: 4.0.2_supports-color@6.1.0 - strip-ansi: 3.0.1 - supports-color: 6.1.0 - url: 0.11.1 - webpack: 4.42.0 - webpack-dev-middleware: 3.7.3_webpack@4.42.0 - webpack-log: 2.0.0 - ws: 6.2.2 - yargs: 13.3.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /webpack-log/2.0.0: - resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} - engines: {node: '>= 6'} - dependencies: - ansi-colors: 3.2.4 - uuid: 3.4.0 - dev: false - - /webpack-manifest-plugin/2.2.0_webpack@4.42.0: - resolution: {integrity: sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==} - engines: {node: '>=6.11.5'} - peerDependencies: - webpack: 2 || 3 || 4 - dependencies: - fs-extra: 7.0.1 - lodash: 4.17.21 - object.entries: 1.1.7 - tapable: 1.1.3 - webpack: 4.42.0 - dev: false - - /webpack-sources/1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - dev: false + esbuild: 0.21.5 + less: 3.13.1 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true - /webpack/4.42.0: - resolution: {integrity: sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==} - engines: {node: '>=6.11.5'} + /vitest@1.6.0(less@3.13.1): + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - webpack-cli: '*' - webpack-command: '*' + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' peerDependenciesMeta: - webpack-cli: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': optional: true - webpack-command: + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: optional: true dependencies: - '@webassemblyjs/ast': 1.8.5 - '@webassemblyjs/helper-module-context': 1.8.5 - '@webassemblyjs/wasm-edit': 1.8.5 - '@webassemblyjs/wasm-parser': 1.8.5 - acorn: 6.4.2 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - chrome-trace-event: 1.0.3 - enhanced-resolve: 4.5.0 - eslint-scope: 4.0.3 - json-parse-better-errors: 1.0.2 - loader-runner: 2.4.0 - loader-utils: 1.4.2 - memory-fs: 0.4.1 - micromatch: 3.1.10 - mkdirp: 0.5.6 - neo-async: 2.6.2 - node-libs-browser: 2.2.1 - schema-utils: 1.0.0 - tapable: 1.1.3 - terser-webpack-plugin: 1.4.5_webpack@4.42.0 - watchpack: 1.7.5 - webpack-sources: 1.4.3 - transitivePeerDependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.3 + chai: 4.4.1 + debug: 4.3.5 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.3.1(less@3.13.1) + vite-node: 1.6.0(less@3.13.1) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss - supports-color - dev: false - - /websocket-driver/0.6.5: - resolution: {integrity: sha512-oBx6ZM1Gs5q2jwZuSN/Qxyy/fbgomV8+vqsmipaPKB/74hjHlKuM07jNmRhn4qa2AdUwsgxrltq+gaPsHgcl0Q==} - engines: {node: '>=0.6.0'} - dependencies: - websocket-extensions: 0.1.4 - dev: false - - /websocket-driver/0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: false - - /websocket-extensions/0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: false - - /whatwg-encoding/1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - dependencies: - iconv-lite: 0.4.24 - dev: false - - /whatwg-fetch/3.6.17: - resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - dev: false - - /whatwg-mimetype/2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: false - - /whatwg-url/6.5.0: - resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - dev: false + - terser + dev: true - /whatwg-url/7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 + loose-envify: 1.4.0 dev: false - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -16127,436 +6452,128 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - - /which-builtin-type/1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - dependencies: - function.prototype.name: 1.1.5 - has-tostringtag: 1.0.0 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 - dev: true - - /which-collection/1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 dev: true - /which-module/2.0.1: + /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true - /which-typed-array/1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 + dev: true - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 + dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 - dev: false + dev: true - /widest-line/2.0.1: - resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} - engines: {node: '>=4'} + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true dependencies: - string-width: 2.1.1 + siginfo: 2.0.0 + stackback: 0.0.2 dev: true - /widest-line/3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + /widest-line@2.0.1: + resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} + engines: {node: '>=4'} dependencies: - string-width: 4.2.3 + string-width: 2.1.1 dev: true - /word-wrap/1.2.5: + /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + dev: true - /workbox-background-sync/4.3.1: - resolution: {integrity: sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-broadcast-update/4.3.1: - resolution: {integrity: sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-build/4.3.1: - resolution: {integrity: sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==} - engines: {node: '>=4.0.0'} - dependencies: - '@babel/runtime': 7.22.11 - '@hapi/joi': 15.1.1 - common-tags: 1.8.2 - fs-extra: 4.0.3 - glob: 7.2.3 - lodash.template: 4.5.0 - pretty-bytes: 5.6.0 - stringify-object: 3.3.0 - strip-comments: 1.0.2 - workbox-background-sync: 4.3.1 - workbox-broadcast-update: 4.3.1 - workbox-cacheable-response: 4.3.1 - workbox-core: 4.3.1 - workbox-expiration: 4.3.1 - workbox-google-analytics: 4.3.1 - workbox-navigation-preload: 4.3.1 - workbox-precaching: 4.3.1 - workbox-range-requests: 4.3.1 - workbox-routing: 4.3.1 - workbox-strategies: 4.3.1 - workbox-streams: 4.3.1 - workbox-sw: 4.3.1 - workbox-window: 4.3.1 - dev: false - - /workbox-cacheable-response/4.3.1: - resolution: {integrity: sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-core/4.3.1: - resolution: {integrity: sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==} - dev: false - - /workbox-expiration/4.3.1: - resolution: {integrity: sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-google-analytics/4.3.1: - resolution: {integrity: sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==} - dependencies: - workbox-background-sync: 4.3.1 - workbox-core: 4.3.1 - workbox-routing: 4.3.1 - workbox-strategies: 4.3.1 - dev: false - - /workbox-navigation-preload/4.3.1: - resolution: {integrity: sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-precaching/4.3.1: - resolution: {integrity: sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-range-requests/4.3.1: - resolution: {integrity: sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-routing/4.3.1: - resolution: {integrity: sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-strategies/4.3.1: - resolution: {integrity: sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-streams/4.3.1: - resolution: {integrity: sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /workbox-sw/4.3.1: - resolution: {integrity: sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==} - dev: false - - /workbox-webpack-plugin/4.3.1_webpack@4.42.0: - resolution: {integrity: sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==} - engines: {node: '>=4.0.0'} - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - '@babel/runtime': 7.22.11 - json-stable-stringify: 1.0.2 - webpack: 4.42.0 - workbox-build: 4.3.1 - dev: false - - /workbox-window/4.3.1: - resolution: {integrity: sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==} - dependencies: - workbox-core: 4.3.1 - dev: false - - /worker-farm/1.7.0: - resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} - dependencies: - errno: 0.1.8 - dev: false - - /worker-rpc/0.1.1: - resolution: {integrity: sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==} - dependencies: - microevent.ts: 0.1.1 - dev: false - - /world-calendars/1.0.3: - resolution: {integrity: sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==} - dependencies: - object-assign: 4.1.1 - dev: false - - /wrap-ansi/5.1.0: + /wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} dependencies: ansi-styles: 3.2.1 string-width: 3.1.0 strip-ansi: 5.2.0 - - /wrappy/1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic/2.4.1: - resolution: {integrity: sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==} - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: false - - /write-file-atomic/2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 dev: true - /write-file-atomic/3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 dev: true - /write/1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - dependencies: - mkdirp: 0.5.6 - - /ws/5.2.3: - resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - async-limiter: 1.0.1 - dev: false - - /ws/6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: - async-limiter: 1.0.1 - dev: false - - /xdg-basedir/3.0.0: - resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} - engines: {node: '>=4'} + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 dev: true - /xdg-basedir/4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /xml-name-validator/3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: false - - /xmlchars/2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: false - - /xo/0.30.0: - resolution: {integrity: sha512-755dmXTIj8uHv0lUZmDrtQb98wdu6ryqgcy8jvXBZgABz+kHm12IlzRQP+bO+w1u6NqkQB0Nn0Bh6Uv+KhdYiA==} - engines: {node: '>=10.18'} - hasBin: true - peerDependencies: - webpack: '>=1.11.0' - peerDependenciesMeta: - webpack: - optional: true + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0_lil7fcptb6lvwsbapucsn3cnza - '@typescript-eslint/parser': 2.34.0_gwfevwdfvao4wdn2y246xkx3di - arrify: 2.0.1 - cosmiconfig: 6.0.0 - debug: 4.3.4 - eslint: 6.8.0 - eslint-config-prettier: 6.15.0_eslint@6.8.0 - eslint-config-xo: 0.29.1_eslint@6.8.0 - eslint-config-xo-typescript: 0.28.0_wp2ytyahinzayi5i5jc7flp7nm - eslint-formatter-pretty: 3.0.1 - eslint-import-resolver-webpack: 0.12.2_b6377bcr3argvnmxmq6ha6uyl4 - eslint-plugin-ava: 10.5.0_eslint@6.8.0 - eslint-plugin-eslint-comments: 3.2.0_eslint@6.8.0 - eslint-plugin-import: 2.28.1_nyzdfmuow6rxbwmj7f5rv6jdzi - eslint-plugin-no-use-extend-native: 0.5.0 - eslint-plugin-node: 11.1.0_eslint@6.8.0 - eslint-plugin-prettier: 3.4.1_swjbyd5hjbhpq3h73cryknwgoy - eslint-plugin-promise: 4.3.1 - eslint-plugin-unicorn: 19.0.1_eslint@6.8.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - fs-extra: 9.1.0 - get-stdin: 7.0.0 - globby: 9.2.0 - has-flag: 4.0.0 + graceful-fs: 4.2.11 imurmurhash: 0.1.4 - is-path-inside: 3.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - json5: 2.2.3 - lodash: 4.17.21 - meow: 5.0.0 - micromatch: 4.0.5 - open-editor: 2.0.1 - p-reduce: 2.1.0 - path-exists: 4.0.0 - prettier: 2.0.4 - resolve-cwd: 3.0.0 - resolve-from: 5.0.0 - semver: 7.5.4 - slash: 3.0.0 - to-absolute-glob: 2.0.2 - typescript: 3.5.3 - update-notifier: 4.1.3 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - supports-color + signal-exit: 3.0.7 dev: true - /xregexp/4.4.1: - resolution: {integrity: sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==} - dependencies: - '@babel/runtime-corejs3': 7.22.11 - dev: false - - /xtend/2.2.0: - resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} - engines: {node: '>=0.4'} - dev: false - - /xtend/4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + /xdg-basedir@3.0.0: + resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} + engines: {node: '>=4'} + dev: true - /y18n/4.0.3: + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true - /yallist/2.1.2: + /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false - - /yallist/4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - - /yargs-parser/10.1.0: - resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} - dependencies: - camelcase: 4.1.0 - dev: true - - /yargs-parser/13.1.2: - resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 dev: false - /yargs-parser/15.0.3: + /yargs-parser@15.0.3: resolution: {integrity: sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: true - /yargs/13.3.2: - resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} - dependencies: - cliui: 5.0.0 - find-up: 3.0.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 3.1.0 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 13.1.2 - dev: false - - /yargs/14.2.3: + /yargs@14.2.3: resolution: {integrity: sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==} dependencies: cliui: 5.0.0 @@ -16571,3 +6588,14 @@ packages: y18n: 4.0.3 yargs-parser: 15.0.3 dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zrender@5.5.0: + resolution: {integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==} + dependencies: + tslib: 2.3.0 + dev: false diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/public/index.html b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/public/index.html deleted file mode 100644 index dbc424e87c43..000000000000 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/public/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - Ozone Recon - - - -
- - diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.less b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.less index 86154408b1d4..3d2cbc814e48 100644 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.less +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.less @@ -16,8 +16,9 @@ * limitations under the License. */ -@import "~antd/es/style/themes/default.less"; -@import "components/navBar/navBar.less"; +@import "antd/es/style/themes/default.less"; +@import 'antd/dist/antd.less'; +@import "@/components/navBar/navBar.less"; .ant-layout-header { padding: 0 20px; @@ -26,6 +27,10 @@ background: #FFF; } +.ant-tabs-nav-wrap { + padding: 0px 5px; +} + .content-layout { margin-left: 200px; &.sidebar-collapsed { @@ -43,25 +48,6 @@ padding: 24px; background-color: #FFF; min-height: 80vh; - .ant-table { - .ant-table-body { - table { - .ant-table-thead > tr > th { - background-color: #ececec; - } - - .ant-table-tbody { - tr.ant-table-row:hover { - background: rgba(60, 90, 100, 0.01); - - & > td { - background: rgba(60, 90, 100, 0.01); - } - } - } - } - } - } } body { diff --git a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.tsx b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.tsx index a21d92846f85..3fec211e7ef0 100644 --- a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.tsx +++ b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/app.tsx @@ -18,60 +18,74 @@ import React from 'react'; -import {Layout} from 'antd'; -import './app.less'; +import { Switch as AntDSwitch, Layout } from 'antd'; import NavBar from './components/navBar/navBar'; import Breadcrumbs from './components/breadcrumbs/breadcrumbs'; -import {HashRouter as Router, Switch, Route, Redirect} from 'react-router-dom'; -import {routes} from './routes'; -import {MakeRouteWithSubRoutes} from './makeRouteWithSubRoutes'; +import { HashRouter as Router, Switch, Route, Redirect } from 'react-router-dom'; +import { routes } from '@/routes'; +import { MakeRouteWithSubRoutes } from '@/makeRouteWithSubRoutes'; import classNames from 'classnames'; +import './app.less'; + const { Header, Content, Footer } = Layout; interface IAppState { collapsed: boolean; + enableNewUI: boolean; } class App extends React.Component, IAppState> { constructor(props = {}) { super(props); - this.state = {collapsed: false}; + this.state = { + collapsed: false, + enableNewUI: false + }; } onCollapse = (collapsed: boolean) => { - this.setState({collapsed}); + this.setState({ collapsed }); }; render() { - const {collapsed} = this.state; - const layoutClass = classNames('content-layout', {'sidebar-collapsed': collapsed}); + const { collapsed } = this.state; + const layoutClass = classNames('content-layout', { 'sidebar-collapsed': collapsed }); + return ( - - + +
-
- +
+ + New UI
} + onChange={(checked: boolean) => { + this.setState({ + enableNewUI: checked + }); + }} />
- + - + { routes.map( - (route, index) => + (route, index) => ) } -