From 8a28931085997ff2adbc8d6d43a6c35a4215ec43 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Sun, 3 Mar 2024 16:59:07 +0100 Subject: [PATCH 01/28] Start development of version 2024.4.0-SNAPSHOT --- io.openems.common/src/io/openems/common/OpenemsConstants.java | 4 ++-- ui/package-lock.json | 4 ++-- ui/package.json | 2 +- ui/src/app/changelog/view/component/changelog.constants.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index 7a20b7b2760..d0b6d35e4f5 100644 --- a/io.openems.common/src/io/openems/common/OpenemsConstants.java +++ b/io.openems.common/src/io/openems/common/OpenemsConstants.java @@ -22,7 +22,7 @@ public class OpenemsConstants { *

* This is the month of the release. */ - public static final short VERSION_MINOR = 3; + public static final short VERSION_MINOR = 4; /** * The patch version of OpenEMS. @@ -36,7 +36,7 @@ public class OpenemsConstants { /** * The additional version string. */ - public static final String VERSION_STRING = ""; + public static final String VERSION_STRING = "SNAPSHOT"; /** * The complete version as a SemanticVersion. diff --git a/ui/package-lock.json b/ui/package-lock.json index 3cd42518e2b..e9feb499312 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "openems-ui", - "version": "2024.3.0", + "version": "2024.4.0-SNAPSHOT", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openems-ui", - "version": "2024.3.0", + "version": "2024.4.0-SNAPSHOT", "license": "AGPL-3.0", "dependencies": { "@angular/animations": "~15.2.9", diff --git a/ui/package.json b/ui/package.json index c9da6310eff..e5e5020f031 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2024.3.0", + "version": "2024.4.0-SNAPSHOT", "license": "AGPL-3.0", "private": true, "dependencies": { diff --git a/ui/src/app/changelog/view/component/changelog.constants.ts b/ui/src/app/changelog/view/component/changelog.constants.ts index 3a9b8fc641d..4a1a9146df5 100644 --- a/ui/src/app/changelog/view/component/changelog.constants.ts +++ b/ui/src/app/changelog/view/component/changelog.constants.ts @@ -2,7 +2,7 @@ import { Role } from "src/app/shared/type/role"; export class Changelog { - public static readonly UI_VERSION = "2024.3.0"; + public static readonly UI_VERSION = "2024.4.0-SNAPSHOT"; public static product(...products: Product[]) { return products.map(product => Changelog.link(product.name, product.url)).join(", ") + '. '; From d65b4e0d80e7ed0af2464a04ad169ef89f306ede Mon Sep 17 00:00:00 2001 From: Thomas Sicking <91258335+tsicking@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:51:34 +0100 Subject: [PATCH 02/28] Edge2Edge: Implement Edge2Edge meter (#2185) * Component Edge2EdgeMeter added to communicate with a meter from a remote OpenEMS * Java code formatting --- io.openems.edge.edge2edge/bnd.bnd | 2 +- .../openems/edge/edge2edge/meter/Config.java | 39 +++++++ .../edge2edge/meter/Edge2EdgeMeterImpl.java | 101 ++++++++++++++++++ .../meter/Edge2EdgeEssMeterImplTest.java | 30 ++++++ .../edge/edge2edge/meter/MyConfig.java | 92 ++++++++++++++++ 5 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java create mode 100644 io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java create mode 100644 io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java create mode 100644 io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java diff --git a/io.openems.edge.edge2edge/bnd.bnd b/io.openems.edge.edge2edge/bnd.bnd index f0d5bb62d42..958b4f6b90f 100644 --- a/io.openems.edge.edge2edge/bnd.bnd +++ b/io.openems.edge.edge2edge/bnd.bnd @@ -10,6 +10,6 @@ Bundle-Version: 1.0.0.${tstamp} io.openems.edge.bridge.modbus,\ io.openems.edge.common,\ io.openems.edge.ess.api,\ - + io.openems.edge.meter.api -testpath: \ ${testpath} \ No newline at end of file diff --git a/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java b/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java new file mode 100644 index 00000000000..b8796eb7353 --- /dev/null +++ b/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java @@ -0,0 +1,39 @@ +package io.openems.edge.edge2edge.meter; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +import io.openems.edge.meter.api.MeterType; + +@ObjectClassDefinition(// + name = "Edge-2-Edge Meter", // + description = "Connects an energy storage system from a slave OpenEMS Edge via Modbus") +@interface Config { + + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "meter0"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "Remote Component-ID", description = "Component-ID of ESS at the slave OpenEMS Edge.") + String remoteComponentId() default "meter0"; + + @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") + String modbus_id() default "modbus0"; + + @AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.") + int modbusUnitId() default 1; + + @AttributeDefinition(name = "Meter-Type", description = "What is measured by this Meter?") + MeterType type() default MeterType.PRODUCTION; + + @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") + String Modbus_target() default "(enabled=true)"; + + String webconsole_configurationFactory_nameHint() default "Edge-2-Edge Meter [{id}]"; + +} \ No newline at end of file diff --git a/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java b/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java new file mode 100644 index 00000000000..38dae8272c8 --- /dev/null +++ b/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java @@ -0,0 +1,101 @@ +package io.openems.edge.edge2edge.meter; + +import java.util.function.Consumer; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.metatype.annotations.Designate; + +import com.google.common.collect.Lists; + +import io.openems.common.channel.AccessMode; +import io.openems.common.exceptions.OpenemsException; +import io.openems.edge.bridge.modbus.api.BridgeModbus; +import io.openems.edge.bridge.modbus.api.ModbusComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.modbusslave.ModbusRecord; +import io.openems.edge.common.modbusslave.ModbusSlaveNatureTable; +import io.openems.edge.edge2edge.common.AbstractEdge2Edge; +import io.openems.edge.edge2edge.common.Edge2Edge; +import io.openems.edge.meter.api.AsymmetricMeter; +import io.openems.edge.meter.api.MeterType; +import io.openems.edge.meter.api.SymmetricMeter; + +@Designate(ocd = Config.class, factory = true) +@Component(// + name = "Edge2Edge.Meter", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE // +) +public class Edge2EdgeMeterImpl extends AbstractEdge2Edge + implements AsymmetricMeter, SymmetricMeter, Edge2Edge, ModbusComponent, OpenemsComponent { + + @Reference + protected ConfigurationAdmin cm; + + @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) + protected void setModbus(BridgeModbus modbus) { + super.setModbus(modbus); + } + + private Config config; + + public Edge2EdgeMeterImpl() throws OpenemsException { + super(// + Lists.newArrayList(// + OpenemsComponent::getModbusSlaveNatureTable, // + SymmetricMeter::getModbusSlaveNatureTable, // + AsymmetricMeter::getModbusSlaveNatureTable // + ), // + OpenemsComponent.ChannelId.values(), // + ModbusComponent.ChannelId.values(), // + Edge2Edge.ChannelId.values(), // + SymmetricMeter.ChannelId.values(), // + AsymmetricMeter.ChannelId.values() // + ); + } + + @Activate + private void activate(ComponentContext context, Config config) throws OpenemsException { + this.config = config; + if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, + "Modbus", config.modbus_id(), config.remoteComponentId(), AccessMode.READ_ONLY)) { + return; + } + } + + @Deactivate + protected void deactivate() { + super.deactivate(); + } + + @Override + protected Consumer getOnUpdateCallback(ModbusSlaveNatureTable modbusSlaveNatureTable, ModbusRecord record) { + return null; + } + + @Override + protected io.openems.edge.common.channel.ChannelId getWriteChannelId(ModbusSlaveNatureTable modbusSlaveNatureTable, + ModbusRecord record) { + return null; + } + + @Override + public String debugLog() { + return "L:" + this.getActivePower().asString(); + } + + @Override + public MeterType getMeterType() { + return this.config.type(); + } + +} diff --git a/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java b/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java new file mode 100644 index 00000000000..a853b552032 --- /dev/null +++ b/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java @@ -0,0 +1,30 @@ +package io.openems.edge.edge2edge.meter; + +import org.junit.Test; + +import io.openems.edge.bridge.modbus.test.DummyModbusBridge; +import io.openems.edge.common.test.AbstractComponentTest.TestCase; +import io.openems.edge.common.test.ComponentTest; +import io.openems.edge.common.test.DummyConfigurationAdmin; +import io.openems.edge.meter.api.MeterType; + +public class Edge2EdgeEssMeterImplTest { + + private static final String COMPONENT_ID = "meter0"; + private static final String MODBUS_ID = "modbus0"; + + @Test + public void test() throws Exception { + new ComponentTest(new Edge2EdgeMeterImpl()) // + .addReference("cm", new DummyConfigurationAdmin()) // + .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // + .activate(MyConfig.create() // + .setId(COMPONENT_ID) // + .setModbusId(MODBUS_ID) // + .setRemoteComponentId(COMPONENT_ID) // + .setMeterType(MeterType.PRODUCTION) // + .build()) + .next(new TestCase()); + } + +} diff --git a/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java b/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java new file mode 100644 index 00000000000..3260615eb4a --- /dev/null +++ b/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java @@ -0,0 +1,92 @@ +package io.openems.edge.edge2edge.meter; + +import io.openems.common.channel.AccessMode; +import io.openems.common.test.AbstractComponentConfig; +import io.openems.common.utils.ConfigUtils; +import io.openems.edge.meter.api.MeterType; + +@SuppressWarnings("all") +public class MyConfig extends AbstractComponentConfig implements Config { + + protected static class Builder { + private String id; + private String modbusId = null; + public int modbusUnitId; + public String remoteComponentId; + public MeterType type; + + private Builder() { + } + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setModbusId(String modbusId) { + this.modbusId = modbusId; + return this; + } + + public Builder setModbusUnitId(int modbusUnitId) { + this.modbusUnitId = modbusUnitId; + return this; + } + + public Builder setRemoteComponentId(String remoteComponentId) { + this.remoteComponentId = remoteComponentId; + return this; + } + + public Builder setMeterType(MeterType type) { + this.type = type; + return this; + } + + public MyConfig build() { + return new MyConfig(this); + } + } + + /** + * Create a Config builder. + * + * @return a {@link Builder} + */ + public static Builder create() { + return new Builder(); + } + + private final Builder builder; + + private MyConfig(Builder builder) { + super(Config.class, builder.id); + this.builder = builder; + } + + @Override + public String modbus_id() { + return this.builder.modbusId; + } + + @Override + public String Modbus_target() { + return ConfigUtils.generateReferenceTargetFilter(this.id(), this.modbus_id()); + } + + @Override + public int modbusUnitId() { + return this.builder.modbusUnitId; + } + + @Override + public String remoteComponentId() { + return this.builder.remoteComponentId; + } + + @Override + public MeterType type() { + return this.builder.type; + } + +} \ No newline at end of file From 6544af3cea2f9a3c95215776536f400d9781b206 Mon Sep 17 00:00:00 2001 From: Christian Lehne <51822163+clehne@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:16:41 +0100 Subject: [PATCH 03/28] Revert "Edge2Edge: Implement Edge2Edge meter (#2185)" This reverts commit d65b4e0d80e7ed0af2464a04ad169ef89f306ede. --- io.openems.edge.edge2edge/bnd.bnd | 2 +- .../openems/edge/edge2edge/meter/Config.java | 39 ------- .../edge2edge/meter/Edge2EdgeMeterImpl.java | 101 ------------------ .../meter/Edge2EdgeEssMeterImplTest.java | 30 ------ .../edge/edge2edge/meter/MyConfig.java | 92 ---------------- 5 files changed, 1 insertion(+), 263 deletions(-) delete mode 100644 io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java delete mode 100644 io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java delete mode 100644 io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java delete mode 100644 io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java diff --git a/io.openems.edge.edge2edge/bnd.bnd b/io.openems.edge.edge2edge/bnd.bnd index 958b4f6b90f..f0d5bb62d42 100644 --- a/io.openems.edge.edge2edge/bnd.bnd +++ b/io.openems.edge.edge2edge/bnd.bnd @@ -10,6 +10,6 @@ Bundle-Version: 1.0.0.${tstamp} io.openems.edge.bridge.modbus,\ io.openems.edge.common,\ io.openems.edge.ess.api,\ - io.openems.edge.meter.api + -testpath: \ ${testpath} \ No newline at end of file diff --git a/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java b/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java deleted file mode 100644 index b8796eb7353..00000000000 --- a/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Config.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.openems.edge.edge2edge.meter; - -import org.osgi.service.metatype.annotations.AttributeDefinition; -import org.osgi.service.metatype.annotations.ObjectClassDefinition; - -import io.openems.edge.meter.api.MeterType; - -@ObjectClassDefinition(// - name = "Edge-2-Edge Meter", // - description = "Connects an energy storage system from a slave OpenEMS Edge via Modbus") -@interface Config { - - @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") - String id() default "meter0"; - - @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID") - String alias() default ""; - - @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") - boolean enabled() default true; - - @AttributeDefinition(name = "Remote Component-ID", description = "Component-ID of ESS at the slave OpenEMS Edge.") - String remoteComponentId() default "meter0"; - - @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus bridge.") - String modbus_id() default "modbus0"; - - @AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.") - int modbusUnitId() default 1; - - @AttributeDefinition(name = "Meter-Type", description = "What is measured by this Meter?") - MeterType type() default MeterType.PRODUCTION; - - @AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.") - String Modbus_target() default "(enabled=true)"; - - String webconsole_configurationFactory_nameHint() default "Edge-2-Edge Meter [{id}]"; - -} \ No newline at end of file diff --git a/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java b/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java deleted file mode 100644 index 38dae8272c8..00000000000 --- a/io.openems.edge.edge2edge/src/io/openems/edge/edge2edge/meter/Edge2EdgeMeterImpl.java +++ /dev/null @@ -1,101 +0,0 @@ -package io.openems.edge.edge2edge.meter; - -import java.util.function.Consumer; - -import org.osgi.service.cm.ConfigurationAdmin; -import org.osgi.service.component.ComponentContext; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.ConfigurationPolicy; -import org.osgi.service.component.annotations.Deactivate; -import org.osgi.service.component.annotations.Reference; -import org.osgi.service.component.annotations.ReferenceCardinality; -import org.osgi.service.component.annotations.ReferencePolicy; -import org.osgi.service.component.annotations.ReferencePolicyOption; -import org.osgi.service.metatype.annotations.Designate; - -import com.google.common.collect.Lists; - -import io.openems.common.channel.AccessMode; -import io.openems.common.exceptions.OpenemsException; -import io.openems.edge.bridge.modbus.api.BridgeModbus; -import io.openems.edge.bridge.modbus.api.ModbusComponent; -import io.openems.edge.common.component.OpenemsComponent; -import io.openems.edge.common.modbusslave.ModbusRecord; -import io.openems.edge.common.modbusslave.ModbusSlaveNatureTable; -import io.openems.edge.edge2edge.common.AbstractEdge2Edge; -import io.openems.edge.edge2edge.common.Edge2Edge; -import io.openems.edge.meter.api.AsymmetricMeter; -import io.openems.edge.meter.api.MeterType; -import io.openems.edge.meter.api.SymmetricMeter; - -@Designate(ocd = Config.class, factory = true) -@Component(// - name = "Edge2Edge.Meter", // - immediate = true, // - configurationPolicy = ConfigurationPolicy.REQUIRE // -) -public class Edge2EdgeMeterImpl extends AbstractEdge2Edge - implements AsymmetricMeter, SymmetricMeter, Edge2Edge, ModbusComponent, OpenemsComponent { - - @Reference - protected ConfigurationAdmin cm; - - @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY) - protected void setModbus(BridgeModbus modbus) { - super.setModbus(modbus); - } - - private Config config; - - public Edge2EdgeMeterImpl() throws OpenemsException { - super(// - Lists.newArrayList(// - OpenemsComponent::getModbusSlaveNatureTable, // - SymmetricMeter::getModbusSlaveNatureTable, // - AsymmetricMeter::getModbusSlaveNatureTable // - ), // - OpenemsComponent.ChannelId.values(), // - ModbusComponent.ChannelId.values(), // - Edge2Edge.ChannelId.values(), // - SymmetricMeter.ChannelId.values(), // - AsymmetricMeter.ChannelId.values() // - ); - } - - @Activate - private void activate(ComponentContext context, Config config) throws OpenemsException { - this.config = config; - if (super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, - "Modbus", config.modbus_id(), config.remoteComponentId(), AccessMode.READ_ONLY)) { - return; - } - } - - @Deactivate - protected void deactivate() { - super.deactivate(); - } - - @Override - protected Consumer getOnUpdateCallback(ModbusSlaveNatureTable modbusSlaveNatureTable, ModbusRecord record) { - return null; - } - - @Override - protected io.openems.edge.common.channel.ChannelId getWriteChannelId(ModbusSlaveNatureTable modbusSlaveNatureTable, - ModbusRecord record) { - return null; - } - - @Override - public String debugLog() { - return "L:" + this.getActivePower().asString(); - } - - @Override - public MeterType getMeterType() { - return this.config.type(); - } - -} diff --git a/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java b/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java deleted file mode 100644 index a853b552032..00000000000 --- a/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/Edge2EdgeEssMeterImplTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.openems.edge.edge2edge.meter; - -import org.junit.Test; - -import io.openems.edge.bridge.modbus.test.DummyModbusBridge; -import io.openems.edge.common.test.AbstractComponentTest.TestCase; -import io.openems.edge.common.test.ComponentTest; -import io.openems.edge.common.test.DummyConfigurationAdmin; -import io.openems.edge.meter.api.MeterType; - -public class Edge2EdgeEssMeterImplTest { - - private static final String COMPONENT_ID = "meter0"; - private static final String MODBUS_ID = "modbus0"; - - @Test - public void test() throws Exception { - new ComponentTest(new Edge2EdgeMeterImpl()) // - .addReference("cm", new DummyConfigurationAdmin()) // - .addReference("setModbus", new DummyModbusBridge(MODBUS_ID)) // - .activate(MyConfig.create() // - .setId(COMPONENT_ID) // - .setModbusId(MODBUS_ID) // - .setRemoteComponentId(COMPONENT_ID) // - .setMeterType(MeterType.PRODUCTION) // - .build()) - .next(new TestCase()); - } - -} diff --git a/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java b/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java deleted file mode 100644 index 3260615eb4a..00000000000 --- a/io.openems.edge.edge2edge/test/io/openems/edge/edge2edge/meter/MyConfig.java +++ /dev/null @@ -1,92 +0,0 @@ -package io.openems.edge.edge2edge.meter; - -import io.openems.common.channel.AccessMode; -import io.openems.common.test.AbstractComponentConfig; -import io.openems.common.utils.ConfigUtils; -import io.openems.edge.meter.api.MeterType; - -@SuppressWarnings("all") -public class MyConfig extends AbstractComponentConfig implements Config { - - protected static class Builder { - private String id; - private String modbusId = null; - public int modbusUnitId; - public String remoteComponentId; - public MeterType type; - - private Builder() { - } - - public Builder setId(String id) { - this.id = id; - return this; - } - - public Builder setModbusId(String modbusId) { - this.modbusId = modbusId; - return this; - } - - public Builder setModbusUnitId(int modbusUnitId) { - this.modbusUnitId = modbusUnitId; - return this; - } - - public Builder setRemoteComponentId(String remoteComponentId) { - this.remoteComponentId = remoteComponentId; - return this; - } - - public Builder setMeterType(MeterType type) { - this.type = type; - return this; - } - - public MyConfig build() { - return new MyConfig(this); - } - } - - /** - * Create a Config builder. - * - * @return a {@link Builder} - */ - public static Builder create() { - return new Builder(); - } - - private final Builder builder; - - private MyConfig(Builder builder) { - super(Config.class, builder.id); - this.builder = builder; - } - - @Override - public String modbus_id() { - return this.builder.modbusId; - } - - @Override - public String Modbus_target() { - return ConfigUtils.generateReferenceTargetFilter(this.id(), this.modbus_id()); - } - - @Override - public int modbusUnitId() { - return this.builder.modbusUnitId; - } - - @Override - public String remoteComponentId() { - return this.builder.remoteComponentId; - } - - @Override - public MeterType type() { - return this.builder.type; - } - -} \ No newline at end of file From 4267c2374c8dde362202bacf250bb3423901f2e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=B6cker?= <39899210+DerStoecki@users.noreply.github.com> Date: Mon, 4 Mar 2024 22:12:53 +0100 Subject: [PATCH 04/28] UI: Install/Update Component filter to lower case (#2531) since the filter is applied to entry id/alias .toLowerCase() the filter themself should be lower case too. Co-authored-by: Ulrich Laupp <38915524+laupp@users.noreply.github.com> --- ui/src/app/edge/settings/component/install/index.component.ts | 2 +- ui/src/app/edge/settings/component/update/index.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/app/edge/settings/component/install/index.component.ts b/ui/src/app/edge/settings/component/install/index.component.ts index 0801e25842a..0cb8df51673 100644 --- a/ui/src/app/edge/settings/component/install/index.component.ts +++ b/ui/src/app/edge/settings/component/install/index.component.ts @@ -42,7 +42,7 @@ export class IndexComponent implements OnInit { updateFilter(completeFilter: string) { // take each space-separated string as an individual and-combined filter - let filters = completeFilter.split(' '); + let filters = completeFilter.toLowerCase().split(' '); let countFilteredEntries = 0; for (let entry of this.list) { entry.filteredFactories = entry.factories.filter(entry => diff --git a/ui/src/app/edge/settings/component/update/index.component.ts b/ui/src/app/edge/settings/component/update/index.component.ts index 4f642046af3..a0793dd77a4 100644 --- a/ui/src/app/edge/settings/component/update/index.component.ts +++ b/ui/src/app/edge/settings/component/update/index.component.ts @@ -43,7 +43,7 @@ export class IndexComponent implements OnInit { updateFilter(completeFilter: string) { // take each space-separated string as an individual and-combined filter - let filters = completeFilter.split(' '); + let filters = completeFilter.toLowerCase().split(' '); let countFilteredEntries = 0; for (let entry of this.list) { entry.filteredComponents = entry.components.filter(entry => From 7da815f9258db9e4de51d91550905dbf6a26efe3 Mon Sep 17 00:00:00 2001 From: Hannes Date: Mon, 4 Mar 2024 22:13:56 +0100 Subject: [PATCH 05/28] UI: Update user.component.html to handle "null" cases (#2527) --- ui/src/app/user/user.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/user/user.component.html b/ui/src/app/user/user.component.html index aa5eb66c724..d0999b213d9 100644 --- a/ui/src/app/user/user.component.html +++ b/ui/src/app/user/user.component.html @@ -17,7 +17,7 @@ Menu.name - {{ this.form?.model ? (this.form?.model?.firstname + ' ' + this.form?.model?.lastname) : user.name }} + {{ this.form?.model ? ((this.form?.model?.firstname ?? '') + ' ' + (this.form?.model?.lastname ?? '')).trim() : user.name }} From 9031dbb2ad9d168565c5a11876ade6f8307169da Mon Sep 17 00:00:00 2001 From: JosefRick <93322344+JosefRick@users.noreply.github.com> Date: Fri, 8 Mar 2024 21:31:43 +0100 Subject: [PATCH 06/28] UI: modal-line element INPUT with optional unit (#2489) Implements a new modal-line element INPUT_UNIT. It's the similar to INPUT with the option to change the unit with the following code line. eg: [control]="{type: 'INPUT_UNIT', properties: {unit: 'mA'}}"> --- .../genericComponents/modal/modal-line/modal-line.html | 7 ++++--- .../genericComponents/modal/modal-line/modal-line.ts | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.html b/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.html index 8fe0aa31bb4..2f795565950 100644 --- a/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.html +++ b/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.html @@ -26,10 +26,11 @@ -  W  +  {{control?.properties?.unit ?? 'W' }}  + - + @@ -78,4 +79,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.ts b/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.ts index bba960b0965..4cf7619299c 100644 --- a/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.ts +++ b/ui/src/app/shared/genericComponents/modal/modal-line/modal-line.ts @@ -18,7 +18,7 @@ export class ModalLineComponent extends AbstractModalLine { /** ControlName for Toggle Button */ @Input() protected control: { type: 'TOGGLE' } | - { type: 'INPUT' } | + { type: 'INPUT', properties?: {unit:'W'} } | /* the available select options*/ { type: 'SELECT', options: { value: string, name: string }[] } | /* the properties for range slider*/ From e8dc8d082dff3dde53502f23be54db424c0bedeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 22:35:10 +0100 Subject: [PATCH 07/28] Bump org.apache.felix:org.apache.felix.http.jetty from 5.1.8 to 5.1.10 in /cnf (#2564) * Bump org.apache.felix:org.apache.felix.http.jetty in /cnf Bumps org.apache.felix:org.apache.felix.http.jetty from 5.1.8 to 5.1.10. --- updated-dependencies: - dependency-name: org.apache.felix:org.apache.felix.http.jetty dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 52846b42c04..9127d4e3418 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -202,7 +202,7 @@ org.apache.felix org.apache.felix.http.jetty - 5.1.8 + 5.1.10 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index d1f6810325c..7991ea526fa 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -104,7 +104,7 @@ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.eventadmin;version='[1.6.4,1.6.5)',\ org.apache.felix.fileinstall;version='[3.7.4,3.7.5)',\ - org.apache.felix.http.jetty;version='[5.1.8,5.1.9)',\ + org.apache.felix.http.jetty;version='[5.1.10,5.1.11)',\ org.apache.felix.http.servlet-api;version='[3.0.0,3.0.1)',\ org.apache.felix.inventory;version='[2.0.0,2.0.1)',\ org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index c52e366d9ff..71a76424057 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -389,7 +389,7 @@ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.eventadmin;version='[1.6.4,1.6.5)',\ org.apache.felix.fileinstall;version='[3.7.4,3.7.5)',\ - org.apache.felix.http.jetty;version='[5.1.8,5.1.9)',\ + org.apache.felix.http.jetty;version='[5.1.10,5.1.11)',\ org.apache.felix.http.servlet-api;version='[3.0.0,3.0.1)',\ org.apache.felix.inventory;version='[2.0.0,2.0.1)',\ org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ From a7a3a893aae0ee5e54a30277593de2224e34b281 Mon Sep 17 00:00:00 2001 From: Hiromasa Ihara Date: Sat, 9 Mar 2024 07:29:09 +0900 Subject: [PATCH 08/28] UI: add japanese language support (#2538) Co-authored-by: Jing Lee Co-authored-by: cvabc Co-authored-by: Hiroyuki Ikegami --- ui/src/app/shared/type/language.ts | 7 +- ui/src/assets/i18n/ja.json | 832 +++++++++++++++++++++++++++++ 2 files changed, 838 insertions(+), 1 deletion(-) create mode 100644 ui/src/assets/i18n/ja.json diff --git a/ui/src/app/shared/type/language.ts b/ui/src/app/shared/type/language.ts index f16d43381ae..993ab5a1295 100644 --- a/ui/src/app/shared/type/language.ts +++ b/ui/src/app/shared/type/language.ts @@ -3,6 +3,7 @@ import localEN from '@angular/common/locales/en'; import localES from '@angular/common/locales/es'; import localFR from '@angular/common/locales/fr'; import localNL from '@angular/common/locales/nl'; +import localJA from '@angular/common/locales/ja'; import { TranslateLoader } from "@ngx-translate/core"; import { Observable, of } from 'rxjs'; import cz from 'src/assets/i18n/cz.json'; @@ -11,6 +12,7 @@ import en from 'src/assets/i18n/en.json'; import es from 'src/assets/i18n/es.json'; import fr from 'src/assets/i18n/fr.json'; import nl from 'src/assets/i18n/nl.json'; +import ja from 'src/assets/i18n/ja.json'; export class MyTranslateLoader implements TranslateLoader { @@ -31,8 +33,9 @@ export class Language { public static readonly NL: Language = new Language("Dutch", "nl", "nl", nl, localNL); public static readonly ES: Language = new Language("Spanish", "es", "es", es, localES); public static readonly FR: Language = new Language("French", "fr", "fr", fr, localFR); + public static readonly JA: Language = new Language("Japanese", "ja", "ja", ja, localJA); - public static readonly ALL = [Language.DE, Language.EN, Language.CZ, Language.NL, Language.ES, Language.FR]; + public static readonly ALL = [Language.DE, Language.EN, Language.CZ, Language.NL, Language.ES, Language.FR, Language.JA]; public static readonly DEFAULT = Language.DE; public static getByKey(key: string): Language | null { @@ -55,6 +58,7 @@ export class Language { case "nl": return Language.NL; case "cz": return Language.CZ; case "fr": return Language.FR; + case "ja": return Language.JA; default: return null; } } @@ -67,6 +71,7 @@ export class Language { case Language.NL.key: return Language.NL.locale; case Language.CZ.key: return Language.CZ.locale; case Language.FR.key: return Language.FR.locale; + case Language.JA.key: return Language.JA.locale; default: return Language.DEFAULT.locale; } } diff --git a/ui/src/assets/i18n/ja.json b/ui/src/assets/i18n/ja.json new file mode 100644 index 00000000000..b9178238ecd --- /dev/null +++ b/ui/src/assets/i18n/ja.json @@ -0,0 +1,832 @@ +{ + "About": { + "build": "このビルド", + "currentDevelopments": "現在の開発", + "developed": "このユーザーインターフェイスは、オープンソースソフトウェアとして開発されています。", + "faq": "よくある質問(FAQ)", + "language": "言語を選択する:", + "openEMS": "Openemsの詳細", + "patchnotes": "このビルドの監視の変更" + }, + "Edge": { + "Index": { + "EmergencyReserve": { + "InfoForEmergencyReserveSlider": "緊急電力予備を有効にすることで、値は5%から100%まで自由に選択することができます。", + "emergencyReserve": "緊急予備" + }, + "Energymonitor": { + "activePower": "アクティブパワー", + "consumptionWarning": "消費と不明な発電", + "gridMeter": "グリッドメーター", + "productionMeter": "発電メーター", + "reactivePower": "リアクティブパワー", + "storage": "蓄電池", + "storageCharge": "蓄電池充電", + "storageDischarge": "蓄電池放電", + "title": "パワーモニター", + "ERROR_TEMPORARY": "データの取得中にエラーが発生しました。 後でもう一度試してください。", + "ERROR_TOO_LONG": "" + }, + "Widgets": { + "autarchyInfo": "自給自足は、発電と蓄電池放電によってカバーできる現在の電力の割合を示します。", + "phasesInfo": "技術的な理由により、個々のフェーズの合計は、合計の合計とは異なることがあります。", + "selfconsumptionInfo": "自己消費は、現在発電された出力のうち、直接消費と蓄電池負荷自体に使用できる割合を示します。", + "twoWayInfoGrid": "負の値はグリッドフィードインに対応し、正の値はメインサプライに対応します", + "InfoStorageForCharge": "負の値は蓄電池充電に対応します", + "InfoStorageForDischarge": "正の値は蓄電池放電に対応します", + "Channeltreshold": { + "TITLE": "閾値コントローラー", + "output": "出力", + "ACTIVE_TIME_OVER_PERIOD": "アクティブ時間" + }, + "Singlethreshold": { + "above": "その上", + "behaviour": "行動", + "below": "下", + "currentValue": "現在の価値", + "dependendOn": "に応じて", + "minSwitchingTime": "最小スイッチ時間", + "moreThanMaxPower": "値が制御されたデバイスの最大電力よりも低くてはなりません", + "other": "他の", + "relationError": "しきい値は、スイッチされた負荷電力よりも大きくなければなりません", + "switchedLoadPower": "負荷電源を切り替えました", + "switchOffAbove": "上記のスイッチをオフにします", + "switchOffBelow": "下のスイッチをオフにします", + "switchOnAbove": "上記のスイッチを入れます", + "switchOnBelow": "以下を切り替えます", + "threshold": "しきい値" + }, + "DelayedSellToGrid": { + "sellToGridPowerLimit": "上記の請求", + "continuousSellToGridPower": "以下で放電します", + "relationError": "充電制限は、排出制限よりも大きくなければなりません" + }, + "Peakshaving": { + "asymmetricInfo": "入力されたパフォーマンス値は、個々のフェーズを指します。最も強調されたフェーズに調整されます。", + "endDate": "終了日", + "endTime": "終了時間", + "mostStressedPhase": "最もストレスの多い段階", + "peakshaving": "ピークシェービング", + "peakshavingPower": "ピークカット目標出力", + "recharge": "充電電力", + "rechargePower": "バッテリー充電可能閾値", + "relationError": "排出制限は充電制限以上でなければなりません", + "startDate": "開始日", + "startTime": "始まる時間", + "startTimeCharge": "充電開始時間" + }, + "GridOptimizedCharge": { + "chargingDelayed": "充電が遅れました", + "considerGridFeedInLimit": "最大グリッドフィードインを検討してください", + "endTime": "終了時間", + "endTimeDescription": "充電は、数時間最大量では行われませんが、長期間にわたって着実に行われます。", + "endTimeDetailedDescription": "充電は数時間で最大量で行われませんが、最大{{value1}}から{{value2}}時の最大で着実に行われます。", + "endTimeLong": "制限された負荷の終了時間", + "expectedSoc": "予想される充電状態", + "expectedSocWithoutSellToGridLimit": "最大グリッドフィードインを避けることなく", + "gridFeedInLimitationAvoided": "グリッドフィードインの制限は回避されました", + "gridOptimizedChargeDisabled": "グリッド最適化された電荷は無効になりました", + "high": "高い", + "History": { + "batteryChargeGridLimitDescription": "最大のグリッドフィードインは、それを超えると(可能な限り)バッテリーの充電が増加します(可能な限り)、早期の生産削減を防ぐために、最大許可されたグリッドフィードインを下回っています。", + "priorityDescription": "最小充電は、最大充電よりも優先度が高い" + }, + "low": "低い", + "maximumCharge": "最大充電", + "maximumGridFeedIn": "最大許容グリッドフィードイン", + "medium": "中くらい", + "minimumCharge": "最小料金", + "RiskDescription": { + "Low": { + "functionDescription": "蓄電池システムの比較的早期充電", + "storageDescription": "蓄電池システムが完全に充電される可能性が高い", + "pvCurtail": "PVシステムの削減が回避される可能性が低い" + }, + "Medium": { + "functionDescription": "ストアシステムの充電さえ比較的", + "storageDescription": "蓄電池システムが完全に充電される可能性が高い", + "pvCurtail": "PVシステムの削減が回避される可能性が高い" + }, + "High": { + "functionDescription": "比較的後で蓄電池システムの充電", + "storageDescription": "蓄電池システムが完全に充電される可能性が低い", + "pvCurtail": "PVシステムの削減が回避される可能性が高い" + } + }, + "riskPropensity": "リスク傾向", + "settingOnlyVisableForInstaller": "この設定は、インストーラーにのみ表示されます", + "State": { + "avoidLowCharging": "低い充電は避けました", + "chargeLimitActive": "充電制限アクティブ", + "endTimeNotCalculated": "計算されていない終了時間", + "gridFeedInLimitationIsAvoided": "グリッドフィードインの制限は回避されます", + "noLimitActive": "充電制限はアクティブではありません", + "noLimitPossible": "不可能な制限はありません(優先度が高いコントロールによって制限されています)", + "notDefined": "定義されていません", + "passedEndTime": "限られた充電の終了時間を超えました", + "storageAlreadyFull": "すでに満員の蓄電池" + }, + "storageCapacity": "storagecapacity(管理者のみ見える)" + }, + "CHP": { + "highThreshold": "高いしきい値", + "lowThreshold": "低いしきい値" + }, + "EVCS": { + "activateCharging": "充電ステーションをアクティブにします", + "amountOfChargingStations": "充電ステーションの量", + "cable": "ケーブル", + "cableNotConnected": "ケーブルは接続されていません", + "carFull": "車はいっぱいです", + "chargeLimitReached": "充電制限が到達しました", + "chargeMode": "充電モード", + "chargeTarget": "目標電力設定値", + "charging": "充電しています", + "chargingLimit": "充電制限", + "chargingPower": "充電力", + "chargingStation": "充電ステーション", + "chargingStationCluster": "充電ステーションクラスター", + "chargingStationDeactivated": "充電ステーションは無効になっています", + "chargingStationPluggedIn": "チャリングステーションが接続されています", + "chargingStationPluggedInEV": "充電ステーション + e-vehicleが接続されています", + "chargingStationPluggedInEVLocked": "充電ステーション + e-vehicleプラグイン +ロックされています", + "chargingStationPluggedInLocked": "プラグイン +ロックされたチャリングステーション", + "clusterConfigError": "EVCSクラスターの構成でエラーが発生しました", + "currentCharge": "現在の充電", + "energySinceBeginning": "今回の充電量", + "energyLimit": "充電量制限", + "enforceCharging": "充電を実施します", + "error": "エラー", + "lock": "ロック済み", + "unlock": "ロック解除済み", + "maxEnergyRestriction": "充電量制限機能", + "notAuthorized": "許可されていません", + "notCharging": "停止中", + "notReadyForCharging": "充電の準備ができていません", + "overviewChargingStations": "充電ステーションの概要", + "prioritization": "優先順位付け", + "readyForCharging": "充電の準備ができました", + "starting": "起動", + "status": "ステータス", + "totalCharge": "総充電", + "totalChargingPower": "合計充電パワー", + "unknown": "確認中", + "unplugged": "プラグを外します", + "Administration": { + "carAdministration": "自動車管理", + "customCarInfo": "この場合、あなたの車は特定の出力から効率的に請求されることができます。このボタンを使用すると、これは構成オプションと自動充電計算に含まれています。", + "renaultZoe": "ルノーゾーイは主にこの充電ステーションで請求されていますか?" + }, + "NoConnection": { + "description": "充電ステーションへの接続はありません。", + "help1_1": "充電ステーションのIPは、再びオンになっているときに表示されます", + "help1": "充電ステーションがオンになっているかどうかを確認し、ネットワークを介して到達できるかどうかを確認してください。" + }, + "OptimizedChargeMode": { + "info": "このモードでは、車の負荷は現在の生産と消費に調整されます。", + "minChargePower": "最低充電電力", + "minCharging": "最低充電力保証", + "minInfo": "車が夜に充電されていないことを防ぎたい場合は、最低充電を設定できます。", + "name": "最適化された充電", + "shortName": "自動", + "ChargingPriority": { + "car": "車", + "info": "優先順位付けに応じて、選択したコンポーネントが最初にロードされます", + "storage": "蓄電池" + } + }, + "ForceChargeMode": { + "info": "このモードでは、充電ステーションがグリッドパワーにアクセスする必要がある場合でも、車の積み込みが強制されます。つまり、車が充電されることが常に保証されます。", + "maxCharging": "目標電力設定値", + "maxChargingDetails": "車が入力された最大値をロードできない場合、電源は自動的に制限されます。", + "name": "強制充電", + "shortName": "手動で" + }, + "Uncontrollable": "この充電ステーションは制御できません。" + }, + "Heatingelement": { + "activeForced": "アクティブ(最小ランタイム)", + "activeLevel": "アクティブレベル", + "endtime": "終了時間", + "energy": "エネルギー", + "guaranteeMinimumHeating": "最小加熱を保証します", + "heatingelement": "加熱要素", + "minimalEnergyAmount": "最小料金", + "minimumRunTime": "最小ランタイム", + "priority": "優先順位", + "time": "時間", + "timeCountdown": "開始までの時間" + }, + "HeatPump": { + "aboveSoc": "そして、充電の状態を超えています", + "belowSoc": "およびの充電の下", + "gridBuy": "グリッド購入から", + "gridSell": "の過剰な送りから", + "lock": "ロック", + "moreThanHpPower": "値は、ヒートポンプの最大出力よりも低くてはなりません", + "normalOperation": "通常の動作", + "normalOperationShort": "普通", + "relationError": "スイッチオンコマンド過剰値は、スイッチオン推奨値よりも大きくなければなりません", + "switchOnCom": "スイッチオンコマンド", + "switchOnComShort": "指図", + "switchOnRec": "スイッチオンの推奨", + "switchOnRecShort": "おすすめ", + "undefined": "未定義" + }, + "TIME_OF_USE_TARIFF": { + "CONTROL_MODE_DESCRIPTION": { + "CHARGE_CONSUMPTION": "" + }, + "CHARGE_CONSUMPTION_ACTIVATE": "ネットワークからのアクティブローディングを有効にする (ベータテスト)", + "PRICE": "現在の価格", + "STATE": { + "DELAY_DISCHARGE": "遅延退院", + "BALANCING": "自己消費の最適化", + "CHARGE": "ネットワークから解放された負荷" + } + } + } + }, + "History": { + "beginDate": "[開始日]を選択します", + "day": "日", + "endDate": "[終了]を選択します", + "export": "Excelファイルとしてダウンロードします", + "go": "行く!", + "lastMonth": "先月", + "lastWeek": "先週", + "lastYear": "去年", + "month": "月", + "noData": "データなし", + "tryAgain": "あとでもう一度試してみてください...", + "otherPeriod": "他の日付", + "period": "期間", + "selectedDay": "{{ value }}", + "selectedPeriod": "選択された期間:", + "today": "今日", + "week": "週", + "year": "年", + "TOTAL": "合計", + "yesterday": "昨日", + "sun": "日", + "mon": "月", + "tue": "火", + "wed": "水", + "thu": "木", + "fri": "金", + "sat": "土", + "jan": "1月", + "feb": "2月", + "mar": "3月", + "apr": "4月", + "may": "5月", + "jun": "6月", + "jul": "7月", + "aug": "8月", + "sep": "9月", + "oct": "10月", + "nov": "11月", + "dec": "12月", + "activeDuration": "アクティブな期間" + }, + "Config": { + "Index": { + "addComponents": "コンポーネントインストール", + "adjustComponents": "コンポーネント設定", + "bridge": "接続とデバイス", + "controller": "アプリケーション", + "dataStorage": "データストレージ", + "executeSimulator": "シミュレーションを実行します", + "liveLog": "ライブシステムログ", + "log": "ログ", + "manualControl": "手動制御", + "renameComponents": "コンポーネントの名前を変更します", + "scheduler": "ApplicationPlanner", + "simulator": "シミュレータ", + "systemExecute": "システムコマンド実行", + "systemProfile": "システムプロファイル", + "alerting": "警告", + "networkConfiguration": "ネットワーク設定" + }, + "More": { + "manualCommand": "手動コマンド", + "manualpqPowerSpecification": "電力仕様", + "manualpqReset": "リセット", + "manualpqSubmit": "送信", + "refuInverter": "インバーターをリフルします", + "refuStart": "始める", + "refuStartStop": "インバーターを開始/停止します", + "refuStop": "ストップ", + "send": "送信" + }, + "Scheduler": { + "always": "いつも", + "class": "クラス:", + "contact": "これは起こらないはずです。にお問い合わせください。", + "newScheduler": "新しいスケジューラ...", + "notImplemented": "フォームは実装されていません:" + }, + "Log": { + "automaticUpdating": "自動更新", + "level": "レベル", + "message": "メッセージ", + "source": "ソース", + "timestamp": "タイムスタンプ" + }, + "Controller": { + "app": "アプリ:", + "internallyID": "内部ID:", + "priority": "優先順位:" + }, + "Bridge": { + "newConnection": "新しい接続...", + "newDevice": "新しいデバイス..." + }, + "Alerting": { + "activate": "活性化", + "delay": "遅れ", + "save": "保存", + "options": {}, + "toast": { + "success": "適用された設定", + "error": "設定の読み込みエラー" + }, + "interval": { + "hour": "時間", + "hours": "時間", + "minute": "分", + "minutes": "分", + "day": "日", + "days": "日々" + } + }, + "App": { + "NAME": "App Center", + "NAME_WITH_EDGE_NAME": "{{ edgeShortName }} App Center", + "header": "アプリマネージャーは現在、最初のテストバージョンです。", + "updateAvailable": "新しい{{edgeshortname}}バージョンがあります!{{edgeshortname}}を更新して、すべての新しい{{edgeshortname}}アプリがアプリセンターに表示されるようにしてください。", + "installed": "インストール", + "available": "利用可能", + "incompatible": "非互換", + "buyApp": "アプリを購入します", + "modifyApp": "アプリを変更します", + "createApp": "アプリをインストールする", + "deleteApp": "アプリを削除します", + "updateApp": "アプリを更新します", + "errorInstallable": "インストールエラー", + "errorCompatible": "互換性エラー" + } + }, + "Service": { + "entireSystem": "システム全体", + "Cell": { + "voltages": "セル電圧", + "temperatures": "セル温度", + "insulation": "隔離" + } + }, + "Network": { + "errorReading": "現在のネットワーク構成を読み取るエラー:", + "mandatoryFields": "必須フィールドを埋めてください", + "successUpdate": "正常に更新されたネットワーク構成", + "errorUpdating": "エラーの更新", + "ipAddress": "IPアドレス", + "subnetmask": "サブネットマスク", + "addIP": "静的IPアドレスを追加します", + "validAddressWarning": "「静的IPアドレスの追加」で、サブネットマスクで有効なIPアドレスを入力してください。10.4.1.6/24", + "advancedMode": "アドバンストモード", + "submit": "送信" + }, + "title": "OpenEMS" + }, + "General": { + "active": "有効", + "actualPower": "e-car充電", + "apply": "適用", + "autarchy": "再生可能エネルギー率", + "automatic": "自動", + "cancel": "キャンセル", + "capacity": "容量", + "changeAccepted": "変更が承認されました", + "changeFailed": "変更が失敗しました", + "chargeDischarge": "充電・放電パワー", + "chargePower": "充電", + "componentCount": "部品数", + "componentInactive": "無効化中", + "connectionLost": "接続が切断されました。再接続を試みます。", + "consumption": "消費", + "cumulative": "累積値", + "currentName": "現在の名前", + "currentValue": "現在の値", + "dateFormat": "yyyy-MM-dd", + "digitalInputs": "デジタル入力", + "numberOfComponents": "部品数", + "directConsumption": "直接消費", + "dischargePower": "放電", + "fault": "障害", + "grid": "グリッド", + "gridBuy": "買電", + "gridBuyAdvanced": "買電", + "gridSell": "売電", + "gridSellAdvanced": "売電", + "HISTORY": "履歴", + "inactive": "非アクティブ", + "info": "情報", + "inputNotValid": "入力が無効です", + "insufficientRights": "権限不足", + "LIVE": "ライブ", + "load": "負荷", + "lockState": "ロック状態", + "manual": "マニュアル", + "manually": "手動", + "measuredValue": "測定値", + "mode": "モード", + "more": "もっと...", + "noValue": "値がありません", + "off": "オフ", + "offGrid": "グリッド接続なし!", + "ok": "ok", + "on": "手動", + "otherConsumption": "その他の消費", + "percentage": "パーセンテージ", + "periodFromTo": "{{ value1 }}から{{ value2 }}まで", + "phase": "フェーズ", + "phases": "フェーズ", + "power": "パワー", + "production": "発電", + "rename": "名前変更", + "reportValue": "破損データを報告", + "reset": "リセット", + "search": "検索", + "selfConsumption": "自己消費", + "soc": "SOC", + "state": "状態", + "storageSystem": "蓄電池システム", + "SYSTEM_STATE": "システムの状態", + "TOTAL": "合計", + "totalState": "総状態", + "warning": "警告", + "Week": { + "monday": "月曜日", + "tuesday": "火曜日", + "wednesday": "水曜日", + "thursday": "木曜日", + "friday": "金曜日", + "saturday": "土曜日", + "sunday": "日曜日" + }, + "Month": { + "january": "1月", + "february": "2月", + "march": "3月", + "april": "4月", + "may": "5月", + "june": "6月", + "july": "7月", + "august": "8月", + "september": "9月", + "october": "10月", + "november": "11月", + "december": "12月" + }, + "save": "保存", + "SystemOutage": "メンテナンス作業のため、オンラインモニタリングが一時的に利用できない状況です。後でもう一度お試しください。詳細については、以下を参照してください。", + "Country": { + "germany": "ドイツ", + "austria": "オーストリア", + "czech": "チェコ共和国", + "sweden": "スウェーデン", + "netherlands": "オランダ", + "switzerland": "スイス", + "japan": "日本" + }, + "yes": "はい", + "no": "いいえ", + "value": "値", + "SUM_STATE": "システム状態" + }, + "Index": { + "allConnected": "すべての接続が確立されています。", + "connectionInProgress": "接続の確立...", + "connectionFailed": "{{value}}への接続が失敗しました。", + "connectionSuccessful": "{{value}}に正常に接続されています。", + "deviceOffline": "デバイスが接続されていません!", + "isOffline": "Openemsはオフラインです!", + "LOGGED_IN_AS": "ログイン権限", + "toEnergymonitor": "Energymonitorに...", + "TYPE": "タイプ", + "ADD_EDGE": "新しい{{edgeshortname}}を追加", + "FIRST_SETUP_PROTOCOL": "初期試運転" + }, + "INSTALLATION": { + "ATTENTION_MESSAGE": "その後、選択を元に戻すことはできないことに注意してください。", + "BACK": "戻る", + "COMPLETE": "完了", + "COMPLETION": { + "DOWNLOAD_ERROR": "プロトコルはダウンロードできませんでした", + "DOWNLOAD": "IBN-Protocolダウンロード", + "SUB_TITLE": "{{value}}を正常に委託しました。", + "TITLE": "セットアップ完了" + }, + "CONFIGURATION_EMERGENCY_RESERVE": { + "EMERGENCY_RESERVE_NOTE": "この機能がアクティブになっている場合、バッテリー充電レベルは設定値を下回ることはできません。", + "EMERGENCY_RESERVE_VALUE": "緊急準備価格", + "EMERGENCY_RESERVE": "緊急電源リザーブ{{シンボル}}", + "IS_ACTIVATED": "緊急電力保護区をアクティブにしますか?", + "IS_ENABLED": "緊急電源機能をアクティブにする必要がありますか?", + "RECENT": "現在:", + "TITLE": "緊急電力保護区", + "VALUE": "価値 [%]", + "EMERGENCY_RESERVE_LABEL": "緊急電源{{シンボル}}" + }, + "CONFIGURATION_EXECUTE": { + "BATTERY_INVERTER": "バッテリーインバーター", + "BATTERY": "バッテリー", + "COMMUNICATION_WITH_BATTERY_INVERTER": "バッテリーインバーターとの通信", + "COMMUNICATION_WITH_BATTERY": "バッテリーとの通信", + "DESCRIPTION_1": "システムのすべてのコンポーネントが正しくセットアップされていることを確認するには、", + "DESCRIPTION_2": "構成とその後の機能テストは、完了するまでに最大10分かかる場合があります。", + "EMERGENCY_CAPACITY_RESERVE": "緊急管理保護区", + "EMERGENCY_POWER_CONSUMER": "緊急電源消費者", + "ERROR": "エラー", + "EXISTING_CONFIGURATION": "既存の構成が見つかりました。構成プロセスを手動で開始することにより、これらを上書きできます。", + "FUNCTION_TEST_ERROR": "機能テストはエラーで完了しました。", + "FUNCTION_TEST": "機能テスト", + "GRID_METER": "グリッドメーター", + "GRID_OPTIMIZED_CHARGE": "グリッドに優しい充電", + "LEGEND": "伝説", + "NOT_YET_CONFIGURED": "まだ構成 /チェックされていません", + "PARTIAL_CONFIGURATION": "すべてのコンポーネントを正しく構成できるわけではありません。", + "PRE_CONFIGURED": "事前に設定された /警告", + "PROGNOSIS": "予後", + "RELAY_BOARD": "リレーボード", + "SELF_CONSUMPTION": "自己消費の最適化", + "START": "設定を開始します", + "STORAGE_SYSTEM": "エネルギー貯蔵システム", + "SUCCESSFULLY_CONFIGURED": "正常に構成 /チェックされました", + "SURPLUS_ENERGY_FEEDIN": "余剰エネルギーフィードイン", + "TITLE": "構成", + "WAITING": "構成実行...", + "WILL_BE_CONFIGURED": "構成 /チェックされます", + "POWER": "力", + "COMMUNICATION_WITH_METER": "メーターとの通信", + "WAGO_BRIDGE": "ワゴブリッジ", + "FIELD_BUS_COUPLER": "フィールドバスカプラー", + "CONTROL_GRID_POINT": "グリッド切断点の制御" + }, + "CONFIGURATION_LINE_SIDE_METER_FUSE": { + "FIXED_VALUE_DESCRIPTION": "回路ブレーカーの現在の値は何ですか?", + "OTHER_VALUE": "カスタム値", + "OTHER": "他の", + "TITLE_COMMERCIAL": "グリッド接続ポイント /カウンター回路ブレーカーのサーキットブレーカー", + "TITLE_HOME": "グリッド接続ポイントのサーキットブレーカー", + "VALUE": "値[a]" + }, + "CONFIGURATION_SUMMARY": { + "BATTERY_LOCATION": "ベスの場所", + "BATTERY": "バッテリー", + "COUNTRY_SETTING": "国の設定", + "CUSTOMER": "お客様", + "DEVICE_ACTIVE_CHECKED": "バッテリーとインバーターがオンになっています", + "EDGE_NUMBER": "{{edgeshortname}} number", + "GENERAL": "全般的", + "GTC_ACCEPT": "GTCの受け入れ", + "INSTALLER": "インストーラ", + "INVERTER": "インバーター", + "NEXT_CLICKED_DESCRIPTION": "[次の]ボタンをクリックすると、蓄電池システムが構成されます。構成プロセス全体でバッテリーとインバーターが電源を入れていることを確認してください。", + "PRODUCER": "発生器", + "SUMMARY": "まとめ", + "TIME_OF_INSTALLATION": "インストールの時間", + "VALUE_AC": "値AC", + "WARRANTY_TERMS": "保証条件の承認", + "PEAK_SHAVING": "ピークシェービング", + "APPS": "アプリ", + "HECKERT": "選択した無料アプリ" + }, + "CONFIGURATION_SYSTEM": { + "OPEN_INSTRUCTIONS": "開く手順", + "PRODUCT_NAME": "商品名", + "TITLE": "構成する製品を選択してください。" + }, + "CONFIRM_APP_SELECTION": "次のアプリを選択しますか?", + "CONFIRM_APP_SELECTION_LATER": "後で選択することはできますか?", + "FORM": { + "MANDATORY_FIELD": "これは必須のフィールドです", + "BATTERY_SERIAL_NUMBER": "{{serialNumber}}は有効なシリアル番号ではありません。有効なシリアル番号は、{{{length}}桁で構成されています。", + "MIN": "{{min}}以上の値のみが許可されます。", + "MAX": "{{max}}以下の値のみが許可されます。", + "EMAIL_MATCH": "電子メールは一致しません。", + "EMAIL": "{{email}}は有効な電子メールアドレスではありません。", + "POSITIVE_INTEGER": "正の数のみが許可されています。" + }, + "FORWARD": "続く", + "LOAD": "ロード", + "NEXT": "次", + "PLEASE_SELECT_OPTION": "オプションを選択してください", + "PRE_INSTALLATION": { + "AUTHENTICATION_FAILED": "認証に失敗しました", + "EDGE_OFFLINE": "{{edgeshortname}}への接続を確立できませんでした", + "INSTALLATION_SUCCESS": "{{EdgeID}}のインストールが開始されました", + "NOTE": "ノート:", + "TITLE": "インストールキーを入力します", + "WRONG_KEY_NOTE": "インストールキーが無効であると誤って認識されている場合は、ページを更新してください。" + }, + "PROTOCOL_FEED_IN_MANAGEMENT": { + "CHOOSE": "選ぶ", + "CONSTANT_VALUE": "cosφ値", + "DYNAMIC_LIMITATION_ACTIVATED": "動的なフィードイン制限がアクティブ化されていますか?", + "DYNAMIC_LIMITATION": "フィードインの動的制限(例:70%の制限)", + "EXTERNAL_CONTROLLER_CHECK": "外部コントロール受信者は、指示に従って適切かつ完全にインストールされました。", + "EXTERNAL_LIMITATION_ACTIVATED": "外部コントロール受信者がアクティブ化されましたか?", + "EXTERNAL_LIMITATION": "外部コントローラー(DSOによる外部制限)", + "FEED_IN_SETTING_DESCRIPTION": "過度の周波数の場合のアクティブな電力削減", + "FIXED_POWER_FACTOR": "定数cosφ(p)", + "MAXIMUM_FEED_IN_VALUE": "最大フィードイン値[W]", + "MAXIMUM_VALUE_DESCRIPTION": "この値は、DSOによって必要とされる場合があります。", + "PU_ENABLED_CURVE": "変位力因子cosφ(p)", + "QU_ENABLED_CURVE": "反応電力-q(u)特性", + "SHADE_MANAGEMENT_DEACTIVATED": "シェード管理は無効になっていますか?", + "TITLE": "フィードイン管理", + "EXTERNAL_CONTROLLER_RECIEVER": "リップルコントロールレシーバー", + "PLACE_HOLDER": "オプションを選択", + "NO_LIMITATION": "フィードイン管理がない" + }, + "PROTOCOL_INSTALLER_AND_CUSTOMER": { + "CITY": "街", + "COMPANY_CUSTOMER": "会社?", + "COMPANY_NAME": "会社名", + "COUNTRY": "国", + "EMAIL_CONFIRMATION": "確認", + "EMAIL_DESCRIPTION": "個人的なアクセスのため", + "EMAIL": "電子メールアドレス", + "FIRST_NAME": "ファーストネーム", + "LAST_NAME": "苗字", + "PHONE": "電話番号", + "STREET_ADDRESS": "住所", + "TITLE_CUSTOMER": "連絡先データ - エンドカスタマー", + "TITLE_INSTALLER": "連絡先データ - インストーラー", + "ZIP": "郵便番号" + }, + "PROTOCOL_PV_AND_ADDITIONAL_AC": { + "ADD": "ジェネレーターを追加します", + "ADDITIONAL_GENERATOR": "追加のACジェネレーター", + "ALIAS_DESCRIPTION_ADDITIONAL_AC": "例えば「PV-Roof」", + "ALIAS_DESCRIPTION_PV": "オンラインモニタリングに表示されます。「PV-Roof」", + "ALIAS": "説明", + "DIRECTIONS": { + "EAST": "東", + "NORTH_EAST": "北東", + "NORTH_WEST": "北西", + "NORTH": "北", + "SOUTH_EAST": "南東", + "SOUTH_WEST": "南西", + "SOUTH": "南", + "WEST": "西" + }, + "INSTALLED_POWER": "インストールされた電源[Wₚ]", + "MARKED_AS": "mppt {{number}}(「pv {{number}}」とマークされています)", + "METER_TYPE_WITH_LABEL": "センサーのタイプ{{label}} {{number}}", + "METER_TYPE": "センサーのタイプ", + "MODBUS_DESCRIPTION": "センサーは、次の設定で構成する必要があります:通信速度(ボー) \"9600\"、通信パリティ(pasrty) \"n\"、通信stopbit(stop) \"1\"", + "MODBUS_WITH_LABEL": "modbus {{label}} {{number}}", + "MODBUS": "modbus", + "MODULE_TYPE_DESCRIPTION": "例えば製造者と出力", + "MODULE_TYPE_WITH_LABEL": "モジュールのタイプ{{label}} {{number}}", + "MODULE_TYPE": "モジュールの種類", + "NUMBER_OF_MODULES_WITH_LABEL": "PVモジュールの数{{label}} {{number}}", + "NUMBER_OF_MODULES": "PVモジュールの数", + "OPEN_MANUAL": "マニュアルを開きます", + "ORIENTATION_WITH_LABEL": "{{label}} {{number}}オリエンテーション", + "ORIENTATION": "オリエーション{{label}} {{number}}", + "SAVE_TO_CONTINUE": "最初にエントリを保存して続行します。", + "SAVE": "ジェネレーターを保存します", + "SHADE_MANAGEMENT_DEACTIVATE": "シェード管理を無効にします", + "SHADE_MANAGEMENT_DESCRIPTION": "シェード管理は、オプティマイザーがインストールされている場合にのみ、無効にする必要があります。", + "TITLE_ADDITIONAL_AC": "AC-Generator", + "TITLE_PV": "DC-PVインストール(インバーター入力)", + "VALID_DATA": "保存する有効なデータを入力します。", + "TITLE_DC": "DC-PVインストール", + "AC_NOT_CREATED": "ACメーターは作成されていません!" + }, + "PROTOCOL_SERIAL_NUMBERS": { + "BATTERY_MODULE": "バッテリーモジュール", + "BATTERY_TOWER": "バッテリータワー{{TowerNumber}}", + "BESS_COMPONENTS": "Bessコンポーネント", + "BMS_BOX": "BMSボックス&ベース", + "CONFIRM": "確認", + "ENTER_VALID_ADDRESS": "設定を適用するには、有効な値を入力します。", + "ERROR_SENDING": "プロトコルの送信エラー。", + "INVERTER": "インバーター", + "NEXT_BUTTON_DESCRIPTION": "[次の]ボタンをクリックすると、IBNプロトコルはFenecon GmbHに自動的に送信されます。", + "NUMBER_OF_MODULES_PER_TOWER": "タワーごとのモジュール数", + "NUMBER_OF_TOWERS": "塔の数", + "READ_DESCRIPTION": "「システムのセットアップ」を確認してください。フィールドの説明をお読みください。", + "SAME_SERIAL_NUMBERS": "{{シリアル番号}}同じシリアル番号を持っています", + "SENT_SUCCESSFULLY": "プロトコルは正常に送信されました。", + "SERIAL_NUMBER": "シリアルナンバー", + "SETUP_NOTE": "プレースホルダー(「x」でマークされた)を適切な文字に置き換えて、シリアル番号を完了します。", + "SINGLE_SERIAL_NUMBER": "{{label}}シリアル番号", + "SYSTEM_SETUP": "システムのセットアップ", + "BATTERY_STRING": "バッテリーストリング{{StringNumber}}", + "EMS_BOX_HOME": "EMSボックス({{edgeshortname}}ボックス)", + "EMS_BOX_HECKERT": "EMSボックス" + }, + "PROTOCOL_SYSTEM": { + "FIRSTNAME": "連絡先の名", + "LAST_NAME": "連絡先の姓", + "LOCATION_SAME_AS_ADDRESS": "Bessの場所は顧客の住所と同じですか?", + "TITLE": "ベスの場所" + }, + "STEP_FROM_TO": "ステップ{{From}} from {{to}}", + "STEP_TO": "ステップ{{number}}", + "SYSTEM_UPDATE": { + "UPDATE_WARNING": "バージョンは更新する必要があります!" + }, + "VALUE_WITH_LABEL": "value {{label}} {{number}} {{symbol}}", + "ALIAS_WITH_LABEL": "エイリアス{{label}} {{number}}" + }, + "Login": { + "title": "ログイン", + "preamble": "パスワードを入力するか、デフォルト値を提出してゲストとしてログインしてください。", + "passwordLabel": "パスワード", + "passwordPlaceholder": "パスワード", + "passwordReset": "パスワードのリセット", + "authenticationFailed": "認証に失敗しました", + "user": "ユーザー" + }, + "Menu": { + "aboutUI": "Openemsについて", + "accessLevel": "アクセスレベル", + "edgeSettings": "OpenEMS設定", + "generalSettings": "一般設定", + "index": "索引", + "logout": "サインアウト", + "menu": "メニュー", + "name": "名前", + "overview": "すべてのシステム", + "settings": "設定", + "user": "ユーザー", + "changelog": "Changelog", + "otherUser": "他のユーザー" + }, + "Notifications": { + "authenticationFailed": "接続なし:認証に失敗しました。", + "closed": "接続が閉じた。", + "failed": "接続に失敗しました。", + "loggedIn": "ログインしました。", + "loggedInAs": "「{{value}}」としてログインします。" + }, + "Register": { + "title": "アカウントを作る", + "segment": { + "user": "ユーザー", + "installer": "インストーラ" + }, + "Form": { + "user": { + "acceptPrivacyPolicy": "" + }, + "installer": { + "acceptPrivacyPolicy": "" + }, + "contactDetails": "連絡先の詳細", + "companyName": "会社名", + "firstname": "ファーストネーム", + "lastname": "苗字", + "street": "街", + "zip": "郵便番号", + "city": "街", + "country": "国", + "phone": "電話番号", + "email": "Eメール", + "password": "パスワード", + "confirmPassword": "パスワードを認証する" + }, + "button": "作成", + "errors": { + "requiredFields": "すべてのフィールドに記入してください", + "passwordNotEqual": "パスワードは等しくありません" + }, + "success": "登録に成功" + }, + "Role": { + "guest": "ゲスト", + "owner": "オーナー", + "installer": "インストーラー", + "admin": "管理者" + }, + "SETTINGS": { + "SYSTEM_UPDATE": { + "INSTALLED_VERSION": "インストールバージョン:", + "LATEST_VERISON": "システムは最新のソフトウェアで最新です", + "NEW_VERSION_INSTALLING": "最新バージョンをインストールします", + "NEW_VERSION": "最新バージョン:", + "OFFLINE": "{{edgeshortname}}はオフラインです。", + "RESTARTING": "{{edge}}が再起動しています...", + "UPDATE_NOT_POSSIBLE": "システムを更新できません!", + "UPDATE_PROGRESS": "進行中の更新。", + "UPDATE_SEARCH": "アップデートの確認...", + "UPDATE_TIME": "(これには最大10分かかることがあります)" + } + } +} From 57358f8544f7a79810004a3e313c20ba86be1e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=B6cker?= <39899210+DerStoecki@users.noreply.github.com> Date: Sun, 10 Mar 2024 22:40:31 +0100 Subject: [PATCH 09/28] Backend Alerding SumState: fix periodic onSetSumState doesn't override SumStateSchedule (#2561) OnSetSumState gets send ~every 5min -> the oldMsg would be constantly updated and therefore would never be send. This behaviour is fixed by checking if the oldMsg/scheduled message has the same sumState (warning, fault) as the current SumState reported by the Edge. --- .../io/openems/backend/alerting/handler/SumStateHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java b/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java index 1250ebd0861..61d77a4b2c0 100644 --- a/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java +++ b/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java @@ -144,7 +144,9 @@ protected void addOrUpdate(Edge edge, Level sumState) { this.log.warn(ex.getMessage()); } } else { - oldMsg.setSumState(sumState, this.timeService.now()); + if (oldMsg.getSumState() != sumState) { + oldMsg.setSumState(sumState, this.timeService.now()); + } if (!oldMsg.isEmpty()) { this.msgScheduler.schedule(oldMsg); } From 3ec90b094164afbe70513ba59857c9862211292c Mon Sep 17 00:00:00 2001 From: Kai J <99220919+da-Kai@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:23:56 +0100 Subject: [PATCH 10/28] Update actions (#2570) Co-authored-by: Kai Jeschek --- .github/workflows/build.yml | 12 ++++++------ .github/workflows/docs.yml | 4 ++-- .github/workflows/release.yml | 18 +++++++++--------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 384f6e34d5d..7b04defeffe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,10 +11,10 @@ jobs: build-java: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Java 21 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' @@ -65,7 +65,7 @@ jobs: mkdir -p ./jacoco echo $PR_NUMBER > ./jacoco/jacoco_report_number echo '![Code Coverage]'"(https://img.shields.io/badge/Code%20Coverage-${coverage}%25-${color}?style=flat)" > ./jacoco/jacoco_report_badge - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: jacoco_report path: jacoco/ @@ -73,15 +73,15 @@ jobs: build-ui: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '16' - name: Setup Cache for Node.js - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.npm diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 084afc6e35b..07b07ba9953 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,10 +8,10 @@ jobs: build-docs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Java 21 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cbb08b04024..841b65015f4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,10 +9,10 @@ jobs: build-java: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Java 21 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' @@ -36,7 +36,7 @@ jobs: run: ./gradlew buildEdge buildBackend - name: Save build-artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build-artifacts path: | @@ -46,15 +46,15 @@ jobs: build-ui: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '16' - name: Setup Cache for Node.js - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.npm @@ -80,7 +80,7 @@ jobs: zip -r ../../build/openems-ui.zip ./* - name: Save build-artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build-artifacts path: build/openems-ui.zip @@ -90,13 +90,13 @@ jobs: needs: [build-java, build-ui] steps: - name: Load build-artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-artifacts path: build - name: Create draft Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: draft: true files: | From 2b74e8eabc4f94717c6682dcb9c7db06476ce427 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:50:53 +0100 Subject: [PATCH 11/28] Bump org.jetbrains.kotlin:kotlin-osgi-bundle from 1.9.22 to 1.9.23 in /cnf (#2574) * Bump org.jetbrains.kotlin:kotlin-osgi-bundle in /cnf Bumps org.jetbrains.kotlin:kotlin-osgi-bundle from 1.9.22 to 1.9.23. --- updated-dependencies: - dependency-name: org.jetbrains.kotlin:kotlin-osgi-bundle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 9127d4e3418..e9f30e4c5ba 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -295,7 +295,7 @@ org.jetbrains.kotlin kotlin-osgi-bundle - 1.9.22 + 1.9.23 org.jetbrains.kotlinx diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 7991ea526fa..96434060092 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -111,7 +111,7 @@ org.apache.felix.scr;version='[2.2.10,2.2.11)',\ org.apache.felix.webconsole;version='[5.0.0,5.0.1)',\ org.apache.felix.webconsole.plugins.ds;version='[2.3.0,2.3.1)',\ - org.jetbrains.kotlin.osgi-bundle;version='[1.9.22,1.9.23)',\ + org.jetbrains.kotlin.osgi-bundle;version='[1.9.23,1.9.24)',\ org.jsr-305;version='[3.0.2,3.0.3)',\ org.ops4j.pax.logging.pax-logging-api;version='[2.2.1,2.2.2)',\ org.ops4j.pax.logging.pax-logging-log4j2;version='[2.2.1,2.2.2)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 71a76424057..66290c2f7a6 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -401,7 +401,7 @@ org.eclipse.jetty.io;version='[9.4.28,9.4.29)',\ org.eclipse.jetty.util;version='[9.4.28,9.4.29)',\ org.eclipse.paho.mqttv5.client;version='[1.2.5,1.2.6)',\ - org.jetbrains.kotlin.osgi-bundle;version='[1.9.22,1.9.23)',\ + org.jetbrains.kotlin.osgi-bundle;version='[1.9.23,1.9.24)',\ org.jsoup;version='[1.17.2,1.17.3)',\ org.jsr-305;version='[3.0.2,3.0.3)',\ org.openmuc.jmbus;version='[3.3.0,3.3.1)',\ From b8b644e5f68e24a8290246ec1b57f5e8b8ce46e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:28:28 +0100 Subject: [PATCH 12/28] Bump com.ghgande:j2mod from 3.2.0 to 3.2.1 in /cnf (#2575) * Bump com.ghgande:j2mod from 3.2.0 to 3.2.1 in /cnf Bumps [com.ghgande:j2mod](https://github.com/steveohara/j2mod) from 3.2.0 to 3.2.1. - [Changelog](https://github.com/steveohara/j2mod/blob/development/RELEASE_NOTES.md) - [Commits](https://github.com/steveohara/j2mod/commits) --- updated-dependencies: - dependency-name: com.ghgande:j2mod dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun * Add link to Changelog --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 3 ++- io.openems.edge.application/EdgeApp.bndrun | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index e9f30e4c5ba..c8095ebf1da 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -20,9 +20,10 @@ 2.9.3 + com.ghgande j2mod - 3.2.0 + 3.2.1 com.github.rzymek diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 66290c2f7a6..6c61ed1f42b 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -191,8 +191,8 @@ bcpkix;version='[1.70.0,1.70.1)',\ bcprov;version='[1.70.0,1.70.1)',\ bcutil;version='[1.70.0,1.70.1)',\ - com.fazecast.jSerialComm;version='[2.9.3,2.9.4)',\ - com.ghgande.j2mod;version='[3.2.0,3.2.1)',\ + com.fazecast.jSerialComm;version='[2.10.4,2.10.5)',\ + com.ghgande.j2mod;version='[3.2.1,3.2.2)',\ com.google.gson;version='[2.10.1,2.10.2)',\ com.google.guava;version='[33.0.0,33.0.1)',\ com.google.guava.failureaccess;version='[1.0.2,1.0.3)',\ From d98329e0c947be5a24105a6f0908d44dc3489a2e Mon Sep 17 00:00:00 2001 From: Hannes Date: Thu, 14 Mar 2024 15:55:30 +0100 Subject: [PATCH 13/28] Update coding-guidelines.adoc (#2576) --- doc/modules/ROOT/pages/contribute/coding-guidelines.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc b/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc index a9e1eb5fa4b..b48fa6f3b90 100644 --- a/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc +++ b/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc @@ -61,7 +61,7 @@ Use Eclipse checkstyle plugin `Eclipse-cs`. Install it with Configure it with -* Eclipse -> Window -> Preferences -> New -> +* Eclipse -> Window -> Preferences -> Checkstyle -> New -> ** Type: `Project Relative Configuration` ** Name: `OpenEMS` ** Location: `/cnf/checkstyle.xml` From 0a10b0b0242132ca5c7fbad6c260e0208a2ab068 Mon Sep 17 00:00:00 2001 From: Kai J <99220919+da-Kai@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:26:25 +0100 Subject: [PATCH 14/28] CI: Docker Workflow (#2568) Build and Release Docker images on tag events. --- .github/workflows/docker.yml | 88 +++++++++++++++++++ .gitignore | 8 +- .gitpod.yml | 6 +- tools/docker/README.md | 14 ++- tools/docker/backend/Dockerfile | 37 ++++++++ tools/docker/backend/README.md | 80 +++++++++++++++++ tools/docker/backend/docker-compose.yml | 46 ++++++++++ .../s6-overlay/s6-rc.d/init-adduser/branding | 8 ++ .../dependencies.d/init-migrations} | 0 .../etc/s6-overlay/s6-rc.d/init-adduser/run | 22 +++++ .../etc/s6-overlay/s6-rc.d/init-adduser/type | 1 + .../etc/s6-overlay/s6-rc.d/init-adduser/up | 1 + .../dependencies.d/init-os-end} | 0 .../s6-overlay/s6-rc.d/init-permissions/run | 7 ++ .../s6-overlay/s6-rc.d/init-permissions/type | 1 + .../s6-overlay/s6-rc.d/init-permissions/up | 1 + .../dependencies.d/init-services | 0 .../svc-openems-backend/notification-fd | 1 + .../s6-rc.d/svc-openems-backend/run | 7 ++ .../s6-rc.d/svc-openems-backend/type | 1 + .../s6-rc.d/user/contents.d/init-permissions | 0 .../user/contents.d/svc-openems-backend | 0 .../opt/openems/config/Edge/Websocket.config | 5 ++ .../opt/openems/config/Metadata/File.config | 3 + .../opt/openems/config/Timedata/Dummy.config | 3 + .../opt/openems/config/Ui/Websocket.config | 5 ++ .../root/var/opt/openems/metadata.json | 14 +++ tools/docker/edge/Dockerfile | 37 ++++++++ tools/docker/edge/README.md | 38 ++++++++ tools/docker/edge/docker-compose.yml | 34 +++++++ .../s6-overlay/s6-rc.d/init-adduser/branding | 8 ++ .../dependencies.d/init-migrations | 0 .../etc/s6-overlay/s6-rc.d/init-adduser/run | 22 +++++ .../etc/s6-overlay/s6-rc.d/init-adduser/type | 1 + .../etc/s6-overlay/s6-rc.d/init-adduser/up | 1 + .../dependencies.d/init-os-end | 0 .../s6-overlay/s6-rc.d/init-permissions/run | 7 ++ .../s6-overlay/s6-rc.d/init-permissions/type | 1 + .../s6-overlay/s6-rc.d/init-permissions/up | 1 + .../dependencies.d/init-services | 0 .../s6-rc.d/svc-openems-edge/notification-fd | 1 + .../s6-overlay/s6-rc.d/svc-openems-edge/run | 7 ++ .../s6-overlay/s6-rc.d/svc-openems-edge/type | 1 + .../s6-rc.d/user/contents.d/init-permissions | 0 .../s6-rc.d/user/contents.d/svc-openems-edge | 0 .../Controller/Api/Websocket/default.config | 8 ++ .../AllAlphabetically/default.config | 9 ++ tools/docker/openems-backend/.atom-build.yml | 1 - ...3f3cb2d-d3ed-4000-b7b3-2d0b2af69b64.config | 8 -- tools/docker/ui/Dockerfile | 40 +++++++++ tools/docker/ui/README.md | 25 ++++++ tools/docker/ui/assets/env.template.js | 6 ++ .../ui/root/defaults/nginx/dhparams.pem | 13 +++ .../ui/root/defaults/nginx/openems-nginx.conf | 79 +++++++++++++++++ .../defaults/nginx/site-confs/openems.conf | 16 ++++ tools/docker/ui/root/defaults/nginx/ssl.conf | 36 ++++++++ tools/docker/ui/root/etc/nginx/nginx.conf | 1 + .../s6-overlay/s6-rc.d/init-adduser/branding | 8 ++ .../dependencies.d/init-migrations | 0 .../etc/s6-overlay/s6-rc.d/init-adduser/run | 22 +++++ .../etc/s6-overlay/s6-rc.d/init-adduser/type | 1 + .../etc/s6-overlay/s6-rc.d/init-adduser/up | 1 + .../init-config/dependencies.d/init-nginx-end | 0 .../init-folders/dependencies.d/init-os-end | 0 .../etc/s6-overlay/s6-rc.d/init-folders/run | 11 +++ .../etc/s6-overlay/s6-rc.d/init-folders/type | 1 + .../etc/s6-overlay/s6-rc.d/init-folders/up | 1 + .../init-keygen/dependencies.d/init-nginx | 0 .../etc/s6-overlay/s6-rc.d/init-keygen/run | 13 +++ .../etc/s6-overlay/s6-rc.d/init-keygen/type | 1 + .../etc/s6-overlay/s6-rc.d/init-keygen/up | 1 + .../dependencies.d/init-permissions | 0 .../s6-overlay/s6-rc.d/init-nginx-end/type | 1 + .../etc/s6-overlay/s6-rc.d/init-nginx-end/up | 1 + .../init-nginx/dependencies.d/init-folders | 0 .../etc/s6-overlay/s6-rc.d/init-nginx/run | 18 ++++ .../etc/s6-overlay/s6-rc.d/init-nginx/type | 1 + .../root/etc/s6-overlay/s6-rc.d/init-nginx/up | 1 + .../dependencies.d/init-keygen | 0 .../s6-overlay/s6-rc.d/init-permissions/run | 10 +++ .../s6-overlay/s6-rc.d/init-permissions/type | 1 + .../s6-overlay/s6-rc.d/init-permissions/up | 1 + .../dependencies.d/init-services | 0 .../s6-rc.d/svc-openems-ui/notification-fd | 1 + .../etc/s6-overlay/s6-rc.d/svc-openems-ui/run | 16 ++++ .../s6-overlay/s6-rc.d/svc-openems-ui/type | 1 + .../s6-rc.d/user/contents.d/init-folders | 0 .../s6-rc.d/user/contents.d/init-keygen | 0 .../s6-rc.d/user/contents.d/init-nginx | 0 .../s6-rc.d/user/contents.d/init-nginx-end | 0 .../s6-rc.d/user/contents.d/init-permissions | 0 .../s6-rc.d/user/contents.d/svc-openems-ui | 0 tools/gitpod/README.md | 1 + .../openems-backend/Dockerfile | 3 +- .../openems-backend/README.md | 0 ...554366a-6dc1-4d96-b855-573617e441f6.config | 8 +- ...2954dfb-d429-4e09-b5a8-2bc946643eb4.config | 8 +- .../config.d/Edge/Websocket.config | 6 +- .../config.d/Metadata/Odoo.config | 0 .../config.d/Timedata/Dummy.config | 4 +- .../config.d/Ui/Websocket.config | 6 +- .../config.d/org/ops4j/pax/logging.config | 6 +- ...pache_felix_cm_impl_DynamicBindings.config | 2 +- .../openems-backend/openems-backend.sh | 0 ...8628d01-a978-4328-9a8f-b9c7751ed2d2.config | 28 +++--- ...7b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config | 28 +++--- ...a382062-22d0-40d9-9cbd-006f131ed0dc.config | 20 ++--- ...3718db7-fae4-48ae-b023-dcf6b764c25b.config | 0 ...92f1c86-a9fe-44be-87b4-8f0ace478e55.config | 24 ++--- ...fabbde9-3cee-47e5-ae70-3979a044ce95.config | 12 +-- ...d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config | 20 ++--- ...a5bcfd0-236e-4394-a484-730559795770.config | 26 +++--- ...29d7d91-2b18-4db2-90ba-fd78224d6b0e.config | 36 ++++---- ...e15c5d6-3005-49a4-9a96-68fa5f39740f.config | 18 ++-- ...9edc02f-a52c-48b7-9243-99a2a95df120.config | 20 ++--- ...0dfc174-ae49-445e-b293-69658074a54f.config | 20 ++--- ...e1a31c2-3d4a-4746-8085-ee1ec1d23383.config | 20 ++--- ...201ea0c-aab9-48e3-b979-49d4391fc924.config | 20 ++--- ...8b3db03-493d-49a2-a060-b9f7c18357e0.config | 22 ++--- ...e8b44bb-9be7-4afe-8569-b04c51f125c0.config | 16 ++-- ...214028b-a418-4b8e-a926-6e4e8317b4e3.config | 14 +-- ...0fc5c07-36e1-41f1-a5ea-770c1e4195e0.config | 20 ++--- ...5ec21fa-6763-4a27-b1e0-58265bc2ee46.config | 20 ++--- ...9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config | 20 ++--- .../config.d/org/ops4j/pax/logging.config | 14 +-- ...pache_felix_cm_impl_DynamicBindings.config | 2 +- tools/gitpod/openems-edge/data/.gitignore | 0 .../{docker => gitpod}/openems-ui/Dockerfile | 0 tools/gitpod/openems-ui/m/.gitignore | 0 .../{docker => gitpod}/openems-ui/m/README.md | 0 .../{docker => gitpod}/openems-ui/nginx.conf | 0 ui/angular.json | 24 +++++ ui/src/index.html | 3 + .../openems/environments/backend-docker.ts | 13 +++ .../openems/environments/edge-docker.ts | 13 +++ 135 files changed, 1140 insertions(+), 249 deletions(-) create mode 100644 .github/workflows/docker.yml create mode 100644 tools/docker/backend/Dockerfile create mode 100644 tools/docker/backend/README.md create mode 100644 tools/docker/backend/docker-compose.yml create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/branding rename tools/docker/{openems-edge/data/.gitignore => backend/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations} (100%) create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/run create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/type create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/up rename tools/docker/{openems-ui/m/.gitignore => backend/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-os-end} (100%) create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/run create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/type create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/up create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/dependencies.d/init-services create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/notification-fd create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/run create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/type create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions create mode 100644 tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-backend create mode 100644 tools/docker/backend/root/var/opt/openems/config/Edge/Websocket.config create mode 100644 tools/docker/backend/root/var/opt/openems/config/Metadata/File.config create mode 100644 tools/docker/backend/root/var/opt/openems/config/Timedata/Dummy.config create mode 100644 tools/docker/backend/root/var/opt/openems/config/Ui/Websocket.config create mode 100644 tools/docker/backend/root/var/opt/openems/metadata.json create mode 100644 tools/docker/edge/Dockerfile create mode 100644 tools/docker/edge/README.md create mode 100644 tools/docker/edge/docker-compose.yml create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/branding create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/run create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/type create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/up create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-os-end create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/run create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/type create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/up create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/dependencies.d/init-services create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/notification-fd create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/run create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/type create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions create mode 100644 tools/docker/edge/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-edge create mode 100644 tools/docker/edge/root/var/opt/openems/config/Controller/Api/Websocket/default.config create mode 100644 tools/docker/edge/root/var/opt/openems/config/Scheduler/AllAlphabetically/default.config delete mode 100644 tools/docker/openems-backend/.atom-build.yml delete mode 100644 tools/docker/openems-edge/config.d/Controller/Io/FixDigitalOutput/c3f3cb2d-d3ed-4000-b7b3-2d0b2af69b64.config create mode 100644 tools/docker/ui/Dockerfile create mode 100644 tools/docker/ui/README.md create mode 100644 tools/docker/ui/assets/env.template.js create mode 100644 tools/docker/ui/root/defaults/nginx/dhparams.pem create mode 100644 tools/docker/ui/root/defaults/nginx/openems-nginx.conf create mode 100644 tools/docker/ui/root/defaults/nginx/site-confs/openems.conf create mode 100644 tools/docker/ui/root/defaults/nginx/ssl.conf create mode 100644 tools/docker/ui/root/etc/nginx/nginx.conf create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/branding create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/run create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/type create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/up create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-config/dependencies.d/init-nginx-end create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/dependencies.d/init-os-end create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/run create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/type create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/up create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/dependencies.d/init-nginx create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/run create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/type create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/up create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/dependencies.d/init-permissions create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/type create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/up create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/dependencies.d/init-folders create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/run create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/type create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/up create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-keygen create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/run create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/type create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/up create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/dependencies.d/init-services create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/notification-fd create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/run create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/type create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-folders create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-keygen create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-nginx create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-nginx-end create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions create mode 100644 tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-ui create mode 100644 tools/gitpod/README.md rename tools/{docker => gitpod}/openems-backend/Dockerfile (88%) rename tools/{docker => gitpod}/openems-backend/README.md (100%) rename tools/{docker => gitpod}/openems-backend/config.d/Backend2Backend/Rest/4554366a-6dc1-4d96-b855-573617e441f6.config (97%) rename tools/{docker => gitpod}/openems-backend/config.d/Backend2Backend/Websocket/e2954dfb-d429-4e09-b5a8-2bc946643eb4.config (97%) rename tools/{docker => gitpod}/openems-backend/config.d/Edge/Websocket.config (96%) rename tools/{docker => gitpod}/openems-backend/config.d/Metadata/Odoo.config (100%) rename tools/{docker => gitpod}/openems-backend/config.d/Timedata/Dummy.config (97%) rename tools/{docker => gitpod}/openems-backend/config.d/Ui/Websocket.config (96%) rename tools/{docker => gitpod}/openems-backend/config.d/org/ops4j/pax/logging.config (97%) rename tools/{docker => gitpod}/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config (98%) rename tools/{docker => gitpod}/openems-backend/openems-backend.sh (100%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/Api/Backend/28628d01-a978-4328-9a8f-b9c7751ed2d2.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/Api/Rest/ReadOnly/fa382062-22d0-40d9-9cbd-006f131ed0dc.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/Api/Websocket/13718db7-fae4-48ae-b023-dcf6b764c25b.config (100%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/CHP/SoC/c92f1c86-a9fe-44be-87b4-8f0ace478e55.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/Debug/Log/6fabbde9-3cee-47e5-ae70-3979a044ce95.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/Ess/LimitTotalDischarge/5d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/IO/ChannelSingleThreshold/ca5bcfd0-236e-4394-a484-730559795770.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/IO/HeatingElement/b29d7d91-2b18-4db2-90ba-fd78224d6b0e.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/Scheduler/AllAlphabetically/99edc02f-a52c-48b7-9243-99a2a95df120.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/Datasource/Single/Direct/80dfc174-ae49-445e-b293-69658074a54f.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/Datasource/Single/Direct/be1a31c2-3d4a-4746-8085-ee1ec1d23383.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/Datasource/Single/Direct/d201ea0c-aab9-48e3-b979-49d4391fc924.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/EssSymmetric/Reacting/e8b3db03-493d-49a2-a060-b9f7c18357e0.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/GridMeter/Reacting/ce8b44bb-9be7-4afe-8569-b04c51f125c0.config (96%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/IO/DigitalInputOutput/0214028b-a418-4b8e-a926-6e4e8317b4e3.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/NRCMeter/Acting/40fc5c07-36e1-41f1-a5ea-770c1e4195e0.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/ProductionMeter/Acting/b5ec21fa-6763-4a27-b1e0-58265bc2ee46.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/Simulator/ProductionMeter/Acting/f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config (97%) rename tools/{docker => gitpod}/openems-edge/config.d/org/ops4j/pax/logging.config (98%) rename tools/{docker => gitpod}/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config (98%) create mode 100644 tools/gitpod/openems-edge/data/.gitignore rename tools/{docker => gitpod}/openems-ui/Dockerfile (100%) create mode 100644 tools/gitpod/openems-ui/m/.gitignore rename tools/{docker => gitpod}/openems-ui/m/README.md (100%) rename tools/{docker => gitpod}/openems-ui/nginx.conf (100%) create mode 100644 ui/src/themes/openems/environments/backend-docker.ts create mode 100644 ui/src/themes/openems/environments/edge-docker.ts diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000000..37698ef7701 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,88 @@ +name: Build OpenEMS Docker Image + +on: + push: + branches: + - develop + - main + tags: + - "*.*.*" + +jobs: + docker: + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + image: [edge, backend, ui-edge, ui-backend] + include: + - image: edge + dockerfile: tools/docker/edge/Dockerfile + args: "" + - image: ui-edge + dockerfile: tools/docker/ui/Dockerfile + args: "VERSION=openems,openems-edge-docker" + - image: backend + dockerfile: tools/docker/backend/Dockerfile + args: "" + - image: ui-backend + dockerfile: tools/docker/ui/Dockerfile + args: "VERSION=openems,openems-backend-docker" + permissions: + packages: write + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Get cleaned branch name + id: clean_name + run: | + REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\///' -e 's/release\/v//') + echo "branch=${REF_NAME}-test" >> "$GITHUB_OUTPUT" + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.REPOSITORY_OWNER }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: | + openems/${{ matrix.image }} + ghcr.io/openems/${{ matrix.image }} + labels: | + org.opencontainers.image.authors=OpenEMS + org.opencontainers.image.title=OpenEMS ${{ matrix.image }} + org.opencontainers.image.vendor=OpenEMS + tags: | + type=semver,pattern={{version}} + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} + type=raw,value=develop,enable=${{ github.ref == 'refs/heads/develop' }} + + - name: Build and push Docker images + uses: docker/build-push-action@v5 + with: + file: ${{ matrix.dockerfile }} + platforms: linux/amd64, linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: ${{ matrix.args }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index c0bb0bee6f5..1fd6e4ec521 100644 --- a/.gitignore +++ b/.gitignore @@ -218,10 +218,10 @@ gradle-app.setting # docs /doc/build/package-lock.json -# tools (docker) build Directories -/tools/docker/openems-backend/build -/tools/docker/openems-edge/build -/tools/docker/openems-ui/build +# tools (gitpod) build Directories +/tools/gitpod/openems-backend/build +/tools/gitpod/openems-edge/build +/tools/gitpod/openems-ui/build .atom-build.yml # OpenEMS temp files diff --git a/.gitpod.yml b/.gitpod.yml index 54481a73d07..5fcbc3ca0c8 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -7,14 +7,14 @@ tasks: ./gradlew build buildBackend -x test rm /tmp/.gradle-lock command: java - -Dfelix.cm.dir=$(pwd)/tools/docker/openems-backend/config.d + -Dfelix.cm.dir=$(pwd)/tools/gitpod/openems-backend/config.d -jar build/openems-backend.jar - init: | sleep 10 && while [ -f /tmp/.gradle-lock ]; do sleep 1; done ./gradlew build buildEdge -x test command: java - -Dfelix.cm.dir=$(pwd)/tools/docker/openems-edge/config.d - -Dopenems.data.dir=$(pwd)/tools/docker/openems-edge/data + -Dfelix.cm.dir=$(pwd)/tools/gitpod/openems-edge/config.d + -Dopenems.data.dir=$(pwd)/tools/gitpod/openems-edge/data -jar build/openems-edge.jar - init: cd ui && npm install command: ng serve diff --git a/tools/docker/README.md b/tools/docker/README.md index 7cb64b33ad1..00cac2c24f4 100644 --- a/tools/docker/README.md +++ b/tools/docker/README.md @@ -1 +1,13 @@ -This directory contains example Dockerfiles \ No newline at end of file +# How to use OpenEMS docker images. + +## Backend + +### see [Backend/README.md](./backend/README.md) + +## Edge + +### see [Edge/README.md](./edge/README.md) + +## UI + +### see [UI/README.md](./ui/README.md) \ No newline at end of file diff --git a/tools/docker/backend/Dockerfile b/tools/docker/backend/Dockerfile new file mode 100644 index 00000000000..17611fd2992 --- /dev/null +++ b/tools/docker/backend/Dockerfile @@ -0,0 +1,37 @@ +ARG JAVA_VERSION=21 + +### Build backend binary +FROM --platform=$BUILDPLATFORM eclipse-temurin:${JAVA_VERSION}-alpine AS build_backend + +WORKDIR /src +RUN --mount=type=bind,target=.,readwrite \ + --mount=type=cache,target=/root/.gradle \ + ./gradlew --no-build-cache assemble && \ + ./gradlew --no-build-cache buildBackend && \ + cp build/openems-backend.jar /opt + +### Build jar container base +FROM ghcr.io/linuxserver/baseimage-alpine:edge AS base_container + +ARG JAVA_VERSION + +RUN wget -O /etc/apk/keys/adoptium.rsa.pub https://packages.adoptium.net/artifactory/api/security/keypair/public/repositories/apk && \ + echo 'https://packages.adoptium.net/artifactory/apk/alpine/main' >> /etc/apk/repositories + +RUN apk update && apk upgrade + +RUN apk add --no-cache \ + temurin-${JAVA_VERSION}-jre + +### Build backend container +FROM base_container + +COPY --from=build_backend /opt/ /opt/openems/ +COPY tools/docker/backend/root/ / + +RUN find /etc/s6-overlay/s6-rc.d -type f -name 'run' -exec chmod +x {} \; + +VOLUME /var/opt/openems/config +VOLUME /var/opt/openems/data + +EXPOSE 8079 8081 8082 \ No newline at end of file diff --git a/tools/docker/backend/README.md b/tools/docker/backend/README.md new file mode 100644 index 00000000000..259f8b5c14d --- /dev/null +++ b/tools/docker/backend/README.md @@ -0,0 +1,80 @@ +# How to use OpenEMS Backend docker image: + +- [How to use OpenEMS Backend docker image:](#how-to-use-openems-backend-docker-image) + - [Start openems docker containers](#start-openems-docker-containers) + - [With docker compose](#with-docker-compose) + - [Setup Container](#setup-container) + - [Setup Timedata.InfluxDB](#setup-timedatainfluxdb) + - [Build your own OpenEMS Backend docker image](#build-your-own-openems-backend-docker-image) + + +## Start openems docker containers + +### With docker compose +1. **Copy [docker-compose.yml](./docker-compose.yml) to a directory of your choice.** + +2. **Typ the following command in the directory where the [docker-compose.yml](./docker-compose.yml) file is located.** + + ```bash + docker compose up -d + ``` + +3. **Access OpenEMS in your browser.** + + | | | + | ------- | ---------------------------------------------- | + | Backend | http://localhost:8079/system/console/configMgr | + | UI | http://localhost:80/ + +## Setup Container +### Setup Timedata.InfluxDB + +1. **Setup InfluxDB** + + ```bash + docker exec openems_influxdb influx setup \ + --username openems \ + --password WKeuIhl0deIJjrjoY62M \ + --org openems.io \ + --bucket openems \ + --force + ``` + + ```bash + docker exec openems_influxdb influx auth list + ``` + + *⚠️ Note down **Token*** + +2. **Open Backend [Apache-Felix](http://localhost:8079/system/console/configMgr).** + +3. **Remove Timedata.Dummy** + +4. **Add Timedata.InfluxDB** + + *⚠️ Values not specified can be left at their default values* + + | Timedata.InfluxDB | | + | ----------------- | ---------------------------- | + | Query Language | INFLUX_QL | + | URL | http://openems_influxdb:8086 | + | Org | openems.io | + | ApiKey | *InfluxDB-Token* | + | Bucket | openems | + +---- +*for further information see [OpenEMS docs](https://openems.github.io/openems.io/openems/latest/introduction.html)* + +## Build your own OpenEMS Backend docker image + +1. **Go into the root directory of the OpenEMS project.** + +2. **View or Change [Dockerfile](./Dockerfile)** + +3. **Type the following build command.** + + ```bash + docker build . -t openems_backend -f tools/docker/backend/Dockerfile + ``` + + *for UI Image see [ui/README.md](../ui/README.md)* diff --git a/tools/docker/backend/docker-compose.yml b/tools/docker/backend/docker-compose.yml new file mode 100644 index 00000000000..ab441363358 --- /dev/null +++ b/tools/docker/backend/docker-compose.yml @@ -0,0 +1,46 @@ +version: "3" + +services: + openems_backend: + image: openems/backend:latest + container_name: openems_backend + hostname: openems_backend + restart: unless-stopped + volumes: + - openems-backend-conf:/var/opt/openems/config:rw + - openems-backend-data:/var/opt/openems/data:rw + ports: + - 8079:8079 # Apache-Felix + - 8081:8081 # Edge-Websocket + - 8082:8082 # UI-Websocket + + openems-ui: + image: openems/ui-backend:latest + container_name: openems_ui + hostname: openems_ui + restart: unless-stopped + volumes: + - openems-ui-conf:/etc/nginx:rw + - openems-ui-log:/var/log/nginx:rw + environment: + - UI_WEBSOCKET=ws://localhost:8082 + ports: + - 80:80 + - 443:443 + + openems_influxdb: + image: influxdb:alpine + container_name: openems_influxdb + hostname: openems_influxdb + restart: unless-stopped + volumes: + - openems-influxdb:/var/lib/influxdb2:rw + ports: + - 8086:8086 + +volumes: + openems-backend-conf: + openems-backend-data: + openems-ui-conf: + openems-ui-log: + openems-influxdb: \ No newline at end of file diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/branding b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/branding new file mode 100644 index 00000000000..88500263f1c --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/branding @@ -0,0 +1,8 @@ +─────────────────────────────────────────── + _____ _____ _____ _____ _____ _____ _____ +| | _ | __| | | __| | __| +| | | __| __| | | | __| | | |__ | +|_____|__| |_____|_|___|_____|_|_|_|_____| + + Based on images from linuxserver.io +─────────────────────────────────────────── \ No newline at end of file diff --git a/tools/docker/openems-edge/data/.gitignore b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations similarity index 100% rename from tools/docker/openems-edge/data/.gitignore rename to tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/run b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/run new file mode 100644 index 00000000000..702c82437e1 --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/run @@ -0,0 +1,22 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +PUID=${PUID:-911} +PGID=${PGID:-911} + +groupmod -o -g "$PGID" abc +usermod -o -u "$PUID" abc + +cat /etc/s6-overlay/s6-rc.d/init-adduser/branding + +echo " +for further information visit: +https://openems.io/ + +─────────────────────────────────────── +GID/UID: $(id -g abc)/$(id -u abc) +───────────────────────────────────────" + +lsiown abc:abc /app +lsiown abc:abc /config +lsiown abc:abc /defaults \ No newline at end of file diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/type b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/type new file mode 100644 index 00000000000..3d92b15f2d5 --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/type @@ -0,0 +1 @@ +oneshot \ No newline at end of file diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/up b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/up new file mode 100644 index 00000000000..53c63386a19 --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-adduser/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-adduser/run \ No newline at end of file diff --git a/tools/docker/openems-ui/m/.gitignore b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-os-end similarity index 100% rename from tools/docker/openems-ui/m/.gitignore rename to tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-os-end diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/run b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/run new file mode 100644 index 00000000000..c4cfd249a2e --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/run @@ -0,0 +1,7 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +# permissions +lsiown -R abc:abc \ + /var/opt/openems \ + /opt/openems diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/type b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/type new file mode 100644 index 00000000000..bdd22a1850a --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/type @@ -0,0 +1 @@ +oneshot diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/up b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/up new file mode 100644 index 00000000000..81bfce3adc4 --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/init-permissions/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-permissions/run diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/dependencies.d/init-services b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/dependencies.d/init-services new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/notification-fd b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/notification-fd new file mode 100644 index 00000000000..00750edc07d --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/notification-fd @@ -0,0 +1 @@ +3 diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/run b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/run new file mode 100644 index 00000000000..3e780fa1ce8 --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/run @@ -0,0 +1,7 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +exec \ + s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z 127.0.0.1 8079" \ + s6-setuidgid abc \ + /usr/bin/java -jar -Dfelix.cm.dir=/var/opt/openems/config -Dopenems.data.dir=/var/opt/openems/data /opt/openems/openems-backend.jar diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/type b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/type new file mode 100644 index 00000000000..5883cff0cd1 --- /dev/null +++ b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/svc-openems-backend/type @@ -0,0 +1 @@ +longrun diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-backend b/tools/docker/backend/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-backend new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/backend/root/var/opt/openems/config/Edge/Websocket.config b/tools/docker/backend/root/var/opt/openems/config/Edge/Websocket.config new file mode 100644 index 00000000000..6a651a8a2ad --- /dev/null +++ b/tools/docker/backend/root/var/opt/openems/config/Edge/Websocket.config @@ -0,0 +1,5 @@ +:org.apache.felix.configadmin.revision:=L"1" +debugMode="OFF" +poolSize=I"10" +port=I"8081" +service.pid="Edge.Websocket" \ No newline at end of file diff --git a/tools/docker/backend/root/var/opt/openems/config/Metadata/File.config b/tools/docker/backend/root/var/opt/openems/config/Metadata/File.config new file mode 100644 index 00000000000..3c48c3a7168 --- /dev/null +++ b/tools/docker/backend/root/var/opt/openems/config/Metadata/File.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +path="/var/opt/openems/metadata.json" +service.pid="Metadata.File" \ No newline at end of file diff --git a/tools/docker/backend/root/var/opt/openems/config/Timedata/Dummy.config b/tools/docker/backend/root/var/opt/openems/config/Timedata/Dummy.config new file mode 100644 index 00000000000..4db19ea6f29 --- /dev/null +++ b/tools/docker/backend/root/var/opt/openems/config/Timedata/Dummy.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +id="timedata0" +service.pid="Timedata.Dummy" \ No newline at end of file diff --git a/tools/docker/backend/root/var/opt/openems/config/Ui/Websocket.config b/tools/docker/backend/root/var/opt/openems/config/Ui/Websocket.config new file mode 100644 index 00000000000..e249f28eb23 --- /dev/null +++ b/tools/docker/backend/root/var/opt/openems/config/Ui/Websocket.config @@ -0,0 +1,5 @@ +:org.apache.felix.configadmin.revision:=L"2" +debugMode="OFF" +poolSize=I"10" +port=I"8082" +service.pid="Ui.Websocket" \ No newline at end of file diff --git a/tools/docker/backend/root/var/opt/openems/metadata.json b/tools/docker/backend/root/var/opt/openems/metadata.json new file mode 100644 index 00000000000..9060f9a25b5 --- /dev/null +++ b/tools/docker/backend/root/var/opt/openems/metadata.json @@ -0,0 +1,14 @@ +{ + edges: { + edge0: { + apikey: "d92IC4eEHyrqmiMab6GX", + setuppassword: "3rzEK9pAqV8iApe7twvy", + comment: "OpenEMS Demo Edge" + }, + edge1: { + apikey: "9O8SAilNKoyYPs8ESUF5", + setuppassword: "R2SKRnE4W5Z7qOTwcZ2m", + comment: "OpenEMS Demo Edge" + } + } +} \ No newline at end of file diff --git a/tools/docker/edge/Dockerfile b/tools/docker/edge/Dockerfile new file mode 100644 index 00000000000..79cdc2946fd --- /dev/null +++ b/tools/docker/edge/Dockerfile @@ -0,0 +1,37 @@ +ARG JAVA_VERSION=21 + +### Build edge binary +FROM --platform=$BUILDPLATFORM eclipse-temurin:${JAVA_VERSION}-alpine AS build_edge + +WORKDIR /src +RUN --mount=type=bind,target=.,readwrite \ + --mount=type=cache,target=/root/.gradle \ + ./gradlew --no-build-cache assemble && \ + ./gradlew --no-build-cache buildEdge && \ + cp build/openems-edge.jar /opt/ + +### Build jar container base +FROM ghcr.io/linuxserver/baseimage-alpine:edge AS base_container + +ARG JAVA_VERSION + +RUN wget -O /etc/apk/keys/adoptium.rsa.pub https://packages.adoptium.net/artifactory/api/security/keypair/public/repositories/apk && \ + echo 'https://packages.adoptium.net/artifactory/apk/alpine/main' >> /etc/apk/repositories + +RUN apk update && apk upgrade + +RUN apk add --no-cache \ + temurin-${JAVA_VERSION}-jre + +### Build edge container +FROM base_container + +COPY --from=build_edge /opt/ /opt/openems/ +COPY tools/docker/edge/root/ / + +RUN find /etc/s6-overlay/s6-rc.d -type f -name 'run' -exec chmod +x {} \; + +VOLUME /var/opt/openems/config +VOLUME /var/opt/openems/data + +EXPOSE 8080 8085 \ No newline at end of file diff --git a/tools/docker/edge/README.md b/tools/docker/edge/README.md new file mode 100644 index 00000000000..441b234c9a4 --- /dev/null +++ b/tools/docker/edge/README.md @@ -0,0 +1,38 @@ +# How to use OpenEMS Edge docker image: + +- [How to use OpenEMS Edge docker image:](#how-to-use-openems-edge-docker-image) + - [Start openems docker containers](#start-openems-docker-containers) + - [With docker compose](#with-docker-compose) + - [Build your own OpenEMS Edge docker image](#build-your-own-openems-edge-docker-image) + +## Start openems docker containers + +### With docker compose +1. **Copy [docker-compose.yml](./docker-compose.yml) to a directory of your choice.** + +2. **Typ the following command in the directory where the [docker-compose.yml](./docker-compose.yml) file is located.** + + ```bash + docker compose up -d + ``` + +3. **Access OpenEMS in your browser.** + + | | | + | ----- | ---------------------------------------------- | + | Edge: | http://localhost:8080/system/console/configMgr | + | UI | http://localhost:80/ | + +## Build your own OpenEMS Edge docker image + +1. **Go into the root directory of the OpenEMS project.** + +2. **View or Change [Dockerfile](./Dockerfile)** + +3. **Type the following build commands.** + + ```bash + docker build . -t openems_edge -f tools/docker/edge/Dockerfile + ``` + + *for UI Image see [ui/README.md](../ui/README.md)* \ No newline at end of file diff --git a/tools/docker/edge/docker-compose.yml b/tools/docker/edge/docker-compose.yml new file mode 100644 index 00000000000..ae6647d2fc3 --- /dev/null +++ b/tools/docker/edge/docker-compose.yml @@ -0,0 +1,34 @@ +version: "3" + +services: + openems-edge: + image: openems/edge:latest + container_name: openems_edge + hostname: openems_edge + restart: unless-stopped + volumes: + - openems-edge-conf:/var/opt/openems/config:rw + - openems-edge-data:/var/opt/openems/data:rw + ports: + - 8080:8080 # Apache-Felix + - 8085:8085 # UI-Websocket + + openems-ui: + image: openems/ui-edge:latest + container_name: openems_ui + hostname: openems_ui + restart: unless-stopped + volumes: + - openems-ui-conf:/etc/nginx:rw + - openems-ui-log:/var/log/nginx:rw + environment: + - UI_WEBSOCKET=ws://localhost:8085 + ports: + - 80:80 + - 443:443 + +volumes: + openems-edge-conf: + openems-edge-data: + openems-ui-conf: + openems-ui-log: \ No newline at end of file diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/branding b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/branding new file mode 100644 index 00000000000..88500263f1c --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/branding @@ -0,0 +1,8 @@ +─────────────────────────────────────────── + _____ _____ _____ _____ _____ _____ _____ +| | _ | __| | | __| | __| +| | | __| __| | | | __| | | |__ | +|_____|__| |_____|_|___|_____|_|_|_|_____| + + Based on images from linuxserver.io +─────────────────────────────────────────── \ No newline at end of file diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/run b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/run new file mode 100644 index 00000000000..702c82437e1 --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/run @@ -0,0 +1,22 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +PUID=${PUID:-911} +PGID=${PGID:-911} + +groupmod -o -g "$PGID" abc +usermod -o -u "$PUID" abc + +cat /etc/s6-overlay/s6-rc.d/init-adduser/branding + +echo " +for further information visit: +https://openems.io/ + +─────────────────────────────────────── +GID/UID: $(id -g abc)/$(id -u abc) +───────────────────────────────────────" + +lsiown abc:abc /app +lsiown abc:abc /config +lsiown abc:abc /defaults \ No newline at end of file diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/type b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/type new file mode 100644 index 00000000000..3d92b15f2d5 --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/type @@ -0,0 +1 @@ +oneshot \ No newline at end of file diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/up b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/up new file mode 100644 index 00000000000..53c63386a19 --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-adduser/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-adduser/run \ No newline at end of file diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-os-end b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-os-end new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/run b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/run new file mode 100644 index 00000000000..312c3298da0 --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/run @@ -0,0 +1,7 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +# permissions +lsiown -R abc:abc \ + /opt/openems \ + /var/opt/openems diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/type b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/type new file mode 100644 index 00000000000..bdd22a1850a --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/type @@ -0,0 +1 @@ +oneshot diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/up b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/up new file mode 100644 index 00000000000..81bfce3adc4 --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/init-permissions/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-permissions/run diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/dependencies.d/init-services b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/dependencies.d/init-services new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/notification-fd b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/notification-fd new file mode 100644 index 00000000000..00750edc07d --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/notification-fd @@ -0,0 +1 @@ +3 diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/run b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/run new file mode 100644 index 00000000000..c9b2a00c590 --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/run @@ -0,0 +1,7 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +exec \ + s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z 127.0.0.1 8080" \ + s6-setuidgid abc \ + /usr/bin/java -jar -Dfelix.cm.dir=/var/opt/openems/config -Dopenems.data.dir=/var/opt/openems/data /opt/openems/openems-edge.jar diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/type b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/type new file mode 100644 index 00000000000..5883cff0cd1 --- /dev/null +++ b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/svc-openems-edge/type @@ -0,0 +1 @@ +longrun diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-edge b/tools/docker/edge/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-edge new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/edge/root/var/opt/openems/config/Controller/Api/Websocket/default.config b/tools/docker/edge/root/var/opt/openems/config/Controller/Api/Websocket/default.config new file mode 100644 index 00000000000..3a080ad1fce --- /dev/null +++ b/tools/docker/edge/root/var/opt/openems/config/Controller/Api/Websocket/default.config @@ -0,0 +1,8 @@ +:org.apache.felix.configadmin.revision:=L"1" +alias="" +apiTimeout=I"60" +enabled=B"true" +id="ctrlApiWebsocket0" +port=I"8085" +service.factoryPid="Controller.Api.Websocket" +service.pid="Controller.Api.Websocket.default" \ No newline at end of file diff --git a/tools/docker/edge/root/var/opt/openems/config/Scheduler/AllAlphabetically/default.config b/tools/docker/edge/root/var/opt/openems/config/Scheduler/AllAlphabetically/default.config new file mode 100644 index 00000000000..a31389b2dec --- /dev/null +++ b/tools/docker/edge/root/var/opt/openems/config/Scheduler/AllAlphabetically/default.config @@ -0,0 +1,9 @@ +:org.apache.felix.configadmin.revision:=L"2" +alias="" +controllers.ids=[ \ + "", \ + ] +enabled=B"true" +id="scheduler0" +service.factoryPid="Scheduler.AllAlphabetically" +service.pid="Scheduler.AllAlphabetically.default" \ No newline at end of file diff --git a/tools/docker/openems-backend/.atom-build.yml b/tools/docker/openems-backend/.atom-build.yml deleted file mode 100644 index 7222bc7bd2d..00000000000 --- a/tools/docker/openems-backend/.atom-build.yml +++ /dev/null @@ -1 +0,0 @@ -cmd: "docker build -t stromdao/openems-backend .;docker push stromdao/openems-backend" diff --git a/tools/docker/openems-edge/config.d/Controller/Io/FixDigitalOutput/c3f3cb2d-d3ed-4000-b7b3-2d0b2af69b64.config b/tools/docker/openems-edge/config.d/Controller/Io/FixDigitalOutput/c3f3cb2d-d3ed-4000-b7b3-2d0b2af69b64.config deleted file mode 100644 index 755e04f0176..00000000000 --- a/tools/docker/openems-edge/config.d/Controller/Io/FixDigitalOutput/c3f3cb2d-d3ed-4000-b7b3-2d0b2af69b64.config +++ /dev/null @@ -1,8 +0,0 @@ -:org.apache.felix.configadmin.revision:=L"4" -alias="Control\ Manually" -enabled=B"true" -id="ctrlIoFixDigitalOutput0" -isOn=B"false" -outputChannelAddress="io0/InputOutput1" -service.factoryPid="Controller.Io.FixDigitalOutput" -service.pid="Controller.Io.FixDigitalOutput.c3f3cb2d-d3ed-4000-b7b3-2d0b2af69b64" diff --git a/tools/docker/ui/Dockerfile b/tools/docker/ui/Dockerfile new file mode 100644 index 00000000000..644ba1bee6d --- /dev/null +++ b/tools/docker/ui/Dockerfile @@ -0,0 +1,40 @@ +ARG NODE=20 +ARG VERSION + +### Build ui files +FROM --platform=$BUILDPLATFORM node:${NODE}-alpine AS build_ui + +ARG VERSION + +RUN apk update && apk upgrade; + +COPY ui/ /src/ + +WORKDIR /src + +RUN npm install && \ + node_modules/.bin/ng build -c "$VERSION"; + +### Build ui base +FROM ghcr.io/linuxserver/baseimage-alpine:edge AS ui_base + +RUN apk update && apk upgrade + +RUN apk add --no-cache \ + nginx openssl + +### Build ui container +FROM ui_base + +COPY --from=build_ui /src/target/ /var/www/html/openems/ +COPY tools/docker/ui/assets/ /var/www/html/openems/assets/ +COPY tools/docker/ui/root/ / + +RUN find /etc/s6-overlay/s6-rc.d -type f -name 'run' -exec chmod +x {} \; + +VOLUME /etc/nginx +VOLUME /var/log/nginx + +ENV UI_WEBSOCKET ws://localhost:8080 + +EXPOSE 80 443 \ No newline at end of file diff --git a/tools/docker/ui/README.md b/tools/docker/ui/README.md new file mode 100644 index 00000000000..91e08787a42 --- /dev/null +++ b/tools/docker/ui/README.md @@ -0,0 +1,25 @@ +# How to use OpenEMS UI docker image + +## Start openems docker containers + +### With docker compose + +see [backend/README.md](../backend/README.md) and [edge/README.md](../edge/README.md) respectively. + +## Build your own OpenEMS UI image + +1. **Go into the root directory of the OpenEMS project.** + +2. **View or Change [Dockerfile](./Dockerfile)** + +3. **Type the following build command.** + + *Edge* + ```bash + docker build . -t openems_ui-edge -f tools/docker/ui/Dockerfile --build-arg VERSION=openems,openems-edge-docker + ``` + --- + *Backend* + ```bash + docker build . -t openems_ui-backend -f tools/docker/ui/Dockerfile --build-arg VERSION=openems,openems-backend-docker + ``` \ No newline at end of file diff --git a/tools/docker/ui/assets/env.template.js b/tools/docker/ui/assets/env.template.js new file mode 100644 index 00000000000..4f8e2c33be4 --- /dev/null +++ b/tools/docker/ui/assets/env.template.js @@ -0,0 +1,6 @@ +(function(window) { + window[\"env\"] = window[\"env\"] || {}; + + // Environment variables + window[\"env\"][\"websocket\"] = \"${UI_WEBSOCKET}\"; +})(this); \ No newline at end of file diff --git a/tools/docker/ui/root/defaults/nginx/dhparams.pem b/tools/docker/ui/root/defaults/nginx/dhparams.pem new file mode 100644 index 00000000000..3cf0fcbc011 --- /dev/null +++ b/tools/docker/ui/root/defaults/nginx/dhparams.pem @@ -0,0 +1,13 @@ +-----BEGIN DH PARAMETERS----- +MIICCAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz ++8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a +87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7 +YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi +7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD +ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3 +7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32 +nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e +8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx +iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K +zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CAQI= +-----END DH PARAMETERS----- diff --git a/tools/docker/ui/root/defaults/nginx/openems-nginx.conf b/tools/docker/ui/root/defaults/nginx/openems-nginx.conf new file mode 100644 index 00000000000..aca4e067f37 --- /dev/null +++ b/tools/docker/ui/root/defaults/nginx/openems-nginx.conf @@ -0,0 +1,79 @@ +# /etc/nginx/openems-nginx.conf +# Based on alpine defaults +# https://git.alpinelinux.org/aports/tree/main/nginx/nginx.conf?h=3.15-stable + +user abc; + +# Set number of worker processes automatically based on number of CPU cores. +worker_processes auto; + +# Enables the use of JIT for regular expressions to speed-up their processing. +pcre_jit on; + +# Configures default error logger. +error_log /var/log/nginx/error.log warn; + +# Includes files with directives to load dynamic modules. +include /etc/nginx/modules/*.conf; + +# Include files with config snippets into the root context. +include /etc/nginx/conf.d/*.conf; + +events { + # The maximum number of simultaneous connections that can be opened by + # a worker process. + worker_connections 1024; +} + +http { + # Includes mapping of file name extensions to MIME types of responses + # and defines the default type. + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # Don't tell nginx version to the clients. Default is 'on'. + server_tokens off; + + # Specifies the maximum accepted body size of a client request, as + # indicated by the request header Content-Length. If the stated content + # length is greater than this size, then the client receives the HTTP + # error code 413. Set to 0 to disable. Default is '1m'. + client_max_body_size 0; + + # Sendfile copies data between one FD and other from within the kernel, + # which is more efficient than read() + write(). Default is off. + sendfile on; + + # Causes nginx to attempt to send its HTTP response head in one packet, + # instead of using partial frames. Default is 'off'. + tcp_nopush on; + + # all ssl related config moved to ssl.conf + # included in server blocks where listen 443 is defined + + # Enable gzipping of responses. + #gzip on; + + # Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'. + gzip_vary on; + + # Helper variable for proxying websockets. + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + # Specifies the main log format. + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + # Sets the path, format, and configuration for a buffered log write. + access_log /var/log/nginx/access.log main; + + # Includes virtual hosts configs. + include /etc/nginx/site-confs/*.conf; +} + +daemon off; +pid /run/nginx.pid; diff --git a/tools/docker/ui/root/defaults/nginx/site-confs/openems.conf b/tools/docker/ui/root/defaults/nginx/site-confs/openems.conf new file mode 100644 index 00000000000..55fb049c8f3 --- /dev/null +++ b/tools/docker/ui/root/defaults/nginx/site-confs/openems.conf @@ -0,0 +1,16 @@ +server { + listen 80 default_server; + listen [::]:80 default_server; + + server_name openems openems.local localhost; + + root /var/www/html/openems; + + index index.html; + + # OpenEMS Web-Interface + location / { + try_files $uri $uri/ /index.html; + error_page 404 300 /index.html; + } +} \ No newline at end of file diff --git a/tools/docker/ui/root/defaults/nginx/ssl.conf b/tools/docker/ui/root/defaults/nginx/ssl.conf new file mode 100644 index 00000000000..bb171cd9c05 --- /dev/null +++ b/tools/docker/ui/root/defaults/nginx/ssl.conf @@ -0,0 +1,36 @@ +### Mozilla Recommendations +# generated 2023-06-25, Mozilla Guideline v5.7, nginx 1.24.0, OpenSSL 3.1.1, intermediate configuration +# https://ssl-config.mozilla.org/#server=nginx&version=1.24.0&config=intermediate&openssl=3.1.1&guideline=5.7 + +ssl_certificate /etc/nginx/keys/cert.crt; +ssl_certificate_key /etc/nginx/keys/cert.key; +ssl_session_timeout 1d; +ssl_session_cache shared:MozSSL:10m; # about 40000 sessions +ssl_session_tickets off; + +ssl_dhparam /etc/nginx/dhparams.pem; + +# intermediate configuration +ssl_protocols TLSv1.2 TLSv1.3; +ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; +ssl_prefer_server_ciphers off; + +# HSTS (ngx_http_headers_module is required) (63072000 seconds) +#add_header Strict-Transport-Security "max-age=63072000" always; + +# OCSP stapling +#ssl_stapling on; +#ssl_stapling_verify on; + +# verify chain of trust of OCSP response using Root CA and Intermediate certs +#ssl_trusted_certificate /etc/nginx/keys/cert.crt; + +# Optional additional headers +#add_header Cache-Control "no-transform" always; +#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'"; +#add_header Permissions-Policy "interest-cohort=()"; +#add_header Referrer-Policy "same-origin" always; +#add_header X-Content-Type-Options "nosniff" always; +#add_header X-Frame-Options "SAMEORIGIN" always; +#add_header X-UA-Compatible "IE=Edge" always; +#add_header X-XSS-Protection "1; mode=block" always; diff --git a/tools/docker/ui/root/etc/nginx/nginx.conf b/tools/docker/ui/root/etc/nginx/nginx.conf new file mode 100644 index 00000000000..fab0903a355 --- /dev/null +++ b/tools/docker/ui/root/etc/nginx/nginx.conf @@ -0,0 +1 @@ +include /etc/nginx/openems-nginx.conf; \ No newline at end of file diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/branding b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/branding new file mode 100644 index 00000000000..88500263f1c --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/branding @@ -0,0 +1,8 @@ +─────────────────────────────────────────── + _____ _____ _____ _____ _____ _____ _____ +| | _ | __| | | __| | __| +| | | __| __| | | | __| | | |__ | +|_____|__| |_____|_|___|_____|_|_|_|_____| + + Based on images from linuxserver.io +─────────────────────────────────────────── \ No newline at end of file diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/dependencies.d/init-migrations new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/run b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/run new file mode 100644 index 00000000000..702c82437e1 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/run @@ -0,0 +1,22 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +PUID=${PUID:-911} +PGID=${PGID:-911} + +groupmod -o -g "$PGID" abc +usermod -o -u "$PUID" abc + +cat /etc/s6-overlay/s6-rc.d/init-adduser/branding + +echo " +for further information visit: +https://openems.io/ + +─────────────────────────────────────── +GID/UID: $(id -g abc)/$(id -u abc) +───────────────────────────────────────" + +lsiown abc:abc /app +lsiown abc:abc /config +lsiown abc:abc /defaults \ No newline at end of file diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/type b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/type new file mode 100644 index 00000000000..3d92b15f2d5 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/type @@ -0,0 +1 @@ +oneshot \ No newline at end of file diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/up b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/up new file mode 100644 index 00000000000..53c63386a19 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-adduser/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-adduser/run \ No newline at end of file diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-config/dependencies.d/init-nginx-end b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-config/dependencies.d/init-nginx-end new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/dependencies.d/init-os-end b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/dependencies.d/init-os-end new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/run b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/run new file mode 100644 index 00000000000..0eed67a30ec --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/run @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +# make folders +mkdir -p \ + /etc/nginx/keys \ + /etc/nginx/site-confs \ + /var/log/nginx \ + /run \ + /var/lib/nginx/tmp/client_body \ + /var/tmp/nginx diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/type b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/type new file mode 100644 index 00000000000..bdd22a1850a --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/type @@ -0,0 +1 @@ +oneshot diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/up b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/up new file mode 100644 index 00000000000..0fb7dc7de6b --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-folders/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-folders/run diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/dependencies.d/init-nginx b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/dependencies.d/init-nginx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/run b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/run new file mode 100644 index 00000000000..49a7dcc5a6a --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/run @@ -0,0 +1,13 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +SUBJECT="/C=DE/ST=HH/L=Hamburg/O=openems.io/OU=OPENEMS Server/CN=*" +if [[ -f /etc/nginx/keys/cert.key && -f /etc/nginx/keys/cert.crt ]]; then + echo "using keys found in /etc/nginx/keys" +else + echo "generating self-signed keys in /etc/nginx/keys, you can replace these with your own keys if required" + rm -f \ + /etc/nginx/keys/cert.key \ + /etc/nginx/keys/cert.crt || true + openssl req -new -x509 -days 3650 -nodes -out /etc/nginx/keys/cert.crt -keyout /etc/nginx/keys/cert.key -subj "$SUBJECT" +fi diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/type b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/type new file mode 100644 index 00000000000..bdd22a1850a --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/type @@ -0,0 +1 @@ +oneshot diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/up b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/up new file mode 100644 index 00000000000..cacd3ec7389 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-keygen/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-keygen/run diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/dependencies.d/init-permissions b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/dependencies.d/init-permissions new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/type b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/type new file mode 100644 index 00000000000..bdd22a1850a --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/type @@ -0,0 +1 @@ +oneshot diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/up b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/up new file mode 100644 index 00000000000..4357f0df1e9 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx-end/up @@ -0,0 +1 @@ +# This file doesn't do anything, it's just the end of the nginx base init process diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/dependencies.d/init-folders b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/dependencies.d/init-folders new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/run b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/run new file mode 100644 index 00000000000..d7b910bc995 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/run @@ -0,0 +1,18 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +# copy default config files if they don't exist +cp -nrv /defaults/nginx/* /etc/nginx/ + +# generate env file +env_template="/var/www/html/openems/assets/env.template.js" +env_file="/var/www/html/openems/assets/env.js" +eval "cat <<< \"$(<$env_template)\"" 2> /dev/null > $env_file; + +# copy pre-generated dhparams or generate if needed +if [[ ! -f /etc/nginx/dhparams.pem ]]; then + cp /defaults/nginx/dhparams.pem.sample /etc/nginx/dhparams.pem +fi +if ! grep -q 'PARAMETERS' "/etc/nginx/dhparams.pem"; then + curl -o /etc/nginx/dhparams.pem -L "https://ssl-config.mozilla.org/ffdhe4096.txt" +fi diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/type b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/type new file mode 100644 index 00000000000..bdd22a1850a --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/type @@ -0,0 +1 @@ +oneshot diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/up b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/up new file mode 100644 index 00000000000..b3b5b494b53 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-nginx/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-nginx/run diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-keygen b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/dependencies.d/init-keygen new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/run b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/run new file mode 100644 index 00000000000..6a669ee2f66 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/run @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +# permissions +lsiown -R abc:abc \ + /var/lib/nginx \ + /var/tmp/nginx \ + /etc/nginx \ + /var/log \ + /var/www/html diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/type b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/type new file mode 100644 index 00000000000..bdd22a1850a --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/type @@ -0,0 +1 @@ +oneshot diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/up b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/up new file mode 100644 index 00000000000..81bfce3adc4 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/init-permissions/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-permissions/run diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/dependencies.d/init-services b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/dependencies.d/init-services new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/notification-fd b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/notification-fd new file mode 100644 index 00000000000..00750edc07d --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/notification-fd @@ -0,0 +1 @@ +3 diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/run b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/run new file mode 100644 index 00000000000..067f031404d --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/run @@ -0,0 +1,16 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +if pgrep -f "[n]ginx:" >/dev/null; then + echo "Zombie nginx processes detected, sending SIGTERM" + pkill -ef [n]ginx: + sleep 1 +fi + +if pgrep -f "[n]ginx:" >/dev/null; then + echo "Zombie nginx processes still active, sending SIGKILL" + pkill -9 -ef [n]ginx: + sleep 1 +fi + +exec /usr/sbin/nginx diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/type b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/type new file mode 100644 index 00000000000..5883cff0cd1 --- /dev/null +++ b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/svc-openems-ui/type @@ -0,0 +1 @@ +longrun diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-folders b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-folders new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-keygen b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-keygen new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-nginx b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-nginx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-nginx-end b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-nginx-end new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/init-permissions new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-ui b/tools/docker/ui/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openems-ui new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/gitpod/README.md b/tools/gitpod/README.md new file mode 100644 index 00000000000..0eddbcd683e --- /dev/null +++ b/tools/gitpod/README.md @@ -0,0 +1 @@ +This directory contains configs for gitpod \ No newline at end of file diff --git a/tools/docker/openems-backend/Dockerfile b/tools/gitpod/openems-backend/Dockerfile similarity index 88% rename from tools/docker/openems-backend/Dockerfile rename to tools/gitpod/openems-backend/Dockerfile index d7f9c989b47..211c6c4a7d2 100644 --- a/tools/docker/openems-backend/Dockerfile +++ b/tools/gitpod/openems-backend/Dockerfile @@ -9,8 +9,7 @@ RUN apt-get install -y --no-install-recommends software-properties-common curl RUN curl -sL https://repos.influxdata.com/influxdb.key | apt-key add - RUN add-apt-repository -y ppa:openjdk-r/ppa RUN apt-get update -RUN apt-get install -y openjdk-17-jdk -RUN apt-get install -y openjdk-17-jre +RUN apt-get install -y openjdk-21-jdk RUN apt-get install -y influxdb RUN update-alternatives --config java RUN update-alternatives --config javac diff --git a/tools/docker/openems-backend/README.md b/tools/gitpod/openems-backend/README.md similarity index 100% rename from tools/docker/openems-backend/README.md rename to tools/gitpod/openems-backend/README.md diff --git a/tools/docker/openems-backend/config.d/Backend2Backend/Rest/4554366a-6dc1-4d96-b855-573617e441f6.config b/tools/gitpod/openems-backend/config.d/Backend2Backend/Rest/4554366a-6dc1-4d96-b855-573617e441f6.config similarity index 97% rename from tools/docker/openems-backend/config.d/Backend2Backend/Rest/4554366a-6dc1-4d96-b855-573617e441f6.config rename to tools/gitpod/openems-backend/config.d/Backend2Backend/Rest/4554366a-6dc1-4d96-b855-573617e441f6.config index 16ac35c2613..882e4710487 100644 --- a/tools/docker/openems-backend/config.d/Backend2Backend/Rest/4554366a-6dc1-4d96-b855-573617e441f6.config +++ b/tools/gitpod/openems-backend/config.d/Backend2Backend/Rest/4554366a-6dc1-4d96-b855-573617e441f6.config @@ -1,4 +1,4 @@ -:org.apache.felix.configadmin.revision:=L"1" -port=I"8075" -service.factoryPid="Backend2Backend.Rest" -service.pid="Backend2Backend.Rest.4554366a-6dc1-4d96-b855-573617e441f6" +:org.apache.felix.configadmin.revision:=L"1" +port=I"8075" +service.factoryPid="Backend2Backend.Rest" +service.pid="Backend2Backend.Rest.4554366a-6dc1-4d96-b855-573617e441f6" diff --git a/tools/docker/openems-backend/config.d/Backend2Backend/Websocket/e2954dfb-d429-4e09-b5a8-2bc946643eb4.config b/tools/gitpod/openems-backend/config.d/Backend2Backend/Websocket/e2954dfb-d429-4e09-b5a8-2bc946643eb4.config similarity index 97% rename from tools/docker/openems-backend/config.d/Backend2Backend/Websocket/e2954dfb-d429-4e09-b5a8-2bc946643eb4.config rename to tools/gitpod/openems-backend/config.d/Backend2Backend/Websocket/e2954dfb-d429-4e09-b5a8-2bc946643eb4.config index 6512e8bc11d..e284c98720f 100644 --- a/tools/docker/openems-backend/config.d/Backend2Backend/Websocket/e2954dfb-d429-4e09-b5a8-2bc946643eb4.config +++ b/tools/gitpod/openems-backend/config.d/Backend2Backend/Websocket/e2954dfb-d429-4e09-b5a8-2bc946643eb4.config @@ -1,4 +1,4 @@ -:org.apache.felix.configadmin.revision:=L"1" -port=I"8076" -service.factoryPid="Backend2Backend.Websocket" -service.pid="Backend2Backend.Websocket.e2954dfb-d429-4e09-b5a8-2bc946643eb4" +:org.apache.felix.configadmin.revision:=L"1" +port=I"8076" +service.factoryPid="Backend2Backend.Websocket" +service.pid="Backend2Backend.Websocket.e2954dfb-d429-4e09-b5a8-2bc946643eb4" diff --git a/tools/docker/openems-backend/config.d/Edge/Websocket.config b/tools/gitpod/openems-backend/config.d/Edge/Websocket.config similarity index 96% rename from tools/docker/openems-backend/config.d/Edge/Websocket.config rename to tools/gitpod/openems-backend/config.d/Edge/Websocket.config index a051596bfec..2e18ccb8c07 100644 --- a/tools/docker/openems-backend/config.d/Edge/Websocket.config +++ b/tools/gitpod/openems-backend/config.d/Edge/Websocket.config @@ -1,3 +1,3 @@ -:org.apache.felix.configadmin.revision:=L"1" -port=I"8081" -service.pid="Edge.Websocket" +:org.apache.felix.configadmin.revision:=L"1" +port=I"8081" +service.pid="Edge.Websocket" diff --git a/tools/docker/openems-backend/config.d/Metadata/Odoo.config b/tools/gitpod/openems-backend/config.d/Metadata/Odoo.config similarity index 100% rename from tools/docker/openems-backend/config.d/Metadata/Odoo.config rename to tools/gitpod/openems-backend/config.d/Metadata/Odoo.config diff --git a/tools/docker/openems-backend/config.d/Timedata/Dummy.config b/tools/gitpod/openems-backend/config.d/Timedata/Dummy.config similarity index 97% rename from tools/docker/openems-backend/config.d/Timedata/Dummy.config rename to tools/gitpod/openems-backend/config.d/Timedata/Dummy.config index 1d55c6fcefe..be5a68a8140 100644 --- a/tools/docker/openems-backend/config.d/Timedata/Dummy.config +++ b/tools/gitpod/openems-backend/config.d/Timedata/Dummy.config @@ -1,2 +1,2 @@ -:org.apache.felix.configadmin.revision:=L"1" -service.pid="Timedata.Dummy" +:org.apache.felix.configadmin.revision:=L"1" +service.pid="Timedata.Dummy" diff --git a/tools/docker/openems-backend/config.d/Ui/Websocket.config b/tools/gitpod/openems-backend/config.d/Ui/Websocket.config similarity index 96% rename from tools/docker/openems-backend/config.d/Ui/Websocket.config rename to tools/gitpod/openems-backend/config.d/Ui/Websocket.config index 0ea48d45a26..277deb50b4d 100644 --- a/tools/docker/openems-backend/config.d/Ui/Websocket.config +++ b/tools/gitpod/openems-backend/config.d/Ui/Websocket.config @@ -1,3 +1,3 @@ -:org.apache.felix.configadmin.revision:=L"1" -port=I"8082" -service.pid="Ui.Websocket" +:org.apache.felix.configadmin.revision:=L"1" +port=I"8082" +service.pid="Ui.Websocket" diff --git a/tools/docker/openems-backend/config.d/org/ops4j/pax/logging.config b/tools/gitpod/openems-backend/config.d/org/ops4j/pax/logging.config similarity index 97% rename from tools/docker/openems-backend/config.d/org/ops4j/pax/logging.config rename to tools/gitpod/openems-backend/config.d/org/ops4j/pax/logging.config index 11460ecdfaf..99e79c9618e 100644 --- a/tools/docker/openems-backend/config.d/org/ops4j/pax/logging.config +++ b/tools/gitpod/openems-backend/config.d/org/ops4j/pax/logging.config @@ -1,3 +1,3 @@ -:org.apache.felix.configadmin.revision:=L"1" -_felix_.cm.newConfiguration=B"true" -service.pid="org.ops4j.pax.logging" +:org.apache.felix.configadmin.revision:=L"1" +_felix_.cm.newConfiguration=B"true" +service.pid="org.ops4j.pax.logging" diff --git a/tools/docker/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config b/tools/gitpod/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config similarity index 98% rename from tools/docker/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config rename to tools/gitpod/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config index 066e2c4ab85..8977e092dd1 100644 --- a/tools/docker/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config +++ b/tools/gitpod/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config @@ -1 +1 @@ -org.ops4j.pax.logging="jar/pax-logging-log4j1-2.0.5.jar" +org.ops4j.pax.logging="jar/pax-logging-log4j1-2.0.5.jar" diff --git a/tools/docker/openems-backend/openems-backend.sh b/tools/gitpod/openems-backend/openems-backend.sh similarity index 100% rename from tools/docker/openems-backend/openems-backend.sh rename to tools/gitpod/openems-backend/openems-backend.sh diff --git a/tools/docker/openems-edge/config.d/Controller/Api/Backend/28628d01-a978-4328-9a8f-b9c7751ed2d2.config b/tools/gitpod/openems-edge/config.d/Controller/Api/Backend/28628d01-a978-4328-9a8f-b9c7751ed2d2.config similarity index 96% rename from tools/docker/openems-edge/config.d/Controller/Api/Backend/28628d01-a978-4328-9a8f-b9c7751ed2d2.config rename to tools/gitpod/openems-edge/config.d/Controller/Api/Backend/28628d01-a978-4328-9a8f-b9c7751ed2d2.config index 7323e3aa7ce..2f4c46cdfb0 100644 --- a/tools/docker/openems-edge/config.d/Controller/Api/Backend/28628d01-a978-4328-9a8f-b9c7751ed2d2.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Api/Backend/28628d01-a978-4328-9a8f-b9c7751ed2d2.config @@ -1,14 +1,14 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="" -apiTimeout=I"60" -apikey="DEMO_API_KEY" -debug=B"false" -enabled=B"true" -id="ctrlBackend0" -noOfCycles=I"10" -proxyAddress="" -proxyPort=I"0" -proxyType="HTTP" -service.factoryPid="Controller.Api.Backend" -service.pid="Controller.Api.Backend.28628d01-a978-4328-9a8f-b9c7751ed2d2" -uri="ws://localhost:8081" +:org.apache.felix.configadmin.revision:=L"1" +alias="" +apiTimeout=I"60" +apikey="DEMO_API_KEY" +debug=B"false" +enabled=B"true" +id="ctrlBackend0" +noOfCycles=I"10" +proxyAddress="" +proxyPort=I"0" +proxyType="HTTP" +service.factoryPid="Controller.Api.Backend" +service.pid="Controller.Api.Backend.28628d01-a978-4328-9a8f-b9c7751ed2d2" +uri="ws://localhost:8081" diff --git a/tools/docker/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config b/tools/gitpod/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config similarity index 97% rename from tools/docker/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config rename to tools/gitpod/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config index c9131becb95..6c21fe32014 100644 --- a/tools/docker/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config @@ -1,14 +1,14 @@ -:org.apache.felix.configadmin.revision:=L"3" -Component.target="(&(enabled\=true)(!(service.pid\=Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146))(|(id\=_sum)))" -_lastChangeAt="2020-09-15T19:21:03" -_lastChangeBy="UNDEFINED" -alias="" -component.ids=[ \ - "_sum", \ - ] -enabled=B"false" -id="ctrlApiModbusTcp0" -maxConcurrentConnections=I"5" -port=I"502" -service.factoryPid="Controller.Api.ModbusTcp.ReadOnly" -service.pid="Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146" +:org.apache.felix.configadmin.revision:=L"3" +Component.target="(&(enabled\=true)(!(service.pid\=Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146))(|(id\=_sum)))" +_lastChangeAt="2020-09-15T19:21:03" +_lastChangeBy="UNDEFINED" +alias="" +component.ids=[ \ + "_sum", \ + ] +enabled=B"false" +id="ctrlApiModbusTcp0" +maxConcurrentConnections=I"5" +port=I"502" +service.factoryPid="Controller.Api.ModbusTcp.ReadOnly" +service.pid="Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146" diff --git a/tools/docker/openems-edge/config.d/Controller/Api/Rest/ReadOnly/fa382062-22d0-40d9-9cbd-006f131ed0dc.config b/tools/gitpod/openems-edge/config.d/Controller/Api/Rest/ReadOnly/fa382062-22d0-40d9-9cbd-006f131ed0dc.config similarity index 96% rename from tools/docker/openems-edge/config.d/Controller/Api/Rest/ReadOnly/fa382062-22d0-40d9-9cbd-006f131ed0dc.config rename to tools/gitpod/openems-edge/config.d/Controller/Api/Rest/ReadOnly/fa382062-22d0-40d9-9cbd-006f131ed0dc.config index bd8612827b3..701e8487eb6 100644 --- a/tools/docker/openems-edge/config.d/Controller/Api/Rest/ReadOnly/fa382062-22d0-40d9-9cbd-006f131ed0dc.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Api/Rest/ReadOnly/fa382062-22d0-40d9-9cbd-006f131ed0dc.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"1" -_lastChangeAt="2020-09-15T19:21:03" -_lastChangeBy="UNDEFINED" -alias="" -debugMode=B"false" -enabled=B"true" -id="ctrlApiRest0" -port=I"8084" -service.factoryPid="Controller.Api.Rest.ReadOnly" -service.pid="Controller.Api.Rest.ReadOnly.fa382062-22d0-40d9-9cbd-006f131ed0dc" +:org.apache.felix.configadmin.revision:=L"1" +_lastChangeAt="2020-09-15T19:21:03" +_lastChangeBy="UNDEFINED" +alias="" +debugMode=B"false" +enabled=B"true" +id="ctrlApiRest0" +port=I"8084" +service.factoryPid="Controller.Api.Rest.ReadOnly" +service.pid="Controller.Api.Rest.ReadOnly.fa382062-22d0-40d9-9cbd-006f131ed0dc" diff --git a/tools/docker/openems-edge/config.d/Controller/Api/Websocket/13718db7-fae4-48ae-b023-dcf6b764c25b.config b/tools/gitpod/openems-edge/config.d/Controller/Api/Websocket/13718db7-fae4-48ae-b023-dcf6b764c25b.config similarity index 100% rename from tools/docker/openems-edge/config.d/Controller/Api/Websocket/13718db7-fae4-48ae-b023-dcf6b764c25b.config rename to tools/gitpod/openems-edge/config.d/Controller/Api/Websocket/13718db7-fae4-48ae-b023-dcf6b764c25b.config diff --git a/tools/docker/openems-edge/config.d/Controller/CHP/SoC/c92f1c86-a9fe-44be-87b4-8f0ace478e55.config b/tools/gitpod/openems-edge/config.d/Controller/CHP/SoC/c92f1c86-a9fe-44be-87b4-8f0ace478e55.config similarity index 96% rename from tools/docker/openems-edge/config.d/Controller/CHP/SoC/c92f1c86-a9fe-44be-87b4-8f0ace478e55.config rename to tools/gitpod/openems-edge/config.d/Controller/CHP/SoC/c92f1c86-a9fe-44be-87b4-8f0ace478e55.config index aae0c115e2e..ba77e20e643 100644 --- a/tools/docker/openems-edge/config.d/Controller/CHP/SoC/c92f1c86-a9fe-44be-87b4-8f0ace478e55.config +++ b/tools/gitpod/openems-edge/config.d/Controller/CHP/SoC/c92f1c86-a9fe-44be-87b4-8f0ace478e55.config @@ -1,12 +1,12 @@ -:org.apache.felix.configadmin.revision:=L"4" -alias="Control\ CHP\ (BHKW)" -enabled=B"true" -highThreshold=I"80" -id="ctrlChpSoc0" -inputChannelAddress="_sum/EssSoc" -invert=B"false" -lowThreshold=I"20" -mode="AUTOMATIC" -outputChannelAddress="io0/InputOutput2" -service.factoryPid="Controller.CHP.SoC" -service.pid="Controller.CHP.SoC.c92f1c86-a9fe-44be-87b4-8f0ace478e55" +:org.apache.felix.configadmin.revision:=L"4" +alias="Control\ CHP\ (BHKW)" +enabled=B"true" +highThreshold=I"80" +id="ctrlChpSoc0" +inputChannelAddress="_sum/EssSoc" +invert=B"false" +lowThreshold=I"20" +mode="AUTOMATIC" +outputChannelAddress="io0/InputOutput2" +service.factoryPid="Controller.CHP.SoC" +service.pid="Controller.CHP.SoC.c92f1c86-a9fe-44be-87b4-8f0ace478e55" diff --git a/tools/docker/openems-edge/config.d/Controller/Debug/Log/6fabbde9-3cee-47e5-ae70-3979a044ce95.config b/tools/gitpod/openems-edge/config.d/Controller/Debug/Log/6fabbde9-3cee-47e5-ae70-3979a044ce95.config similarity index 97% rename from tools/docker/openems-edge/config.d/Controller/Debug/Log/6fabbde9-3cee-47e5-ae70-3979a044ce95.config rename to tools/gitpod/openems-edge/config.d/Controller/Debug/Log/6fabbde9-3cee-47e5-ae70-3979a044ce95.config index f6810715eeb..5bdadebcbb6 100644 --- a/tools/docker/openems-edge/config.d/Controller/Debug/Log/6fabbde9-3cee-47e5-ae70-3979a044ce95.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Debug/Log/6fabbde9-3cee-47e5-ae70-3979a044ce95.config @@ -1,6 +1,6 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="" -enabled=B"true" -id="ctrlDebugLog0" -service.factoryPid="Controller.Debug.Log" -service.pid="Controller.Debug.Log.6fabbde9-3cee-47e5-ae70-3979a044ce95" +:org.apache.felix.configadmin.revision:=L"1" +alias="" +enabled=B"true" +id="ctrlDebugLog0" +service.factoryPid="Controller.Debug.Log" +service.pid="Controller.Debug.Log.6fabbde9-3cee-47e5-ae70-3979a044ce95" diff --git a/tools/docker/openems-edge/config.d/Controller/Ess/LimitTotalDischarge/5d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config b/tools/gitpod/openems-edge/config.d/Controller/Ess/LimitTotalDischarge/5d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config similarity index 96% rename from tools/docker/openems-edge/config.d/Controller/Ess/LimitTotalDischarge/5d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config rename to tools/gitpod/openems-edge/config.d/Controller/Ess/LimitTotalDischarge/5d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config index d1d3b2f2fec..0bbcb7d80cf 100644 --- a/tools/docker/openems-edge/config.d/Controller/Ess/LimitTotalDischarge/5d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Ess/LimitTotalDischarge/5d5d6c32-fd4e-4857-ac8b-31b1d6f23895.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="" -enabled=B"true" -ess.id="ess0" -forceChargePower="" -forceChargeSoc=I"10" -id="ctrlLimitTotalDischarge0" -minSoc=I"15" -service.factoryPid="Controller.Ess.LimitTotalDischarge" -service.pid="Controller.Ess.LimitTotalDischarge.5d5d6c32-fd4e-4857-ac8b-31b1d6f23895" +:org.apache.felix.configadmin.revision:=L"1" +alias="" +enabled=B"true" +ess.id="ess0" +forceChargePower="" +forceChargeSoc=I"10" +id="ctrlLimitTotalDischarge0" +minSoc=I"15" +service.factoryPid="Controller.Ess.LimitTotalDischarge" +service.pid="Controller.Ess.LimitTotalDischarge.5d5d6c32-fd4e-4857-ac8b-31b1d6f23895" diff --git a/tools/docker/openems-edge/config.d/Controller/IO/ChannelSingleThreshold/ca5bcfd0-236e-4394-a484-730559795770.config b/tools/gitpod/openems-edge/config.d/Controller/IO/ChannelSingleThreshold/ca5bcfd0-236e-4394-a484-730559795770.config similarity index 97% rename from tools/docker/openems-edge/config.d/Controller/IO/ChannelSingleThreshold/ca5bcfd0-236e-4394-a484-730559795770.config rename to tools/gitpod/openems-edge/config.d/Controller/IO/ChannelSingleThreshold/ca5bcfd0-236e-4394-a484-730559795770.config index 578edf9ea4f..6d5e8a4b93e 100644 --- a/tools/docker/openems-edge/config.d/Controller/IO/ChannelSingleThreshold/ca5bcfd0-236e-4394-a484-730559795770.config +++ b/tools/gitpod/openems-edge/config.d/Controller/IO/ChannelSingleThreshold/ca5bcfd0-236e-4394-a484-730559795770.config @@ -1,13 +1,13 @@ -:org.apache.felix.configadmin.revision:=L"5" -alias="Control\ by\ Threshold" -enabled=B"true" -id="ctrlChannelSingleThreshold0" -inputChannelAddress="_sum/EssSoc" -invert=B"true" -minimumSwitchingTime=I"60" -mode="AUTOMATIC" -outputChannelAddress="io0/InputOutput0" -service.factoryPid="Controller.IO.ChannelSingleThreshold" -service.pid="Controller.IO.ChannelSingleThreshold.ca5bcfd0-236e-4394-a484-730559795770" -switchedLoadPower=I"0" -threshold=I"40" +:org.apache.felix.configadmin.revision:=L"5" +alias="Control\ by\ Threshold" +enabled=B"true" +id="ctrlChannelSingleThreshold0" +inputChannelAddress="_sum/EssSoc" +invert=B"true" +minimumSwitchingTime=I"60" +mode="AUTOMATIC" +outputChannelAddress="io0/InputOutput0" +service.factoryPid="Controller.IO.ChannelSingleThreshold" +service.pid="Controller.IO.ChannelSingleThreshold.ca5bcfd0-236e-4394-a484-730559795770" +switchedLoadPower=I"0" +threshold=I"40" diff --git a/tools/docker/openems-edge/config.d/Controller/IO/HeatingElement/b29d7d91-2b18-4db2-90ba-fd78224d6b0e.config b/tools/gitpod/openems-edge/config.d/Controller/IO/HeatingElement/b29d7d91-2b18-4db2-90ba-fd78224d6b0e.config similarity index 96% rename from tools/docker/openems-edge/config.d/Controller/IO/HeatingElement/b29d7d91-2b18-4db2-90ba-fd78224d6b0e.config rename to tools/gitpod/openems-edge/config.d/Controller/IO/HeatingElement/b29d7d91-2b18-4db2-90ba-fd78224d6b0e.config index 59807870f77..e2ec14629e1 100644 --- a/tools/docker/openems-edge/config.d/Controller/IO/HeatingElement/b29d7d91-2b18-4db2-90ba-fd78224d6b0e.config +++ b/tools/gitpod/openems-edge/config.d/Controller/IO/HeatingElement/b29d7d91-2b18-4db2-90ba-fd78224d6b0e.config @@ -1,18 +1,18 @@ -:org.apache.felix.configadmin.revision:=L"5" -_lastChangeAt="2020-09-15T19:38:09" -_lastChangeBy="guest:\ Guest" -alias="Control\ Heating\ Element" -defaultLevel="LEVEL_1" -enabled=B"true" -endTime="17:00" -id="ctrlIoHeatingElement0" -minTime=I"1" -minimumSwitchingTime=I"60" -mode="AUTOMATIC" -outputChannelPhaseL1="io0/InputOutput3" -outputChannelPhaseL2="io0/InputOutput4" -outputChannelPhaseL3="io0/InputOutput5" -powerPerPhase=I"2000" -service.factoryPid="Controller.IO.HeatingElement" -service.pid="Controller.IO.HeatingElement.b29d7d91-2b18-4db2-90ba-fd78224d6b0e" -workMode="TIME" +:org.apache.felix.configadmin.revision:=L"5" +_lastChangeAt="2020-09-15T19:38:09" +_lastChangeBy="guest:\ Guest" +alias="Control\ Heating\ Element" +defaultLevel="LEVEL_1" +enabled=B"true" +endTime="17:00" +id="ctrlIoHeatingElement0" +minTime=I"1" +minimumSwitchingTime=I"60" +mode="AUTOMATIC" +outputChannelPhaseL1="io0/InputOutput3" +outputChannelPhaseL2="io0/InputOutput4" +outputChannelPhaseL3="io0/InputOutput5" +powerPerPhase=I"2000" +service.factoryPid="Controller.IO.HeatingElement" +service.pid="Controller.IO.HeatingElement.b29d7d91-2b18-4db2-90ba-fd78224d6b0e" +workMode="TIME" diff --git a/tools/docker/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config b/tools/gitpod/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config similarity index 97% rename from tools/docker/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config rename to tools/gitpod/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config index e50b2ce5d48..7f47aea6211 100644 --- a/tools/docker/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config @@ -1,9 +1,9 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="Self-consumption\ optimization" -enabled=B"true" -ess.id="ess0" -id="ctrlBalancing0" -meter.id="meter0" -service.factoryPid="Controller.Symmetric.Balancing" -service.pid="Controller.Symmetric.Balancing.6e15c5d6-3005-49a4-9a96-68fa5f39740f" -targetGridSetpoint=I"0" +:org.apache.felix.configadmin.revision:=L"1" +alias="Self-consumption\ optimization" +enabled=B"true" +ess.id="ess0" +id="ctrlBalancing0" +meter.id="meter0" +service.factoryPid="Controller.Symmetric.Balancing" +service.pid="Controller.Symmetric.Balancing.6e15c5d6-3005-49a4-9a96-68fa5f39740f" +targetGridSetpoint=I"0" diff --git a/tools/docker/openems-edge/config.d/Scheduler/AllAlphabetically/99edc02f-a52c-48b7-9243-99a2a95df120.config b/tools/gitpod/openems-edge/config.d/Scheduler/AllAlphabetically/99edc02f-a52c-48b7-9243-99a2a95df120.config similarity index 96% rename from tools/docker/openems-edge/config.d/Scheduler/AllAlphabetically/99edc02f-a52c-48b7-9243-99a2a95df120.config rename to tools/gitpod/openems-edge/config.d/Scheduler/AllAlphabetically/99edc02f-a52c-48b7-9243-99a2a95df120.config index 1beb5499f39..de2f0b9ba04 100644 --- a/tools/docker/openems-edge/config.d/Scheduler/AllAlphabetically/99edc02f-a52c-48b7-9243-99a2a95df120.config +++ b/tools/gitpod/openems-edge/config.d/Scheduler/AllAlphabetically/99edc02f-a52c-48b7-9243-99a2a95df120.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"3" -alias="" -controllers.ids=[ \ - "ctrlLimitTotalDischarge0", \ - "ctrlBalancing0", \ - ] -enabled=B"true" -id="scheduler0" -service.factoryPid="Scheduler.AllAlphabetically" -service.pid="Scheduler.AllAlphabetically.99edc02f-a52c-48b7-9243-99a2a95df120" +:org.apache.felix.configadmin.revision:=L"3" +alias="" +controllers.ids=[ \ + "ctrlLimitTotalDischarge0", \ + "ctrlBalancing0", \ + ] +enabled=B"true" +id="scheduler0" +service.factoryPid="Scheduler.AllAlphabetically" +service.pid="Scheduler.AllAlphabetically.99edc02f-a52c-48b7-9243-99a2a95df120" diff --git a/tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/80dfc174-ae49-445e-b293-69658074a54f.config b/tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/80dfc174-ae49-445e-b293-69658074a54f.config similarity index 96% rename from tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/80dfc174-ae49-445e-b293-69658074a54f.config rename to tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/80dfc174-ae49-445e-b293-69658074a54f.config index cb48a4ff316..3d79ebbafe6 100644 --- a/tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/80dfc174-ae49-445e-b293-69658074a54f.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/80dfc174-ae49-445e-b293-69658074a54f.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="Simulated\ PV\ East\ Datasource" -enabled=B"true" -id="datasource2" -service.factoryPid="Simulator.Datasource.Single.Direct" -service.pid="Simulator.Datasource.Single.Direct.80dfc174-ae49-445e-b293-69658074a54f" -timeDelta=I"-1" -values=i[ \ - "2000", \ - ] +:org.apache.felix.configadmin.revision:=L"1" +alias="Simulated\ PV\ East\ Datasource" +enabled=B"true" +id="datasource2" +service.factoryPid="Simulator.Datasource.Single.Direct" +service.pid="Simulator.Datasource.Single.Direct.80dfc174-ae49-445e-b293-69658074a54f" +timeDelta=I"-1" +values=i[ \ + "2000", \ + ] diff --git a/tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/be1a31c2-3d4a-4746-8085-ee1ec1d23383.config b/tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/be1a31c2-3d4a-4746-8085-ee1ec1d23383.config similarity index 96% rename from tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/be1a31c2-3d4a-4746-8085-ee1ec1d23383.config rename to tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/be1a31c2-3d4a-4746-8085-ee1ec1d23383.config index 0493c93d8fc..70aa3f084b3 100644 --- a/tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/be1a31c2-3d4a-4746-8085-ee1ec1d23383.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/be1a31c2-3d4a-4746-8085-ee1ec1d23383.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="Simulated\ Consumption\ Datasource" -enabled=B"true" -id="datasource0" -service.factoryPid="Simulator.Datasource.Single.Direct" -service.pid="Simulator.Datasource.Single.Direct.be1a31c2-3d4a-4746-8085-ee1ec1d23383" -timeDelta=I"-1" -values=i[ \ - "500", \ - ] +:org.apache.felix.configadmin.revision:=L"1" +alias="Simulated\ Consumption\ Datasource" +enabled=B"true" +id="datasource0" +service.factoryPid="Simulator.Datasource.Single.Direct" +service.pid="Simulator.Datasource.Single.Direct.be1a31c2-3d4a-4746-8085-ee1ec1d23383" +timeDelta=I"-1" +values=i[ \ + "500", \ + ] diff --git a/tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/d201ea0c-aab9-48e3-b979-49d4391fc924.config b/tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/d201ea0c-aab9-48e3-b979-49d4391fc924.config similarity index 96% rename from tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/d201ea0c-aab9-48e3-b979-49d4391fc924.config rename to tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/d201ea0c-aab9-48e3-b979-49d4391fc924.config index b2e631a8a5e..7087a487ba8 100644 --- a/tools/docker/openems-edge/config.d/Simulator/Datasource/Single/Direct/d201ea0c-aab9-48e3-b979-49d4391fc924.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/Datasource/Single/Direct/d201ea0c-aab9-48e3-b979-49d4391fc924.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"2" -alias="Simulated\ PV\ West\ Datasource" -enabled=B"true" -id="datasource1" -service.factoryPid="Simulator.Datasource.Single.Direct" -service.pid="Simulator.Datasource.Single.Direct.d201ea0c-aab9-48e3-b979-49d4391fc924" -timeDelta=I"-1" -values=i[ \ - "3000", \ - ] +:org.apache.felix.configadmin.revision:=L"2" +alias="Simulated\ PV\ West\ Datasource" +enabled=B"true" +id="datasource1" +service.factoryPid="Simulator.Datasource.Single.Direct" +service.pid="Simulator.Datasource.Single.Direct.d201ea0c-aab9-48e3-b979-49d4391fc924" +timeDelta=I"-1" +values=i[ \ + "3000", \ + ] diff --git a/tools/docker/openems-edge/config.d/Simulator/EssSymmetric/Reacting/e8b3db03-493d-49a2-a060-b9f7c18357e0.config b/tools/gitpod/openems-edge/config.d/Simulator/EssSymmetric/Reacting/e8b3db03-493d-49a2-a060-b9f7c18357e0.config similarity index 96% rename from tools/docker/openems-edge/config.d/Simulator/EssSymmetric/Reacting/e8b3db03-493d-49a2-a060-b9f7c18357e0.config rename to tools/gitpod/openems-edge/config.d/Simulator/EssSymmetric/Reacting/e8b3db03-493d-49a2-a060-b9f7c18357e0.config index 73b9bbec8cb..b95a3a19df0 100644 --- a/tools/docker/openems-edge/config.d/Simulator/EssSymmetric/Reacting/e8b3db03-493d-49a2-a060-b9f7c18357e0.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/EssSymmetric/Reacting/e8b3db03-493d-49a2-a060-b9f7c18357e0.config @@ -1,11 +1,11 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="Battery" -capacity=I"10000" -datasource.target="" -enabled=B"true" -gridMode="ON_GRID" -id="ess0" -initialSoc=I"30" -maxApparentPower=I"10000" -service.factoryPid="Simulator.EssSymmetric.Reacting" -service.pid="Simulator.EssSymmetric.Reacting.e8b3db03-493d-49a2-a060-b9f7c18357e0" +:org.apache.felix.configadmin.revision:=L"1" +alias="Battery" +capacity=I"10000" +datasource.target="" +enabled=B"true" +gridMode="ON_GRID" +id="ess0" +initialSoc=I"30" +maxApparentPower=I"10000" +service.factoryPid="Simulator.EssSymmetric.Reacting" +service.pid="Simulator.EssSymmetric.Reacting.e8b3db03-493d-49a2-a060-b9f7c18357e0" diff --git a/tools/docker/openems-edge/config.d/Simulator/GridMeter/Reacting/ce8b44bb-9be7-4afe-8569-b04c51f125c0.config b/tools/gitpod/openems-edge/config.d/Simulator/GridMeter/Reacting/ce8b44bb-9be7-4afe-8569-b04c51f125c0.config similarity index 96% rename from tools/docker/openems-edge/config.d/Simulator/GridMeter/Reacting/ce8b44bb-9be7-4afe-8569-b04c51f125c0.config rename to tools/gitpod/openems-edge/config.d/Simulator/GridMeter/Reacting/ce8b44bb-9be7-4afe-8569-b04c51f125c0.config index 5decabdee62..c53e78035ca 100644 --- a/tools/docker/openems-edge/config.d/Simulator/GridMeter/Reacting/ce8b44bb-9be7-4afe-8569-b04c51f125c0.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/GridMeter/Reacting/ce8b44bb-9be7-4afe-8569-b04c51f125c0.config @@ -1,8 +1,8 @@ -:org.apache.felix.configadmin.revision:=L"1" -alias="Grid" -enabled=B"true" -id="meter0" -maxActivePower="" -minActivePower="" -service.factoryPid="Simulator.GridMeter.Reacting" -service.pid="Simulator.GridMeter.Reacting.ce8b44bb-9be7-4afe-8569-b04c51f125c0" +:org.apache.felix.configadmin.revision:=L"1" +alias="Grid" +enabled=B"true" +id="meter0" +maxActivePower="" +minActivePower="" +service.factoryPid="Simulator.GridMeter.Reacting" +service.pid="Simulator.GridMeter.Reacting.ce8b44bb-9be7-4afe-8569-b04c51f125c0" diff --git a/tools/docker/openems-edge/config.d/Simulator/IO/DigitalInputOutput/0214028b-a418-4b8e-a926-6e4e8317b4e3.config b/tools/gitpod/openems-edge/config.d/Simulator/IO/DigitalInputOutput/0214028b-a418-4b8e-a926-6e4e8317b4e3.config similarity index 97% rename from tools/docker/openems-edge/config.d/Simulator/IO/DigitalInputOutput/0214028b-a418-4b8e-a926-6e4e8317b4e3.config rename to tools/gitpod/openems-edge/config.d/Simulator/IO/DigitalInputOutput/0214028b-a418-4b8e-a926-6e4e8317b4e3.config index 5c85241004c..4d630b8d682 100644 --- a/tools/docker/openems-edge/config.d/Simulator/IO/DigitalInputOutput/0214028b-a418-4b8e-a926-6e4e8317b4e3.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/IO/DigitalInputOutput/0214028b-a418-4b8e-a926-6e4e8317b4e3.config @@ -1,7 +1,7 @@ -:org.apache.felix.configadmin.revision:=L"3" -alias="Simulated\ Relay-Board" -enabled=B"true" -id="io0" -numberOfOutputs=I"6" -service.factoryPid="Simulator.IO.DigitalInputOutput" -service.pid="Simulator.IO.DigitalInputOutput.0214028b-a418-4b8e-a926-6e4e8317b4e3" +:org.apache.felix.configadmin.revision:=L"3" +alias="Simulated\ Relay-Board" +enabled=B"true" +id="io0" +numberOfOutputs=I"6" +service.factoryPid="Simulator.IO.DigitalInputOutput" +service.pid="Simulator.IO.DigitalInputOutput.0214028b-a418-4b8e-a926-6e4e8317b4e3" diff --git a/tools/docker/openems-edge/config.d/Simulator/NRCMeter/Acting/40fc5c07-36e1-41f1-a5ea-770c1e4195e0.config b/tools/gitpod/openems-edge/config.d/Simulator/NRCMeter/Acting/40fc5c07-36e1-41f1-a5ea-770c1e4195e0.config similarity index 97% rename from tools/docker/openems-edge/config.d/Simulator/NRCMeter/Acting/40fc5c07-36e1-41f1-a5ea-770c1e4195e0.config rename to tools/gitpod/openems-edge/config.d/Simulator/NRCMeter/Acting/40fc5c07-36e1-41f1-a5ea-770c1e4195e0.config index 48826683286..d691cb84147 100644 --- a/tools/docker/openems-edge/config.d/Simulator/NRCMeter/Acting/40fc5c07-36e1-41f1-a5ea-770c1e4195e0.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/NRCMeter/Acting/40fc5c07-36e1-41f1-a5ea-770c1e4195e0.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"5" -alias="Consumption" -datasource.id="datasource0" -datasource.target="(&(enabled\=true)(!(service.pid\=Simulator.NRCMeter.Acting.40fc5c07-36e1-41f1-a5ea-770c1e4195e0))(|(id\=datasource0)))" -enabled=B"true" -id="meter3" -maxActivePower="" -minActivePower="" -service.factoryPid="Simulator.NRCMeter.Acting" -service.pid="Simulator.NRCMeter.Acting.40fc5c07-36e1-41f1-a5ea-770c1e4195e0" +:org.apache.felix.configadmin.revision:=L"5" +alias="Consumption" +datasource.id="datasource0" +datasource.target="(&(enabled\=true)(!(service.pid\=Simulator.NRCMeter.Acting.40fc5c07-36e1-41f1-a5ea-770c1e4195e0))(|(id\=datasource0)))" +enabled=B"true" +id="meter3" +maxActivePower="" +minActivePower="" +service.factoryPid="Simulator.NRCMeter.Acting" +service.pid="Simulator.NRCMeter.Acting.40fc5c07-36e1-41f1-a5ea-770c1e4195e0" diff --git a/tools/docker/openems-edge/config.d/Simulator/ProductionMeter/Acting/b5ec21fa-6763-4a27-b1e0-58265bc2ee46.config b/tools/gitpod/openems-edge/config.d/Simulator/ProductionMeter/Acting/b5ec21fa-6763-4a27-b1e0-58265bc2ee46.config similarity index 97% rename from tools/docker/openems-edge/config.d/Simulator/ProductionMeter/Acting/b5ec21fa-6763-4a27-b1e0-58265bc2ee46.config rename to tools/gitpod/openems-edge/config.d/Simulator/ProductionMeter/Acting/b5ec21fa-6763-4a27-b1e0-58265bc2ee46.config index c7b37e1744e..1b45c75a2b1 100644 --- a/tools/docker/openems-edge/config.d/Simulator/ProductionMeter/Acting/b5ec21fa-6763-4a27-b1e0-58265bc2ee46.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/ProductionMeter/Acting/b5ec21fa-6763-4a27-b1e0-58265bc2ee46.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"3" -alias="PV\ West" -datasource.id="datasource1" -datasource.target="(&(enabled\=true)(!(service.pid\=Simulator.ProductionMeter.Acting.b5ec21fa-6763-4a27-b1e0-58265bc2ee46))(|(id\=datasource1)))" -enabled=B"true" -id="meter1" -maxActivePower="" -minActivePower="" -service.factoryPid="Simulator.ProductionMeter.Acting" -service.pid="Simulator.ProductionMeter.Acting.b5ec21fa-6763-4a27-b1e0-58265bc2ee46" +:org.apache.felix.configadmin.revision:=L"3" +alias="PV\ West" +datasource.id="datasource1" +datasource.target="(&(enabled\=true)(!(service.pid\=Simulator.ProductionMeter.Acting.b5ec21fa-6763-4a27-b1e0-58265bc2ee46))(|(id\=datasource1)))" +enabled=B"true" +id="meter1" +maxActivePower="" +minActivePower="" +service.factoryPid="Simulator.ProductionMeter.Acting" +service.pid="Simulator.ProductionMeter.Acting.b5ec21fa-6763-4a27-b1e0-58265bc2ee46" diff --git a/tools/docker/openems-edge/config.d/Simulator/ProductionMeter/Acting/f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config b/tools/gitpod/openems-edge/config.d/Simulator/ProductionMeter/Acting/f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config similarity index 97% rename from tools/docker/openems-edge/config.d/Simulator/ProductionMeter/Acting/f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config rename to tools/gitpod/openems-edge/config.d/Simulator/ProductionMeter/Acting/f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config index 8419ad7901a..af4f2c9c0e8 100644 --- a/tools/docker/openems-edge/config.d/Simulator/ProductionMeter/Acting/f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config +++ b/tools/gitpod/openems-edge/config.d/Simulator/ProductionMeter/Acting/f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1.config @@ -1,10 +1,10 @@ -:org.apache.felix.configadmin.revision:=L"2" -alias="PV\ East" -datasource.id="datasource2" -datasource.target="(&(enabled\=true)(!(service.pid\=Simulator.ProductionMeter.Acting.f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1))(|(id\=datasource2)))" -enabled=B"true" -id="meter2" -maxActivePower="" -minActivePower="" -service.factoryPid="Simulator.ProductionMeter.Acting" -service.pid="Simulator.ProductionMeter.Acting.f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1" +:org.apache.felix.configadmin.revision:=L"2" +alias="PV\ East" +datasource.id="datasource2" +datasource.target="(&(enabled\=true)(!(service.pid\=Simulator.ProductionMeter.Acting.f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1))(|(id\=datasource2)))" +enabled=B"true" +id="meter2" +maxActivePower="" +minActivePower="" +service.factoryPid="Simulator.ProductionMeter.Acting" +service.pid="Simulator.ProductionMeter.Acting.f9ce1378-d6c1-48fd-93bb-d7b0f24c64e1" diff --git a/tools/docker/openems-edge/config.d/org/ops4j/pax/logging.config b/tools/gitpod/openems-edge/config.d/org/ops4j/pax/logging.config similarity index 98% rename from tools/docker/openems-edge/config.d/org/ops4j/pax/logging.config rename to tools/gitpod/openems-edge/config.d/org/ops4j/pax/logging.config index 2c903157995..8149a098b3f 100644 --- a/tools/docker/openems-edge/config.d/org/ops4j/pax/logging.config +++ b/tools/gitpod/openems-edge/config.d/org/ops4j/pax/logging.config @@ -1,7 +1,7 @@ -:org.apache.felix.configadmin.revision:=L"1" -log4j.appender.CONSOLE="org.apache.log4j.ConsoleAppender" -log4j.appender.CONSOLE.layout="org.apache.log4j.PatternLayout" -log4j.appender.CONSOLE.layout.ConversionPattern="%d{ISO8601}\ [%-8.8t]\ %-5p\ [%-30.30c]\ %m%n" -log4j.logger.org.eclipse.osgi="WARN" -log4j.rootLogger="INFO,\ CONSOLE,\ osgi:*" -service.pid="org.ops4j.pax.logging" +:org.apache.felix.configadmin.revision:=L"1" +log4j.appender.CONSOLE="org.apache.log4j.ConsoleAppender" +log4j.appender.CONSOLE.layout="org.apache.log4j.PatternLayout" +log4j.appender.CONSOLE.layout.ConversionPattern="%d{ISO8601}\ [%-8.8t]\ %-5p\ [%-30.30c]\ %m%n" +log4j.logger.org.eclipse.osgi="WARN" +log4j.rootLogger="INFO,\ CONSOLE,\ osgi:*" +service.pid="org.ops4j.pax.logging" diff --git a/tools/docker/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config b/tools/gitpod/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config similarity index 98% rename from tools/docker/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config rename to tools/gitpod/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config index 066e2c4ab85..8977e092dd1 100644 --- a/tools/docker/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config +++ b/tools/gitpod/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config @@ -1 +1 @@ -org.ops4j.pax.logging="jar/pax-logging-log4j1-2.0.5.jar" +org.ops4j.pax.logging="jar/pax-logging-log4j1-2.0.5.jar" diff --git a/tools/gitpod/openems-edge/data/.gitignore b/tools/gitpod/openems-edge/data/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/openems-ui/Dockerfile b/tools/gitpod/openems-ui/Dockerfile similarity index 100% rename from tools/docker/openems-ui/Dockerfile rename to tools/gitpod/openems-ui/Dockerfile diff --git a/tools/gitpod/openems-ui/m/.gitignore b/tools/gitpod/openems-ui/m/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/docker/openems-ui/m/README.md b/tools/gitpod/openems-ui/m/README.md similarity index 100% rename from tools/docker/openems-ui/m/README.md rename to tools/gitpod/openems-ui/m/README.md diff --git a/tools/docker/openems-ui/nginx.conf b/tools/gitpod/openems-ui/nginx.conf similarity index 100% rename from tools/docker/openems-ui/nginx.conf rename to tools/gitpod/openems-ui/nginx.conf diff --git a/ui/angular.json b/ui/angular.json index 2c19d7e9849..bb545d9ee55 100644 --- a/ui/angular.json +++ b/ui/angular.json @@ -121,6 +121,30 @@ } ] }, + "openems-edge-docker": { + "fileReplacements": [ + { + "replace": "src/environments/theme.ts", + "with": "src/themes/openems/environments/theme.ts" + }, + { + "replace": "src/environments/dummy.ts", + "with": "src/themes/openems/environments/edge-docker.ts" + } + ] + }, + "openems-backend-docker": { + "fileReplacements": [ + { + "replace": "src/environments/theme.ts", + "with": "src/themes/openems/environments/theme.ts" + }, + { + "replace": "src/environments/dummy.ts", + "with": "src/themes/openems/environments/backend-docker.ts" + } + ] + }, "openems-gitpod": { "fileReplacements": [ { diff --git a/ui/src/index.html b/ui/src/index.html index ce5fab36389..c1f60e418a5 100644 --- a/ui/src/index.html +++ b/ui/src/index.html @@ -9,6 +9,9 @@ content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /> + + + diff --git a/ui/src/themes/openems/environments/backend-docker.ts b/ui/src/themes/openems/environments/backend-docker.ts new file mode 100644 index 00000000000..386f296c86d --- /dev/null +++ b/ui/src/themes/openems/environments/backend-docker.ts @@ -0,0 +1,13 @@ +import { Environment } from "src/environments"; +import { theme } from "./theme"; + +export const environment: Environment = { + ...theme, ...{ + + backend: 'OpenEMS Backend', + url: window["env"]["websocket"], + + production: true, + debugMode: false, + }, +}; diff --git a/ui/src/themes/openems/environments/edge-docker.ts b/ui/src/themes/openems/environments/edge-docker.ts new file mode 100644 index 00000000000..d174226e837 --- /dev/null +++ b/ui/src/themes/openems/environments/edge-docker.ts @@ -0,0 +1,13 @@ +import { Environment } from "src/environments"; +import { theme } from "./theme"; + +export const environment: Environment = { + ...theme, ...{ + + backend: 'OpenEMS Edge', + url: window["env"]["websocket"], + + production: true, + debugMode: false, + }, +}; From 3312dac5e4bbb2394e6db84cbac7fe8848e65004 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 09:44:12 +0100 Subject: [PATCH 15/28] Bump com.squareup.okio:okio-jvm from 3.8.0 to 3.9.0 in /cnf (#2585) * Bump com.squareup.retrofit2:adapter-rxjava3 from 2.9.0 to 2.10.0 in /cnf Bumps [com.squareup.retrofit2:adapter-rxjava3](https://github.com/square/retrofit) from 2.9.0 to 2.10.0. - [Release notes](https://github.com/square/retrofit/releases) - [Changelog](https://github.com/square/retrofit/blob/trunk/CHANGELOG.md) - [Commits](https://github.com/square/retrofit/compare/2.9.0...2.10.0) --- updated-dependencies: - dependency-name: com.squareup.retrofit2:adapter-rxjava3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Bump com.squareup.retrofit2:converter-gson from 2.9.0 to 2.10.0 in /cnf Bumps [com.squareup.retrofit2:converter-gson](https://github.com/square/retrofit) from 2.9.0 to 2.10.0. - [Release notes](https://github.com/square/retrofit/releases) - [Changelog](https://github.com/square/retrofit/blob/trunk/CHANGELOG.md) - [Commits](https://github.com/square/retrofit/compare/2.9.0...2.10.0) --- updated-dependencies: - dependency-name: com.squareup.retrofit2:converter-gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Bump com.squareup.retrofit2:retrofit from 2.9.0 to 2.10.0 in /cnf Bumps [com.squareup.retrofit2:retrofit](https://github.com/square/retrofit) from 2.9.0 to 2.10.0. - [Release notes](https://github.com/square/retrofit/releases) - [Changelog](https://github.com/square/retrofit/blob/trunk/CHANGELOG.md) - [Commits](https://github.com/square/retrofit/compare/2.9.0...2.10.0) --- updated-dependencies: - dependency-name: com.squareup.retrofit2:retrofit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Bump com.squareup.retrofit2:converter-scalars in /cnf Bumps [com.squareup.retrofit2:converter-scalars](https://github.com/square/retrofit) from 2.9.0 to 2.10.0. - [Release notes](https://github.com/square/retrofit/releases) - [Changelog](https://github.com/square/retrofit/blob/trunk/CHANGELOG.md) - [Commits](https://github.com/square/retrofit/compare/2.9.0...2.10.0) --- updated-dependencies: - dependency-name: com.squareup.retrofit2:converter-scalars dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Bump com.squareup.okio:okio-jvm from 3.8.0 to 3.9.0 in /cnf Bumps [com.squareup.okio:okio-jvm](https://github.com/square/okio) from 3.8.0 to 3.9.0. - [Changelog](https://github.com/square/okio/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okio/compare/parent-3.8.0...parent-3.9.0) --- updated-dependencies: - dependency-name: com.squareup.okio:okio-jvm dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update bnd, bndrun and wrapper --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 10 +++++----- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- io.openems.wrapper/bnd.bnd | 8 ++++---- io.openems.wrapper/retrofit-adapter-rxjava3.bnd | 8 ++++---- io.openems.wrapper/retrofit-converter-gson.bnd | 6 +++--- io.openems.wrapper/retrofit-converter-scalars.bnd | 6 +++--- io.openems.wrapper/retrofit2.bnd | 8 ++++---- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index c8095ebf1da..a6a054d5e0f 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -61,31 +61,31 @@ com.squareup.okio okio-jvm - 3.8.0 + 3.9.0 com.squareup.retrofit2 converter-gson - 2.9.0 + 2.10.0 com.squareup.retrofit2 retrofit - 2.9.0 + 2.10.0 com.squareup.retrofit2 converter-scalars - 2.9.0 + 2.10.0 com.squareup.retrofit2 adapter-rxjava3 - 2.9.0 + 2.10.0 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 96434060092..f6f24a73651 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -63,7 +63,7 @@ com.google.gson;version='[2.10.1,2.10.2)',\ com.google.guava;version='[33.0.0,33.0.1)',\ com.google.guava.failureaccess;version='[1.0.2,1.0.3)',\ - com.squareup.okio;version='[3.8.0,3.8.1)',\ + com.squareup.okio;version='[3.9.0,3.9.1)',\ com.zaxxer.HikariCP;version='[5.1.0,5.1.1)',\ io.openems.backend.alerting;version=snapshot,\ io.openems.backend.application;version=snapshot,\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 6c61ed1f42b..63385f54141 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -196,7 +196,7 @@ com.google.gson;version='[2.10.1,2.10.2)',\ com.google.guava;version='[33.0.0,33.0.1)',\ com.google.guava.failureaccess;version='[1.0.2,1.0.3)',\ - com.squareup.okio;version='[3.8.0,3.8.1)',\ + com.squareup.okio;version='[3.9.0,3.9.1)',\ com.sun.jna;version='[5.14.0,5.14.1)',\ io.openems.common;version=snapshot,\ io.openems.edge.application;version=snapshot,\ diff --git a/io.openems.wrapper/bnd.bnd b/io.openems.wrapper/bnd.bnd index 3e6ff8bc26b..7b93cb64a2b 100644 --- a/io.openems.wrapper/bnd.bnd +++ b/io.openems.wrapper/bnd.bnd @@ -10,10 +10,10 @@ Bundle-Description: This wraps external java libraries that do not have OSGi hea com.influxdb:flux-dsl;version='6.12.0',\ com.squareup.okhttp3:logging-interceptor;version='4.12.0',\ com.squareup.okhttp3:okhttp;version='4.12.0',\ - com.squareup.retrofit2:retrofit;version='2.9.0',\ - com.squareup.retrofit2:converter-gson;version='2.9.0',\ - com.squareup.retrofit2:converter-scalars;version='2.9.0',\ - com.squareup.retrofit2:adapter-rxjava3;version='2.9.0',\ + com.squareup.retrofit2:retrofit;version='2.10.0',\ + com.squareup.retrofit2:converter-gson;version='2.10.0',\ + com.squareup.retrofit2:converter-scalars;version='2.10.0',\ + com.squareup.retrofit2:adapter-rxjava3;version='2.10.0',\ com.sun.activation.javax.activation;version='1.2.0',\ eu.chargetime.ocpp:OCPP-J;version='1.0.2',\ eu.chargetime.ocpp:common;version='1.0.2',\ diff --git a/io.openems.wrapper/retrofit-adapter-rxjava3.bnd b/io.openems.wrapper/retrofit-adapter-rxjava3.bnd index 1b6310d426e..696523a3dc8 100644 --- a/io.openems.wrapper/retrofit-adapter-rxjava3.bnd +++ b/io.openems.wrapper/retrofit-adapter-rxjava3.bnd @@ -2,7 +2,7 @@ # NOTE: At runtime Retrofit throws a not so nice warning: # # WARNING: An illegal reflective access operation has occurred -# WARNING: Illegal reflective access by retrofit2.Platform (file:.../.gradle/caches/.../retrofit-2.9.0.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int) +# WARNING: Illegal reflective access by retrofit2.Platform (file:.../.gradle/caches/.../retrofit-2.10.0.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int) # WARNING: Please consider reporting this to the maintainers of retrofit2.Platform # WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations # WARNING: All illegal access operations will be denied in a future release @@ -14,10 +14,10 @@ Bundle-Name: retrofit-adapter-rxjava3 Bundle-Description: A type-safe HTTP client for Android and Java Bundle-DocURL: https://github.com/google/gson Bundle-License: https://opensource.org/licenses/Apache-2.0 -Bundle-Version: 2.9.0 +Bundle-Version: 2.10.0 Include-Resource: \ - @adapter-rxjava3-2.9.0.jar,\ + @adapter-rxjava3-2.10.0.jar,\ Export-Package: \ retrofit2.adapter.rxjava3,\ @@ -29,4 +29,4 @@ Import-Package: \ -metatypeannotations: * --sources: false \ No newline at end of file +-sources: false diff --git a/io.openems.wrapper/retrofit-converter-gson.bnd b/io.openems.wrapper/retrofit-converter-gson.bnd index fef8fb8a7a9..30433e39e8a 100644 --- a/io.openems.wrapper/retrofit-converter-gson.bnd +++ b/io.openems.wrapper/retrofit-converter-gson.bnd @@ -2,10 +2,10 @@ Bundle-Name: retrofit-converter-gson Bundle-Description: A type-safe HTTP client for Android and Java Bundle-DocURL: https://github.com/google/gson Bundle-License: https://opensource.org/licenses/Apache-2.0 -Bundle-Version: 2.9.0 +Bundle-Version: 2.10.0 Include-Resource: \ - @converter-gson-2.9.0.jar,\ + @converter-gson-2.10.0.jar,\ Export-Package: \ retrofit2.converter.gson,\ @@ -17,4 +17,4 @@ Import-Package: \ -metatypeannotations: * --sources: false \ No newline at end of file +-sources: false diff --git a/io.openems.wrapper/retrofit-converter-scalars.bnd b/io.openems.wrapper/retrofit-converter-scalars.bnd index 19a8e9fc2be..f0983200c5c 100644 --- a/io.openems.wrapper/retrofit-converter-scalars.bnd +++ b/io.openems.wrapper/retrofit-converter-scalars.bnd @@ -2,10 +2,10 @@ Bundle-Name: retrofit-converter-scalars Bundle-Description: A type-safe HTTP client for Android and Java Bundle-DocURL: https://github.com/google/gson Bundle-License: https://opensource.org/licenses/Apache-2.0 -Bundle-Version: 2.9.0 +Bundle-Version: 2.10.0 Include-Resource: \ - @converter-scalars-2.9.0.jar,\ + @converter-scalars-2.10.0.jar,\ Export-Package: \ retrofit2.converter.scalars,\ @@ -17,4 +17,4 @@ Import-Package: \ -metatypeannotations: * --sources: false \ No newline at end of file +-sources: false diff --git a/io.openems.wrapper/retrofit2.bnd b/io.openems.wrapper/retrofit2.bnd index 778722e9852..a0b40ad3890 100644 --- a/io.openems.wrapper/retrofit2.bnd +++ b/io.openems.wrapper/retrofit2.bnd @@ -2,7 +2,7 @@ # NOTE: At runtime Retrofit throws a not so nice warning: # # WARNING: An illegal reflective access operation has occurred -# WARNING: Illegal reflective access by retrofit2.Platform (file:.../.gradle/caches/.../retrofit-2.9.0.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int) +# WARNING: Illegal reflective access by retrofit2.Platform (file:.../.gradle/caches/.../retrofit-2.10.0.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int) # WARNING: Please consider reporting this to the maintainers of retrofit2.Platform # WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations # WARNING: All illegal access operations will be denied in a future release @@ -14,10 +14,10 @@ Bundle-Name: retrofit Bundle-Description: A type-safe HTTP client for Android and Java Bundle-DocURL: https://github.com/google/gson Bundle-License: https://opensource.org/licenses/Apache-2.0 -Bundle-Version: 2.9.0 +Bundle-Version: 2.10.0 Include-Resource: \ - @retrofit-2.9.0.jar,\ + @retrofit-2.10.0.jar,\ Export-Package: \ retrofit2,\ @@ -32,4 +32,4 @@ Import-Package: \ -metatypeannotations: * --sources: false \ No newline at end of file +-sources: false From 2c575760a41e34e46af66745d4bba2cbe23e2736 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 10:35:56 +0100 Subject: [PATCH 16/28] Bump de.bytefish:pgbulkinsert from 8.1.2 to 8.1.3 in /cnf (#2582) * Bump de.bytefish:pgbulkinsert from 8.1.2 to 8.1.3 in /cnf Bumps [de.bytefish:pgbulkinsert](https://github.com/bytefish/PgBulkInsert) from 8.1.2 to 8.1.3. - [Release notes](https://github.com/bytefish/PgBulkInsert/releases) - [Changelog](https://github.com/PgBulkInsert/PgBulkInsert/blob/master/CHANGELOG.md) - [Commits](https://github.com/bytefish/PgBulkInsert/commits/8.1.3) --- updated-dependencies: - dependency-name: de.bytefish:pgbulkinsert dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bnd files --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.wrapper/bnd.bnd | 2 +- io.openems.wrapper/pgbulkinsert.bnd | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index a6a054d5e0f..d6ab8b8cbc8 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -105,7 +105,7 @@ de.bytefish pgbulkinsert - 8.1.2 + 8.1.3 diff --git a/io.openems.wrapper/bnd.bnd b/io.openems.wrapper/bnd.bnd index 7b93cb64a2b..5cc36edbe38 100644 --- a/io.openems.wrapper/bnd.bnd +++ b/io.openems.wrapper/bnd.bnd @@ -22,7 +22,7 @@ Bundle-Description: This wraps external java libraries that do not have OSGi hea info.faljse:SDNotify;version='1.5.0',\ io.reactivex.rxjava3.rxjava;version='3.1.8',\ com.google.gson;version='2.10.1',\ - de.bytefish:pgbulkinsert;version='8.1.2',\ + de.bytefish:pgbulkinsert;version='8.1.3',\ fr.turri:aXMLRPC;version='1.13.0',\ org.dhatim:fastexcel;version='0.17.0',\ org.eclipse.paho.mqttv5.client;version='1.2.5',\ diff --git a/io.openems.wrapper/pgbulkinsert.bnd b/io.openems.wrapper/pgbulkinsert.bnd index 8ba26754878..85d5e2aa364 100644 --- a/io.openems.wrapper/pgbulkinsert.bnd +++ b/io.openems.wrapper/pgbulkinsert.bnd @@ -1,10 +1,10 @@ Bundle-Name: pgbulkinsert Bundle-DocURL: https://github.com/PgBulkInsert/PgBulkInsert Bundle-License: https://opensource.org/licenses/MIT -Bundle-Version: 8.1.2 +Bundle-Version: 8.1.3 Include-Resource: \ - @pgbulkinsert-8.1.2.jar,\ + @pgbulkinsert-8.1.3.jar,\ -dsannotations: * From fc9fb2f6e4ef0f618d0941d1b439d098ed90744d Mon Sep 17 00:00:00 2001 From: Thomas Sicking <91258335+tsicking@users.noreply.github.com> Date: Wed, 20 Mar 2024 10:49:27 +0100 Subject: [PATCH 17/28] Janitza UMG 511: fix inverted active power (#2587) Previously, the overall active power was not inverted if configured, only the phase powers were. This is fixed here. --- .../edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java index 454c4190c57..5b9b915ba6c 100644 --- a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java +++ b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java @@ -120,7 +120,8 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { m(ElectricityMeter.ChannelId.REACTIVE_POWER_L3, new FloatDoublewordElement(3873), // INVERT_IF_TRUE(this.invert))), // new FC3ReadRegistersTask(3925, Priority.HIGH, // - m(ElectricityMeter.ChannelId.ACTIVE_POWER, new FloatDoublewordElement(3925)), // + m(ElectricityMeter.ChannelId.ACTIVE_POWER, new FloatDoublewordElement(3925), // + INVERT_IF_TRUE(this.invert)), // m(ElectricityMeter.ChannelId.REACTIVE_POWER, new FloatDoublewordElement(3927), // INVERT_IF_TRUE(this.invert))), // new FC3ReadRegistersTask(3995, Priority.LOW, // From f34de489832815f382f29b4cfc7202a36eb769ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 22:18:35 +0100 Subject: [PATCH 18/28] Bump com.google.guava:guava from 33.0.0-jre to 33.1.0-jre in /cnf (#2579) * Bump com.google.guava:guava from 33.0.0-jre to 33.1.0-jre in /cnf Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.0.0-jre to 33.1.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update bndrun + bnd --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/build.bnd | 2 +- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cnf/build.bnd b/cnf/build.bnd index 8a7b5e57090..f2e77d03885 100644 --- a/cnf/build.bnd +++ b/cnf/build.bnd @@ -40,7 +40,7 @@ buildpath: \ org.osgi.service.metatype;version='1.4.1',\ org.osgi.service.metatype.annotations;version='1.4.1',\ org.osgi.util.promise;version='1.2.0',\ - com.google.guava;version='33.0.0.jre',\ + com.google.guava;version='33.1.0.jre',\ com.google.gson;version='2.10.1',\ testpath: \ diff --git a/cnf/pom.xml b/cnf/pom.xml index d6ab8b8cbc8..2e7c76a1fd2 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -38,7 +38,7 @@ com.google.guava guava - 33.0.0-jre + 33.1.0-jre com.google.guava diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index f6f24a73651..9141078a1de 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -61,7 +61,7 @@ -runbundles: \ Java-WebSocket;version='[1.5.4,1.5.5)',\ com.google.gson;version='[2.10.1,2.10.2)',\ - com.google.guava;version='[33.0.0,33.0.1)',\ + com.google.guava;version='[33.1.0,33.1.1)',\ com.google.guava.failureaccess;version='[1.0.2,1.0.3)',\ com.squareup.okio;version='[3.9.0,3.9.1)',\ com.zaxxer.HikariCP;version='[5.1.0,5.1.1)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 63385f54141..09c9967dc78 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -194,7 +194,7 @@ com.fazecast.jSerialComm;version='[2.10.4,2.10.5)',\ com.ghgande.j2mod;version='[3.2.1,3.2.2)',\ com.google.gson;version='[2.10.1,2.10.2)',\ - com.google.guava;version='[33.0.0,33.0.1)',\ + com.google.guava;version='[33.1.0,33.1.1)',\ com.google.guava.failureaccess;version='[1.0.2,1.0.3)',\ com.squareup.okio;version='[3.9.0,3.9.1)',\ com.sun.jna;version='[5.14.0,5.14.1)',\ From 0730c22935bb3bf5a80adae9316ae1cbeb75f853 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 22:50:25 +0100 Subject: [PATCH 19/28] Bump org.postgresql:postgresql from 42.7.2 to 42.7.3 in /cnf (#2580) * Bump org.postgresql:postgresql from 42.7.2 to 42.7.3 in /cnf Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.2 to 42.7.3. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.7.2...REL42.7.3) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 2e7c76a1fd2..373ce66e9ee 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -394,7 +394,7 @@ org.postgresql postgresql - 42.7.2 + 42.7.3 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 9141078a1de..bc68a467e50 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -120,5 +120,5 @@ org.osgi.util.function;version='[1.2.0,1.2.1)',\ org.osgi.util.promise;version='[1.3.0,1.3.1)',\ org.owasp.encoder;version='[1.2.3,1.2.4)',\ - org.postgresql.jdbc;version='[42.7.2,42.7.3)',\ + org.postgresql.jdbc;version='[42.7.3,42.7.4)',\ reactive-streams;version='[1.0.4,1.0.5)' \ No newline at end of file From 529095411164e9c9ca4754f25b5ec6be3e251425 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 08:46:34 +0100 Subject: [PATCH 20/28] Bump d3 from 7.8.5 to 7.9.0 in /ui (#2586) * Bump d3 from 7.8.5 to 7.9.0 in /ui Bumps [d3](https://github.com/d3/d3) from 7.8.5 to 7.9.0. - [Release notes](https://github.com/d3/d3/releases) - [Changelog](https://github.com/d3/d3/blob/main/CHANGES.md) - [Commits](https://github.com/d3/d3/compare/v7.8.5...v7.9.0) --- updated-dependencies: - dependency-name: d3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update package-lock --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- ui/package-lock.json | 3057 ++++++++++++------------------------------ ui/package.json | 2 +- 2 files changed, 827 insertions(+), 2232 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index e9feb499312..ca2b931dafc 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -29,7 +29,7 @@ "chartjs-plugin-zoom": "^2.0.1", "classlist.js": "^1.1.20150312", "compare-versions": "^6.1.0", - "d3": "^7.8.5", + "d3": "^7.9.0", "date-fns": "^2.30.0", "file-saver-es": "^2.0.5", "ng2-charts": "4.1.1", @@ -616,19 +616,6 @@ "typescript": ">=4.8.2 <5.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@angular/compiler-cli/node_modules/@babel/compat-data": { "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", @@ -717,40 +704,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@angular/compiler-cli/node_modules/@babel/helper-module-imports": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", @@ -806,24 +759,6 @@ "node": ">=6.9.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@angular/compiler-cli/node_modules/@babel/helper-validator-option": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", @@ -847,32 +782,6 @@ "node": ">=6.9.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@angular/compiler-cli/node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -887,41 +796,6 @@ "node": ">=6.9.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@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.15", - "@babel/types": "^7.22.15", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@angular/compiler-cli/node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -983,12 +857,6 @@ "node": ">=6.9.0" } }, - "node_modules/@angular/compiler-cli/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "node_modules/@angular/compiler-cli/node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -1028,15 +896,6 @@ "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "dev": true }, - "node_modules/@angular/compiler-cli/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@angular/compiler-cli/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -1163,6 +1022,19 @@ "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "dev": true }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/core": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", @@ -1193,19 +1065,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/@babel/compat-data": { "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", @@ -1246,40 +1105,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/@babel/helper-module-imports": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", @@ -1335,24 +1160,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/@babel/helper-validator-option": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", @@ -1376,32 +1183,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/core/node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -1416,41 +1197,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@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.15", - "@babel/types": "^7.22.15", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -1512,12 +1258,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "node_modules/@babel/core/node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -1548,15 +1288,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/core/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/core/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -1577,38 +1308,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -1623,15 +1322,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/generator/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", @@ -1644,51 +1334,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "2023.10.0-SNAPSHOT", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -1801,6 +1450,54 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", @@ -1813,45 +1510,49 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { @@ -1873,19 +1574,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -1898,28 +1586,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", @@ -1946,24 +1612,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-wrap-function": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", @@ -1978,32 +1626,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -2018,35 +1640,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -2063,19 +1656,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -2111,28 +1691,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-member-expression-to-functions": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", @@ -2207,84 +1765,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "node_modules/@babel/plugin-proposal-class-properties/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2294,15 +1774,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", @@ -2469,19 +1940,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -2517,28 +1975,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-member-expression-to-functions": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", @@ -2613,102 +2049,15 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-proposal-private-methods/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", @@ -2763,38 +2112,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/regenerate-unicode-properties": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", @@ -2833,15 +2150,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -3162,19 +2470,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -3187,28 +2482,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", @@ -3247,24 +2520,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-wrap-function": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", @@ -3279,32 +2534,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -3319,35 +2548,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", @@ -3386,47 +2586,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.19.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", @@ -3468,38 +2627,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3509,15 +2636,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/preset-env": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", @@ -3607,19 +2725,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/preset-env/node_modules/@babel/compat-data": { "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", @@ -3709,59 +2814,25 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "node_modules/@babel/preset-env/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", + "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "node_modules/@babel/preset-env/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -3860,24 +2931,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/preset-env/node_modules/@babel/helper-validator-option": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", @@ -3887,32 +2940,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/preset-env/node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", @@ -4572,20 +3599,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/preset-env/node_modules/browserslist": { "version": "4.21.10", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", @@ -4631,12 +3644,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/@babel/preset-env/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "node_modules/@babel/preset-env/node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4693,15 +3700,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/preset-env/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/preset-env/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -4740,92 +3738,82 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/template/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@colors/colors": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -5644,9 +4632,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -5659,9 +4647,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -6654,6 +5642,12 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/selenium-webdriver": { + "version": "3.0.26", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.26.tgz", + "integrity": "sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg==", + "dev": true + }, "node_modules/@types/send": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -7567,15 +6561,6 @@ "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", "dev": true }, - "node_modules/adm-zip": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", - "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -7825,25 +6810,6 @@ "deep-equal": "^2.0.5" } }, - "node_modules/aria-query/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/aria-query/node_modules/deep-equal": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", @@ -7950,6 +6916,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aria-query/node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aria-query/node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -7981,6 +6959,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aria-query/node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aria-query/node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -8026,6 +7016,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aria-query/node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aria-query/node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aria-query/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -8122,33 +7140,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "node_modules/aria-query/node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-buffer-byte-length/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8202,25 +7219,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-includes/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-includes/node_modules/es-abstract": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", @@ -8607,25 +7605,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.flat/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flat/node_modules/es-abstract": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", @@ -9003,25 +7982,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.flatmap/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap/node_modules/es-abstract": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", @@ -9386,25 +8346,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arraybuffer.prototype.slice/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/arraybuffer.prototype.slice/node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -9513,12 +8454,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/autoprefixer/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, "node_modules/aws-sign2": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -9528,6 +8463,12 @@ "node": "*" } }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, "node_modules/axobject-query": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", @@ -9537,25 +8478,6 @@ "deep-equal": "^2.0.5" } }, - "node_modules/axobject-query/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axobject-query/node_modules/deep-equal": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", @@ -9662,6 +8584,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axobject-query/node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axobject-query/node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -9693,6 +8627,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axobject-query/node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axobject-query/node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -9738,6 +8684,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axobject-query/node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axobject-query/node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axobject-query/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -9834,6 +8808,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axobject-query/node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-loader": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", @@ -10066,12 +9058,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -10081,15 +9067,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/bl": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -10473,6 +9450,25 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "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.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -10629,6 +9625,18 @@ "node": ">= 8" } }, + "node_modules/chokidar/node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "devOptional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -11708,9 +10716,9 @@ "dev": true }, "node_modules/d3": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", - "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -12447,12 +11455,6 @@ "void-elements": "^2.0.0" } }, - "node_modules/dom-serialize/node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, "node_modules/dom-serialize/node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -13507,6 +12509,21 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -13701,6 +12718,26 @@ "node": ">=6" } }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -13738,6 +12775,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/forwarded": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -13891,6 +12951,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -14095,6 +13164,45 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -14239,29 +13347,13 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/html-entities": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", @@ -14336,26 +13428,6 @@ "@types/node": "*" } }, - "node_modules/http-proxy-middleware/node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/http-proxy-middleware/node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -14401,6 +13473,21 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -14674,15 +13761,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/inquirer/node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/inquirer/node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -14820,25 +13898,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arguments/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -14911,15 +13970,6 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, - "node_modules/is-map": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-plain-obj": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -14944,15 +13994,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-set": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -14980,14 +14021,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakmap": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-weakref": { "version": "2023.10.0-SNAPSHOT", @@ -15001,57 +14039,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-what": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -15079,6 +14066,12 @@ "node": ">=0.10.0" } }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -15104,18 +14097,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -15232,6 +14213,12 @@ "colors": "1.4.0" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -15278,6 +14265,12 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -15290,6 +14283,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -15325,6 +14324,21 @@ "node >= 0.2.0" ] }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/jszip": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -15718,26 +14732,6 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, - "node_modules/karma/node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/karma/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -17052,6 +16046,15 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -17102,25 +16105,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values/node_modules/es-abstract": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", @@ -17700,6 +16684,15 @@ "defaults": "^1.0.3" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-locate": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -18131,61 +17124,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, - "node_modules/parse-json/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "node_modules/parse-node-version": { + "version": "2023.10.0-SNAPSHOT", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/parse-json/node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/parse-json/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/parse-node-version": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" + "node": ">= 0.10" } }, "node_modules/parse5": { @@ -18274,6 +17225,18 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -18468,12 +17431,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/postcss/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, "node_modules/postcss/node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -18542,12 +17499,6 @@ "node": ">=10.13.x" } }, - "node_modules/protractor/node_modules/@types/selenium-webdriver": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.23.tgz", - "integrity": "sha512-f4lAmp7rmGgsTkRPjgHOpQumgpqjQ0RxbEkOwCwLVSsa5gCnni4GMBfqmN0nObFeDRZj/DTTsx99SOjOXRW2bQ==", - "dev": true - }, "node_modules/protractor/node_modules/agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -18728,15 +17679,6 @@ "node": ">= 6.9.x" } }, - "node_modules/protractor/node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/protractor/node_modules/q": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", @@ -18762,18 +17704,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/protractor/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/protractor/node_modules/saucelabs": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", @@ -18786,21 +17716,6 @@ "node": "*" } }, - "node_modules/protractor/node_modules/selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "dependencies": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "engines": { - "node": ">= 6.9.0" - } - }, "node_modules/protractor/node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -18881,31 +17796,6 @@ "node": ">=0.8.0" } }, - "node_modules/protractor/node_modules/tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/protractor/node_modules/webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "dependencies": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - }, - "engines": { - "node": ">=6.9.x" - } - }, "node_modules/protractor/node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -18962,28 +17852,6 @@ "node": ">=8" } }, - "node_modules/protractor/node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/protractor/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/protractor/node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -19054,6 +17922,12 @@ "dev": true, "optional": true }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -19077,25 +17951,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qs/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/qs/node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -19201,6 +18056,57 @@ "jsesc": "bin/jsesc" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "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.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -19370,25 +18276,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -19516,6 +18403,33 @@ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, + "node_modules/selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "dependencies": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "engines": { + "node": ">= 6.9.0" + } + }, + "node_modules/selenium-webdriver/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/semver": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", @@ -19983,6 +18897,37 @@ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "node_modules/ssri": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", @@ -20025,25 +18970,6 @@ "node": ">= 0.4" } }, - "node_modules/stop-iteration-iterator/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/stop-iteration-iterator/node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -20149,25 +19075,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trim/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trim/node_modules/es-abstract": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", @@ -20683,6 +19590,27 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -20692,6 +19620,19 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -20791,6 +19732,24 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "node_modules/type-fest": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -20830,25 +19789,6 @@ "node": ">= 0.4" } }, - "node_modules/typed-array-buffer/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typed-array-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", @@ -20867,25 +19807,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-array-byte-length/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typed-array-byte-length/node_modules/has-proto": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", @@ -20932,25 +19853,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-array-byte-offset/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typed-array-byte-offset/node_modules/has-proto": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", @@ -20991,25 +19893,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unbox-primitive/node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -21211,12 +20094,6 @@ "node": ">=6" } }, - "node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -21279,25 +20156,20 @@ "node": ">= 0.8" } }, - "node_modules/watchpack": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/watchpack/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, "node_modules/wbuf": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -21307,6 +20179,19 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "dependencies": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + }, + "engines": { + "node": ">=6.9.x" + } + }, "node_modules/webdriver-manager": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", @@ -21332,20 +20217,13 @@ "node": ">=6.9.x" } }, - "node_modules/webdriver-manager/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/webdriver-manager/node_modules/adm-zip": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", + "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.0" } }, "node_modules/webdriver-manager/node_modules/ansi-regex": { @@ -21366,176 +20244,40 @@ "node": ">=0.10.0" } }, - "node_modules/webdriver-manager/node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/webdriver-manager/node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/webdriver-manager/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/webdriver-manager/node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/webdriver-manager/node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webdriver-manager/node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webdriver-manager/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/webdriver-manager/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "node_modules/webdriver-manager/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/webdriver-manager/node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/webdriver-manager/node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=0.10.0" } }, + "node_modules/webdriver-manager/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/webdriver-manager/node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -21545,27 +20287,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webdriver-manager/node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/webdriver-manager/node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, "node_modules/webdriver-manager/node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -21576,47 +20297,6 @@ "teleport": ">=0.2.0" } }, - "node_modules/webdriver-manager/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/webdriver-manager/node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/webdriver-manager/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -21638,31 +20318,6 @@ "semver": "bin/semver" } }, - "node_modules/webdriver-manager/node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webdriver-manager/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -21684,83 +20339,6 @@ "node": ">=0.8.0" } }, - "node_modules/webdriver-manager/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/webdriver-manager/node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/webdriver-manager/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "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.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/webdriver-manager/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/webdriver-manager/node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webdriver-manager/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/webpack": { "version": "5.76.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", @@ -22125,6 +20703,22 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/webpack-dev-server/node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, "node_modules/webpack-dev-server/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -22547,6 +21141,19 @@ } } }, + "node_modules/webpack/node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/webpack/node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -22579,21 +21186,6 @@ "node": ">=0.8.0" } }, - "node_modules/which-collection": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", @@ -22628,25 +21220,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wide-align": { "version": "2023.10.0-SNAPSHOT", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -22792,6 +21365,28 @@ } } }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/ui/package.json b/ui/package.json index e5e5020f031..556b5739013 100644 --- a/ui/package.json +++ b/ui/package.json @@ -24,7 +24,7 @@ "chartjs-plugin-zoom": "^2.0.1", "classlist.js": "^1.1.20150312", "compare-versions": "^6.1.0", - "d3": "^7.8.5", + "d3": "^7.9.0", "date-fns": "^2.30.0", "file-saver-es": "^2.0.5", "ng2-charts": "4.1.1", From a31ad14fceed1c7453c117547b18605c984d0b6d Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Sun, 24 Mar 2024 23:21:45 +0100 Subject: [PATCH 21/28] Update gradle to 8.7 (#2590) --- .gradle-wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.gradle-wrapper/gradle-wrapper.properties b/.gradle-wrapper/gradle-wrapper.properties index a80b22ce5cf..b82aa23a4f0 100644 --- a/.gradle-wrapper/gradle-wrapper.properties +++ b/.gradle-wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index b6b9a42d7ef..922eb59f04f 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail From 71f82df965c41102c981d2b8d2f26d3bf4b5192c Mon Sep 17 00:00:00 2001 From: Kai J <99220919+da-Kai@users.noreply.github.com> Date: Mon, 25 Mar 2024 14:56:06 +0100 Subject: [PATCH 22/28] CI: fix docker workflows (#2591) --- tools/docker/backend/Dockerfile | 5 +---- tools/docker/edge/Dockerfile | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/tools/docker/backend/Dockerfile b/tools/docker/backend/Dockerfile index 17611fd2992..140504a0baa 100644 --- a/tools/docker/backend/Dockerfile +++ b/tools/docker/backend/Dockerfile @@ -15,13 +15,10 @@ FROM ghcr.io/linuxserver/baseimage-alpine:edge AS base_container ARG JAVA_VERSION -RUN wget -O /etc/apk/keys/adoptium.rsa.pub https://packages.adoptium.net/artifactory/api/security/keypair/public/repositories/apk && \ - echo 'https://packages.adoptium.net/artifactory/apk/alpine/main' >> /etc/apk/repositories - RUN apk update && apk upgrade RUN apk add --no-cache \ - temurin-${JAVA_VERSION}-jre + openjdk${JAVA_VERSION}-jre ### Build backend container FROM base_container diff --git a/tools/docker/edge/Dockerfile b/tools/docker/edge/Dockerfile index 79cdc2946fd..47e969f2574 100644 --- a/tools/docker/edge/Dockerfile +++ b/tools/docker/edge/Dockerfile @@ -15,13 +15,10 @@ FROM ghcr.io/linuxserver/baseimage-alpine:edge AS base_container ARG JAVA_VERSION -RUN wget -O /etc/apk/keys/adoptium.rsa.pub https://packages.adoptium.net/artifactory/api/security/keypair/public/repositories/apk && \ - echo 'https://packages.adoptium.net/artifactory/apk/alpine/main' >> /etc/apk/repositories - RUN apk update && apk upgrade RUN apk add --no-cache \ - temurin-${JAVA_VERSION}-jre + openjdk${JAVA_VERSION}-jre ### Build edge container FROM base_container From a96262ab3936a40d7767662b7e0e302ed6200813 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Thu, 28 Mar 2024 15:03:32 +0100 Subject: [PATCH 23/28] FEMS Backports 2023-03 (#2593) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ToU: optionally show Grid-Buy in history chart - Add third y-axis (second right y-axis) for GridBuy * AppCenter: fixStateOfCharge App - added app - added to scheduler - created formly datetime builder * Tibber: implement handling for rate limit (HTTP code 429) - A special case-handler is added that handles http status error 429 and schedules next execution 12 hours later. * UI: Change chartjs resolution for mobile view - Use bigger resolution for day and week for smartphone to enable better readability - Technical description... | View | smartphone or desktop | Aggregation | --- | --- | --- | | day | Smartphone | 20 min aggregated Data | | day | Desktop | 5 min aggregated Data | | week | Smartphone | 8 hours aggregated Data | | week | Desktop | 1 hour aggregated Data | - Backend query has to be adjusted due to wrong timestamps! * CI: improvements - Add [WOODPECKER_ENVIRONMENT](https://woodpecker-ci.org/docs/usage/environment#global-environment-variables); - Run checkstyle before build * AppCenter: Add definition to set min Role to delete an App & validation - Add Permission Role to set which Role is required to delete an App Instance - Currently CanSeeRole == CanDeleteRole so there is no UI change neccesarry to add a special request to hide/show/disable delete button. * AppCenter Tibber: Access Token will be displayed as "xxx" if set - If a access token is set in the Tibber Provider it will be displayed as "xxx" and shown directly as a clear text token and can not be accessed from the ui in clear text. - If the token wont get modified and stays at "xxx" it wont get updated and the old token remains in the provider configuration. * FENECON Home Battery: Calculate number of towers * UI: Implement system reboot - adding maintenance to /system - Available only for admins at first - Systemupdate renamed to system now including maintenance * Edge/UI: add persistencePriority to EdgeConfig - Show warning in /channels if global persistence priority is bigger than channel persistence priority * Controller ESS Cycle: fix Standby Time - Updating the last changed state time onExit approach was using wrong. - The last changed time is taking actually from previous state. - For an instance: - As the controller started; goes first to Undefined State then onExit set the lastStateChangeTime. - Aftwerwards keep charges the system till it gets fully charged. - At the end of the 'START_CHARGE' state, if the fully charged conditions fullfilled, controller tries to wait before it switches the state, according to the given 'standbyTime' in config. - However, in context 'waitForChangeState' method proofs whether the wait time achieved or not. - But here; 'getLastStateChangeTime' method gives the time that actually what is in 'Undefined-onExit' set. - So, if the charge process takes more time than given 'standbyTime', state switching will be approved and state will change to 'Continue_Discharge' immediately. * UI: README changes - correcting wrong Ports * UI: Bugfix: Pickdatepopover not showing allowed historyPeriods - History Popover only showing custom period * UI: Extend unittest for pickdatepopover - Create type for periodString values * UI: Style improvements - Align Buttons to right side in System view for consistency - Adjusting the EMS System View to align line with single button to the right - Cleanup alertController style adjustments * UI: Updated redirect link to update page - Updated redirect link to update page from AppCenter and live storage modal * Time-of-Use: improvements - Reduce search space, by calculating later periods as hours and not quarters - Improve calculation of charge power in CHARGE_GRID mode - More and smarter Genotypes in initialPopulation - Improved error handling - New EnergyFlow calculation + fix previsou calculation bugs - Be default always apply §14a EnWG limit of 4.2 kW (configurable) * GoodWe: Disable ShadowManagement - During the time that GoodWe's shadow management is active, we will not be able to discharge or charge the battery. During this time, the DC connection cannot work as usual. * HeatingElement: Changed Persistence Priority for LEVEL to HIGH - Set persistencePriority to HIGH for LEVEL for UI History Chart - removed unused UNDEFINED constant * Time-of-Use: bugfix §14a EnWG - Wrong sign; mixed up positive/negatve values * Tibber: hide "homes" filter in App - "Homes" filter is ignored for parsing if there is only one home. - Added a check box to selct if there are multiple homes. Only then the filter field is displayed to enter. * UI/Time-of-Use: optionally show Grid-Buy in Live schedule chart - Add second y-axis for GridBuy in StatePriceChart. * UI EVCS: fix possible NPE - This currently happens on fems4 with EVCS test; causes a lot of logs in Backend log - Validate `evcsComponent` and `this.controller` are actually available * Tibber: differentiate warnings based on HTTP status codes - 1. Error code 400 is considered for authentication failure. - 2. Added two new warn channels to differentiate between client and server error. - 3. added new test cases to get next run. * UI/AppCenter: Add popover to notify costumer about unsued keys - Add popover when entering AppCenter and a registered key is available to notify the costumer to redeem it. - Also added badge how many keys are available * Time-of-Use: fix duplicate data in GetScheduleResponse - Removed duplicate data while merging past and future schedule data. * UI: Add footer for EMS-Nr., installed version and comment * UI & Time-of-Use - fix Log-Output, distinguish HOUR/QUARTERLY - change content order in footer - always add `edgeShortName` to browser title - fix unsetting browser-title in overview * UI: remove ion item line in footer - Remove line generated at bottom of ion-item in footer * UI: Link footer version to /system * Time-of-Use: bugfix for mixing up HOUR/QUARTER in JSONRPC-Response and Log * Backend-Improvements --------- Co-authored-by: Sagar Venu <32655208+venu-sagar@users.noreply.github.com> Co-authored-by: Lukas Rieger <73471197+lukasrgr@users.noreply.github.com> Co-authored-by: Michael Grill <59126309+michaelgrill@users.noreply.github.com> Co-authored-by: Kai Jeschek <99220919+da-Kai@users.noreply.github.com> Co-authored-by: Hueseyin Sahutoglu <34771592+huseyinsaht@users.noreply.github.com> Co-authored-by: Lóránt Meszlényi <16509320+hydroid7@users.noreply.github.com> Co-authored-by: Sebastian Asen <47855186+sebastianasen@users.noreply.github.com> Co-authored-by: Anas Shetla <141644226+AnasShetla@users.noreply.github.com> Co-authored-by: Stefan Feilmeier <3515268+sfeilmeier@users.noreply.github.com> Co-authored-by: Maximilian Lang <35968713+mlang97@users.noreply.github.com> --- build.gradle | 12 + .../alerting/handler/OfflineEdgeHandler.java | 20 +- .../alerting/handler/SumStateHandler.java | 2 +- .../alerting/OfflineEdgeAlertingTest.java | 3 +- .../handler/TestOfflineEdgeHandler.java | 8 +- .../common/alerting/UserAlertingSettings.java | 2 +- .../openems/backend/common/metadata/Edge.java | 2 + .../EdgeRpcRequestHandler.java | 109 +- .../openems/backend/metadata/odoo/Config.java | 10 + .../openems/backend/metadata/odoo/Field.java | 1 - .../backend/metadata/odoo/MetadataOdoo.java | 172 +- .../metadata/odoo/odoo/OdooHandler.java | 41 +- .../odoo/postgres/PostgresHandler.java | 1 + .../aggregatedinflux/AggregatedInflux.java | 54 +- .../aggregatedinflux/AllowedChannels.java | 17 + .../write/TimescaledbWriteHandler.java | 2 +- .../backend/uiwebsocket/impl/OnRequest.java | 34 +- .../common/channel/PersistencePriority.java | 2 + .../openems/common/function/TriFunction.java | 28 + .../request/UpdateUserSettingsRequest.java | 2 +- .../common/oem/DummyOpenemsEdgeOem.java | 1 + .../openems/common/oem/OpenemsBackendOem.java | 14 + .../io/openems/common/types/EdgeConfig.java | 93 +- .../openems/common/utils/FunctionUtils.java | 102 + .../io/openems/common/utils/JsonUtils.java | 2 +- .../io/openems/common/utils/StringUtils.java | 30 + .../openems/common/utils/ThreadPoolUtils.java | 12 +- .../websocket/AbstractWebsocketServer.java | 9 +- .../common/utils/FunctionUtilsTest.java | 75 + .../openems/common/utils/JsonUtilsTest.java | 27 + .../openems/common/utils/StringUtilsTest.java | 17 + .../fenecon/home/BatteryFeneconHome.java | 20 +- .../fenecon/home/BatteryFeneconHomeImpl.java | 94 +- .../ess/cycle/ControllerEssCycleImpl.java | 7 + .../ess/cycle/statemachine/Context.java | 8 +- .../ContinueWithChargeHandler.java | 7 +- .../ContinueWithDischargeHandler.java | 7 +- .../statemachine/StartChargeHandler.java | 7 +- .../statemachine/StartDischargeHandler.java | 7 +- .../ess/timeofusetariff/Config.java | 4 + .../TimeOfUseTariffControllerImpl.java | 45 +- .../jsonrpc/GetScheduleResponse.java | 16 +- .../jsonrpc/ScheduleDatas.java | 327 + .../timeofusetariff/optimizer/Context.java | 35 +- .../timeofusetariff/optimizer/EnergyFlow.java | 101 + .../optimizer/InitialPopulationUtils.java | 57 +- .../timeofusetariff/optimizer/Optimizer.java | 72 +- .../ess/timeofusetariff/optimizer/Params.java | 217 +- .../optimizer/ParamsUtils.java | 105 + .../ess/timeofusetariff/optimizer/Period.java | 74 - .../timeofusetariff/optimizer/Simulator.java | 143 +- .../ess/timeofusetariff/optimizer/Utils.java | 435 +- .../ess/timeofusetariff/MyConfig.java | 11 + .../ess/timeofusetariff/TestData.java | 26 +- .../TimeOfUseTariffControllerImplTest.java | 96 +- .../jsonrpc/GetScheduleResponseTest.java | 50 + .../jsonrpc/ScheduleDatasTest.java | 134 + .../optimizer/EnergyFlowTest.java | 278 + .../optimizer/InitialPopulationUtilsTest.java | 52 +- .../optimizer/IntegrationTests.java | 270 +- .../optimizer/OptimizerTest.java | 7 +- .../optimizer/ParamsUtilsTest.java | 41 + .../timeofusetariff/optimizer/PeriodTest.java | 25 - .../optimizer/RunOptimizerFromLogApp.java | 3 +- .../optimizer/SimulatorTest.java | 294 +- .../timeofusetariff/optimizer/UtilsTest.java | 347 +- .../ControllerIoHeatingElement.java | 3 +- .../ControllerIoHeatingElementImpl.java | 9 +- .../io/heatingelement/enums/Level.java | 6 +- .../openems/edge/app/ess/FixActivePower.java | 1 + .../edge/app/ess/FixStateOfCharge.java | 251 + .../edge/app/ess/PowerPlantController.java | 1 + .../edge/app/ess/PrepareBatteryExtension.java | 1 + .../app/integratedsystem/FeneconHome.java | 1 + .../app/integratedsystem/FeneconHome20.java | 1 + .../app/integratedsystem/FeneconHome30.java | 1 + .../s/FeneconIndustrialSComponents.java | 402 - .../industrial/s/FeneconIndustrialSProps.java | 51 - .../fenecon/industrial/s/Isk010.java | 191 - .../fenecon/industrial/s/Isk011.java | 203 - .../fenecon/industrial/s/Isk110.java | 209 - .../edge/app/pvinverter/KacoPvInverter.java | 4 + .../edge/app/timeofusetariff/Tibber.java | 40 +- .../openems/edge/core/appmanager/AppDef.java | 27 +- .../appmanager/OpenemsAppPermissions.java | 29 +- .../dependency/AppManagerAppHelperImpl.java | 9 +- ...edulerByCentralOrderAggregateTaskImpl.java | 1 + .../appmanager/formly/JsonFormlyUtil.java | 13 +- .../formly/builder/DateTimeBuilder.java | 45 + .../edge/core/appmanager/jsonrpc/GetApps.java | 2 +- .../core/appmanager/translation_de.properties | 12 + .../core/appmanager/translation_en.properties | 12 + .../componentmanager/EdgeConfigWorker.java | 22 +- .../TestFeneconIndustrial.java | 92 - .../edge/app/timeofusetariff/TestTibber.java | 39 +- .../core/appmanager/AppPermissionTest.java | 71 + .../io/openems/edge/core/appmanager/Apps.java | 44 +- .../core/appmanager/TestTranslations.java | 7 +- .../GoodWeBatteryInverterImpl.java | 3 +- .../tibber/TimeOfUseTariffTibber.java | 8 +- .../tibber/TimeOfUseTariffTibberImpl.java | 69 +- .../edge/timeofusetariff/tibber/Utils.java | 47 + .../timeofusetariff/tibber/UtilsTest.java | 358 +- io.openems.oem.openems/bnd.bnd | 1 + .../openems/shared/influxdb/DbDataUtils.java | 43 +- .../shared/influxdb/proxy/InfluxQlProxy.java | 70 +- .../shared/influxdb/DbDataUtilsTest.java | 93 + .../influxdb/proxy/InfluxQlProxyTest.java | 36 + ui/README.md | 4 +- ui/package-lock.json | 22853 +++++++--------- ui/src/app/app-routing.module.ts | 7 +- ui/src/app/app.component.html | 4 +- ui/src/app/app.component.ts | 5 +- .../view/component/changelog.component.html | 12 +- .../view/component/changelog.component.ts | 8 +- ui/src/app/edge/edge.component.ts | 4 +- .../Ess/TimeOfUseTariff/chart/chart.ts | 58 +- .../app/edge/history/abstracthistorychart.ts | 17 +- .../common/consumption/chart/chart.spec.ts | 19 +- .../common/energy/chart/channels.spec.ts | 35 +- .../history/common/energy/chart/chart.spec.ts | 34 +- .../edge/history/common/energy/chart/chart.ts | 55 +- .../history/common/grid/chart/chart.spec.ts | 17 +- .../gridoptimizedcharge/chart.component.ts | 11 +- ui/src/app/edge/history/shared.ts | 42 +- .../TimeOfUseTariff/Ess_TimeOfUseTariff.ts | 5 +- .../TimeOfUseTariff/modal/powerSocChart.ts | 56 +- .../TimeOfUseTariff/modal/statePriceChart.ts | 80 +- .../edge/live/Controller/Evcs/flat/flat.html | 4 +- .../edge/live/Controller/Evcs/flat/flat.ts | 20 +- .../common/storage/modal/modal.component.html | 6 +- .../edge/settings/app/index.component.html | 16 +- .../app/edge/settings/app/index.component.ts | 43 +- .../edge/settings/app/update.component.html | 5 +- .../settings/channels/channels.component.html | 9 +- .../settings/channels/channels.component.ts | 14 +- .../settings/profile/profile.component.html | 2 +- .../app/edge/settings/settings.component.html | 6 +- .../app/edge/settings/settings.component.ts | 2 +- ui/src/app/edge/settings/settings.module.ts | 11 +- .../executeSystemUpdate.ts | 0 .../executeSystemUpdateRequest.ts | 0 .../executesystemupdate.component.html | 0 .../executesystemupdate.component.ts | 0 .../getSystemUpdateStateRequest.ts | 0 .../getSystemUpdateStateResponse.ts | 0 .../system/maintenance/maintenance.html | 39 + .../system/maintenance/maintenance.ts | 190 + .../oe-system-update.component.html | 6 +- .../oe-system-update.component.ts | 0 .../system.component.html} | 7 +- .../system.component.ts} | 18 +- ui/src/app/shared/edge/edge.ts | 14 +- ui/src/app/shared/edge/edgeconfig.ts | 22 + ui/src/app/shared/footer/footer.html | 23 + ui/src/app/shared/footer/footer.ts | 80 + .../chart/abstracthistorychart.ts | 158 +- .../chart/chart.constants.spec.ts | 33 + .../chart/chart.constants.ts | 57 + .../flat/abstract-flat-widget-line.ts | 12 + .../flat/abstract-flat-widget.ts | 2 - .../flat-widget-line/flat-widget-line.html | 2 +- .../shared/genericComponents/shared/filter.ts | 10 + .../shared/testing/common.ts | 30 +- .../shared/testing/tester.ts | 6 +- .../request/executeSystemRestartRequest.ts | 34 + .../request/get24HoursPredictionRequest.ts | 33 - .../request/getUserAlertingConfigsRequest.ts | 2 +- .../response/executeSystemRestartResponse.ts | 27 + .../response/get24HoursPredictionResponse.ts | 30 - .../jsonrpc/response/getScheduleResponse.ts | 5 +- .../app/shared/pickdate/pickdate.component.ts | 5 +- .../pickdate/popover/popover.component.ts | 3 +- ui/src/app/shared/service/arrayutils.ts | 21 + ui/src/app/shared/service/defaulttypes.ts | 3 + ui/src/app/shared/service/utils.ts | 68 +- ui/src/app/shared/shared.module.ts | 3 + ui/src/app/shared/shared.spec.ts | 23 +- ui/src/app/shared/shared.ts | 46 +- .../status/single/status.component.spec.ts | 4 +- ui/src/app/shared/type/language.spec.ts | 11 + ui/src/app/shared/type/language.ts | 16 + .../shared/utils/array/array.utils.spec.ts | 26 + ui/src/app/shared/utils/array/array.utils.ts | 54 + ui/src/app/shared/utils/time/timeutils.ts | 27 + ui/src/assets/i18n/cz.json | 32 +- ui/src/assets/i18n/de.json | 62 +- ui/src/assets/i18n/en.json | 65 +- ui/src/assets/i18n/es.json | 32 +- ui/src/assets/i18n/fr.json | 32 +- ui/src/assets/i18n/nl.json | 32 +- ui/src/environments/index.ts | 4 +- ui/src/global.scss | 6 +- 193 files changed, 14526 insertions(+), 17207 deletions(-) create mode 100644 io.openems.common/src/io/openems/common/function/TriFunction.java create mode 100644 io.openems.common/src/io/openems/common/utils/FunctionUtils.java create mode 100644 io.openems.common/test/io/openems/common/utils/FunctionUtilsTest.java create mode 100644 io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatas.java create mode 100644 io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/EnergyFlow.java create mode 100644 io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/ParamsUtils.java delete mode 100644 io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Period.java create mode 100644 io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponseTest.java create mode 100644 io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatasTest.java create mode 100644 io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/EnergyFlowTest.java create mode 100644 io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/ParamsUtilsTest.java delete mode 100644 io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/PeriodTest.java create mode 100644 io.openems.edge.core/src/io/openems/edge/app/ess/FixStateOfCharge.java delete mode 100644 io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSComponents.java delete mode 100644 io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSProps.java delete mode 100644 io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk010.java delete mode 100644 io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk011.java delete mode 100644 io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk110.java create mode 100644 io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/builder/DateTimeBuilder.java delete mode 100644 io.openems.edge.core/test/io/openems/edge/app/integratedsystem/TestFeneconIndustrial.java create mode 100644 io.openems.edge.core/test/io/openems/edge/core/appmanager/AppPermissionTest.java create mode 100644 io.openems.shared.influxdb/test/io/openems/shared/influxdb/DbDataUtilsTest.java create mode 100644 io.openems.shared.influxdb/test/io/openems/shared/influxdb/proxy/InfluxQlProxyTest.java rename ui/src/app/edge/settings/{systemupdate => system}/executeSystemUpdate.ts (100%) rename ui/src/app/edge/settings/{systemupdate => system}/executeSystemUpdateRequest.ts (100%) rename ui/src/app/edge/settings/{systemupdate => system}/executesystemupdate.component.html (100%) rename ui/src/app/edge/settings/{systemupdate => system}/executesystemupdate.component.ts (100%) rename ui/src/app/edge/settings/{systemupdate => system}/getSystemUpdateStateRequest.ts (100%) rename ui/src/app/edge/settings/{systemupdate => system}/getSystemUpdateStateResponse.ts (100%) create mode 100644 ui/src/app/edge/settings/system/maintenance/maintenance.html create mode 100644 ui/src/app/edge/settings/system/maintenance/maintenance.ts rename ui/src/app/edge/settings/{systemupdate => system}/oe-system-update.component.html (97%) rename ui/src/app/edge/settings/{systemupdate => system}/oe-system-update.component.ts (100%) rename ui/src/app/edge/settings/{systemupdate/systemupdate.component.html => system/system.component.html} (85%) rename ui/src/app/edge/settings/{systemupdate/systemupdate.component.ts => system/system.component.ts} (53%) create mode 100644 ui/src/app/shared/footer/footer.html create mode 100644 ui/src/app/shared/footer/footer.ts create mode 100644 ui/src/app/shared/genericComponents/chart/chart.constants.spec.ts create mode 100644 ui/src/app/shared/genericComponents/chart/chart.constants.ts create mode 100644 ui/src/app/shared/jsonrpc/request/executeSystemRestartRequest.ts delete mode 100644 ui/src/app/shared/jsonrpc/request/get24HoursPredictionRequest.ts create mode 100644 ui/src/app/shared/jsonrpc/response/executeSystemRestartResponse.ts delete mode 100644 ui/src/app/shared/jsonrpc/response/get24HoursPredictionResponse.ts create mode 100644 ui/src/app/shared/type/language.spec.ts create mode 100644 ui/src/app/shared/utils/array/array.utils.spec.ts create mode 100644 ui/src/app/shared/utils/array/array.utils.ts diff --git a/build.gradle b/build.gradle index 37d18e80f2e..f44c073c365 100644 --- a/build.gradle +++ b/build.gradle @@ -78,6 +78,7 @@ subprojects { reports { xml.required = false html.required = false + sarif.required = false } minHeapSize = "256m" maxHeapSize = "1g" @@ -104,6 +105,17 @@ task cleanEdge() { } } +task checkstyleAll() { + group 'OpenEMS-Build' + description 'Checkstyle all bundles' + + subprojects.each { proj -> + if (proj.tasks.findAll { it.name == 'checkstyleMain' }) { + dependsOn(proj.checkstyleMain) + } + } +} + task cleanBackend() { group 'OpenEMS-Build' description 'Clean all Backend-Bundles' diff --git a/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/OfflineEdgeHandler.java b/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/OfflineEdgeHandler.java index 1d2fc543517..7662a1badcb 100644 --- a/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/OfflineEdgeHandler.java +++ b/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/OfflineEdgeHandler.java @@ -29,7 +29,8 @@ public class OfflineEdgeHandler implements Handler { // Definition of unrealistically high values for messages sent simultaneously public static final int MAX_SIMULTANEOUS_MSGS = 500; public static final int MAX_SIMULTANEOUS_EDGES = 1000; - + public static final int EDGE_REBOOT_MINUTES = 5; + private final Logger log = LoggerFactory.getLogger(OfflineEdgeHandler.class); private final int initialDelay; // in Minutes @@ -41,7 +42,7 @@ public class OfflineEdgeHandler implements Handler { private TimedTask initMetadata; private TimedExecutor timeService; - + public OfflineEdgeHandler(MessageSchedulerService mss, TimedExecutor timeService, Mailer mailer, Metadata metadata, int initialDelay) { this.mailer = mailer; @@ -69,6 +70,9 @@ public void stop() { public void send(ZonedDateTime sentAt, List pack) { // Ensure Edge is still offline before sending mail. pack.removeIf((msg) -> !this.isEdgeOffline(msg.getEdgeId())); + if (pack.isEmpty()) { + return; + } var params = JsonUtils.generateJsonArray(pack, OfflineEdgeMessage::getParams); @@ -139,7 +143,7 @@ private void checkMetadata() { private boolean isValidEdge(Edge edge) { var invalid = edge.getLastmessage() == null // was never online || edge.getLastmessage() // - .isBefore(ZonedDateTime.now().minusWeeks(1)); // already offline for a week + .isBefore(this.timeService.now().minusWeeks(1)); // already offline for a week return !invalid; } @@ -152,7 +156,7 @@ private boolean isValidEdge(Edge edge) { protected OfflineEdgeMessage getEdgeMessage(Edge edge) { if (edge == null || edge.getId() == null) { this.log.warn("Called method getEdgeMessage with " // - + edge == null ? "Edge{null}" : "Edge{id=null}"); + + (edge == null ? "Edge{null}" : "Edge{id=null}")); return null; } try { @@ -233,7 +237,11 @@ private void handleOnSetOnline(EventReader event) { if (isOnline) { this.tryRemoveEdge(edge); } else { - this.tryAddEdge(edge); + this.timeService.schedule(this.timeService.now().plusMinutes(EDGE_REBOOT_MINUTES), t -> { + if (edge.isOffline()) { + this.tryAddEdge(edge); + } + }); } } } else { @@ -248,7 +256,7 @@ public Consumer getEventHandler(String eventTopic) { yield this::handleOnSetOnline; case Metadata.Events.AFTER_IS_INITIALIZED: - yield this::handleMetadataAfterInitialize; + yield this::handleMetadataAfterInitialize; default: yield null; diff --git a/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java b/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java index 61d77a4b2c0..d61fca0c8ba 100644 --- a/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java +++ b/io.openems.backend.alerting/src/io/openems/backend/alerting/handler/SumStateHandler.java @@ -108,7 +108,7 @@ private boolean isSevere(Level level) { protected SumStateMessage getEdgeMessage(Edge edge, Level sumState) throws OpenemsException { if (edge == null || edge.getId() == null) { this.log.warn("Called method SumStateHandler.getEdgeMessage with " // - + edge == null ? "Edge{null}" : "Edge{id=null}"); + + (edge == null ? "Edge{null}" : "Edge{id=null}")); return null; } else if (edge.isOffline()) { this.log.warn("Called method SumStateHandler.getEdgeMessage with offline" // diff --git a/io.openems.backend.alerting/test/io/openems/backend/alerting/OfflineEdgeAlertingTest.java b/io.openems.backend.alerting/test/io/openems/backend/alerting/OfflineEdgeAlertingTest.java index 26b74aa0c7c..79f0d307b4e 100644 --- a/io.openems.backend.alerting/test/io/openems/backend/alerting/OfflineEdgeAlertingTest.java +++ b/io.openems.backend.alerting/test/io/openems/backend/alerting/OfflineEdgeAlertingTest.java @@ -14,6 +14,7 @@ import io.openems.backend.alerting.Dummy.AlertingMetadataImpl; import io.openems.backend.alerting.Dummy.MailerImpl; import io.openems.backend.alerting.Dummy.TimeLeapMinuteTimer; +import io.openems.backend.alerting.handler.OfflineEdgeHandler; import io.openems.backend.alerting.scheduler.Scheduler; import io.openems.backend.common.alerting.OfflineEdgeAlertingSetting; import io.openems.backend.common.metadata.Edge; @@ -128,7 +129,7 @@ public void integrationTest() { env.setOnline("edge03", false); env.setOnline("edge04", false); env.setOnline("edge07", false); - env.timer.leap(1); /* inaccuracy */ + env.timer.leap(1 + OfflineEdgeHandler.EDGE_REBOOT_MINUTES); /* inaccuracy */ /* edge05[user03], edge03[user01,user02], edge07[user04] */ assertEquals(3, env.scheduler.getScheduledMsgsCount()); diff --git a/io.openems.backend.alerting/test/io/openems/backend/alerting/handler/TestOfflineEdgeHandler.java b/io.openems.backend.alerting/test/io/openems/backend/alerting/handler/TestOfflineEdgeHandler.java index 1963dbc2ad5..bf29da78b22 100644 --- a/io.openems.backend.alerting/test/io/openems/backend/alerting/handler/TestOfflineEdgeHandler.java +++ b/io.openems.backend.alerting/test/io/openems/backend/alerting/handler/TestOfflineEdgeHandler.java @@ -33,7 +33,7 @@ public class TestOfflineEdgeHandler { public void testGetterSetter() { final var mss = new MessageSchedulerServiceImpl(); final var meta = new SimpleMetadataImpl(); - final var timer = new MinuteTimer(null); + final var timer = new MinuteTimer(Clock.systemUTC()); final var handler = new OfflineEdgeHandler(mss, timer, null, meta, 1); assertEquals(OfflineEdgeMessage.class, handler.getGeneric()); } @@ -41,7 +41,7 @@ public void testGetterSetter() { @Test public void testActivate() { final var service = new MessageSchedulerServiceImpl(); - final var timer = new MinuteTimer(null); + final var timer = new MinuteTimer(Clock.systemUTC()); var handler = new OfflineEdgeHandler(service, timer, null, new SimpleMetadataImpl(), 1); assertEquals(1, service.msgScheduler.size()); assertTrue(service.msgScheduler.get(0).isFor(handler)); @@ -78,7 +78,7 @@ public void send() { public void checkmetadata() { final var metadata = Utility.getTestMetadata(); final var msgsch = new MessageSchedulerServiceImpl(); - final var timer = new MinuteTimer(null); + final var timer = new MinuteTimer(Clock.systemUTC()); final var handler = new OfflineEdgeHandler(msgsch, timer, null, metadata, 0); final var expected = (int) metadata.getOfflineSettings().values().stream() // @@ -105,7 +105,7 @@ public void checkMetadataEmergencyStop() { final var msgMeta = new Utility.ToManyMsgsMetadata(); final var msgMsgsch = new MessageSchedulerServiceImpl(); final var msgCount = new AtomicInteger(); - final var timer = new MinuteTimer(null); + final var timer = new MinuteTimer(Clock.systemUTC()); msgMeta.getAllOfflineEdges().stream().map(e -> msgMeta.getEdgeOfflineAlertingSettings(e.getId())).forEach(e -> { e.forEach(s -> { if (s.lastNotification().plusMinutes(s.delay()).isBefore(Utility.now)) { diff --git a/io.openems.backend.common/src/io/openems/backend/common/alerting/UserAlertingSettings.java b/io.openems.backend.common/src/io/openems/backend/common/alerting/UserAlertingSettings.java index ead84d4eaa4..7f79575d982 100644 --- a/io.openems.backend.common/src/io/openems/backend/common/alerting/UserAlertingSettings.java +++ b/io.openems.backend.common/src/io/openems/backend/common/alerting/UserAlertingSettings.java @@ -11,6 +11,6 @@ public UserAlertingSettings(String userLogin, int offlineEdgeDelay, int faultSta } public UserAlertingSettings(String deviceId, String userLogin) { - this(deviceId, userLogin, 1440, 1440, 1440, null, null); + this(deviceId, userLogin, 0, 0, 0, null, null); } } \ No newline at end of file diff --git a/io.openems.backend.common/src/io/openems/backend/common/metadata/Edge.java b/io.openems.backend.common/src/io/openems/backend/common/metadata/Edge.java index 5c069d92ae3..b5940b7d971 100644 --- a/io.openems.backend.common/src/io/openems/backend/common/metadata/Edge.java +++ b/io.openems.backend.common/src/io/openems/backend/common/metadata/Edge.java @@ -178,6 +178,7 @@ private void setVersion(SemanticVersion version, boolean emitEvent) { EventBuilder.from(this.parent.getEventAdmin(), Events.ON_SET_VERSION) // .addArg(Events.OnSetVersion.EDGE, this) // + .addArg(Events.OnSetVersion.OLD_VERSION, oldVersion) // .addArg(Events.OnSetVersion.VERSION, version) // .send(); } @@ -255,6 +256,7 @@ public static final class OnSetOnline { public static final class OnSetVersion { public static final String EDGE = "Edge:Edge"; + public static final String OLD_VERSION = "OldVersion:SemanticVersion"; public static final String VERSION = "Version:SemanticVersion"; } diff --git a/io.openems.backend.core/src/io/openems/backend/core/jsonrpcrequesthandler/EdgeRpcRequestHandler.java b/io.openems.backend.core/src/io/openems/backend/core/jsonrpcrequesthandler/EdgeRpcRequestHandler.java index 2b843371034..dcb7a5a800e 100644 --- a/io.openems.backend.core/src/io/openems/backend/core/jsonrpcrequesthandler/EdgeRpcRequestHandler.java +++ b/io.openems.backend.core/src/io/openems/backend/core/jsonrpcrequesthandler/EdgeRpcRequestHandler.java @@ -9,17 +9,12 @@ import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.jsonrpc.base.JsonrpcResponseSuccess; import io.openems.common.jsonrpc.request.AppCenterRequest; -import io.openems.common.jsonrpc.request.ComponentJsonApiRequest; -import io.openems.common.jsonrpc.request.CreateComponentConfigRequest; -import io.openems.common.jsonrpc.request.DeleteComponentConfigRequest; import io.openems.common.jsonrpc.request.EdgeRpcRequest; import io.openems.common.jsonrpc.request.GetEdgeConfigRequest; import io.openems.common.jsonrpc.request.QueryHistoricTimeseriesDataRequest; import io.openems.common.jsonrpc.request.QueryHistoricTimeseriesEnergyPerPeriodRequest; import io.openems.common.jsonrpc.request.QueryHistoricTimeseriesEnergyRequest; import io.openems.common.jsonrpc.request.QueryHistoricTimeseriesExportXlxsRequest; -import io.openems.common.jsonrpc.request.SetChannelValueRequest; -import io.openems.common.jsonrpc.request.UpdateComponentConfigRequest; import io.openems.common.jsonrpc.response.EdgeRpcResponse; import io.openems.common.jsonrpc.response.GetEdgeConfigResponse; import io.openems.common.jsonrpc.response.QueryHistoricTimeseriesDataResponse; @@ -86,31 +81,8 @@ protected CompletableFuture handleRequest(User user, UUID messa resultFuture = this.handleGetEdgeConfigRequest(edgeId, user, GetEdgeConfigRequest.from(request)); break; - case CreateComponentConfigRequest.METHOD: - resultFuture = this.handleCreateComponentConfigRequest(edgeId, user, - CreateComponentConfigRequest.from(request)); - break; - - case UpdateComponentConfigRequest.METHOD: - resultFuture = this.handleUpdateComponentConfigRequest(edgeId, user, - UpdateComponentConfigRequest.from(request)); - break; - - case DeleteComponentConfigRequest.METHOD: - resultFuture = this.handleDeleteComponentConfigRequest(edgeId, user, - DeleteComponentConfigRequest.from(request)); - break; - - case SetChannelValueRequest.METHOD: - resultFuture = this.handleSetChannelValueRequest(edgeId, user, SetChannelValueRequest.from(request)); - break; - - case ComponentJsonApiRequest.METHOD: - resultFuture = this.handleComponentJsonApiRequest(edgeId, user, ComponentJsonApiRequest.from(request)); - break; - default: - throw OpenemsError.JSONRPC_UNHANDLED_METHOD.exception(request.getMethod()); + resultFuture = this.parent.edgeWebsocket.send(edgeId, user, request); } // Wrap reply in EdgeRpcResponse @@ -214,83 +186,4 @@ private CompletableFuture handleGetEdgeConfigRequest(Str return CompletableFuture.completedFuture(new GetEdgeConfigResponse(request.getId(), config)); } - /** - * Handles a {@link CreateComponentConfigRequest}. - * - * @param edgeId the Edge-ID - * @param user the {@link User} - Installer-level required - * @param request the {@link CreateComponentConfigRequest} - * @return the Future JSON-RPC Response - * @throws OpenemsNamedException on error - */ - private CompletableFuture handleCreateComponentConfigRequest(String edgeId, User user, - CreateComponentConfigRequest request) throws OpenemsNamedException { - user.assertEdgeRoleIsAtLeast(CreateComponentConfigRequest.METHOD, edgeId, Role.INSTALLER); - - return this.parent.edgeWebsocket.send(edgeId, user, request); - } - - /** - * Handles a {@link UpdateComponentConfigRequest}. - * - * @param edgeId the Edge-ID - * @param user the {@link User} - Installer-level required - * @param request the {@link UpdateComponentConfigRequest} - * @return the Future JSON-RPC Response - * @throws OpenemsNamedException on error - */ - private CompletableFuture handleUpdateComponentConfigRequest(String edgeId, User user, - UpdateComponentConfigRequest request) throws OpenemsNamedException { - user.assertEdgeRoleIsAtLeast(UpdateComponentConfigRequest.METHOD, edgeId, Role.OWNER); - - return this.parent.edgeWebsocket.send(edgeId, user, request); - } - - /** - * Handles a {@link DeleteComponentConfigRequest}. - * - * @param edgeId the Edge-ID - * @param user the {@link User} - Installer-level required - * @param request the {@link DeleteComponentConfigRequest} - * @return the Future JSON-RPC Response - * @throws OpenemsNamedException on error - */ - private CompletableFuture handleDeleteComponentConfigRequest(String edgeId, User user, - DeleteComponentConfigRequest request) throws OpenemsNamedException { - user.assertEdgeRoleIsAtLeast(DeleteComponentConfigRequest.METHOD, edgeId, Role.INSTALLER); - - return this.parent.edgeWebsocket.send(edgeId, user, request); - } - - /** - * Handles a {@link SetChannelValueRequest}. - * - * @param edgeId the Edge-ID - * @param user the {@link User} - * @param request the {@link SetChannelValueRequest} - * @return the Future JSON-RPC Response - * @throws OpenemsNamedException on error - */ - private CompletableFuture handleSetChannelValueRequest(String edgeId, User user, - SetChannelValueRequest request) throws OpenemsNamedException { - user.assertEdgeRoleIsAtLeast(SetChannelValueRequest.METHOD, edgeId, Role.ADMIN); - - return this.parent.edgeWebsocket.send(edgeId, user, request); - } - - /** - * Handles a {@link UpdateComponentConfigRequest}. - * - * @param edgeId the Edge-ID - * @param user the {@link User} - Guest-level required - * @param componentJsonApiRequest the {@link ComponentJsonApiRequest} - * @return the Future JSON-RPC Response - * @throws OpenemsNamedException on error - */ - private CompletableFuture handleComponentJsonApiRequest(String edgeId, User user, - ComponentJsonApiRequest componentJsonApiRequest) throws OpenemsNamedException { - user.assertEdgeRoleIsAtLeast(ComponentJsonApiRequest.METHOD, edgeId, Role.GUEST); - - return this.parent.edgeWebsocket.send(edgeId, user, componentJsonApiRequest); - } } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Config.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Config.java index 9d36281a8f5..24780745baa 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Config.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Config.java @@ -4,6 +4,7 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition; import io.openems.backend.metadata.odoo.odoo.Protocol; +import io.openems.common.websocket.AbstractWebsocketServer.DebugMode; @ObjectClassDefinition(// name = "Metadata.Odoo", // @@ -40,6 +41,15 @@ @AttributeDefinition(name = "Database", description = "The database name") String database(); + @AttributeDefinition(name = "Number of Threads", description = "Pool-Size: the number of threads dedicated to handle the tasks") + int poolSize() default 30; + + @AttributeDefinition(name = "Number of Threads", description = "Pool-Size: the maximum number of concurrent connections") + int pgConnectionPoolSize() default 40; + + @AttributeDefinition(name = "Debug Mode", description = "Activates the debug mode") + DebugMode debugMode() default DebugMode.OFF; + String webconsole_configurationFactory_nameHint() default "Metadata.Odoo"; } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java index c0eb9da2aee..cfd7dc2ef1c 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java @@ -222,7 +222,6 @@ public enum EdgeDeviceUserRole implements Field { DEVICE_ODOO_ID("device_id", false), // USER_ODOO_ID("user_id", true), // ROLE("role", false), // - TIME_TO_WAIT("time_to_wait", true), // LAST_NOTIFICATION("last_notification", true), // ; // diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MetadataOdoo.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MetadataOdoo.java index 23324b1ab0b..bab8ab64e22 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MetadataOdoo.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MetadataOdoo.java @@ -1,9 +1,12 @@ package io.openems.backend.metadata.odoo; +import static io.openems.common.utils.ThreadPoolUtils.shutdownAndAwaitTermination; + import java.sql.SQLException; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.NavigableMap; @@ -11,9 +14,12 @@ import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -33,10 +39,12 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import io.openems.backend.common.alerting.OfflineEdgeAlertingSetting; import io.openems.backend.common.alerting.SumStateAlertingSetting; import io.openems.backend.common.alerting.UserAlertingSettings; +import io.openems.backend.common.debugcycle.DebugLoggable; import io.openems.backend.common.metadata.AbstractMetadata; import io.openems.backend.common.metadata.AppCenterMetadata; import io.openems.backend.common.metadata.Edge; @@ -63,6 +71,7 @@ import io.openems.common.types.SemanticVersion; import io.openems.common.utils.JsonUtils; import io.openems.common.utils.ThreadPoolUtils; +import io.openems.common.websocket.AbstractWebsocketServer.DebugMode; @Designate(ocd = Config.class, factory = false) @Component(// @@ -74,19 +83,22 @@ Edge.Events.ALL_EVENTS // }) public class MetadataOdoo extends AbstractMetadata implements AppCenterMetadata, AppCenterMetadata.EdgeData, - AppCenterMetadata.UiData, Metadata, Mailer, EventHandler { + AppCenterMetadata.UiData, Metadata, Mailer, EventHandler, DebugLoggable { - private static final int EXECUTOR_MIN_THREADS = 1; - private static final int EXECUTOR_MAX_THREADS = 50; + private static final Function ATOMIC_INTEGER_PROVIDER = (key) -> { + return new AtomicInteger(0); + }; private final Logger log = LoggerFactory.getLogger(MetadataOdoo.class); private final EdgeCache edgeCache; private final OdooEdgeHandler edgeHandler = new OdooEdgeHandler(this); - private final ThreadPoolExecutor executor = new ThreadPoolExecutor(EXECUTOR_MIN_THREADS, EXECUTOR_MAX_THREADS, 60L, - TimeUnit.SECONDS, new LinkedBlockingQueue(), - new ThreadFactoryBuilder().setNameFormat("Metadata.Odoo.Worker-%d").build()); /** Maps User-ID to {@link User}. */ private final ConcurrentHashMap users = new ConcurrentHashMap<>(); + private final ConcurrentHashMap activeTasks = new ConcurrentHashMap<>(100); + + private ThreadPoolExecutor defaultExecutor = null; + private ThreadPoolExecutor edgeConfigExecutor = null; + private final ConcurrentHashMap pendingEdgeConfigIds = new ConcurrentHashMap<>(); @Reference private EventAdmin eventAdmin; @@ -96,6 +108,7 @@ public class MetadataOdoo extends AbstractMetadata implements AppCenterMetadata, protected OdooHandler odooHandler = null; protected PostgresHandler postgresHandler = null; + private DebugMode debugMode = DebugMode.OFF; public MetadataOdoo() { super("Metadata.Odoo"); @@ -112,6 +125,11 @@ private void activate(Config config) throws SQLException { + (config.pgPassword() != null ? "ok" : "NOT_SET") + "] " // + "Database [" + config.database() + "]"); + this.debugMode = config.debugMode(); + this.defaultExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(config.poolSize() / 2, + new ThreadFactoryBuilder().setNameFormat("Metadata.Odoo.Default-%d").build()); + this.edgeConfigExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(config.poolSize() / 2, + new ThreadFactoryBuilder().setNameFormat("Metadata.Odoo.EdgeConfig-%d").build()); this.odooHandler = new OdooHandler(this, this.edgeCache, config); this.postgresHandler = new PostgresHandler(this, this.edgeCache, config, () -> { this.setInitialized(); @@ -121,7 +139,8 @@ private void activate(Config config) throws SQLException { @Deactivate private void deactivate() { this.logInfo(this.log, "Deactivate"); - ThreadPoolUtils.shutdownAndAwaitTermination(this.executor, 5); + shutdownAndAwaitTermination(this.defaultExecutor, 5); + shutdownAndAwaitTermination(this.edgeConfigExecutor, 5); if (this.postgresHandler != null) { this.postgresHandler.deactivate(); } @@ -355,7 +374,7 @@ public void handleEvent(Event event) { var edge = (MyEdge) reader.getProperty(Edge.Events.OnSetProducttype.EDGE); var producttype = reader.getString(Edge.Events.OnSetProducttype.PRODUCTTYPE); // Set Producttype in Odoo/Postgres - this.executor.execute(() -> { + this.execute(this.defaultExecutor, "OnSetProducttype", () -> { try { this.postgresHandler.edge.updateProductType(edge.getOdooId(), producttype); } catch (SQLException | OpenemsNamedException e) { @@ -371,7 +390,7 @@ public void handleEvent(Event event) { @Override public void logGenericSystemLog(GenericSystemLog systemLog) { - this.executor.execute(() -> { + this.execute(this.defaultExecutor, "LogGenericSystemLog", () -> { try { final var edge = (MyEdge) this.getEdgeOrError(systemLog.edgeId()); this.postgresHandler.edge.insertGenericSystemLog(edge.getOdooId(), systemLog); @@ -382,41 +401,55 @@ public void logGenericSystemLog(GenericSystemLog systemLog) { } private void onSetConfigEvent(EventReader reader) { - this.executor.execute(() -> { - var edge = (MyEdge) reader.getProperty(Edge.Events.OnSetConfig.EDGE); - var newConfig = (EdgeConfig) reader.getProperty(Edge.Events.OnSetConfig.CONFIG); + final var edge = (MyEdge) reader.getProperty(Edge.Events.OnSetConfig.EDGE); + if (this.pendingEdgeConfigIds.putIfAbsent(edge.getId(), Boolean.TRUE) != null) { + // A task for this Edge-ID is already scheduled + // TODO it would be better to drop the old task and not the new one + this.logWarn(this.log, + "Edge [" + edge.getId() + "]. Update config ignored: another task is already scheduled"); + return; + } - EdgeConfig oldConfig; + this.execute(this.edgeConfigExecutor, "OnSetConfig", () -> { try { - oldConfig = this.edgeHandler.getEdgeConfig(edge.getId()); + var newConfig = (EdgeConfig) reader.getProperty(Edge.Events.OnSetConfig.CONFIG); - } catch (OpenemsNamedException e) { - oldConfig = EdgeConfig.empty(); - this.logWarn(this.log, "Edge [" + edge.getId() + "]. " + e.getMessage()); - } + EdgeConfig oldConfig; + try { + oldConfig = this.edgeHandler.getEdgeConfig(edge.getId()); - var diff = EdgeConfigDiff.diff(newConfig, oldConfig); - if (diff.isDifferent()) { - // Update "EdgeConfigUpdate" - var diffString = diff.toString(); - if (!diffString.isBlank()) { - this.logInfo(this.log, "Edge [" + edge.getId() + "]. Update config: " + diff.toString()); + } catch (OpenemsNamedException e) { + oldConfig = EdgeConfig.empty(); + this.logWarn(this.log, "Edge [" + edge.getId() + "]. " + e.getMessage()); } + var diff = EdgeConfigDiff.diff(newConfig, oldConfig); + if (diff.isDifferent()) { + // Update "EdgeConfigUpdate" + var diffString = diff.toString(); + if (!diffString.isBlank()) { + this.logInfo(this.log, "Edge [" + edge.getId() + "]. Update config: " + diff.toString()); + } + + try { + this.postgresHandler.edge.insertEdgeConfigUpdate(edge.getOdooId(), diff); + } catch (SQLException | OpenemsNamedException e) { + this.logWarn(this.log, "Edge [" + edge.getId() + "] " // + + "Unable to insert EdgeConfigUpdate: " + e.getMessage()); + } + } + + // Always update EdgeConfig, because it also updates "openems_config_components" try { - this.postgresHandler.edge.insertEdgeConfigUpdate(edge.getOdooId(), diff); + this.postgresHandler.edge.updateEdgeConfig(edge.getOdooId(), newConfig); } catch (SQLException | OpenemsNamedException e) { this.logWarn(this.log, "Edge [" + edge.getId() + "] " // + "Unable to insert EdgeConfigUpdate: " + e.getMessage()); } - } - // Always update EdgeConfig, because it also updates "openems_config_components" - try { - this.postgresHandler.edge.updateEdgeConfig(edge.getOdooId(), newConfig); - } catch (SQLException | OpenemsNamedException e) { - this.logWarn(this.log, "Edge [" + edge.getId() + "] " // - + "Unable to insert EdgeConfigUpdate: " + e.getMessage()); + } finally { + // Remove from pending list + this.pendingEdgeConfigIds.remove(edge.getId()); } }); } @@ -579,7 +612,11 @@ private EdgeMetadata convertToEdgeMetadata(User user, JsonElement jDevice) throw .map(String::toUpperCase) // .map(Level::valueOf) // .orElse(Level.OK); - final var commment = JsonUtils.getAsOptionalString(jDevice, "comment").orElse(""); + + final var commment = this.oem.anonymizeEdgeComment(user, // + JsonUtils.getAsOptionalString(jDevice, "comment").orElse(""), // + edgeId); + final var producttype = JsonUtils.getAsOptionalString(jDevice, "producttype").orElse(""); final var firstSetupProtocol = JsonUtils.getAsOptionalString(jDevice, "first_setup_protocol_date") .map(DateTime::stringToDateTime) // @@ -618,4 +655,69 @@ public void updateUserSettings(User user, JsonObject settings) throws OpenemsNam this.odooHandler.updateUserSettings(user, settings); } + /** + * Execute a {@link Runnable} using the shared {@link ExecutorService}. + * + * @param executor the {@link Executor} + * @param id the identifier for this type of command + * @param command the {@link Runnable} + */ + private void execute(Executor executor, String id, Runnable command) { + if (executor == null) { + return; + } + + if (this.debugMode.isAtLeast(DebugMode.DETAILED)) { + this.activeTasks.computeIfAbsent(id, ATOMIC_INTEGER_PROVIDER).incrementAndGet(); + executor.execute(() -> { + try { + command.run(); + } catch (Throwable t) { + throw t; + } finally { + this.activeTasks.get(id).decrementAndGet(); + } + }); + } else { + executor.execute(command); + } + } + + @Override + public String debugLog() { + var b = new StringBuilder("[").append(this.getName()).append("] [monitor] ") // + .append("Default: ") // + .append(ThreadPoolUtils.debugLog(this.defaultExecutor)) // + .append(", EdgeConfig: ") // + .append(ThreadPoolUtils.debugLog(this.edgeConfigExecutor)); + + if (this.debugMode.isAtLeast(DebugMode.DETAILED)) { + b.append(", Tasks: "); + this.activeTasks.forEach((id, count) -> { + var cnt = count.get(); + if (cnt > 0) { + b.append(id).append(':').append(cnt).append(", "); + } + }); + } + + return b.toString(); + } + + @Override + public Map debugMetrics() { + // TODO implement getId() + final var metrics = new HashMap(); + var defaultExecutorMetrics = ThreadPoolUtils.debugMetrics(this.defaultExecutor); + var edgeConfigExecutorMetrics = ThreadPoolUtils.debugMetrics(this.edgeConfigExecutor); + defaultExecutorMetrics.forEach((key, value) -> { + var value2 = edgeConfigExecutorMetrics.get(key); + if (value2 != null) { + value += value2; + } + metrics.put("metadata0/" + key, new JsonPrimitive(value)); + }); + return metrics; + } + } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java index 1bcf0477ed5..625a990b6e7 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java @@ -57,6 +57,7 @@ import io.openems.common.jsonrpc.request.GetEdgesRequest.PaginationOptions; import io.openems.common.session.Language; import io.openems.common.session.Role; +import io.openems.common.utils.JsonUtils; import io.openems.common.utils.ObjectUtils; import io.openems.common.utils.PasswordUtils; @@ -178,10 +179,18 @@ private void assignEdgeToUser(int userId, int edgeId, OdooUserRole userRole) thr new FieldValue<>(Field.EdgeDeviceUserRole.DEVICE_ODOO_ID, edgeId), // new FieldValue<>(Field.EdgeDeviceUserRole.ROLE, userRole.getOdooRole()) // ); - if (userRole.equals(OdooUserRole.OWNER)) { - fields.add(new FieldValue<>(Field.EdgeDeviceUserRole.TIME_TO_WAIT, 60)); - } OdooUtils.create(this.credentials, Field.EdgeDeviceUserRole.ODOO_MODEL, fields.toArray(FieldValue[]::new)); + + // create initial configuration for alerting settings for owner + if (!userRole.equals(OdooUserRole.OWNER)) { + return; + } + final var alertingFields = Lists.newArrayList(// + new FieldValue<>(Field.AlertingSetting.USER_ODOO_ID, userId), // + new FieldValue<>(Field.AlertingSetting.DEVICE_ODOO_ID, edgeId), // + new FieldValue<>(Field.AlertingSetting.OFFLINE_DELAY, 60) // + ); + OdooUtils.create(this.credentials, Field.AlertingSetting.ODOO_MODEL, alertingFields.toArray(FieldValue[]::new)); } /** @@ -411,32 +420,32 @@ public byte[] getOdooSetupProtocolReport(int setupProtocolId) throws OpenemsName * @throws OpenemsNamedException on error */ public int submitSetupProtocol(MyUser user, JsonObject setupProtocolJson) throws OpenemsNamedException { - var userJson = getAsJsonObject(setupProtocolJson, "customer"); - var edgeJson = getAsJsonObject(setupProtocolJson, "edge"); - var installerJson = getAsJsonObject(setupProtocolJson, "installer"); - var oem = getAsString(setupProtocolJson, "oem").toUpperCase(); + final var userJson = getAsJsonObject(setupProtocolJson, "customer"); + final var edgeJson = getAsJsonObject(setupProtocolJson, "edge"); + final var installerJson = getAsJsonObject(setupProtocolJson, "installer"); + final var oem = getAsString(setupProtocolJson, "oem").toUpperCase(); - var edgeId = getAsString(edgeJson, "id"); - var foundEdge = OdooUtils.search(this.credentials, Field.EdgeDevice.ODOO_MODEL, + final var edgeId = getAsString(edgeJson, "id"); + final var foundEdge = OdooUtils.search(this.credentials, Field.EdgeDevice.ODOO_MODEL, new Domain(Field.EdgeDevice.NAME, Operator.EQ, edgeId)); if (foundEdge.length != 1) { throw new OpenemsException("Edge not found for id [" + edgeId + "]"); } - var password = PasswordUtils.generateRandomPassword(8); - var odooUserId = this.createOdooUser(userJson, password, oem); + final var password = PasswordUtils.generateRandomPassword(8); + final var odooUserId = this.createOdooUser(userJson, password, oem); - var customerId = this.getOdooPartnerId(odooUserId); - var installerId = this.getOdooPartnerId(user); + final var customerId = this.getOdooPartnerId(odooUserId); + final var installerId = this.getOdooPartnerId(user); this.assignEdgeToUser(odooUserId, foundEdge[0], OdooUserRole.OWNER); - var protocolId = this.createSetupProtocol(setupProtocolJson, foundEdge[0], customerId, installerId); + final var protocolId = this.createSetupProtocol(setupProtocolJson, foundEdge[0], customerId, installerId); this.updateEdgeComment(userJson, edgeId, foundEdge[0]); - var installer = OdooUtils.readOne(this.credentials, Field.Partner.ODOO_MODEL, installerId, + final var installer = OdooUtils.readOne(this.credentials, Field.Partner.ODOO_MODEL, installerId, Field.Partner.IS_COMPANY); - var isCompany = (boolean) installer.get("is_company"); + final var isCompany = (boolean) installer.get("is_company"); if (!isCompany) { Map fieldsToUpdate = new HashMap<>(); getAsOptionalString(installerJson, "firstname") // diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/postgres/PostgresHandler.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/postgres/PostgresHandler.java index fffadecee4f..3b3b6377b2e 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/postgres/PostgresHandler.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/postgres/PostgresHandler.java @@ -82,6 +82,7 @@ private HikariDataSource getDataSource(Config config) throws SQLException { pgds.setPassword(config.pgPassword()); } var result = new HikariDataSource(); + result.setMaximumPoolSize(config.pgConnectionPoolSize()); result.setDataSource(pgds); return result; } diff --git a/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AggregatedInflux.java b/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AggregatedInflux.java index be3f5160348..4781e471dbb 100644 --- a/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AggregatedInflux.java +++ b/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AggregatedInflux.java @@ -29,6 +29,9 @@ import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventHandler; +import org.osgi.service.event.propertytypes.EventTopics; import org.osgi.service.metatype.annotations.Designate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,9 +44,11 @@ import io.openems.backend.common.component.AbstractOpenemsBackendComponent; import io.openems.backend.common.debugcycle.DebugLoggable; +import io.openems.backend.common.metadata.Edge; import io.openems.backend.common.timedata.InternalTimedataException; import io.openems.backend.common.timedata.Timedata; import io.openems.backend.timedata.aggregatedinflux.AllowedChannels.ChannelType; +import io.openems.common.event.EventReader; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.exceptions.OpenemsException; import io.openems.common.jsonrpc.notification.AbstractDataNotification; @@ -54,6 +59,7 @@ import io.openems.common.timedata.DurationUnit; import io.openems.common.timedata.Resolution; import io.openems.common.types.ChannelAddress; +import io.openems.common.types.SemanticVersion; import io.openems.shared.influxdb.DbDataUtils; import io.openems.shared.influxdb.InfluxConnector; @@ -62,7 +68,10 @@ name = "Timedata.AggregatedInfluxDB", // configurationPolicy = ConfigurationPolicy.REQUIRE // ) -public class AggregatedInflux extends AbstractOpenemsBackendComponent implements Timedata, DebugLoggable { +@EventTopics({ // + Edge.Events.ON_SET_VERSION // +}) +public class AggregatedInflux extends AbstractOpenemsBackendComponent implements Timedata, DebugLoggable, EventHandler { private final Logger log = LoggerFactory.getLogger(this.getClass()); @@ -130,6 +139,20 @@ private void deactivate() { this.influxConnector.deactivate(); } + @Override + public void handleEvent(Event event) { + final var reader = new EventReader(event); + switch (event.getTopic()) { + case Edge.Events.ON_SET_VERSION -> { + this.handleEdgeVersionUpdateEvent(// + reader.getProperty(Edge.Events.OnSetVersion.EDGE).getId(), // + reader.getProperty(Edge.Events.OnSetVersion.OLD_VERSION), // + reader.getProperty(Edge.Events.OnSetVersion.VERSION) // + ); + } + } + } + @Override public SortedMap> queryHistoricData(// String edgeId, // @@ -364,6 +387,11 @@ private String checkDataAvailableOrErrorMessage(// influxEdgeId, AllowedChannels.isChannelDefined(channel.toString()) ? "" : "un", channel.toString()); } + // TODO remove + // available since is in milliseconds + if (availableSince > 999_999_999_999L) { + availableSince /= 1_000; + } if (seconds < availableSince) { return "AvailableSince %5d for channel %s too early got: %d, needed %d".formatted(// influxEdgeId, channel.toString(), availableSince, seconds); @@ -422,4 +450,28 @@ public Map debugMetrics() { return null; } + private void handleEdgeVersionUpdateEvent(// + final String edgeId, // + final SemanticVersion lastVersion, // + final SemanticVersion currentVersion // + ) { + // Version ZERO indicates that this edge got connected for the first time + if (!lastVersion.equals(SemanticVersion.ZERO)) { + return; + } + Integer influxEdgeId; + try { + influxEdgeId = InfluxConnector.parseNumberFromName(edgeId); + } catch (OpenemsException e) { + return; + } + + for (var channel : AllowedChannels.ALLOWED_AVERAGE_CHANNELS.keySet()) { + this.setAvailableSince(influxEdgeId, channel, 0); + } + for (var channel : AllowedChannels.ALLOWED_CUMULATED_CHANNELS.keySet()) { + this.setAvailableSince(influxEdgeId, channel, 0); + } + } + } diff --git a/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AllowedChannels.java b/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AllowedChannels.java index bd11967ec23..f7d8fc2813d 100644 --- a/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AllowedChannels.java +++ b/io.openems.backend.timedata.aggregatedinflux/src/io/openems/backend/timedata/aggregatedinflux/AllowedChannels.java @@ -43,6 +43,7 @@ private AllowedChannels() { .put("ctrlIoHeatPump0/Status", DataType.LONG) // .putAll(multiChannels("ess", 0, 17, "Soc", DataType.LONG)) // .putAll(multiChannels("ess", 0, 17, "ActivePower", DataType.LONG)) // + .putAll(multiChannels("ess", 0, 17, "ReactivePower", DataType.LONG)) // .put("ctrlIoHeatingElement0/Level", DataType.LONG) // .put("ctrlGridOptimizedCharge0/DelayChargeMaximumChargeLimit", DataType.LONG) // .putAll(multiChannels("charger", 0, 10, "ActualPower", DataType.LONG)) // @@ -56,6 +57,18 @@ private AllowedChannels() { .put("ctrlEssTimeOfUseTariff0/QuarterlyPrices", DataType.DOUBLE) // .put("ctrlEssTimeOfUseTariff0/StateMachine", DataType.LONG) // .putAll(multiChannels("evcs", 0, 10, "ChargePower", DataType.LONG)) // + .putAll(multiChannels("ctrlTimeslotPeakshaving", 0, 10, "StateMachine", DataType.LONG)) // + .putAll(multiChannels("ctrlTimeslotPeakshaving", 0, 10, "_PropertyRechargePower", DataType.LONG)) // + .putAll(multiChannels("ctrlTimeslotPeakshaving", 0, 10, "_PropertyPeakShavingPower", DataType.LONG)) // + // both for symmetric and asymmetric + .put("ctrlPeakShaving0/_PropertyPeakShavingPower", DataType.LONG) // + .put("ctrlPeakShaving0/_PropertyRechargePower", DataType.LONG) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "Ess0SetActivePowerEquals", DataType.LONG)) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "Ess0SetReactivePowerEquals", DataType.LONG)) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "Ess0SetActivePowerLessOrEquals", DataType.LONG)) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "Ess0SetReactivePowerLessOrEquals", DataType.LONG)) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "Ess0SetReactivePowerGreaterOrEquals", DataType.LONG)) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "Ess0SetActivePowerGreaterOrEquals", DataType.LONG)) // .build(); ALLOWED_CUMULATED_CHANNELS = ImmutableMap.builder() // @@ -94,6 +107,10 @@ private AllowedChannels() { .put("ctrlIoHeatPump0/RecommendationStateTime", DataType.LONG) // .put("ctrlIoHeatPump0/ForceOnStateTime", DataType.LONG) // .put("ctrlIoHeatPump0/LockStateTime", DataType.LONG) // + .putAll(multiChannels("ess", 0, 17, "ActiveChargeEnergy", DataType.LONG)) // + .putAll(multiChannels("ess", 0, 17, "ActiveDischargeEnergy", DataType.LONG)) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "CumulatedActiveTime", DataType.LONG)) // + .putAll(multiChannels("ctrlApiModbusTcp", 0, 3, "CumulatedInactiveTime", DataType.LONG)) // .build(); } diff --git a/io.openems.backend.timedata.timescaledb/src/io/openems/backend/timedata/timescaledb/internal/write/TimescaledbWriteHandler.java b/io.openems.backend.timedata.timescaledb/src/io/openems/backend/timedata/timescaledb/internal/write/TimescaledbWriteHandler.java index 1d7ea6e2b5f..e26aaf72312 100644 --- a/io.openems.backend.timedata.timescaledb/src/io/openems/backend/timedata/timescaledb/internal/write/TimescaledbWriteHandler.java +++ b/io.openems.backend.timedata.timescaledb/src/io/openems/backend/timedata/timescaledb/internal/write/TimescaledbWriteHandler.java @@ -153,7 +153,7 @@ public StringBuilder debugLog() { * * @return metrics */ - public Map debugMetrics() { + public Map debugMetrics() { return ThreadPoolUtils.debugMetrics(this.executor); } diff --git a/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java b/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java index b35e84f4225..7464ba22feb 100644 --- a/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java +++ b/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java @@ -1,5 +1,7 @@ package io.openems.backend.uiwebsocket.impl; +import static java.util.Collections.emptyMap; + import java.util.List; import java.util.Map; import java.util.Objects; @@ -242,6 +244,13 @@ private CompletableFuture handleEdgeRpcRequest(WsData wsData, U case "executeSystemUpdate" -> { this.parent.metadata.logGenericSystemLog(new LogUpdateSystem(edgeId, user)); } + case "executeSystemRestart" -> { + final var executeSystemCommandRequest = componentRequest.getPayload(); + final var p = executeSystemCommandRequest.getParams(); + this.parent.metadata.logGenericSystemLog(new LogRestartSystem(edgeId, user, // + JsonUtils.getAsOptionalString(p, "type").orElse(null) // + )); + } } yield null; @@ -311,7 +320,30 @@ public String teaser() { @Override public Map getValues() { - return Map.of(); + return emptyMap(); + } + + } + + private record LogRestartSystem(// + String edgeId, // non-null + User user, // non-null + String type // null-able + ) implements GenericSystemLog { + + @Override + public String teaser() { + return "Systemrestart"; + } + + @Override + public Map getValues() { + if (this.type == null) { + return emptyMap(); + } + return Map.of(// + "type", this.type // + ); } } diff --git a/io.openems.common/src/io/openems/common/channel/PersistencePriority.java b/io.openems.common/src/io/openems/common/channel/PersistencePriority.java index 8be1fe47281..bf55d45309e 100644 --- a/io.openems.common/src/io/openems/common/channel/PersistencePriority.java +++ b/io.openems.common/src/io/openems/common/channel/PersistencePriority.java @@ -90,6 +90,8 @@ private PersistencePriority(int value) { this.value = value; } + public static final PersistencePriority DEFAULT_PERSISTENCE_PRIORITY = PersistencePriority.VERY_LOW; + /** * Is this {@link PersistencePriority} at least as high as the given * {@link PersistencePriority}?. diff --git a/io.openems.common/src/io/openems/common/function/TriFunction.java b/io.openems.common/src/io/openems/common/function/TriFunction.java new file mode 100644 index 00000000000..e5d50938d1c --- /dev/null +++ b/io.openems.common/src/io/openems/common/function/TriFunction.java @@ -0,0 +1,28 @@ +package io.openems.common.function; + +import java.util.function.BiFunction; + +/** + * This interface is similar to the java.util interface {@link BiFunction}. + * Difference is, that it allows to pass to the apply() method one more + * parameter. + * + * @param the apply methods first argument type + * @param the apply methods second argument type + * @param the apply methods third argument type + * @param the type of the result of the function + */ +@FunctionalInterface +public interface TriFunction { + + /** + * Applies this function to the given arguments. + * + * @param t the first function argument + * @param u the second function argument + * @param s the third function argument + * @return the function result + */ + public R apply(T t, U u, S s); + +} diff --git a/io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserSettingsRequest.java b/io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserSettingsRequest.java index ea40ca74f1a..017ae46224d 100644 --- a/io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserSettingsRequest.java +++ b/io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserSettingsRequest.java @@ -52,7 +52,7 @@ public JsonObject getParams() { .add("settings", this.settings) // .build(); } - + public JsonObject getSettings() { return this.settings; } diff --git a/io.openems.common/src/io/openems/common/oem/DummyOpenemsEdgeOem.java b/io.openems.common/src/io/openems/common/oem/DummyOpenemsEdgeOem.java index dba025ba18f..270154f1318 100644 --- a/io.openems.common/src/io/openems/common/oem/DummyOpenemsEdgeOem.java +++ b/io.openems.common/src/io/openems/common/oem/DummyOpenemsEdgeOem.java @@ -97,6 +97,7 @@ public SystemUpdateParams getSystemUpdateParams() { .put("App.PeakShaving.PeakShaving", "") // .put("App.PeakShaving.PhaseAccuratePeakShaving", "") // .put("App.Ess.FixActivePower", "") // + .put("App.Ess.FixStateOfCharge", "") // .put("App.Ess.PowerPlantController", "") // .put("App.Ess.PrepareBatteryExtension", "") // .build(); diff --git a/io.openems.common/src/io/openems/common/oem/OpenemsBackendOem.java b/io.openems.common/src/io/openems/common/oem/OpenemsBackendOem.java index fcdd30aa1ca..948e7822ab3 100644 --- a/io.openems.common/src/io/openems/common/oem/OpenemsBackendOem.java +++ b/io.openems.common/src/io/openems/common/oem/OpenemsBackendOem.java @@ -1,5 +1,7 @@ package io.openems.common.oem; +import io.openems.common.session.AbstractUser; + public interface OpenemsBackendOem { /** @@ -22,4 +24,16 @@ public default String getAppCenterMasterKey() { public default String getInfluxdbTag() { return "edge"; } + + /** + * Anonymize edge comment, dependent on user id. + * + * @param user the current user + * @param comment the edge comment + * @param edgeId the edge id + * @return the edge comment + */ + public default String anonymizeEdgeComment(AbstractUser user, String comment, String edgeId) { + return comment; + } } diff --git a/io.openems.common/src/io/openems/common/types/EdgeConfig.java b/io.openems.common/src/io/openems/common/types/EdgeConfig.java index 9ed97a7ef88..1871fb826d7 100644 --- a/io.openems.common/src/io/openems/common/types/EdgeConfig.java +++ b/io.openems.common/src/io/openems/common/types/EdgeConfig.java @@ -27,11 +27,11 @@ import io.openems.common.channel.AccessMode; import io.openems.common.channel.ChannelCategory; import io.openems.common.channel.Level; +import io.openems.common.channel.PersistencePriority; import io.openems.common.channel.Unit; import io.openems.common.exceptions.InvalidValueException; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.exceptions.OpenemsException; -import io.openems.common.types.EdgeConfig.ActualEdgeConfig.Builder; import io.openems.common.types.EdgeConfig.Component.JsonFormat; import io.openems.common.utils.JsonUtils; @@ -62,6 +62,13 @@ public static interface ChannelDetail { */ public ChannelCategory getCategory(); + /** + * Gets the {@link PersistencePriority} of the Channel. + * + * @return the {@link PersistencePriority} + */ + public PersistencePriority getPersistencePriority(); + /** * Gets the {@link ChannelDetail} as {@link JsonObject}. * @@ -75,7 +82,10 @@ public static interface ChannelDetail { */ public static class ChannelDetailOpenemsType implements ChannelDetail { - public ChannelDetailOpenemsType() { + private final PersistencePriority persistencePriority; + + public ChannelDetailOpenemsType(PersistencePriority persistencePriority) { + this.persistencePriority = persistencePriority; } @Override @@ -87,6 +97,11 @@ public ChannelCategory getCategory() { public JsonObject toJson() { return new JsonObject(); } + + @Override + public PersistencePriority getPersistencePriority() { + return this.persistencePriority; + } } /** @@ -95,9 +110,11 @@ public JsonObject toJson() { public static class ChannelDetailEnum implements ChannelDetail { private final Map options; + private final PersistencePriority persistencePriority; - public ChannelDetailEnum(Map options) { + public ChannelDetailEnum(Map options, PersistencePriority persistencePriority) { this.options = options; + this.persistencePriority = persistencePriority; } @Override @@ -124,6 +141,11 @@ public JsonObject toJson() { .add("options", options) // .build(); } + + @Override + public PersistencePriority getPersistencePriority() { + return this.persistencePriority; + } } /** @@ -132,9 +154,11 @@ public JsonObject toJson() { public static class ChannelDetailState implements ChannelDetail { private final Level level; + private final PersistencePriority persistencePriority; - public ChannelDetailState(Level level) { + public ChannelDetailState(Level level, PersistencePriority persistencePriority) { this.level = level; + this.persistencePriority = persistencePriority; } /** @@ -157,6 +181,11 @@ public JsonObject toJson() { .addProperty("level", this.level.name()) // .build(); } + + @Override + public PersistencePriority getPersistencePriority() { + return this.persistencePriority; + } } /** @@ -170,6 +199,9 @@ public JsonObject toJson() { public static Channel fromJson(String channelId, JsonElement json) throws OpenemsNamedException { final var type = JsonUtils.getAsEnum(OpenemsType.class, json, "type"); var accessModeAbbrOpt = JsonUtils.getAsOptionalString(json, "accessMode"); + var persistencePriority = JsonUtils + .getAsOptionalEnum(PersistencePriority.class, json, "persistencePriority") + .orElse(PersistencePriority.DEFAULT_PERSISTENCE_PRIORITY); var accessMode = AccessMode.READ_ONLY; if (accessModeAbbrOpt.isPresent()) { var accessModeAbbr = accessModeAbbrOpt.get(); @@ -193,7 +225,7 @@ public static Channel fromJson(String channelId, JsonElement json) throws Openem ChannelDetail detail = null; switch (category) { case OPENEMS_TYPE: { - detail = new ChannelDetailOpenemsType(); + detail = new ChannelDetailOpenemsType(persistencePriority); break; } @@ -205,13 +237,13 @@ public static Channel fromJson(String channelId, JsonElement json) throws Openem values.put(entry.getKey(), entry.getValue()); } } - detail = new ChannelDetailEnum(values); + detail = new ChannelDetailEnum(values, persistencePriority); break; } case STATE: { var level = JsonUtils.getAsEnum(Level.class, json, "level"); - detail = new ChannelDetailState(level); + detail = new ChannelDetailState(level, persistencePriority); break; } @@ -304,6 +336,7 @@ public JsonObject toJson() { .addProperty("text", this.text) // .addProperty("unit", this.unit.symbol) // .addProperty("category", this.detail.getCategory().name()) // + .addProperty("persistencePriority", this.detail.getPersistencePriority()) // .build(); } } @@ -554,7 +587,10 @@ public static Component fromJson(String componentId, JsonElement json) throws Op var jPropertiesOpt = JsonUtils.getAsOptionalJsonObject(json, "properties"); if (jPropertiesOpt.isPresent()) { for (Entry entry : jPropertiesOpt.get().entrySet()) { - properties.put(entry.getKey(), entry.getValue()); + if (!ignorePropertyKey(entry.getKey()) + && !ignoreComponentPropertyKey(componentId, entry.getKey())) { + properties.put(entry.getKey(), entry.getValue()); + } } } var channels = new TreeMap(); @@ -1422,17 +1458,34 @@ public Optional getStateChannel(ChannelAddress channelAddress * @return true if it should get ignored */ public static boolean ignorePropertyKey(String key) { - switch (key) { - case OpenemsConstants.PROPERTY_COMPONENT_ID: - case OpenemsConstants.PROPERTY_OSGI_COMPONENT_ID: - case OpenemsConstants.PROPERTY_OSGI_COMPONENT_NAME: - case OpenemsConstants.PROPERTY_FACTORY_PID: - case OpenemsConstants.PROPERTY_PID: - case "webconsole.configurationFactory.nameHint": - case "event.topics": - return true; - default: - return false; - } + return switch (key) { + case OpenemsConstants.PROPERTY_COMPONENT_ID, OpenemsConstants.PROPERTY_OSGI_COMPONENT_ID, + OpenemsConstants.PROPERTY_OSGI_COMPONENT_NAME, OpenemsConstants.PROPERTY_FACTORY_PID, + OpenemsConstants.PROPERTY_PID, "webconsole.configurationFactory.nameHint", "event.topics" -> + true; + + default -> false; + }; + } + + /** + * Internal Method to decide whether a configuration property should be ignored. + * + * @param componentId the Component-ID + * @param key the property key + * @return true if it should get ignored + */ + public static boolean ignoreComponentPropertyKey(String componentId, String key) { + return switch (componentId) { + // Filter for _sum component + case "_sum" -> switch (key) { + case "productionMaxActivePower", "consumptionMaxActivePower", "gridMinActivePower", "gridMaxActivePower" -> + true; + + default -> false; + }; + + default -> false; + }; } } diff --git a/io.openems.common/src/io/openems/common/utils/FunctionUtils.java b/io.openems.common/src/io/openems/common/utils/FunctionUtils.java new file mode 100644 index 00000000000..2b9d3fef218 --- /dev/null +++ b/io.openems.common/src/io/openems/common/utils/FunctionUtils.java @@ -0,0 +1,102 @@ +package io.openems.common.utils; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import io.openems.common.function.ThrowingBiConsumer; +import io.openems.common.function.ThrowingConsumer; +import io.openems.common.function.ThrowingRunnable; + +public final class FunctionUtils { + + /** + * Helper method to create empty {@link Runnable} or {@link ThrowingRunnable}. + * + *

+ * Usage: + * + *

+	 * final Runnable runnable = FunctionUtils::doNothing;
+	 * 
+	 * final ThrowingRunnable<Exception> runnable = FunctionUtils::doNothing;
+	 * 
+ */ + public static void doNothing() { + + } + + /** + * Helper method to create empty {@link Consumer} or {@link ThrowingConsumer}. + * + *

+ * Usage: + * + *

+	 * final Consumer<String> consumer = FunctionUtils::doNothing;
+	 * 
+	 * final ThrowingConsumer<String, Exception> consumer = FunctionUtils::doNothing;
+	 * 
+ * + * @param the type of the first input parameter + * @param t the first input parameter + */ + public static void doNothing(T t) { + + } + + /** + * Helper method to create empty {@link BiConsumer} or + * {@link ThrowingBiConsumer}. + * + *

+ * Usage: + * + *

+	 * final BiConsumer<String> consumer = FunctionUtils::doNothing;
+	 * 
+	 * final ThrowingBiConsumer<String, Exception> consumer = FunctionUtils::doNothing;
+	 * 
+ * + * @param the type of the first input parameter + * @param the type of the second input parameter + * @param t the first input parameter + * @param e the second input parameter + */ + public static void doNothing(T t, U e) { + + } + + /** + * Helper method to create a {@link Supplier}. + * + *

+ * Instead of an explicit type: + * + *

+	 * final Supplier<String> provideString = () -> {
+	 * 	return "";
+	 * };
+	 * 
+ * + *

+ * ... an implicit type based on the return value can be used: + * + *

+	 * final var provideString = supplier(() -> {
+	 * 	return "";
+	 * });
+	 * 
+ * + * @param the type of results supplied by the created supplier + * @param supplier the created {@link Supplier} + * @return the created {@link Supplier} + */ + public static Supplier supplier(Supplier supplier) { + return supplier; + } + + private FunctionUtils() { + } + +} diff --git a/io.openems.common/src/io/openems/common/utils/JsonUtils.java b/io.openems.common/src/io/openems/common/utils/JsonUtils.java index 36370520fd7..591a960f80f 100644 --- a/io.openems.common/src/io/openems/common/utils/JsonUtils.java +++ b/io.openems.common/src/io/openems/common/utils/JsonUtils.java @@ -1806,7 +1806,7 @@ public static void prettyPrint(JsonElement j) { * {@link GsonBuilder#setPrettyPrinting()} */ public static String prettyToString(JsonElement j) { - return new GsonBuilder().setPrettyPrinting().create().toJson(j); + return new GsonBuilder().setPrettyPrinting().serializeNulls().create().toJson(j); } /** diff --git a/io.openems.common/src/io/openems/common/utils/StringUtils.java b/io.openems.common/src/io/openems/common/utils/StringUtils.java index 17c63ed7ab1..1402944d8d8 100644 --- a/io.openems.common/src/io/openems/common/utils/StringUtils.java +++ b/io.openems.common/src/io/openems/common/utils/StringUtils.java @@ -1,5 +1,6 @@ package io.openems.common.utils; +import java.util.OptionalInt; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -91,9 +92,12 @@ public static int matchWildcard(String source, String pattern) { private static final Predicate DETECT_INTEGER_PATTERN = // Pattern.compile("^[-+]?[0-9]+$").asPredicate(); + private static final Predicate DETECT_FLOAT_PATTERN = // Pattern.compile("^[-+]?[0-9]*\\.[0-9]+$").asPredicate(); + private static final Pattern NAME_NUMBER_PATTERN = Pattern.compile("[^0-9]+([0-9]+)$"); + /** * Checks if the given string matches an Integer pattern, i.e. if could be * parsed to Integer/Long. @@ -153,4 +157,30 @@ public static String definedOrElse(String original, String alternative) { } return alternative; } + + /** + * Parses the number of an Edge from its name string. + * + *

+ * e.g. translates "edge0" to "0". + * + * @param name the edge name + * @return the number or empty optional if there is no number in the name or if + * the name is null + */ + public static OptionalInt parseNumberFromName(String name) { + if (name == null) { + return OptionalInt.empty(); + } + try { + var matcher = NAME_NUMBER_PATTERN.matcher(name); + if (matcher.find()) { + var nameNumberString = matcher.group(1); + return OptionalInt.of(Integer.parseInt(nameNumberString)); + } + } catch (NullPointerException e) { + /* ignore */ + } + return OptionalInt.empty(); + } } diff --git a/io.openems.common/src/io/openems/common/utils/ThreadPoolUtils.java b/io.openems.common/src/io/openems/common/utils/ThreadPoolUtils.java index 63ddde77954..1d875582b70 100644 --- a/io.openems.common/src/io/openems/common/utils/ThreadPoolUtils.java +++ b/io.openems.common/src/io/openems/common/utils/ThreadPoolUtils.java @@ -74,12 +74,12 @@ public static String debugLog(ThreadPoolExecutor executor) { * @param executor the executor * @return a Map of key to value */ - public static Map debugMetrics(ThreadPoolExecutor executor) { - return Map.of(// - "PoolSize", executor.getPoolSize(), // - "MaxPoolSize", executor.getMaximumPoolSize(), // - "Active", executor.getActiveCount(), // - "Pending", executor.getQueue().size(), // + public static Map debugMetrics(ThreadPoolExecutor executor) { + return Map.of(// + "PoolSize", Long.valueOf(executor.getPoolSize()), // + "MaxPoolSize", Long.valueOf(executor.getMaximumPoolSize()), // + "Active", Long.valueOf(executor.getActiveCount()), // + "Pending", Long.valueOf(executor.getQueue().size()), // "Completed", executor.getCompletedTaskCount() // ); } diff --git a/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java b/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java index b1e7179331c..07bd5a40d8a 100644 --- a/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java +++ b/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java @@ -67,11 +67,10 @@ public boolean isAtLeast(DebugMode other) { /** * Construct an {@link AbstractWebsocketServer}. * - * @param name to identify this server - * @param port to listen on - * @param poolSize number of threads dedicated to handle the tasks - * @param debugMode activate a regular debug log about the state of the - * tasks + * @param name to identify this server + * @param port to listen on + * @param poolSize number of threads dedicated to handle the tasks + * @param debugMode activate a regular debug log about the state of the tasks */ protected AbstractWebsocketServer(String name, int port, int poolSize, DebugMode debugMode) { super(name); diff --git a/io.openems.common/test/io/openems/common/utils/FunctionUtilsTest.java b/io.openems.common/test/io/openems/common/utils/FunctionUtilsTest.java new file mode 100644 index 00000000000..839149a9357 --- /dev/null +++ b/io.openems.common/test/io/openems/common/utils/FunctionUtilsTest.java @@ -0,0 +1,75 @@ +package io.openems.common.utils; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.junit.Test; + +import io.openems.common.function.ThrowingBiConsumer; +import io.openems.common.function.ThrowingConsumer; +import io.openems.common.function.ThrowingRunnable; + +public class FunctionUtilsTest { + + @Test + public void testEmptyRunnable() { + final Runnable runnable = FunctionUtils::doNothing; + runnable.run(); + assertTrue(true); + } + + @Test + public void testEmptyThrowingRunnable() throws Exception { + final ThrowingRunnable runnable = FunctionUtils::doNothing; + runnable.run(); + assertTrue(true); + } + + @Test + public void testEmptyConsumer() { + final Consumer consumer = FunctionUtils::doNothing; + consumer.accept(""); + consumer.accept(null); + assertTrue(true); + } + + @Test + public void testEmptyBiConsumer() { + final BiConsumer consumer = FunctionUtils::doNothing; + consumer.accept("", ""); + consumer.accept("", null); + consumer.accept(null, ""); + consumer.accept(null, null); + assertTrue(true); + } + + @Test + public void testEmptyThrowingConsumer() throws Exception { + final ThrowingConsumer consumer = FunctionUtils::doNothing; + consumer.accept(""); + consumer.accept(null); + assertTrue(true); + } + + @Test + public void testEmptyThrowingBiConsumer() throws Exception { + final ThrowingBiConsumer consumer = FunctionUtils::doNothing; + consumer.accept("", ""); + consumer.accept("", null); + consumer.accept(null, ""); + consumer.accept(null, null); + assertTrue(true); + } + + @Test + public void testSupplier() { + final var supplier = FunctionUtils.supplier(() -> { + return "success"; + }); + assertEquals("success", supplier.get()); + } + +} diff --git a/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java b/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java index 256d95a1e2d..badcaae75dd 100644 --- a/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java +++ b/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java @@ -72,6 +72,7 @@ import static io.openems.common.utils.JsonUtils.parse; import static io.openems.common.utils.JsonUtils.parseToJsonArray; import static io.openems.common.utils.JsonUtils.parseToJsonObject; +import static io.openems.common.utils.JsonUtils.prettyToString; import static io.openems.common.utils.JsonUtils.toJson; import static io.openems.common.utils.JsonUtils.toJsonArray; import static io.openems.common.utils.JsonUtils.toJsonObject; @@ -98,6 +99,7 @@ import com.google.common.collect.ImmutableMap; import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; @@ -699,6 +701,31 @@ public void testParseToJsonArray() throws OpenemsNamedException { assertEquals(buildJsonArray().add("foo").build(), parseToJsonArray("[\"foo\"]")); } + @Test + public void testPrettyToString() throws OpenemsNamedException { + assertEquals(""" + { + "Hello": "World", + "Foo": [ + "A", + 123, + true + ], + "Bar": null, + "BarBar": null + }""", prettyToString(// + buildJsonObject() // + .addProperty("Hello", "World") // + .add("Foo", buildJsonArray() // + .add("A") // + .add(123) // + .add(true) // + .build()) // + .add("Bar", null) // + .add("BarBar", JsonNull.INSTANCE) // + .build())); + } + @Test public void testIsEmptyJsonObject() throws OpenemsNamedException { assertTrue(isEmptyJsonObject(new JsonObject())); diff --git a/io.openems.common/test/io/openems/common/utils/StringUtilsTest.java b/io.openems.common/test/io/openems/common/utils/StringUtilsTest.java index 2c58839b5c5..2b5fa1ce8af 100644 --- a/io.openems.common/test/io/openems/common/utils/StringUtilsTest.java +++ b/io.openems.common/test/io/openems/common/utils/StringUtilsTest.java @@ -64,4 +64,21 @@ public void testDefinedOrElse() { assertEquals("bar", definedOrElse(" ", "bar")); } + @Test + public void testParseNumberFromNameNull() throws Exception { + assertTrue(StringUtils.parseNumberFromName(null).isEmpty()); + } + + @Test + public void testParseNumberFromNameInvalidString() throws Exception { + assertTrue(StringUtils.parseNumberFromName("edge").isEmpty()); + } + + @Test + public void testParseNumberFromNameValidString() throws Exception { + final var parsedNumber = StringUtils.parseNumberFromName("edge404"); + assertTrue(parsedNumber.isPresent()); + assertEquals(404, parsedNumber.getAsInt()); + } + } diff --git a/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHome.java b/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHome.java index 8752d0bf3f6..f362fe3dea4 100644 --- a/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHome.java +++ b/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHome.java @@ -621,7 +621,7 @@ public static enum ChannelId implements io.openems.edge.common.channel.ChannelId .accessMode(AccessMode.READ_ONLY) // .persistencePriority(PersistencePriority.HIGH) // .text("Number of modules per tower") // - .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), + .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), NUMBER_OF_TOWERS(Doc.of(OpenemsType.INTEGER) // .unit(Unit.NONE) // @@ -629,17 +629,29 @@ public static enum ChannelId implements io.openems.edge.common.channel.ChannelId .persistencePriority(PersistencePriority.HIGH) // .text("Number of towers of the built system")), + TOWER_4_BMS_SOFTWARE_VERSION(new IntegerDoc() // + .unit(Unit.NONE) // + .accessMode(AccessMode.READ_ONLY) // + .text("Bms software version of fifth tower") // + .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), + + TOWER_3_BMS_SOFTWARE_VERSION(new IntegerDoc() // + .unit(Unit.NONE) // + .accessMode(AccessMode.READ_ONLY) // + .text("Bms software version of fourth tower") // + .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), + TOWER_2_BMS_SOFTWARE_VERSION(new IntegerDoc() // .unit(Unit.NONE) // .accessMode(AccessMode.READ_ONLY) // .text("Bms software version of third tower") // - .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), + .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), TOWER_1_BMS_SOFTWARE_VERSION(new IntegerDoc() // .unit(Unit.NONE) // .accessMode(AccessMode.READ_ONLY) // .text("Bms software version of second tower") // - .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), + .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), TOWER_0_BMS_SOFTWARE_VERSION(new IntegerDoc() // .unit(Unit.NONE) // @@ -647,7 +659,7 @@ public static enum ChannelId implements io.openems.edge.common.channel.ChannelId .text("Bms software version of first tower")), BATTERY_HARDWARE_TYPE(Doc.of(BatteryFeneconHomeHardwareType.values()) // - .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), + .onChannelChange(BatteryFeneconHomeImpl::updateNumberOfTowersAndModules)), /** * true: started; false: not-started. diff --git a/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHomeImpl.java b/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHomeImpl.java index e02f269bd06..d45e42a80b6 100644 --- a/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHomeImpl.java +++ b/io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHomeImpl.java @@ -3,6 +3,7 @@ import static io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent.BitConverter.INVERT; import static io.openems.edge.bridge.modbus.api.ElementToChannelConverter.SCALE_FACTOR_MINUS_1; +import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; @@ -54,6 +55,7 @@ import io.openems.edge.common.channel.BooleanWriteChannel; import io.openems.edge.common.channel.Channel; import io.openems.edge.common.channel.ChannelId.ChannelIdImpl; +import io.openems.edge.common.channel.ChannelUtils; import io.openems.edge.common.channel.Doc; import io.openems.edge.common.channel.internal.OpenemsTypeDoc; import io.openems.edge.common.component.ComponentManager; @@ -315,6 +317,10 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { .bit(7, BatteryFeneconHome.ChannelId.RACK_SYSTEM_LOW_CELL_VOLTAGE_PERMANENT_FAILURE) // .bit(8, BatteryFeneconHome.ChannelId.RACK_SYSTEM_SHORT_CIRCUIT)), // m(BatteryFeneconHome.ChannelId.UPPER_VOLTAGE, new UnsignedWordElement(528))), // + new FC3ReadRegistersTask(18000, Priority.LOW, // + m(BatteryFeneconHome.ChannelId.TOWER_4_BMS_SOFTWARE_VERSION, new UnsignedWordElement(18000))), // + new FC3ReadRegistersTask(16000, Priority.LOW, // + m(BatteryFeneconHome.ChannelId.TOWER_3_BMS_SOFTWARE_VERSION, new UnsignedWordElement(16000))), // new FC3ReadRegistersTask(14000, Priority.LOW, // m(BatteryFeneconHome.ChannelId.TOWER_2_BMS_SOFTWARE_VERSION, new UnsignedWordElement(14000))), // new FC3ReadRegistersTask(12000, Priority.LOW, // @@ -440,22 +446,11 @@ public void setStartStop(StartStop value) { @Override public StartStop getStartStopTarget() { - switch (this.config.startStop()) { - case AUTO: - // read StartStop-Channel - return this.startStopTarget.get(); - - case START: - // force START - return StartStop.START; - - case STOP: - // force STOP - return StartStop.STOP; - } - - assert false; - return StartStop.UNDEFINED; // can never happen + return switch (this.config.startStop()) { + case AUTO -> this.startStopTarget.get(); + case START -> StartStop.START; + case STOP -> StartStop.STOP; + }; } /** @@ -465,43 +460,46 @@ public StartStop getStartStopTarget() { * Recalculate the number of towers and modules. Unfortunately the battery may * report too small wrong values in the beginning, so we need to recalculate on * every change. + * + *

+ * As an alternative, these channels may also be introduced in a record, and the + * associated channel value could be read with the aid of + * {@link ChannelUtils#getValues}. However, startup time is once again involved + * in this process. This indicates that the last callback will have been made + * before the record is set. Furthermore, there is no certainty that the + * "software version channel value change" will occur, making it unlikely for + * this to trigger a callback. */ protected synchronized void updateNumberOfTowersAndModules() { Channel numberOfModulesPerTowerChannel = this .channel(BatteryFeneconHome.ChannelId.NUMBER_OF_MODULES_PER_TOWER); var numberOfModulesPerTowerOpt = numberOfModulesPerTowerChannel.value(); - Channel tower2BmsSoftwareVersionChannel = this - .channel(BatteryFeneconHome.ChannelId.TOWER_1_BMS_SOFTWARE_VERSION); - var tower2BmsSoftwareVersion = tower2BmsSoftwareVersionChannel.value(); - Channel tower3BmsSoftwareVersionChannel = this - .channel(BatteryFeneconHome.ChannelId.TOWER_2_BMS_SOFTWARE_VERSION); - var tower3BmsSoftwareVersion = tower3BmsSoftwareVersionChannel.value(); // Were all required registers read? - if (!numberOfModulesPerTowerOpt.isDefined() || !tower3BmsSoftwareVersion.isDefined() - || !tower2BmsSoftwareVersion.isDefined()) { + if (!numberOfModulesPerTowerOpt.isDefined()) { return; } // Evaluate the total number of towers by reading the software versions of // towers 2 and 3: they are '0' when the respective tower is not available. - final int numberOfTowers; - if (!Objects.equals(tower3BmsSoftwareVersion.get(), 0)) { - numberOfTowers = 3; - } else if (!Objects.equals(tower2BmsSoftwareVersion.get(), 0)) { - numberOfTowers = 2; - } else { - numberOfTowers = 1; - } + final var softwareVersionlist = List.of(// + BatteryFeneconHome.ChannelId.TOWER_0_BMS_SOFTWARE_VERSION, // + BatteryFeneconHome.ChannelId.TOWER_1_BMS_SOFTWARE_VERSION, // + BatteryFeneconHome.ChannelId.TOWER_2_BMS_SOFTWARE_VERSION, // + BatteryFeneconHome.ChannelId.TOWER_3_BMS_SOFTWARE_VERSION, // + BatteryFeneconHome.ChannelId.TOWER_4_BMS_SOFTWARE_VERSION// + ); + + final var numberOfTowers = this.calculateTowerNumberFromSoftwareVersion(softwareVersionlist); // Write 'TOWER_NUMBER' Debug Channel Channel numberOfTowersChannel = this.channel(BatteryFeneconHome.ChannelId.NUMBER_OF_TOWERS); numberOfTowersChannel.setNextValue(numberOfTowers); - var moduleMaxVoltage = this.getBatteryHardwareType().moduleMaxVoltage; - var moduleMinVoltage = this.getBatteryHardwareType().moduleMinVoltage; - var capacityPerModule = this.getBatteryHardwareType().capacityPerModule; - int numberOfModulesPerTower = numberOfModulesPerTowerOpt.get(); + final var moduleMaxVoltage = this.getBatteryHardwareType().moduleMaxVoltage; + final var moduleMinVoltage = this.getBatteryHardwareType().moduleMinVoltage; + final var capacityPerModule = this.getBatteryHardwareType().capacityPerModule; + final int numberOfModulesPerTower = numberOfModulesPerTowerOpt.get(); // Set Battery Channels this._setChargeMaxVoltage(Math.round(numberOfModulesPerTower * moduleMaxVoltage)); @@ -517,6 +515,22 @@ protected synchronized void updateNumberOfTowersAndModules() { } } + private int calculateTowerNumberFromSoftwareVersion(List channelIdList) { + var numberOftowers = 1; + for (var channelId : channelIdList) { + if (channelId == null) { + return numberOftowers; + } + Channel channel = this.channel(channelId); + var softwareVersion = channel.value(); + if (softwareVersion.isDefined() && !Objects.equals(softwareVersion.get(), 0) + && !Objects.equals(softwareVersion.get(), 256)) { + numberOftowers++; + } + } + return numberOftowers; + } + private int lastNumberOfTowers = 0; private int lastNumberOfModulesPerTower = 0; @@ -524,7 +538,7 @@ protected synchronized void updateNumberOfTowersAndModules() { * Initialize channels per towers and modules. * * @param numberOfTowers the number of towers - * @param numberOfModulesPerTower the number of modulers per tower + * @param numberOfModulesPerTower the number of modules per tower * @throws OpenemsException on error */ private synchronized void initializeTowerModulesChannels(int numberOfTowers, int numberOfModulesPerTower) @@ -759,7 +773,8 @@ private synchronized void initializeTowerModulesChannels(int numberOfTowers, int new UnsignedDoublewordElement(towerOffset + 51), new ElementToChannelConverter(value -> { Integer intValue = TypeUtils.getAsType(OpenemsType.INTEGER, value); - return buildSerialNumber(this.getBatteryHardwareType().serialNrPrefixBms, intValue); + return buildSerialNumber(this.getBatteryHardwareType().serialNrPrefixBms, + intValue); })))); } @@ -851,7 +866,8 @@ private synchronized void initializeTowerModulesChannels(int numberOfTowers, int m(channelId, new UnsignedDoublewordElement(moduleOffset + module * 100 + 83), new ElementToChannelConverter(value -> { Integer intValue = TypeUtils.getAsType(OpenemsType.INTEGER, value); - return buildSerialNumber(this.getBatteryHardwareType().serialNrPrefixModule, intValue); + return buildSerialNumber( + this.getBatteryHardwareType().serialNrPrefixModule, intValue); })))); } } diff --git a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/ControllerEssCycleImpl.java b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/ControllerEssCycleImpl.java index 35507c0f608..7130b47f74a 100644 --- a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/ControllerEssCycleImpl.java +++ b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/ControllerEssCycleImpl.java @@ -2,6 +2,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.concurrent.atomic.AtomicBoolean; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.component.ComponentContext; @@ -37,6 +38,7 @@ public class ControllerEssCycleImpl extends AbstractOpenemsComponent implements ControllerEssCycle, Controller, OpenemsComponent { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + private final AtomicBoolean processFinished = new AtomicBoolean(false); private final Logger log = LoggerFactory.getLogger(ControllerEssCycleImpl.class); private final StateMachine stateMachine = new StateMachine(State.UNDEFINED); @@ -138,4 +140,9 @@ public LocalDateTime getLastStateChangeTime() { public void setLastStateChangeTime(LocalDateTime time) { this.lastStateChangeTime = time; } + + public AtomicBoolean getProcessFinished() { + return this.processFinished; + } + } diff --git a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/Context.java b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/Context.java index ac25d1ae97a..a97c045451b 100644 --- a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/Context.java +++ b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/Context.java @@ -88,10 +88,16 @@ public boolean isStartTimeInitialized() { * @return {@link State} state. */ protected State waitForChangeState(State currentState, State nextState) { + final var controller = this.getParent(); + if (!controller.getProcessFinished().get()) { + controller.getProcessFinished().set(true); + this.updateLastStateChangeTime(); + } var now = LocalDateTime.now(this.clock); var standbyTimeInMinutes = Duration.ofMinutes(this.config.standbyTime()); if (now.minus(standbyTimeInMinutes.toSeconds(), ChronoUnit.SECONDS) - .isAfter(this.getParent().getLastStateChangeTime())) { + .isAfter(controller.getLastStateChangeTime())) { + controller.getProcessFinished().set(false); return nextState; } this.logInfo(this.log, "Awaiting hysteresis for changing from [" + currentState + "] to [" + nextState + "]"); diff --git a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithChargeHandler.java b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithChargeHandler.java index 3d8ec7c7c8b..0ac08a95208 100644 --- a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithChargeHandler.java +++ b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithChargeHandler.java @@ -25,7 +25,7 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return context.waitForChangeState(State.CONTINUE_WITH_CHARGE, State.COMPLETED_CYCLE); } - if (ess.getSoc().get() >= config.maxSoc()) { + if (ess.getSoc().get() > config.maxSoc()) { return context.waitForChangeState(State.CONTINUE_WITH_CHARGE, State.COMPLETED_CYCLE); } @@ -39,9 +39,4 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return State.CONTINUE_WITH_CHARGE; } - - @Override - protected void onExit(Context context) { - context.updateLastStateChangeTime(); - } } diff --git a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithDischargeHandler.java b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithDischargeHandler.java index 70ecd0efc46..4856a7d0cb7 100644 --- a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithDischargeHandler.java +++ b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/ContinueWithDischargeHandler.java @@ -25,7 +25,7 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return context.waitForChangeState(State.CONTINUE_WITH_DISCHARGE, State.COMPLETED_CYCLE); } - if (ess.getSoc().get() <= config.minSoc()) { + if (ess.getSoc().get() < config.minSoc()) { return context.waitForChangeState(State.CONTINUE_WITH_DISCHARGE, State.COMPLETED_CYCLE); } @@ -39,9 +39,4 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return State.CONTINUE_WITH_DISCHARGE; } - - @Override - protected void onExit(Context context) { - context.updateLastStateChangeTime(); - } } diff --git a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartChargeHandler.java b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartChargeHandler.java index caa98e81515..c67a3525e73 100644 --- a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartChargeHandler.java +++ b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartChargeHandler.java @@ -25,7 +25,7 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return context.waitForChangeState(State.START_CHARGE, State.CONTINUE_WITH_DISCHARGE); } - if (ess.getSoc().get() >= config.maxSoc()) { + if (ess.getSoc().get() > config.maxSoc()) { return context.waitForChangeState(State.START_CHARGE, State.CONTINUE_WITH_DISCHARGE); } @@ -39,9 +39,4 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return State.START_CHARGE; } - - @Override - protected void onExit(Context context) { - context.updateLastStateChangeTime(); - } } diff --git a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartDischargeHandler.java b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartDischargeHandler.java index aa6c90e0769..6ca878c38c7 100644 --- a/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartDischargeHandler.java +++ b/io.openems.edge.controller.ess.cycle/src/io/openems/edge/controller/ess/cycle/statemachine/StartDischargeHandler.java @@ -25,7 +25,7 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return context.waitForChangeState(State.START_DISCHARGE, State.CONTINUE_WITH_CHARGE); } - if (ess.getSoc().get() <= config.minSoc()) { + if (ess.getSoc().get() < config.minSoc()) { return context.waitForChangeState(State.START_DISCHARGE, State.CONTINUE_WITH_CHARGE); } @@ -39,9 +39,4 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException { return State.START_DISCHARGE; } - - @Override - protected void onExit(Context context) { - context.updateLastStateChangeTime(); - } } diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/Config.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/Config.java index be0b3bb2b73..99793e89191 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/Config.java +++ b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/Config.java @@ -36,6 +36,10 @@ @AttributeDefinition(name = "Max Charge Power from the grid [W]", description = "Maximum charge power from the grid") int maxChargePowerFromGrid() default 20_000; + // TODO This will eventually be moved globally + @AttributeDefinition(name = "Limit Charge Power for §14a EnWG", description = "Always apply §14a EnWG limitation of 4.2 kW") + boolean limitChargePowerFor14aEnWG() default false; + @AttributeDefinition(name = "Ess target filter", description = "This is auto-generated by 'Ess-ID'.") String ess_target() default "(enabled=true)"; diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImpl.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImpl.java index c96bb589391..2646728095b 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImpl.java +++ b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImpl.java @@ -43,7 +43,6 @@ import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.GetScheduleRequest; import io.openems.edge.controller.ess.timeofusetariff.optimizer.Context; import io.openems.edge.controller.ess.timeofusetariff.optimizer.Optimizer; -import io.openems.edge.controller.ess.timeofusetariff.optimizer.Period; import io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils; import io.openems.edge.ess.api.ManagedSymmetricEss; import io.openems.edge.ess.power.api.Phase; @@ -113,15 +112,16 @@ public TimeOfUseTariffControllerImpl() { // Prepare Optimizer and Context this.optimizer = new Optimizer(() -> Context.create() // - .clock(this.componentManager.getClock()) // - .sum(this.sum) // - .predictorManager(this.predictorManager) // - .timeOfUseTariff(this.timeOfUseTariff) // - .ess(this.ess) // - .ctrlEmergencyCapacityReserves(this.ctrlEmergencyCapacityReserves) // - .ctrlLimitTotalDischarges(this.ctrlLimitTotalDischarges) // - .controlMode(this.config.controlMode()) // - .maxChargePowerFromGrid(this.config.maxChargePowerFromGrid()) // + .setClock(this.componentManager.getClock()) // + .setSum(this.sum) // + .setPredictorManager(this.predictorManager) // + .setTimeOfUseTariff(this.timeOfUseTariff) // + .setEss(this.ess) // + .setCtrlEmergencyCapacityReserves(this.ctrlEmergencyCapacityReserves) // + .setCtrlLimitTotalDischarges(this.ctrlLimitTotalDischarges) // + .setControlMode(this.config.controlMode()) // + .setMaxChargePowerFromGrid(this.config.maxChargePowerFromGrid()) // + .setLimitChargePowerFor14aEnWG(this.config.limitChargePowerFor14aEnWG()) // .build()); } @@ -175,14 +175,14 @@ public void run() throws OpenemsNamedException { this.updateVisualizationChannels(); } - private Period getCurrentPeriod() { - return this.optimizer.getCurrentPeriod(); + private StateMachine getCurrentStateMachine() { + return this.optimizer.getCurrentStateMachine(); } private StateMachine getCurrentPeriodState() { - var period = this.getCurrentPeriod(); - if (period != null) { - return period.state(); + var state = this.getCurrentStateMachine(); + if (state != null) { + return state; } return BALANCING; // Default Fallback } @@ -208,7 +208,7 @@ private void modeAutomatic() throws OpenemsNamedException { // Get and apply ActivePower Less-or-Equals Set-Point var activePower = switch (state) { case CHARGE_GRID -> calculateChargeGridPower(this.optimizer.getParams(), this.ess, this.sum, - this.config.maxChargePowerFromGrid()); + this.config.maxChargePowerFromGrid(), this.config.limitChargePowerFor14aEnWG()); case DELAY_DISCHARGE -> calculateDelayDischargePower(this.ess); case BALANCING -> null; }; @@ -237,14 +237,19 @@ private void modeOff() { */ private void updateVisualizationChannels() { final Double quarterlyPrice; - var period = this.getCurrentPeriod(); + var period = this.getCurrentStateMachine(); if (period == null) { // Values are not available. quarterlyPrice = this.timeOfUseTariff.getPrices().getFirst(); } else { - // First period is always the current period. - quarterlyPrice = period.price(); + var params = this.optimizer.getParams(); + if (params != null) { + // First period is always the current period. + quarterlyPrice = params.optimizePeriods().get(0).price(); + } else { + quarterlyPrice = null; + } } // Set the channels @@ -284,7 +289,7 @@ private CompletableFuture handleGetScheduleReq public String debugLog() { var b = new StringBuilder() // .append(this.getStateMachine()); // - if (this.getCurrentPeriod() == null) { + if (this.getCurrentStateMachine() == null) { b.append("|No Schedule available"); } return b.toString(); diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponse.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponse.java index b46b93be4e1..4464d3548d4 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponse.java +++ b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponse.java @@ -1,8 +1,8 @@ package io.openems.edge.controller.ess.timeofusetariff.jsonrpc; +import java.time.ZonedDateTime; import java.util.UUID; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.openems.common.jsonrpc.base.JsonrpcResponseSuccess; @@ -32,21 +32,23 @@ */ public class GetScheduleResponse extends JsonrpcResponseSuccess { - private final JsonArray schedule; + private final ZonedDateTime fromDate; + private final ScheduleDatas scheduleDatas; - public GetScheduleResponse(JsonArray schedule) { - this(UUID.randomUUID(), schedule); + public GetScheduleResponse(ZonedDateTime fromDate, ScheduleDatas scheduleDatas) { + this(UUID.randomUUID(), fromDate, scheduleDatas); } - public GetScheduleResponse(UUID id, JsonArray schedule) { + public GetScheduleResponse(UUID id, ZonedDateTime fromDate, ScheduleDatas scheduleDatas) { super(id); - this.schedule = schedule; + this.scheduleDatas = scheduleDatas; + this.fromDate = fromDate; } @Override public JsonObject getResult() { return JsonUtils.buildJsonObject() // - .add("schedule", this.schedule) // + .add("schedule", this.scheduleDatas.toJsonArray(this.fromDate)) // .build(); } diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatas.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatas.java new file mode 100644 index 00000000000..d2251fa011b --- /dev/null +++ b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatas.java @@ -0,0 +1,327 @@ +package io.openems.edge.controller.ess.timeofusetariff.jsonrpc; + +import static com.google.common.collect.ImmutableList.toImmutableList; +import static io.openems.common.types.OptionsEnum.getOption; +import static io.openems.common.utils.JsonUtils.getAsDouble; +import static io.openems.common.utils.JsonUtils.getAsInt; +import static io.openems.common.utils.JsonUtils.toJson; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_CONSUMPTION; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_ESS_DISCHARGE_POWER; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_ESS_SOC; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_GRID; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_PRODUCTION; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.toEnergy; +import static java.lang.Double.parseDouble; +import static java.lang.Integer.parseInt; +import static java.lang.Math.round; +import static java.util.Optional.ofNullable; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collection; +import java.util.Locale; +import java.util.Objects; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSortedMap; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.exceptions.OpenemsException; +import io.openems.common.types.ChannelAddress; +import io.openems.common.utils.JsonUtils; +import io.openems.edge.controller.ess.timeofusetariff.StateMachine; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Optimizer; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.Length; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.Period; + +/** + * Data for JSONRPC-Response. Values are in [W]. + */ +public record ScheduleDatas(int essTotalEnergy, ImmutableList entries) { + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); + + /** + * Creates {@link ScheduleDatas} from an {@link Optimizer}. + * + * @param optimizer the {@link Optimizer} + * @return a {@link ScheduleDatas}a + * @throws OpenemsException on error + */ + public static ScheduleDatas fromSchedule(Optimizer optimizer) throws OpenemsException { + final var schedule = optimizer.getSchedule(); + if (schedule == null) { + throw new OpenemsException("Has no Schedule"); + } + final var params = optimizer.getParams(); + if (params == null) { + throw new OpenemsException("Has no Params"); + } + return fromSchedule(params.essTotalEnergy(), schedule); + } + + /** + * Creates {@link ScheduleDatas} from a Schedule of {@link Period}s. + * + * @param essTotalEnergy ESS Total Energy (Capacity) [Wh] + * @param schedule the {@link Period}s + * @return a list of {@link ScheduleData} + */ + public static ScheduleDatas fromSchedule(int essTotalEnergy, ImmutableSortedMap schedule) { + return new ScheduleDatas(// + essTotalEnergy, // + schedule.values().stream() // + .flatMap(ScheduleData::fromPeriod) // + .collect(toImmutableList())); + } + + /** + * Creates {@link ScheduleDatas} from the log output of {@link #toLogString()}. + * + * @param essTotalEnergy ESS Total Energy (Capacity) [Wh] + * @param log the log output of {@link #toLogString()} + * @return a list of {@link ScheduleData} + */ + public static ScheduleDatas fromLogString(int essTotalEnergy, String log) throws IllegalArgumentException { + return new ScheduleDatas(// + essTotalEnergy, // + log.lines() // + .filter(l -> !l.contains("Params") && !l.contains("Time")) // + .map(l -> { + var matcher = PATTERN.matcher(l); + if (!matcher.find()) { + throw new IllegalArgumentException("Pattern does not match"); + } + return new ScheduleData(// + LocalTime.parse(matcher.group("time"), FORMATTER) // + .atDate(LocalDate.MIN).atZone(ZoneId.of("UTC")), // + null /* ignore */, // + parseInt(matcher.group("essMaxChargeEnergy")), // + parseInt(matcher.group("essMaxDischargeEnergy")), // + parseInt(matcher.group("maxBuyFromGrid")), // + parseInt(matcher.group("essInitial")), // + parseInt(matcher.group("production")), // + parseInt(matcher.group("consumption")), // + parseDouble(matcher.group("price")), // + StateMachine.valueOf(matcher.group("state")), // + parseInt(matcher.group("essChargeDischarge")), // + parseInt(matcher.group("grid"))); // + }) // + .collect(toImmutableList())); + } + + private static final Pattern PATTERN = Pattern.compile("" // + + "(?

+ * Applies {@link #ESS_CHARGE_C_RATE} with the minimum of usable ESS energy or + * predicted consumption energy that cannot be supplied from production. + * + * @param essMinSocEnergy ESS energy below a configured minimum SoC [Wh] + * @param essMaxSocEnergy ESS energy below a configured maximium SoC [Wh] + * @param productions Production predictions per period + * @param consumptions Consumption predictions per period + * @param prices Prices per period + * @return the value in [Wh] + */ + protected static int calculateChargeEnergyInChargeGrid(int essMinSocEnergy, int essMaxSocEnergy, int[] productions, + int[] consumptions, double[] prices) { + var refs = ImmutableIntArray.builder(); + + // Uses the total available energy as reference (= fallback) + var fallback = max(0, essMaxSocEnergy - essMinSocEnergy); + add(refs, fallback); + + // Uses the total excess consumption as reference + add(refs, IntStream.range(0, min(productions.length, consumptions.length)) // + .map(i -> consumptions[i] - productions[i]) // calculates excess Consumption Energy per Period + .sum()); + + // Uses the excess consumption till first production > consumption as reference + add(refs, IntStream.range(0, min(productions.length, consumptions.length)) // + .takeWhile(i -> consumptions[i] >= productions[i]) // take only first Periods + .map(i -> consumptions[i] - productions[i]) // calculates excess Consumption Energy per Period + .sum()); + + // Uses the excess consumption during high price periods as reference + { + var peakIndex = findFirstPeakIndex(findFirstValleyIndex(0, prices), prices); + var firstPrices = stream(prices).limit(peakIndex).toArray(); + if (firstPrices.length > 0) { + var percentilePrice = percentiles().index(95).compute(firstPrices); + add(refs, IntStream.range(0, min(productions.length, consumptions.length)) // + .limit(peakIndex) // + .filter(i -> prices[i] >= percentilePrice) // takes only prices > + .map(i -> consumptions[i] - productions[i]) // calculates excess Consumption Energy per Period + .sum()); + } + } + + return (int) round(// + refs.build().stream() // + .average() // + .orElse(fallback) // + * ESS_CHARGE_C_RATE / PERIODS_PER_HOUR); + } + + private static void add(ImmutableIntArray.Builder builder, int value) { + if (value > 0) { + builder.add(value); + } + } + + /** + * Calculates the index when period length switches from + * {@link Period.Length#QUARTER} to {@link Period.Length#HOUR}. + * + *

+ * The index is calculated as "6 hours" plus remaining quarters of the current + * hour. + * + * @param time Start-Timestamp of the Schedule + * @return the index + */ + protected static int calculatePeriodLengthHourFromIndex(ZonedDateTime time) { + var minute = time.getMinute(); + if (minute == 0) { + minute = 60; + } + return 6 * 4 + (60 - minute) / 15; + } +} diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Period.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Period.java deleted file mode 100644 index 7b5b5f55aaa..00000000000 --- a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Period.java +++ /dev/null @@ -1,74 +0,0 @@ -package io.openems.edge.controller.ess.timeofusetariff.optimizer; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Locale; -import java.util.regex.Pattern; - -import io.openems.edge.controller.ess.timeofusetariff.StateMachine; - -public record Period(ZonedDateTime time, int production, int consumption, int essInitial, StateMachine state, - int essChargeDischarge, int grid, double price, double cost) { - - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); - - /** - * Gets the {@link Period#toString()} header. - * - * @return header - */ - public static String header() { - return "Time Production Consumption EssInitial State EssChargeDischarge Grid Price Cost"; - } - - /** - * Gets the Period as String. - */ - public String toString() { - return String.format(Locale.ENGLISH, "%s %10d %11d %10d %-17s %18d %5d %.2f %.4f", // - this.time.format(FORMATTER), this.production, this.consumption, // - this.essInitial, // - this.state, // - this.essChargeDischarge, this.grid, this.price, this.cost); - } - - private static final Pattern PATTERN = Pattern.compile("" // - + "(?

- * This is the reverse of {@link #toString()} method. - * - * @return a new Period - * @throws RuntimeException on error - */ - public static Period fromLog(String log) throws RuntimeException { - var matcher = PATTERN.matcher(log); - if (!matcher.find()) { - throw new IllegalArgumentException("Pattern does not match"); - } - return new Period(// - LocalTime.parse(matcher.group("time"), FORMATTER).atDate(LocalDate.MIN).atZone(ZoneId.of("UTC")), // - Integer.parseInt(matcher.group("production")), // - Integer.parseInt(matcher.group("consumption")), // - Integer.parseInt(matcher.group("essInitial")), // - StateMachine.valueOf(matcher.group("state")), // - Integer.parseInt(matcher.group("essChargeDischarge")), // - Integer.parseInt(matcher.group("grid")), // - Double.parseDouble(matcher.group("price")), // - Double.parseDouble(matcher.group("cost"))); - } -} \ No newline at end of file diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Simulator.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Simulator.java index f1ae2112d41..849e7cd3a11 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Simulator.java +++ b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Simulator.java @@ -3,147 +3,120 @@ import static io.jenetics.engine.EvolutionResult.toBestGenotype; import static io.jenetics.engine.Limits.byExecutionTime; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.InitialPopulationUtils.buildInitialPopulation; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateBalancingEnergy; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateChargeGridEnergy; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateMaxChargeEnergy; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateMaxDischargeEnergy; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.paramsAreValid; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.postprocessSimulatorState; import static java.lang.Math.max; -import static java.lang.Math.min; import static java.time.Duration.ofSeconds; +import java.time.ZonedDateTime; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.IntStream; import java.util.stream.Stream; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSortedMap; + import io.jenetics.Genotype; import io.jenetics.IntegerChromosome; import io.jenetics.IntegerGene; import io.jenetics.engine.Engine; import io.jenetics.engine.EvolutionResult; import io.openems.edge.controller.ess.timeofusetariff.StateMachine; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.Length; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.OptimizePeriod; public class Simulator { /** Used to incorporate charge/discharge efficiency. */ public static final double EFFICIENCY_FACTOR = 1.17; + public record Period(OptimizePeriod op, StateMachine state, int essInitial, EnergyFlow ef) { + } + /** - * Calculates the cost of a Schedule. + * Simulates a Schedule and calculates the cost. * - * @param p the {@link Params} - * @param states the {@link StateMachine} states of the Schedule + * @param p the {@link Params} + * @param schedule the {@link StateMachine} states of the Schedule * @return the cost, lower is better; always positive */ - protected static double calculateCost(Params p, StateMachine[] states) { - return calculateCost(p, states, null); + protected static double calculateCost(Params p, StateMachine[] schedule) { + final var nextEssInitial = new AtomicInteger(p.essInitialEnergy()); + var sum = 0.; + for (var i = 0; i < p.optimizePeriods().size(); i++) { + sum += simulatePeriod(p, p.optimizePeriods().get(i), schedule[i], nextEssInitial, null); + } + return sum; } /** - * Calculates the cost of a Schedule. + * Simulates a Schedule in quarterly periods. * - * @param p the {@link Params} - * @param states the {@link StateMachine} states of the Schedule - * @param collect a {@link Consumer} to collect the simulation results if - * required. We are not always collecting results to reduce - * workload during simulation. - * @return the cost, lower is better; always positive + * @param p the {@link Params} + * @param schedule the {@link StateMachine} states of the Schedule + * @return a Map of {@link Period}s */ - protected static double calculateCost(Params p, StateMachine[] states, Consumer collect) { + protected static ImmutableSortedMap simulate(Params p, StateMachine[] schedule) { final var nextEssInitial = new AtomicInteger(p.essInitialEnergy()); - var sum = 0.; - for (var i = 0; i < p.numberOfPeriods(); i++) { - sum += calculatePeriodCost(p, i, states, nextEssInitial, collect); + var result = ImmutableSortedMap.naturalOrder(); + for (var i = 0; i < p.optimizePeriods().size(); i++) { + var state = schedule[i]; + var op = p.optimizePeriods().get(i); + var length = op.quarterPeriods().size() == 1 ? Length.QUARTER : Length.HOUR; + // Convert mixed OptimizePeriods to pure quarterly + for (var qp : op.quarterPeriods()) { + var quarterlyOp = new OptimizePeriod(qp.time(), length, qp.essMaxChargeEnergy(), + qp.essMaxDischargeEnergy(), qp.essChargeInChargeGrid(), qp.maxBuyFromGrid(), qp.production(), + qp.consumption(), qp.price(), ImmutableList.of(qp)); + simulatePeriod(p, quarterlyOp, state, nextEssInitial, period -> result.put(period.op().time(), period)); + } } - return sum; + return result.build(); } /** * Calculates the cost of one Period under the given Schedule. * * @param p the {@link Params} - * @param i the index of the current period - * @param states the {@link StateMachine} states of the Schedule + * @param op the current {@link OptimizePeriod} + * @param state the {@link StateMachine} of the current period * @param nextEssInitial the initial SoC-Energy; also used as return value * @param collect a {@link Consumer} to collect the simulation results if * required. We are not always collecting results to * reduce workload during simulation. * @return the cost, lower is better; always positive */ - protected static double calculatePeriodCost(Params p, int i, StateMachine[] states, + protected static double simulatePeriod(Params p, OptimizePeriod op, StateMachine state, final AtomicInteger nextEssInitial, Consumer collect) { // Constants - final var production = p.productions()[i]; - final var consumption = p.consumptions()[i]; - final var state = states[i]; - final var price = p.prices()[i]; final var essInitial = max(0, nextEssInitial.get()); // always at least '0' - // Calculate Grid and ESS energy - final var essMaxChargeInBalancing = calculateMaxChargeEnergy(// - p.essTotalEnergy() /* unlimited in BALANCING */, // - p.essMaxEnergyPerPeriod(), essInitial); - final var essMaxDischarge = calculateMaxDischargeEnergy(p.essMinSocEnergy(), // - p.essMaxEnergyPerPeriod(), essInitial); - final var essChargeDischargeInBalancing = calculateBalancingEnergy(essMaxChargeInBalancing, essMaxDischarge, - production, consumption); - final int essChargeDischarge; - final int grid; - final int gridEssCharge; - final int gridConsumption; - switch (state) { - case BALANCING: - essChargeDischarge = essChargeDischargeInBalancing; - grid = consumption - production - essChargeDischarge; - gridEssCharge = 0; - gridConsumption = grid; - break; - - case DELAY_DISCHARGE: - essChargeDischarge = min(0, essChargeDischargeInBalancing); // allow charge - grid = consumption - production - essChargeDischarge; - gridEssCharge = 0; - gridConsumption = grid - gridEssCharge; - break; - - case CHARGE_GRID: - final var essChargeInChargeGrid = calculateMaxChargeEnergy(// - p.essMaxSocEnergy() /* limited in CHARGE_GRID */, // - p.essMaxEnergyPerPeriod(), essInitial); - - gridConsumption = max(0, consumption - production); - gridEssCharge = calculateChargeGridEnergy(essChargeInChargeGrid, p.essChargeInChargeGrid(), - p.maxBuyFromGrid(), production, consumption); - grid = gridConsumption + gridEssCharge; - essChargeDischarge = consumption - production - grid; - break; - - default: - throw new IllegalArgumentException("Missing handler for State [" + state + "]. This should never happen!"); - } - nextEssInitial.set(essInitial - essChargeDischarge); + // Calculate Energy-Flow + final var ef = switch (state) { + case BALANCING -> EnergyFlow.withBalancing(p, op, essInitial); + case DELAY_DISCHARGE -> EnergyFlow.withDelayDischarge(p, op, essInitial); + case CHARGE_GRID -> EnergyFlow.withChargeGrid(p, op, essInitial); + }; + + nextEssInitial.set(essInitial - ef.ess()); // Calculate Cost double cost; - if (grid > 0) { + if (ef.grid() > 0) { cost = // Cost for direct Consumption - gridConsumption * price + ef.gridToConsumption() * op.price() // Cost for future Consumption after storage - + gridEssCharge * price * EFFICIENCY_FACTOR; + + ef.gridToEss() * op.price() * EFFICIENCY_FACTOR; } else { // Sell-to-Grid cost = 0.; } if (collect != null) { - var time = p.time().plusMinutes(15 * i); - var postprocessedState = postprocessSimulatorState(p, essChargeDischarge, essInitial, - essChargeDischargeInBalancing, state); - collect.accept(new Period(time, production, consumption, essInitial, postprocessedState, essChargeDischarge, - grid, price, cost / 1000000)); + var postprocessedState = postprocessSimulatorState(p, essInitial, state, ef); + collect.accept(new Period(op, postprocessedState, essInitial, ef)); } return cost; } @@ -163,14 +136,14 @@ protected static StateMachine[] getBestSchedule(Params p, long executionLimitSec Integer limit) { // Return pure BALANCING Schedule if no predictions are available if (!paramsAreValid(p)) { - return IntStream.range(0, p.numberOfPeriods()) // - .mapToObj(period -> StateMachine.BALANCING) // + return p.optimizePeriods().stream() // + .map(op -> StateMachine.BALANCING) // .toArray(StateMachine[]::new); } - var gtf = Genotype.of(IntegerChromosome.of(IntegerGene.of(0, p.states().length)), p.numberOfPeriods()); // + var gtf = Genotype.of(IntegerChromosome.of(IntegerGene.of(0, p.states().length)), p.optimizePeriods().size()); // var eval = (Function, Double>) (gt) -> { - var modes = new StateMachine[p.numberOfPeriods()]; + var modes = new StateMachine[p.optimizePeriods().size()]; for (var i = 0; i < modes.length; i++) { modes[i] = p.states()[gt.get(i).get(0).intValue()]; } @@ -191,7 +164,7 @@ protected static StateMachine[] getBestSchedule(Params p, long executionLimitSec } var bestGt = stream // .collect(toBestGenotype()); - return IntStream.range(0, p.numberOfPeriods()) // + return IntStream.range(0, p.optimizePeriods().size()) // .mapToObj(period -> p.states()[bestGt.get(period).get(0).intValue()]) // .toArray(StateMachine[]::new); } diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Utils.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Utils.java index e763531d743..c3c07d1023a 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Utils.java +++ b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Utils.java @@ -1,21 +1,14 @@ package io.openems.edge.controller.ess.timeofusetariff.optimizer; -import static com.google.common.math.Quantiles.percentiles; import static io.openems.common.utils.DateUtils.roundDownToQuarter; -import static io.openems.common.utils.JsonUtils.getAsOptionalDouble; -import static io.openems.common.utils.JsonUtils.getAsOptionalInt; -import static io.openems.common.utils.JsonUtils.toJson; -import static io.openems.edge.common.type.TypeUtils.fitWithin; import static io.openems.edge.common.type.TypeUtils.multiply; import static io.openems.edge.common.type.TypeUtils.orElse; import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.BALANCING; import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.DELAY_DISCHARGE; import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffController.PERIODS_PER_HOUR; -import static java.lang.Math.abs; import static java.lang.Math.max; import static java.lang.Math.min; import static java.lang.Math.round; -import static java.time.format.DateTimeFormatter.ISO_INSTANT; import static java.util.Arrays.stream; import static java.util.stream.IntStream.concat; @@ -24,18 +17,19 @@ import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.List; -import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.TreeMap; import java.util.UUID; import java.util.random.RandomGeneratorFactory; import java.util.stream.IntStream; -import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Streams; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import io.jenetics.util.RandomRegistry; import io.openems.common.exceptions.InvalidValueException; @@ -43,7 +37,6 @@ import io.openems.common.exceptions.OpenemsException; import io.openems.common.timedata.Resolution; import io.openems.common.types.ChannelAddress; -import io.openems.common.utils.JsonUtils; import io.openems.edge.common.sum.Sum; import io.openems.edge.controller.api.Controller; import io.openems.edge.controller.ess.emergencycapacityreserve.ControllerEssEmergencyCapacityReserve; @@ -51,6 +44,9 @@ import io.openems.edge.controller.ess.timeofusetariff.StateMachine; import io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffController; import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.GetScheduleResponse; +import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatas; +import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatas.ScheduleData; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.Period; import io.openems.edge.ess.api.HybridEss; import io.openems.edge.ess.api.ManagedSymmetricEss; import io.openems.edge.ess.api.SymmetricEss; @@ -70,26 +66,27 @@ private Utils() { /** Keep some buffer to avoid scheduling errors because of bad predictions. */ public static final float ESS_MAX_SOC = 90F; + /** Limit Charge Power for §14a EnWG. */ + public static final int ESS_LIMIT_14A_ENWG = -4200; + /** * C-Rate (capacity divided by time) during {@link StateMachine#CHARGE_GRID}. * With a C-Rate of 0.5 the battery gets fully charged within 2 hours. */ public static final float ESS_CHARGE_C_RATE = 0.5F; - protected static final ChannelAddress SUM_GRID = new ChannelAddress("_sum", "GridActivePower"); - protected static final ChannelAddress SUM_PRODUCTION = new ChannelAddress("_sum", "ProductionActivePower"); - protected static final ChannelAddress SUM_UNMANAGED_CONSUMPTION = new ChannelAddress("_sum", + public static final ChannelAddress SUM_PRODUCTION = new ChannelAddress("_sum", "ProductionActivePower"); + public static final ChannelAddress SUM_CONSUMPTION = new ChannelAddress("_sum", "ConsumptionActivePower"); + public static final ChannelAddress SUM_GRID = new ChannelAddress("_sum", "GridActivePower"); + public static final ChannelAddress SUM_UNMANAGED_CONSUMPTION = new ChannelAddress("_sum", "UnmanagedConsumptionActivePower"); - protected static final ChannelAddress SUM_CONSUMPTION = new ChannelAddress("_sum", "ConsumptionActivePower"); - protected static final ChannelAddress SUM_ESS_DISCHARGE_POWER = new ChannelAddress("_sum", "EssDischargePower"); - protected static final ChannelAddress SUM_ESS_SOC = new ChannelAddress("_sum", "EssSoc"); + public static final ChannelAddress SUM_ESS_DISCHARGE_POWER = new ChannelAddress("_sum", "EssDischargePower"); + public static final ChannelAddress SUM_ESS_SOC = new ChannelAddress("_sum", "EssSoc"); protected static final long EXECUTION_LIMIT_SECONDS_BUFFER = 30; protected static final long EXECUTION_LIMIT_SECONDS_MINIMUM = 60; - public record ScheduleData(Double quarterlyPrice, Integer stateMachine, Integer grid, Integer production, - Integer consumption, Integer ess, Integer soc) { - } + private static final Logger LOG = LoggerFactory.getLogger(Utils.class); /** * Initializes the Jenetics {@link RandomRegistry} for production. @@ -136,8 +133,8 @@ private static void initializeRandomRegistry(boolean isUnitTest) { * @return {@link Params} * @throws InvalidValueException on error */ - public static Params createSimulatorParams(Context context, TreeMap existingSchedule) - throws InvalidValueException { + public static Params createSimulatorParams(Context context, + ImmutableSortedMap existingSchedule) throws InvalidValueException { final var time = roundDownToQuarter(ZonedDateTime.now()); // Prediction values @@ -161,20 +158,24 @@ public static Params createSimulatorParams(Context context, TreeMap toEnergy(v)).toArray()) // - .consumptions(stream(interpolateArray(predictionConsumption)).map(v -> toEnergy(v)).toArray()) // - .prices(interpolateArray(prices.asArray())) // - .states(context.controlMode().states) // - .existingSchedule(existingSchedule) // + .setTime(time) // + .setEssTotalEnergy(essTotalEnergy) // + .setEssMinSocEnergy(essMinSocEnergy) // + .setEssMaxSocEnergy(essMaxSocEnergy) // + .setEssInitialEnergy(essSocEnergy) // + .setEssMaxChargeEnergy(toEnergy(Math.abs(maxChargePower))) // + .setEssMaxDischargeEnergy(toEnergy(maxDischargePower)) // + .seMaxBuyFromGrid(toEnergy(context.maxChargePowerFromGrid())) // + .setProductions(stream(interpolateArray(predictionProduction)).map(v -> toEnergy(v)).toArray()) // + .setConsumptions(stream(interpolateArray(predictionConsumption)).map(v -> toEnergy(v)).toArray()) // + .setPrices(interpolateArray(prices.asArray())) // + .setStates(context.controlMode().states) // + .setExistingSchedule(existingSchedule) // .build(); } @@ -206,26 +207,23 @@ protected static Integer[] joinConsumptionPredictions(int splitAfterIndex, Integ } protected static boolean paramsAreValid(Params p) { - if (p.numberOfPeriods() == 0) { + if (p.optimizePeriods().isEmpty()) { // No periods are available - System.out.println("No periods are available"); + LOG.warn("No periods are available"); return false; } - if (stream(p.productions()).allMatch(v -> v == 0) // - && stream(p.consumptions()).allMatch(v -> v == 0)) { + if (p.optimizePeriods().stream() // + .allMatch(pp -> pp.production() == 0 && pp.consumption() == 0)) { // Production and Consumption predictions are all zero - System.out.println("Production and Consumption predictions are all zero"); + LOG.warn("Production and Consumption predictions are all zero"); return false; } - var pricesAreAllTheSame = true; - for (var i = 1; i < p.prices().length; i++) { - if (p.prices()[0] != p.prices()[i]) { - pricesAreAllTheSame = false; - } - } - if (pricesAreAllTheSame) { + if (p.optimizePeriods().stream() // + .mapToDouble(Params.OptimizePeriod::price) // + .distinct() // + .count() <= 1) { // Prices are all the same - System.out.println("Prices are all the same"); + LOG.info("Prices are all the same"); return false; } @@ -336,114 +334,6 @@ protected static int[] interpolateArray(Integer[] values) { return result; } - /** - * Calculates the ESS max charge energy for a period. - * - * @param essMaxSocEnergy ESS energy below a configured maximium SoC [Wh] - * @param essMaxEnergyPerPeriod ESS max charge/discharge energy per period [Wh] - * @param essInitial ESS initially available energy (SoC in [Wh]) of - * the given period - * @return the value in [Wh] - */ - protected static int calculateMaxChargeEnergy(int essMaxSocEnergy, int essMaxEnergyPerPeriod, int essInitial) { - return IntStream.of(essMaxEnergyPerPeriod, essMaxSocEnergy - essInitial) // - .map(v -> max(0, v)) // only positives - .min().orElse(0); - } - - /** - * Calculates the ESS max discharge energy for a period. - * - * @param essMinSocEnergy ESS energy below a configured minimum SoC [Wh] - * @param essMaxEnergyPerPeriod ESS max charge/discharge energy per period [Wh] - * @param essInitial ESS initially available energy (SoC in [Wh]) of - * the given period - * @return the value in [Wh] - */ - protected static int calculateMaxDischargeEnergy(int essMinSocEnergy, int essMaxEnergyPerPeriod, int essInitial) { - return IntStream.of(essMaxEnergyPerPeriod, essInitial - essMinSocEnergy) // - .map(v -> max(0, v)) // only positives - .min().orElse(0); - } - - /** - * Calculates the ESS charge (negative) or discharge (positive) energy for a - * period in {@link StateMachine#BALANCING}. - * - * @param essMaxCharge ESS max charge energy - * @param essMaxDischarge ESS max discharge energy - * @param production Production prediction - * @param consumption Consumption prediction - * @return the value in [Wh] - */ - protected static int calculateBalancingEnergy(int essMaxCharge, int essMaxDischarge, int production, - int consumption) { - var balance = consumption - production; - return fitWithin(-essMaxCharge, essMaxDischarge, balance); - } - - /** - * Calculates the default ESS charge energy per period in - * {@link StateMachine#CHARGE_GRID}. - * - *

- * Applies {@link #ESS_CHARGE_C_RATE} with the minimum of usable ESS energy or - * predicted consumption energy that cannot be supplied from production. - * - * @param essMinSocEnergy ESS energy below a configured minimum SoC [Wh] - * @param essMaxSocEnergy ESS energy below a configured maximium SoC [Wh] - * @param productions Production predictions per period - * @param consumptions Consumption predictions per period - * @param prices Prices per period - * @return the value in [Wh] - */ - protected static int calculateParamsChargeEnergyInChargeGrid(int essMinSocEnergy, int essMaxSocEnergy, - int[] productions, int[] consumptions, double[] prices) { - // Uses the total available energy as reference (= fallback) - var usableEssEnergy = max(0, essMaxSocEnergy - essMinSocEnergy); - - // Uses the total excess consumption as reference - var excessConsumptionEnergy = IntStream.range(0, min(productions.length, consumptions.length)) // - .map(i -> consumptions[i] - productions[i]) // calculates excess Consumption Energy per Period - .sum(); - - // Uses the excess consumption till first production > consumption as reference - var excessConsumptionEnergyInitial = IntStream.range(0, min(productions.length, consumptions.length)) // - .takeWhile(i -> consumptions[i] >= productions[i]) // take only first Periods - .map(i -> consumptions[i] - productions[i]) // calculates excess Consumption Energy per Period - .sum(); - - // Uses the excess consumption during high price periods as reference - var percentileEnergy = -1; - { - var peakIndex = findFirstPeakIndex(findFirstValleyIndex(0, prices), prices); - var firstPrices = stream(prices).limit(peakIndex).toArray(); - if (firstPrices.length > 0) { - var percentilePrice = percentiles().index(95).compute(firstPrices); - percentileEnergy = IntStream.range(0, min(productions.length, consumptions.length)) // - .limit(peakIndex) // - .filter(i -> prices[i] >= percentilePrice) // takes only prices > - .map(i -> consumptions[i] - productions[i]) // calculates excess Consumption Energy per Period - .sum(); - } - } - - return round(min(min(min(// - filter(excessConsumptionEnergy), // - filter(excessConsumptionEnergyInitial)), // - filter(percentileEnergy)), // - usableEssEnergy) // - * ESS_CHARGE_C_RATE / PERIODS_PER_HOUR); - } - - private static int filter(int energy) { - if (energy > 1000) { - return energy; - } else { - return Integer.MAX_VALUE; - } - } - protected static int findFirstPeakIndex(int fromIndex, double[] values) { if (values.length <= fromIndex) { return fromIndex; @@ -476,27 +366,6 @@ protected static int findFirstValleyIndex(int fromIndex, double[] values) { return values.length - 1; } - /** - * Calculates the ESS charge energy for one period in - * {@link StateMachine#CHARGE_GRID}. - * - * @param essMaxCharge ESS max charge energy [Wh] - * @param essChargeInState ESS target charge energy in CHARGE_GRID [Wh] - * @param maxBuyFromGrid Max buy-from-grid energy [Wh] - * @param production Production prediction - * @param consumption Consumption prediction - * @return the value in [Wh] - */ - protected static int calculateChargeGridEnergy(int essMaxCharge, int essChargeInState, int maxBuyFromGrid, - int production, int consumption) { - var remainingAfterChargeProduction = essMaxCharge - max(0, production - consumption); - var remainingAfterSupplyConsumption = maxBuyFromGrid - max(0, consumption - production); - var result = IntStream.of(essChargeInState, remainingAfterChargeProduction, remainingAfterSupplyConsumption) // - .map(v -> max(0, v)) // only positives - .min().orElse(0); - return max(1, result); // always at least one, to make a difference to BALANCING - } - /** * Utilizes the previous three hours' data and computes the next 21 hours data * from the {@link Optimizer} provided, then concatenates them to generate a @@ -515,103 +384,40 @@ public static GetScheduleResponse handleGetScheduleRequest(Optimizer optimizer, String componentId, ZonedDateTime now) throws OpenemsNamedException { now = roundDownToQuarter(now); - if (optimizer == null) { + final var schedule = optimizer.getSchedule(); + if (schedule == null) { throw new OpenemsException("Has no Schedule"); } - final var periods = optimizer.getPeriods(); - if (periods == null) { - throw new OpenemsException("Has no scheduled Periods"); - } final var params = optimizer.getParams(); if (params == null) { throw new OpenemsException("Has no Params"); } - - // Define channel addresses final var channelQuarterlyPrices = new ChannelAddress(componentId, "QuarterlyPrices"); final var channelStateMachine = new ChannelAddress(componentId, "StateMachine"); + final var b = ImmutableList.builder(); - // Query historic data + // Process past data final var fromDate = now.minusHours(3); - var queryResult = timedata.queryHistoricData(null, fromDate, now, // - Set.of(channelQuarterlyPrices, channelStateMachine, // - SUM_GRID, SUM_PRODUCTION, SUM_CONSUMPTION, SUM_ESS_DISCHARGE_POWER, SUM_ESS_SOC), - new Resolution(15, ChronoUnit.MINUTES)); - if (queryResult == null) { - queryResult = new TreeMap<>(); + final var toDate = now.minusMinutes(15); + + try { + var queryResult = timedata.queryHistoricData(null, fromDate, toDate, // + Set.of(channelQuarterlyPrices, channelStateMachine, // + SUM_GRID, SUM_PRODUCTION, SUM_CONSUMPTION, SUM_ESS_DISCHARGE_POWER, SUM_ESS_SOC), + new Resolution(15, ChronoUnit.MINUTES)); + ScheduleData.fromHistoricDataQuery(// + params.essTotalEnergy(), channelQuarterlyPrices, channelStateMachine, queryResult) // + .forEach(b::add); + } catch (Exception e) { + LOG.warn("Unable to read historic data: " + e.getMessage()); } - // Process past predictions - var pastPredictions = queryResult.entrySet().stream()// - .map(Entry::getValue) // - .map(d -> new ScheduleData(// - getAsOptionalDouble(d.get(channelQuarterlyPrices)).orElse(null), // - getAsOptionalInt(d.get(channelStateMachine)).orElse(null), // - jsonIntToEnergy(d.get(SUM_GRID)), // - jsonIntToEnergy(d.get(SUM_PRODUCTION)), // - jsonIntToEnergy(d.get(SUM_CONSUMPTION)), // - jsonIntToEnergy(d.get(SUM_ESS_DISCHARGE_POWER)), // - getAsOptionalInt(d.get(SUM_ESS_SOC)).orElse(null))) // - .toList(); - if (pastPredictions.isEmpty()) { - IntStream.range(0, 3 /* hours */ * 4 /* quarters */) // - .mapToObj(i -> new ScheduleData(null, null, null, null, null, null, null)) // - .toList(); - } - - // Process future predictions - final var futurePredictions = periods.stream()// - .map(period -> new ScheduleData(// - period.price(), // - period.state().getValue(), // - period.grid(), // - period.production(), // - period.consumption(), // - period.essChargeDischarge(), // - round((period.essInitial() * 100) / (float) params.essTotalEnergy()))) // SoC - .toList(); - - // Concatenate past and future predictions - final var predictions = Stream.concat(// - pastPredictions.stream().limit(12), // Last 3 hours data. - futurePredictions.stream()) // Future data. - .toList(); - - // Create schedule and return GetScheduleResponse - var result = createSchedule(predictions, fromDate); - - return new GetScheduleResponse(requestId, result); - } - - /** - * Generates a 24-hour schedule as a {@link JsonArray}. The resulting schedule - * includes timestamped entries of predicted 'state', 'price', 'production', - * 'consumption', 'soc' for each 15-minute interval. - * - * @param datas the list of {@link ScheduleData}s - * @param timestamp the timestamp of the first entry in the schedule - * @return the schedule data as a {@link JsonArray} - */ - public static JsonArray createSchedule(List datas, ZonedDateTime timestamp) { - var schedule = JsonUtils.buildJsonArray(); - - // Create the JSON object for each ScheduleData and add it to the schedule array - for (int index = 0; index < datas.size(); index++) { - var data = datas.get(index); - schedule.add(JsonUtils.buildJsonObject() // - // Calculate the timestamp for the current entry, adding 15 minutes for each - .add("timestamp", toJson(timestamp.plusMinutes(15 * index).format(ISO_INSTANT))) // - .add("price", toJson(data.quarterlyPrice())) // - .add("state", toJson(data.stateMachine())) // - .add("grid", toJson(toPower(data.grid()))) // - .add("production", toJson(toPower(data.production()))) // - .add("consumption", toJson(toPower(data.consumption()))) // - .add("ess", toJson(toPower(data.ess()))) // - .add("soc", toJson(data.soc())) // - .build()); - } + // Process future schedule + optimizer.getSchedule().values().stream() // + .flatMap(ScheduleData::fromPeriod) // + .forEach(b::add); - return schedule.build(); + return new GetScheduleResponse(requestId, fromDate, new ScheduleDatas(params.essTotalEnergy(), b.build())); } /** @@ -639,17 +445,14 @@ public static long calculateExecutionLimitSeconds(Clock clock) { * NOTE: heavy computation is ok here, because this method is called only at the * end with the best Schedule. * - * @param p the {@link Params} - * @param essChargeDischarge the scheduled ESS charge/discharge energy for - * this period - * @param essInitialEnergy the initial ESS energy in this period - * @param balancingChargeDischarge the ESS energy that would be required for - * BALANCING - * @param state the initial state + * @param p the {@link Params} + * @param essInitialEnergy the initial ESS energy in this period + * @param state the initial state + * @param ef the {@link EnergyFlow} * @return the new state */ - public static StateMachine postprocessSimulatorState(Params p, int essChargeDischarge, int essInitialEnergy, - int balancingChargeDischarge, StateMachine state) { + public static StateMachine postprocessSimulatorState(Params p, int essInitialEnergy, StateMachine state, + EnergyFlow ef) { return switch (state) { case BALANCING -> state; @@ -658,9 +461,8 @@ public static StateMachine postprocessSimulatorState(Params p, int essChargeDisc if (essInitialEnergy <= p.essMinSocEnergy()) { // but battery is already empty (at Min-Soc) yield BALANCING; - } else if (essChargeDischarge < 0 && essChargeDischarge == balancingChargeDischarge) { - // but actually selling to grid (i.e. production > consumption) -> could have - // been BALANCING + } else if (ef.productionToEss() > 0) { + // but actually charging -> could have been BALANCING yield BALANCING; } yield state; @@ -668,8 +470,8 @@ public static StateMachine postprocessSimulatorState(Params p, int essChargeDisc case CHARGE_GRID -> { // CHARGE_GRID,... - if (essChargeDischarge >= 0 || essChargeDischarge == balancingChargeDischarge) { - // but actually not charging (i.e. no production) + if (ef.gridToEss() == 0) { + // but actually not charging yield BALANCING; } else if (essInitialEnergy > p.essMaxSocEnergy()) { // but battery is above limit @@ -725,7 +527,9 @@ public static StateMachine postprocessRunState(int minSoc, Integer soc, int prod protected static int calculateEssChargeInChargeGridPowerFromParams(Params params, ManagedSymmetricEss ess) { if (params != null) { - return toPower(params.essChargeInChargeGrid()); + for (var period : params.optimizePeriods()) { + return toPower(period.essChargeInChargeGrid()); // take first period + } } var capacity = ess.getCapacity(); if (capacity.isDefined()) { @@ -742,14 +546,16 @@ protected static int calculateEssChargeInChargeGridPowerFromParams(Params params * Calculates the Max-ActivePower constraint for * {@link StateMachine#CHARGE_GRID}. * - * @param params the {@link Params} - * @param ess the {@link ManagedSymmetricEss} - * @param sum the {@link Sum} - * @param maxChargePowerFromGrid the configured max charge from grid power + * @param params the {@link Params} + * @param ess the {@link ManagedSymmetricEss} + * @param sum the {@link Sum} + * @param maxChargePowerFromGrid the configured max charge from grid power + * @param limitChargePowerFor14aEnWG Limit Charge Power for §14a EnWG * @return the set-point or null */ public static Integer calculateChargeGridPower(Params params, ManagedSymmetricEss ess, Sum sum, - int maxChargePowerFromGrid) { + int maxChargePowerFromGrid, boolean limitChargePowerFor14aEnWG) { + // TODO limitChargePowerFor14aEnWG var gridActivePower = sum.getGridActivePower().get(); // current buy-from/sell-to grid var essActivePower = ess.getActivePower().get(); // current charge/discharge ESS if (gridActivePower == null || essActivePower == null) { @@ -762,7 +568,15 @@ public static Integer calculateChargeGridPower(Params params, ManagedSymmetricEs var effectiveGridBuyPower = max(0, realGridPower) + targetChargePower; var chargePower = max(0, targetChargePower - max(0, effectiveGridBuyPower - maxChargePowerFromGrid)); - return chargePower * -1; + // Invert to negative for CHARGE + chargePower *= -1; + + // Apply §14a EnWG limit + if (limitChargePowerFor14aEnWG) { + chargePower = max(ESS_LIMIT_14A_ENWG, chargePower); + } + + return chargePower; } /** @@ -803,18 +617,10 @@ public static Integer calculateDelayDischargePower(ManagedSymmetricEss ess) { * @param power the power value * @return the energy value */ - protected static int toEnergy(int power) { + public static int toEnergy(int power) { return power / PERIODS_PER_HOUR; } - private static Integer jsonIntToEnergy(JsonElement j) { - var i = getAsOptionalInt(j); - if (i.isPresent()) { - return toEnergy(i.get()); - } - return null; - } - /** * Converts energy [Wh/15 min] to power [W]. * @@ -835,26 +641,33 @@ public static Integer toPower(Integer energy) { * @param params the {@link Params} * @param periods the map of {@link Period}s */ - protected static void logSchedule(Params params, TreeMap periods) { - var b = new StringBuilder() // - .append("OPTIMIZER ") // - .append(params.toString(false)) // - .append("\n") // - .append("OPTIMIZER ") // - .append(Period.header()) // - .append("\n"); - if (periods.values().isEmpty()) { - b // - .append("OPTIMIZER ") // - .append("-> EMPTY\n"); - } else { - periods.values().stream() // - .map(Period::toString) // - .forEach(s -> b // - .append("OPTIMIZER ") // - .append(s) // - .append("\n")); + protected static void logSchedule(Params params, ImmutableSortedMap periods) { + System.out.println("OPTIMIZER " + params.toLogString()); + System.out.println(ScheduleDatas.fromSchedule(params.essTotalEnergy(), periods).toLogString("OPTIMIZER ")); + } + + /** + * Updates the active Schedule with a new Schedule. + * + *

+ *

    + *
  • Period of the currently active Quarter is never changed + *
  • Old Periods are removed from the Schedule + *
  • Remaining Schedules are updated from new Schedule + *
+ * + * @param now the current {@link ZonedDateTime} + * @param schedule the active Schedule + * @param newSchedule the new Schedule + */ + public static void updateSchedule(ZonedDateTime now, TreeMap schedule, + ImmutableSortedMap newSchedule) { + var thisQuarter = roundDownToQuarter(now); + var current = schedule.get(thisQuarter); + schedule.clear(); + schedule.putAll(newSchedule); + if (current != null) { + schedule.put(thisQuarter, current); } - System.out.println(b.toString()); } } diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/MyConfig.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/MyConfig.java index 49d5551c37b..bc0c137b4a2 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/MyConfig.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/MyConfig.java @@ -14,6 +14,7 @@ protected static class Builder { private ControlMode controlMode; private int essMaxChargePower; private int maxChargePowerFromGrid; + private boolean limitChargePowerFor14aEnWG; private RiskLevel riskLevel; private Builder() { @@ -59,6 +60,11 @@ public Builder setRiskLevel(RiskLevel riskLevel) { return this; } + public Builder setLimitChargePowerFor14aEnWG(boolean limitChargePowerFor14aEnWG) { + this.limitChargePowerFor14aEnWG = limitChargePowerFor14aEnWG; + return this; + } + public MyConfig build() { return new MyConfig(this); } @@ -105,6 +111,11 @@ public int maxChargePowerFromGrid() { return this.builder.maxChargePowerFromGrid; } + @Override + public boolean limitChargePowerFor14aEnWG() { + return this.builder.limitChargePowerFor14aEnWG; + } + @Override public RiskLevel riskLevel() { return this.builder.riskLevel; diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TestData.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TestData.java index b9d5ccad2c7..664f3b0d705 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TestData.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TestData.java @@ -1,5 +1,8 @@ package io.openems.edge.controller.ess.timeofusetariff; +import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.BALANCING; +import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.DELAY_DISCHARGE; + public class TestData { // Edge 888; 06.11.2023 @@ -84,15 +87,20 @@ public class TestData { 149.99, 157.43, 130.9, 120.14 // }; - public static final Integer[] STATES = { // - 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, // - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // - 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, // - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, // - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 // + public static final StateMachine[] STATES = { // + BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, DELAY_DISCHARGE, + BALANCING, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, + DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, + DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, + DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, + BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, + BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, + BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, + BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, + BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, BALANCING, + BALANCING, BALANCING, BALANCING, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, + DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE, + DELAY_DISCHARGE, DELAY_DISCHARGE, DELAY_DISCHARGE // }; public static final Integer[] PAST_STATES = { // diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImplTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImplTest.java index 54a786d43e7..f7d4af753f2 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImplTest.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/TimeOfUseTariffControllerImplTest.java @@ -1,53 +1,47 @@ package io.openems.edge.controller.ess.timeofusetariff; -import static io.openems.edge.common.test.DummyUser.DUMMY_OWNER; +import static io.openems.common.utils.DateUtils.roundDownToQuarter; import static io.openems.edge.controller.ess.timeofusetariff.ControlMode.CHARGE_CONSUMPTION; import static io.openems.edge.controller.ess.timeofusetariff.Mode.AUTOMATIC; import static io.openems.edge.controller.ess.timeofusetariff.RiskLevel.MEDIUM; +import static io.openems.edge.controller.ess.timeofusetariff.TestData.CONSUMPTION_PREDICTION_QUARTERLY; +import static io.openems.edge.controller.ess.timeofusetariff.TestData.PRODUCTION_PREDICTION_QUARTERLY; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_CONSUMPTION; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_PRODUCTION; +import static java.time.temporal.ChronoUnit.DAYS; import java.time.Clock; +import java.time.Instant; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; import java.util.function.Supplier; import org.junit.Test; -import io.openems.common.exceptions.OpenemsException; +import io.openems.common.test.TimeLeapClock; import io.openems.edge.common.sum.DummySum; import io.openems.edge.common.test.AbstractComponentTest.TestCase; import io.openems.edge.common.test.DummyComponentManager; import io.openems.edge.common.test.DummyConfigurationAdmin; -import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.GetScheduleRequest; import io.openems.edge.controller.ess.timeofusetariff.optimizer.Context; import io.openems.edge.controller.ess.timeofusetariff.optimizer.Optimizer; import io.openems.edge.controller.test.ControllerTest; import io.openems.edge.ess.test.DummyManagedSymmetricEss; +import io.openems.edge.predictor.api.prediction.Prediction; +import io.openems.edge.predictor.api.test.DummyPredictor; import io.openems.edge.predictor.api.test.DummyPredictorManager; import io.openems.edge.timedata.test.DummyTimedata; import io.openems.edge.timeofusetariff.test.DummyTimeOfUseTariffProvider; public class TimeOfUseTariffControllerImplTest { + public static final Clock CLOCK = new TimeLeapClock(Instant.parse("2020-03-04T14:19:00.00Z"), ZoneOffset.UTC); + private static final String CTRL_ID = "ctrl0"; @Test public void test() throws Exception { - create(); - } - - @Test(expected = OpenemsException.class) - public void testJsonrpcRequest() throws Exception { - var sut = create(); - // Error: has no params - sut.handleJsonrpcRequest(DUMMY_OWNER, new GetScheduleRequest()).get(); - } - - /** - * Creates a {@link TimeOfUseTariffControllerImplTest} instance. - * - * @return the object - * @throws Exception on error - */ - public static TimeOfUseTariffControllerImpl create() throws Exception { - return create(Clock.systemDefaultZone()); + create(CLOCK); } /** @@ -58,14 +52,24 @@ public static TimeOfUseTariffControllerImpl create() throws Exception { * @throws Exception on error */ public static TimeOfUseTariffControllerImpl create(Clock clock) throws Exception { + var now = roundDownToQuarter(ZonedDateTime.now(clock)); + final var midnight = now.truncatedTo(DAYS); + var componentManager = new DummyComponentManager(clock); + var sum = new DummySum(); + var predictor0 = new DummyPredictor("predictor0", componentManager, + Prediction.from(sum, SUM_PRODUCTION, midnight, PRODUCTION_PREDICTION_QUARTERLY), SUM_PRODUCTION); + var predictor1 = new DummyPredictor("predictor0", componentManager, + Prediction.from(sum, SUM_CONSUMPTION, midnight, CONSUMPTION_PREDICTION_QUARTERLY), SUM_CONSUMPTION); + var timeOfUseTariff = DummyTimeOfUseTariffProvider.fromHourlyPrices(clock, TestData.HOURLY_PRICES_SUMMER); + var sut = new TimeOfUseTariffControllerImpl(); new ControllerTest(sut) // .addReference("cm", new DummyConfigurationAdmin()) // - .addReference("componentManager", new DummyComponentManager(clock)) // - .addReference("predictorManager", new DummyPredictorManager()) // + .addReference("componentManager", componentManager) // + .addReference("predictorManager", new DummyPredictorManager(predictor0, predictor1)) // .addReference("timedata", new DummyTimedata("timedata0")) // - .addReference("timeOfUseTariff", DummyTimeOfUseTariffProvider.empty(clock)) // - .addReference("sum", new DummySum()) // + .addReference("timeOfUseTariff", timeOfUseTariff) // + .addReference("sum", sum) // .addReference("ess", new DummyManagedSymmetricEss("ess0") // .withSoc(60) // .withCapacity(10000)) // @@ -76,6 +80,8 @@ public static TimeOfUseTariffControllerImpl create(Clock clock) throws Exception .setMode(AUTOMATIC) // .setControlMode(CHARGE_CONSUMPTION) // .setEssMaxChargePower(5000) // + .setMaxChargePowerFromGrid(10000) // + .setLimitChargePowerFor14aEnWG(false) // .setRiskLevel(MEDIUM) // .build()) // .next(new TestCase()); @@ -96,42 +102,16 @@ public static Optimizer getOptimizer(TimeOfUseTariffControllerImpl ctrl) throws } /** - * Gets the {@link DummyPredictorManager} via Java Reflection. + * Calls the 'createParams()' method in the {@link Optimizer} via Java + * Reflection. * - * @param ctrl the {@link TimeOfUseTariffControllerImplTest} - * @return the object + * @param optimizer the {@link Optimizer} * @throws Exception on error */ - public static DummyPredictorManager getPredictorManager(TimeOfUseTariffControllerImpl ctrl) throws Exception { - var field = TimeOfUseTariffControllerImpl.class.getDeclaredField("predictorManager"); - field.setAccessible(true); - return (DummyPredictorManager) field.get(ctrl); - } - - /** - * Gets the {@link DummyComponentManager} via Java Reflection. - * - * @param ctrl the {@link TimeOfUseTariffControllerImplTest} - * @return the object - * @throws Exception on error - */ - public static DummyComponentManager getComponentManager(TimeOfUseTariffControllerImpl ctrl) throws Exception { - var field = TimeOfUseTariffControllerImpl.class.getDeclaredField("componentManager"); - field.setAccessible(true); - return (DummyComponentManager) field.get(ctrl); - } - - /** - * Gets the {@link DummyTimeOfUseTariffProvider} via Java Reflection. - * - * @param ctrl the {@link TimeOfUseTariffControllerImplTest} - * @return the object - * @throws Exception on error - */ - public static DummyTimeOfUseTariffProvider getTimeOfUseTariff(TimeOfUseTariffControllerImpl ctrl) throws Exception { - var field = TimeOfUseTariffControllerImpl.class.getDeclaredField("timeOfUseTariff"); - field.setAccessible(true); - return (DummyTimeOfUseTariffProvider) field.get(ctrl); + public static void callCreateParams(Optimizer optimizer) throws Exception { + var method = Optimizer.class.getDeclaredMethod("createParams"); + method.setAccessible(true); + method.invoke(optimizer); } /** diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponseTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponseTest.java new file mode 100644 index 00000000000..a5d6d3df718 --- /dev/null +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/GetScheduleResponseTest.java @@ -0,0 +1,50 @@ +package io.openems.edge.controller.ess.timeofusetariff.jsonrpc; + +import static io.openems.common.utils.JsonUtils.prettyToString; +import static io.openems.common.utils.UuidUtils.getNilUuid; +import static io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatasTest.SCHEDULE_DATAS; +import static io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatasTest.TIME; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; + +public class GetScheduleResponseTest { + + @Test + public void testToJsonObject() throws OpenemsNamedException { + var response = new GetScheduleResponse(getNilUuid(), TIME, SCHEDULE_DATAS); + + assertEquals(""" + { + "jsonrpc": "2.0", + "id": "00000000-0000-0000-0000-000000000000", + "result": { + "schedule": [ + { + "timestamp": "2000-01-01T00:15:00Z", + "soc": 6, + "production": 222, + "consumption": 333, + "state": 0, + "price": 78.9, + "ess": 987, + "grid": 654 + }, + { + "timestamp": "2000-01-01T00:30:00Z", + "soc": 21, + "production": 444, + "consumption": 333, + "state": 3, + "price": 12.3, + "ess": 987, + "grid": 654 + } + ] + } + }""", prettyToString(response.toJsonObject())); + } + +} diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatasTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatasTest.java new file mode 100644 index 00000000000..0ee6b1f3b95 --- /dev/null +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/jsonrpc/ScheduleDatasTest.java @@ -0,0 +1,134 @@ +package io.openems.edge.controller.ess.timeofusetariff.jsonrpc; + +import static io.openems.common.utils.JsonUtils.prettyToString; +import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.CHARGE_GRID; +import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.DELAY_DISCHARGE; +import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.CLOCK; +import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.callCreateParams; +import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.getOptimizer; +import static io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatas.fromLogString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.junit.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSortedMap; + +import io.openems.edge.controller.ess.timeofusetariff.StateMachine; +import io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest; +import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatas.ScheduleData; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.EnergyFlow; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.Length; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.OptimizePeriod; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.QuarterPeriod; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator; + +public class ScheduleDatasTest { + + protected static final ZonedDateTime TIME = ZonedDateTime.of(2000, 1, 1, 0, 15, 0, 0, ZoneId.of("UTC")); + + protected static final ScheduleDatas SCHEDULE_DATAS = new ScheduleDatas(22_000, ImmutableList.of(// + new ScheduleData(TIME, null, 100, 200, 300, 1234, 222, 333, 78.9, DELAY_DISCHARGE, 987, 654), + new ScheduleData(TIME.plusMinutes(15), null, 100, 200, 300, 4567, 444, 333, 12.3, CHARGE_GRID, 987, 654))); + + @Test + public void testIsEmpty() { + assertFalse(SCHEDULE_DATAS.isEmpty()); + assertTrue(new ScheduleDatas(22_000, ImmutableList.of()).isEmpty()); + } + + @Test + public void testStream() { + assertEquals(2, SCHEDULE_DATAS.stream().count()); + } + + @Test + public void testToLogString() { + assertEquals( + """ + OPTIMIZER Time OptimizeBy EssMaxChargeEnergy EssMaxDischargeEnergy MaxBuyFromGrid EssInitial Production Consumption Price State EssChargeDischarge Grid + OPTIMIZER 00:15 - 100 200 300 1234 222 333 78.90 DELAY_DISCHARGE 987 654 + OPTIMIZER 00:30 - 100 200 300 4567 444 333 12.30 CHARGE_GRID 987 654 + """, + SCHEDULE_DATAS.toLogString("OPTIMIZER ")); + } + + @Test + public void testToJsonArray() { + assertEquals(""" + [ + { + "timestamp": "2000-01-01T00:00:00Z", + "soc": null, + "production": null, + "consumption": null, + "state": null, + "price": null, + "ess": null, + "grid": null + }, + { + "timestamp": "2000-01-01T00:15:00Z", + "soc": 6, + "production": 222, + "consumption": 333, + "state": 0, + "price": 78.9, + "ess": 987, + "grid": 654 + }, + { + "timestamp": "2000-01-01T00:30:00Z", + "soc": 21, + "production": 444, + "consumption": 333, + "state": 3, + "price": 12.3, + "ess": 987, + "grid": 654 + } + ]""", prettyToString(SCHEDULE_DATAS.toJsonArray(TIME.minusMinutes(15)))); + } + + @Test + public void testFromLogString() { + var log = SCHEDULE_DATAS.toLogString(""); + assertEquals(log, fromLogString(22_000, log).toLogString("")); + } + + @Test + public void testFromSchedule1() throws Exception { + var optimizer = getOptimizer(TimeOfUseTariffControllerImplTest.create(CLOCK)); + callCreateParams(optimizer); + var sds = ScheduleDatas.fromSchedule(optimizer); + assertEquals( + """ + Time OptimizeBy EssMaxChargeEnergy EssMaxDischargeEnergy MaxBuyFromGrid EssInitial Production Consumption Price State EssChargeDischarge Grid + """, + sds.toLogString("")); + } + + @Test + public void testFromSchedule2() throws Exception { + var sds = ScheduleDatas.fromSchedule(22_000, ImmutableSortedMap.of(// + TIME, // + new Simulator.Period(// + new OptimizePeriod(TIME, Length.QUARTER, 1, 2, 3, 4, 5, 6, 7., ImmutableList.of(// + new QuarterPeriod(TIME, 1, 2, 3, 4, 5, 6, 7))), + StateMachine.BALANCING, 10_000, + new EnergyFlow(0, 0, 1000 /* ess */, 500 /* grid */, 0, 0, 0, 0, 0, 0)) // + )); + assertEquals( + """ + OPTIMIZER Time OptimizeBy EssMaxChargeEnergy EssMaxDischargeEnergy MaxBuyFromGrid EssInitial Production Consumption Price State EssChargeDischarge Grid + OPTIMIZER 00:15 QUARTER 1 2 4 10000 5 6 7.00 BALANCING 1000 500 + """, + sds.toLogString("OPTIMIZER ")); + } + +} diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/EnergyFlowTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/EnergyFlowTest.java new file mode 100644 index 00000000000..a9d8b9eec7b --- /dev/null +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/EnergyFlowTest.java @@ -0,0 +1,278 @@ +package io.openems.edge.controller.ess.timeofusetariff.optimizer; + +import static java.lang.Math.max; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import org.junit.Before; +import org.junit.Test; + +import io.openems.common.function.TriFunction; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.OptimizePeriod; + +public class EnergyFlowTest { + + public static final ZonedDateTime TIME = ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")); + public static final EnergyFlow NO_FLOW = new EnergyFlow(0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + private static void assertEnergyFlow(EnergyFlow ef) { + assertTrue("Production is positive", ef.production() >= 0); + assertTrue("Consumption is positive", ef.consumption() >= 0); + assertTrue("ProductionToConsumption is positive", ef.productionToConsumption() >= 0); + assertTrue("ProductionToGrid is positive", ef.productionToGrid() >= 0); + assertTrue("ProductionToEss is positive", ef.productionToEss() >= 0); + assertTrue("GridToConsumption is positive", ef.gridToConsumption() >= 0); + assertTrue("EssToConsumption is positive", ef.essToConsumption() >= 0); + + assertEquals("Sum of Grid", 0, ef.grid() + ef.productionToGrid() - ef.gridToConsumption() - ef.gridToEss()); + assertEquals("Sum of Ess", 0, ef.ess() + ef.productionToEss() - ef.essToConsumption() + ef.gridToEss()); + assertEquals("Sum of Production", 0, + ef.production() - ef.productionToConsumption() - ef.productionToEss() - ef.productionToGrid()); + assertEquals("Sum of Consumption", 0, + ef.consumption() - ef.essToConsumption() - ef.gridToConsumption() - ef.productionToConsumption()); + assertEquals("Overall Sum", 0, ef.grid() + ef.ess() + ef.production() - ef.consumption()); + } + + private static Params.Builder P; + + @Before + public void prepareParams() { + P = Params.create() // + .setTime(TIME) // + .setEssMinSocEnergy(1000) // + .setEssTotalEnergy(22000) // + .setEssMaxSocEnergy(20000) // + .setEssMaxChargeEnergy(5000) // + .setEssMaxDischargeEnergy(5000) // + .seMaxBuyFromGrid(4000) // + .setPrices(0); + + // essChargeInChargeGrid = 2375 + } + + private static EnergyFlow execute(TriFunction function, int essInitial, + Params.Builder pb) { + var p = pb.build(); + return function.apply(p, p.optimizePeriods().get(0), essInitial); + } + + private static EnergyFlow charge(TriFunction function) { + return execute(function, 10000, P // + .setProductions(2500) // + .setConsumptions(500)); + } + + private static EnergyFlow chargeFull(TriFunction function) { + return execute(function, 19_600, P // + .setProductions(3000) // + .setConsumptions(100)); + } + + private static EnergyFlow discharge(TriFunction function) { + return execute(function, 10000, P // + .setProductions(500) // + .setConsumptions(2500)); + } + + private static EnergyFlow dischargeEmpty(TriFunction function) { + return execute(function, 2800, P // + .setProductions(500) // + .setConsumptions(4500)); + } + + private static EnergyFlow chargeMoreThanEssMaxEnergy( + TriFunction function) { + return execute(function, 10000, P // + .setProductions(2500) // + .setConsumptions(500) // + .setEssMaxChargeEnergy(900) // + .setEssMaxDischargeEnergy(900)); + } + + private static EnergyFlow dischargeMoreThanEssMaxEnergy( + TriFunction function) { + return execute(function, 10000, P // + .setProductions(500) // + .setConsumptions(2500) // + .setEssMaxChargeEnergy(900) // + .setEssMaxDischargeEnergy(900)); + } + + private static void testBalancingCharge(TriFunction function) { + var e = charge(function); + assertEnergyFlow(e); + assertEquals(-2000, e.ess()); + assertEquals(0, e.grid()); + assertEquals(500, e.productionToConsumption()); + assertEquals(2000, e.productionToEss()); + } + + private static void testBalancingChargeFull(TriFunction function) { + var e = chargeFull(function); + assertEnergyFlow(e); + assertEquals(-2400, e.ess()); // expect 2900, but limited by essTotalEnergy + assertEquals(-500, e.grid()); // expect 0, but ess is limited by 500 -> sell-to-grid + assertEquals(100, e.productionToConsumption()); + assertEquals(2400, e.productionToEss()); + assertEquals(500, e.productionToGrid()); + } + + /* + * BALANCING + */ + + @Test + public void testBalancingAndCharge() { + testBalancingCharge(EnergyFlow::withBalancing); + } + + @Test + public void testBalancingAndChargeFull() { + testBalancingChargeFull(EnergyFlow::withBalancing); + } + + @Test + public void testBalancingAndDischarge() { + var e = discharge(EnergyFlow::withBalancing); + assertEnergyFlow(e); + assertEquals(2000, e.ess()); + assertEquals(500, e.productionToConsumption()); + assertEquals(2000, e.essToConsumption()); + } + + @Test + public void testBalancingAndDischargeEmpty() { + var e = dischargeEmpty(EnergyFlow::withBalancing); + assertEnergyFlow(e); + assertEquals(1800, e.ess()); + assertEquals(1800, e.essToConsumption()); + assertEquals(2200, e.grid()); + assertEquals(2200, e.gridToConsumption()); + assertEquals(500, e.productionToConsumption()); + } + + @Test + public void testBalancingAndChargeMoreThanEssMaxEnergy() { + var e = chargeMoreThanEssMaxEnergy(EnergyFlow::withBalancing); + assertEnergyFlow(e); + assertEquals(-900, e.ess()); + assertEquals(-1100, e.grid()); + assertEquals(500, e.productionToConsumption()); + assertEquals(900, e.productionToEss()); + assertEquals(1100, e.productionToGrid()); + } + + @Test + public void testBalancingAndDischargeAboveEssMaxEnergy() { + var e = dischargeMoreThanEssMaxEnergy(EnergyFlow::withBalancing); + assertEnergyFlow(e); + assertEquals(900, e.ess()); + assertEquals(1100, e.grid()); + assertEquals(500, e.productionToConsumption()); + assertEquals(900, e.essToConsumption()); + assertEquals(1100, e.gridToConsumption()); + } + + @Test + public void testBalancingAndAboveGridMaxEnergy() { + var e = execute(EnergyFlow::withBalancing, 3000, P // + .setProductions(1000) // + .setConsumptions(4900) // + .seMaxBuyFromGrid(1600)); + assertEnergyFlow(e); + assertEquals(2000, e.ess()); + assertEquals(1900, e.grid()); // ESS Limit has higher priority + assertEquals(1000, e.productionToConsumption()); + assertEquals(1900, e.gridToConsumption()); + assertEquals(2000, e.essToConsumption()); + } + + /* + * DELAY DISCHARGE + */ + + @Test + public void testDelayDischargeAndCharge() { + testBalancingCharge(EnergyFlow::withDelayDischarge); + } + + @Test + public void testDelayDischargeAndChargeFull() { + testBalancingChargeFull(EnergyFlow::withDelayDischarge); + } + + @Test + public void testDelayDischargeAndWouldDischarge() { + var e = discharge(EnergyFlow::withDelayDischarge); + assertEnergyFlow(e); + assertEquals(2000, e.grid()); + assertEquals(500, e.productionToConsumption()); + assertEquals(2000, e.gridToConsumption()); + } + + /* + * CHARGE GRID + */ + + @Test + public void testChargeGridAndCharge() { + var e = charge(EnergyFlow::withChargeGrid); + assertEnergyFlow(e); + assertEquals(-4375, e.ess()); + assertEquals(2375, e.grid()); + assertEquals(500, e.productionToConsumption()); + assertEquals(2000, e.productionToEss()); + } + + @Test + public void testChargeGridAndChargeFull() { + var e = execute(EnergyFlow::withChargeGrid, 16_600, P // + .setProductions(3000) // + .setConsumptions(100)); + assertEnergyFlow(e); + assertEquals(-3400, e.ess()); // expect 5275, but limited by essTotalEnergy + assertEquals(500, e.grid()); // expect 2375, but production has priority + assertEquals(100, e.productionToConsumption()); + assertEquals(2900, e.productionToEss()); + assertEquals(500, e.gridToEss()); + } + + @Test + public void testChargeGridAndAboveGridMaxEnergy() { + var e = execute(EnergyFlow::withChargeGrid, 10000, P // + .setProductions(1000) // + .setConsumptions(2000) // + .seMaxBuyFromGrid(1600)); + assertEnergyFlow(e); + assertEquals(-600, e.ess()); + assertEquals(1600, e.grid()); // Limited by maxBuyFromGrid + assertEquals(1000, e.productionToConsumption()); + assertEquals(1000, e.gridToConsumption()); + assertEquals(600, e.gridToEss()); + } + + /* + * DISCHARGE GRID - just for completeness + */ + private static EnergyFlow withDischargeGrid(Params p, OptimizePeriod op, int essInitial) { + // This is just for completeness; not actually used yet + return EnergyFlow.create(p, op, essInitial, // + p.essTotalEnergy(), // Does not matter here + // Same as Balancing + Discharge-To-Grid + max(0, op.consumption() - op.production()) + 3000 /* static for tests */); + } + + @Test + public void testDischargeGridAndCharge() { + var e = charge(EnergyFlowTest::withDischargeGrid); + assertEnergyFlow(e); + assertEquals(3000, e.ess()); + assertEquals(-5000, e.grid()); + assertEquals(-3000, e.gridToEss()); + assertEquals(500, e.productionToConsumption()); + assertEquals(2000, e.productionToGrid()); + } +} diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/InitialPopulationUtilsTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/InitialPopulationUtilsTest.java index 6f6f977af3e..31c101e741e 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/InitialPopulationUtilsTest.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/InitialPopulationUtilsTest.java @@ -10,44 +10,54 @@ import static io.openems.edge.controller.ess.timeofusetariff.optimizer.SimulatorTest.hourlyToQuarterly; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.interpolateArray; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.toEnergy; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.UtilsTest.prepareExistingSchedule; import static java.util.Arrays.stream; import static org.junit.Assert.assertEquals; +import java.time.ZoneId; +import java.time.ZonedDateTime; + import org.junit.Test; import io.openems.edge.controller.ess.timeofusetariff.ControlMode; public class InitialPopulationUtilsTest { + public static final ZonedDateTime TIME = ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")); + @Test public void testBuildInitialPopulation() { { var lgt = buildInitialPopulation(Params.create() // - .productions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .consumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .prices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // - .states(ControlMode.CHARGE_CONSUMPTION.states) // - .existingSchedule() // + .setTime(TIME) // + .setProductions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setConsumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setPrices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // + .setStates(ControlMode.CHARGE_CONSUMPTION.states) // + .setExistingSchedule(prepareExistingSchedule(TIME)) // .build()); assertEquals(5, lgt.size()); // No Schedule -> only pure BALANCING + CHARGE_GRID } { var lgt = buildInitialPopulation(Params.create() // - .productions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .consumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .prices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // - .states(ControlMode.CHARGE_CONSUMPTION.states) // - .existingSchedule(BALANCING, BALANCING) // + .setTime(TIME) // + .setProductions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setConsumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setPrices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // + .setStates(ControlMode.CHARGE_CONSUMPTION.states) // + .setExistingSchedule(prepareExistingSchedule(TIME, BALANCING, BALANCING)) // .build()); assertEquals(5, lgt.size()); // Existing Schedule is only BALANCING -> only pure BALANCING + CHARGE_GRID } { var gt = buildInitialPopulation(Params.create() // - .productions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .consumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .prices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // - .states(ControlMode.CHARGE_CONSUMPTION.states) // - .existingSchedule(CHARGE_GRID, DELAY_DISCHARGE, CHARGE_GRID, DELAY_DISCHARGE, BALANCING) // + .setTime(TIME) // + .setProductions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setConsumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setPrices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // + .setStates(ControlMode.CHARGE_CONSUMPTION.states) // + .setExistingSchedule(prepareExistingSchedule(TIME, // + CHARGE_GRID, DELAY_DISCHARGE, CHARGE_GRID, DELAY_DISCHARGE, BALANCING)) // .build()).get(1); assertEquals(2 /* CHARGE_GRID */, gt.get(0).get(0).intValue()); assertEquals(1 /* DELAY_DISCHARGE */, gt.get(1).get(0).intValue()); @@ -58,11 +68,13 @@ public void testBuildInitialPopulation() { } { var gt = buildInitialPopulation(Params.create() // - .productions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .consumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .prices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // - .states(ControlMode.DELAY_DISCHARGE.states) // - .existingSchedule(CHARGE_GRID, DELAY_DISCHARGE, CHARGE_GRID, DELAY_DISCHARGE, BALANCING) // + .setTime(TIME) // + .setProductions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setConsumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setPrices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // + .setStates(ControlMode.DELAY_DISCHARGE.states) // + .setExistingSchedule(prepareExistingSchedule(TIME, // + CHARGE_GRID, DELAY_DISCHARGE, CHARGE_GRID, DELAY_DISCHARGE, BALANCING)) // .build()).get(1); assertEquals(0 /* fallback to BALANCING */, gt.get(0).get(0).intValue()); assertEquals(1 /* DELAY_DISCHARGE */, gt.get(1).get(0).intValue()); diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/IntegrationTests.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/IntegrationTests.java index a09083f12bb..8869a26d10a 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/IntegrationTests.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/IntegrationTests.java @@ -1,16 +1,14 @@ package io.openems.edge.controller.ess.timeofusetariff.optimizer; +import static io.openems.common.utils.DateUtils.parseZonedDateTimeOrError; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Params.PARAMS_PATTERN; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.calculateCost; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.getBestSchedule; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.SimulatorTest.logSchedule; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.initializeRandomRegistryForUnitTest; import static java.lang.Integer.parseInt; -import static java.util.Arrays.stream; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import java.util.List; -import java.util.Objects; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -18,7 +16,12 @@ import org.junit.Ignore; import org.junit.Test; +import com.google.common.collect.ImmutableSortedMap; + +import io.openems.common.exceptions.OpenemsException; import io.openems.edge.controller.ess.timeofusetariff.StateMachine; +import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatas; +import io.openems.edge.controller.ess.timeofusetariff.jsonrpc.ScheduleDatas.ScheduleData; public class IntegrationTests { @@ -29,268 +32,61 @@ public void before() { /** * Two price peaks; should CHARGE_GRID during first peak. + * + * @throws Exception on error */ @Ignore @Test - public void test1() { + // TODO to be updated + public void test1() throws Exception { var log = """ - Params [numberOfPeriods=113, time=2024-02-27T19:45+01:00[Europe/Berlin], essTotalEnergy=22000, essMinSocEnergy=0, essMaxSocEnergy=19800, essInitialEnergy=0, essMaxEnergyPerPeriod=2565, essChargeInChargeGrid=2475, maxBuyFromGrid=5750, states=[BALANCING, DELAY_DISCHARGE, CHARGE_GRID]] - Time Production Consumption EssInitial State EssChargeDischarge Grid Price Cost - 19:45 0 1164 0 BALANCING 0 1164 294.00 0.3422 - 20:15 0 2623 0 BALANCING 0 2623 269.30 0.7064 - 20:30 0 1292 0 BALANCING 0 1292 269.30 0.3479 - 20:45 0 1001 0 BALANCING 0 1001 269.30 0.2696 - 21:00 0 383 0 BALANCING 0 383 255.00 0.0977 - 21:15 0 375 0 BALANCING 0 375 255.00 0.0956 - 21:30 0 1129 0 BALANCING 0 1129 255.00 0.2879 - 21:45 0 512 0 BALANCING 0 512 255.00 0.1306 - 22:00 0 384 0 BALANCING 0 384 252.50 0.0970 - 22:15 0 1265 0 BALANCING 0 1265 252.50 0.3194 - 22:30 0 316 0 BALANCING 0 316 252.50 0.0798 - 22:45 0 565 0 BALANCING 0 565 252.50 0.1427 - 23:00 0 505 0 BALANCING 0 505 246.20 0.1243 - 23:15 0 348 0 BALANCING 0 348 246.20 0.0857 - 23:30 0 739 0 BALANCING 0 739 246.20 0.1819 - 23:45 0 513 0 BALANCING 0 513 246.20 0.1263 - 00:00 0 158 0 BALANCING 0 158 240.70 0.0380 - 00:15 0 181 0 BALANCING 0 181 240.70 0.0436 - 00:30 0 356 0 BALANCING 0 356 240.70 0.0857 - 00:45 0 455 0 BALANCING 0 455 240.70 0.1095 - 01:00 0 256 0 BALANCING 0 256 239.60 0.0613 - 01:15 0 360 0 BALANCING 0 360 239.60 0.0863 - 01:30 0 139 0 BALANCING 0 139 239.60 0.0333 - 01:45 0 308 0 BALANCING 0 308 239.60 0.0738 - 02:00 0 320 0 BALANCING 0 320 241.90 0.0774 - 02:15 0 259 0 BALANCING 0 259 241.90 0.0627 - 02:30 0 223 0 BALANCING 0 223 241.90 0.0539 - 02:45 0 288 0 BALANCING 0 288 241.90 0.0697 - 03:00 0 269 0 BALANCING 0 269 244.40 0.0657 - 03:15 0 187 0 BALANCING 0 187 244.40 0.0457 - 03:30 0 230 0 BALANCING 0 230 244.40 0.0562 - 03:45 0 556 0 BALANCING 0 556 244.40 0.1359 - 04:00 0 571 0 BALANCING 0 571 244.70 0.1397 - 04:15 0 326 0 BALANCING 0 326 244.70 0.0798 - 04:30 0 219 0 BALANCING 0 219 244.70 0.0536 - 04:45 0 243 0 BALANCING 0 243 244.70 0.0595 - 05:00 0 108 0 BALANCING 0 108 249.10 0.0269 - 05:15 0 367 0 BALANCING 0 367 249.10 0.0914 - 05:30 0 271 0 BALANCING 0 271 249.10 0.0675 - 05:45 0 1496 0 BALANCING 0 1496 249.10 0.3727 - 06:00 0 1237 0 BALANCING 0 1237 257.30 0.3183 - 06:15 0 1439 0 BALANCING 0 1439 257.30 0.3703 - 06:30 3 1445 0 BALANCING 0 1442 257.30 0.3710 - 06:45 4 1308 0 BALANCING 0 1304 257.30 0.3355 - 07:00 24 1590 0 BALANCING 0 1566 286.60 0.4488 - 07:15 82 1184 0 BALANCING 0 1102 286.60 0.3158 - 07:30 111 924 0 BALANCING 0 813 286.60 0.2330 - 07:45 140 652 0 BALANCING 0 512 286.60 0.1467 - 08:00 158 337 0 BALANCING 0 179 293.20 0.0525 - 08:15 198 670 0 BALANCING 0 472 293.20 0.1384 - 08:30 293 734 0 BALANCING 0 441 293.20 0.1293 - 08:45 471 577 0 BALANCING 0 106 293.20 0.0311 - 09:00 499 771 0 BALANCING 0 272 270.60 0.0736 - 09:15 656 512 0 BALANCING -144 0 270.60 0.0000 - 09:30 1172 198 144 BALANCING -974 0 270.60 0.0000 - 09:45 1486 1095 1118 BALANCING -391 0 270.60 0.0000 - 10:00 1150 355 1509 BALANCING -795 0 256.90 0.0000 - 10:15 942 275 2304 BALANCING -667 0 256.90 0.0000 - 10:30 1103 816 2971 BALANCING -287 0 256.90 0.0000 - 10:45 1125 753 3258 BALANCING -372 0 256.90 0.0000 - 11:00 1046 196 3630 BALANCING -850 0 249.30 0.0000 - 11:15 956 1146 4480 DELAY_DISCHARGE 0 190 249.30 0.0474 - 11:30 722 392 4480 BALANCING -330 0 249.30 0.0000 - 11:45 737 262 4810 BALANCING -475 0 249.30 0.0000 - 12:00 687 803 5285 DELAY_DISCHARGE 0 116 244.90 0.0284 - 12:15 653 210 5285 BALANCING -443 0 244.90 0.0000 - 12:30 659 885 5728 DELAY_DISCHARGE 0 226 244.90 0.0553 - 12:45 641 369 5728 BALANCING -272 0 244.90 0.0000 - 13:00 656 400 6000 BALANCING -256 0 241.10 0.0000 - 13:15 589 553 6256 BALANCING -36 0 241.10 0.0000 - 13:30 492 1014 6292 DELAY_DISCHARGE 0 522 241.10 0.1259 - 13:45 487 403 6292 BALANCING -84 0 241.10 0.0000 - 14:00 506 621 6376 DELAY_DISCHARGE 0 115 242.10 0.0278 - 14:15 579 1030 6376 DELAY_DISCHARGE 0 451 242.10 0.1092 - 14:30 599 1081 6376 DELAY_DISCHARGE 0 482 242.10 0.1167 - 14:45 645 987 6376 DELAY_DISCHARGE 0 342 242.10 0.0828 - 15:00 641 1137 6376 DELAY_DISCHARGE 0 496 252.70 0.1253 - 15:15 478 984 6376 DELAY_DISCHARGE 0 506 252.70 0.1279 - 15:30 390 1185 6376 DELAY_DISCHARGE 0 795 252.70 0.2009 - 15:45 355 997 6376 DELAY_DISCHARGE 0 642 252.70 0.1622 - 16:00 360 1135 6376 DELAY_DISCHARGE 0 775 258.10 0.2000 - 16:15 368 982 6376 DELAY_DISCHARGE 0 614 258.10 0.1585 - 16:30 316 1104 6376 DELAY_DISCHARGE 0 788 258.10 0.2034 - 16:45 218 988 6376 DELAY_DISCHARGE 0 770 258.10 0.1987 - 17:00 143 1124 6376 DELAY_DISCHARGE 0 981 279.60 0.2743 - 17:15 62 991 6376 BALANCING 929 0 279.60 0.0000 - 17:30 7 1106 5447 BALANCING 1099 0 279.60 0.0000 - 17:45 1 1374 4348 DELAY_DISCHARGE 0 1373 279.60 0.3839 - 18:00 1 1257 4348 BALANCING 1256 0 279.80 0.0000 - 18:15 0 1079 3092 BALANCING 1079 0 279.80 0.0000 - 18:30 0 1088 2013 BALANCING 1088 0 279.80 0.0000 - 18:45 0 1112 925 BALANCING 925 187 279.80 0.0523 - 19:00 0 1059 0 BALANCING 0 1059 262.00 0.2775 - 19:15 0 1303 0 BALANCING 0 1303 262.00 0.3414 - 19:30 0 1303 0 BALANCING 0 1303 262.00 0.3414 - 19:45 0 336 0 BALANCING 0 336 262.00 0.0880 - 20:00 0 1812 0 BALANCING 0 1812 246.70 0.4470 - 20:15 0 827 0 BALANCING 0 827 246.70 0.2040 - 20:30 0 749 0 BALANCING 0 749 246.70 0.1848 - 20:45 0 528 0 BALANCING 0 528 246.70 0.1303 - 21:00 0 196 0 BALANCING 0 196 243.40 0.0477 - 21:15 0 185 0 BALANCING 0 185 243.40 0.0450 - 21:30 0 535 0 BALANCING 0 535 243.40 0.1302 - 21:45 0 232 0 BALANCING 0 232 243.40 0.0565 - 22:00 0 165 0 BALANCING 0 165 245.10 0.0404 - 22:15 0 515 0 BALANCING 0 515 245.10 0.1262 - 22:30 0 120 0 BALANCING 0 120 245.10 0.0294 - 22:45 0 199 0 BALANCING 0 199 245.10 0.0488 - 23:00 0 162 0 BALANCING 0 162 234.50 0.0380 - 23:15 0 348 0 BALANCING 0 348 234.50 0.0816 - 23:30 0 739 0 BALANCING 0 739 234.50 0.1733 - 23:45 0 513 0 BALANCING 0 513 234.50 0.1203 """; var p = IntegrationTests.parseParams(log); var schedule = getBestSchedule(p, 30); logSchedule(p, schedule); - assertEquals(282, p.essChargeInChargeGrid()); + assertEquals(282, p.optimizePeriods().get(0).essChargeInChargeGrid()); assertEquals(1.400715212E7, calculateCost(p, schedule), 0.001); } - /** - * Delta between low and high price is approx. factor 1.16. - */ - @Ignore - @Test - public void test2() { - var log = """ - Params [numberOfPeriods=51, time=2024-02-28T11:15+01:00[Europe/Berlin], essTotalEnergy=22000, essMinSocEnergy=0, essMaxSocEnergy=19800, essInitialEnergy=0, essMaxEnergyPerPeriod=2565, essChargeInChargeGrid=361, maxBuyFromGrid=5750, states=[BALANCING, DELAY_DISCHARGE, CHARGE_GRID]] - Time Production Consumption EssInitial State EssChargeDischarge Grid Price Cost - 11:15 518 865 0 BALANCING 0 347 249.30 0.0865 - 11:45 234 306 0 BALANCING 0 72 249.30 0.0179 - 12:00 257 951 0 BALANCING 0 694 244.90 0.1700 - 12:15 281 611 0 BALANCING 0 330 244.90 0.0808 - 12:30 321 409 0 BALANCING 0 88 244.90 0.0216 - 12:45 349 1399 0 BALANCING 0 1050 244.90 0.2571 - 13:00 395 239 0 CHARGE_GRID -517 361 241.10 0.1010 - 13:15 388 418 517 CHARGE_GRID -361 391 241.10 0.1082 - 13:30 352 1308 878 CHARGE_GRID -361 1317 241.10 0.3315 - 13:45 376 534 1239 CHARGE_GRID -361 519 241.10 0.1391 - 14:00 419 600 1600 DELAY_DISCHARGE 0 181 242.10 0.0438 - 14:15 513 818 1600 DELAY_DISCHARGE 0 305 242.10 0.0738 - 14:30 565 1097 1600 DELAY_DISCHARGE 0 532 242.10 0.1288 - 14:45 645 1050 1600 DELAY_DISCHARGE 0 405 242.10 0.0981 - 15:00 641 1074 1600 DELAY_DISCHARGE 0 433 252.70 0.1094 - 15:15 478 1048 1600 DELAY_DISCHARGE 0 570 252.70 0.1440 - 15:30 390 1055 1600 DELAY_DISCHARGE 0 665 252.70 0.1680 - 15:45 355 1117 1600 DELAY_DISCHARGE 0 762 252.70 0.1926 - 16:00 360 1016 1600 DELAY_DISCHARGE 0 656 258.10 0.1693 - 16:15 368 1116 1600 DELAY_DISCHARGE 0 748 258.10 0.1931 - 16:30 316 988 1600 DELAY_DISCHARGE 0 672 258.10 0.1734 - 16:45 218 1096 1600 DELAY_DISCHARGE 0 878 258.10 0.2266 - 17:00 143 1000 1600 DELAY_DISCHARGE 0 857 279.60 0.2396 - 17:15 62 1118 1600 DELAY_DISCHARGE 0 1056 279.60 0.2953 - 17:30 7 991 1600 DELAY_DISCHARGE 0 984 279.60 0.2751 - 17:45 1 1151 1600 DELAY_DISCHARGE 0 1150 279.60 0.3215 - 18:00 1 1414 1600 BALANCING 1413 0 279.80 0.0000 - 18:15 0 1227 187 DELAY_DISCHARGE 0 1227 279.80 0.3433 - 18:30 0 1026 187 DELAY_DISCHARGE 0 1026 279.80 0.2871 - 18:45 0 1099 187 BALANCING 187 912 279.80 0.2552 - 19:00 0 1120 0 BALANCING 0 1120 262.00 0.2934 - 19:15 0 1120 0 BALANCING 0 1120 262.00 0.2934 - 19:30 0 1327 0 BALANCING 0 1327 262.00 0.3477 - 19:45 0 1286 0 BALANCING 0 1286 262.00 0.3369 - 20:00 0 1302 0 BALANCING 0 1302 246.70 0.3212 - 20:15 0 1297 0 BALANCING 0 1297 246.70 0.3200 - 20:30 0 1298 0 BALANCING 0 1298 246.70 0.3202 - 20:45 0 1295 0 BALANCING 0 1295 246.70 0.3195 - 21:00 0 1297 0 BALANCING 0 1297 243.40 0.3157 - 21:15 0 1298 0 BALANCING 0 1298 243.40 0.3159 - 21:30 0 1290 0 BALANCING 0 1290 243.40 0.3140 - 21:45 0 1378 0 BALANCING 0 1378 243.40 0.3354 - 22:00 0 1494 0 BALANCING 0 1494 245.10 0.3662 - 22:15 0 1298 0 BALANCING 0 1298 245.10 0.3181 - 22:30 0 1137 0 BALANCING 0 1137 245.10 0.2787 - 22:45 0 965 0 BALANCING 0 965 245.10 0.2365 - 23:00 0 958 0 BALANCING 0 958 234.50 0.2247 - 23:15 0 998 0 BALANCING 0 998 234.50 0.2340 - 23:30 0 1384 0 BALANCING 0 1384 234.50 0.3245 - 23:45 0 956 0 BALANCING 0 956 234.50 0.2242 - """; - var p = IntegrationTests.parseParams(log); - var schedule = getBestSchedule(p, 30); - logSchedule(p, schedule); - - assertTrue(stream(schedule).noneMatch(s -> s == StateMachine.CHARGE_GRID)); - assertEquals(323, p.essChargeInChargeGrid()); - assertEquals(1.1092183E7, calculateCost(p, schedule), 0.001); - } - - public static final Pattern PARAMS_PATTERN = Pattern.compile("^" // - + ".*essTotalEnergy=(?\\d+)" // - + ".*essMinSocEnergy=(?\\d+)" // - + ".*essMaxSocEnergy=(?\\d+)" // - + ".*essInitialEnergy=(?\\d+)" // - + ".*essMaxEnergyPerPeriod=(?\\d+)" // - + ".*maxBuyFromGrid=(?\\d+)" // - + ".*states=\\[(?[A-Z_, ]+)\\]" // - + ".*$"); public static final Pattern PERIOD_PATTERN = Pattern.compile("^.*(?\\d{2}:\\d{2}\s+.*$)"); - protected static Params parseParams(String log) throws IllegalArgumentException { - var periods = IntegrationTests.parsePeriods(log); - + protected static Params parseParams(String log) throws IllegalArgumentException, OpenemsException { var paramsMatcher = log.lines() // .findFirst() // .map(PARAMS_PATTERN::matcher) // .get(); paramsMatcher.find(); + final var time = parseZonedDateTimeOrError(paramsMatcher.group("time")); final var essTotalEnergy = parseInt(paramsMatcher.group("essTotalEnergy")); final var essMinSocEnergy = parseInt(paramsMatcher.group("essMinSocEnergy")); final var essMaxSocEnergy = parseInt(paramsMatcher.group("essMaxSocEnergy")); final var essInitialEnergy = parseInt(paramsMatcher.group("essInitialEnergy")); - final var essMaxEnergyPerPeriod = parseInt(paramsMatcher.group("essMaxEnergyPerPeriod")); - final var maxBuyFromGrid = parseInt(paramsMatcher.group("maxBuyFromGrid")); final var states = Stream.of(paramsMatcher.group("states").split(", ")) // .map(StateMachine::valueOf) // .toArray(StateMachine[]::new); - return Params.create() // - .time(periods.get(0).time()) // - .essTotalEnergy(essTotalEnergy) // - .essMinSocEnergy(essMinSocEnergy) // - .essMaxSocEnergy(essMaxSocEnergy) // - .essInitialEnergy(essInitialEnergy) // - .essMaxEnergyPerPeriod(essMaxEnergyPerPeriod) // - .maxBuyFromGrid(maxBuyFromGrid) // - .productions(periods.stream().mapToInt(Period::production).toArray()) // - .consumptions(periods.stream().mapToInt(Period::consumption).toArray()) // - .prices(periods.stream().mapToDouble(Period::price).toArray()) // - .states(states) // - .existingSchedule() // - .build(); - } - - private static List parsePeriods(String log) throws IllegalArgumentException { - var result = log.lines() // - .skip(1) // - .map(l -> { - if (l.contains(" Time ")) { // remove header - return null; - } - var matcher = PERIOD_PATTERN.matcher(l); - if (!matcher.find()) { - return null; - } - return matcher.group("log"); // - }) // - .filter(Objects::nonNull) // - .map(Period::fromLog) // - .toList(); - if (result.isEmpty()) { + var sds = ScheduleDatas.fromLogString(essTotalEnergy, log); + if (sds.isEmpty()) { throw new IllegalArgumentException("No Periods"); } - return result; + var sd = sds.stream().findFirst().get(); + + return Params.create() // + .setTime(time) // + .setEssTotalEnergy(essTotalEnergy) // + .setEssMinSocEnergy(essMinSocEnergy) // + .setEssMaxSocEnergy(essMaxSocEnergy) // + .setEssInitialEnergy(essInitialEnergy) // + .setEssMaxChargeEnergy(sd.essMaxChargeEnergy()) // + .setEssMaxDischargeEnergy(sd.essMaxDischargeEnergy()) // + .seMaxBuyFromGrid(sd.maxBuyFromGrid()) // + .setProductions(sds.stream().mapToInt(ScheduleData::production).toArray()) // + .setConsumptions(sds.stream().mapToInt(ScheduleData::consumption).toArray()) // + .setPrices(sds.stream().mapToDouble(ScheduleData::price).toArray()) // + .setStates(states) // + .setExistingSchedule(ImmutableSortedMap.of()) // + .build(); } } diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/OptimizerTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/OptimizerTest.java index 5337e6d656d..310c8f74fc8 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/OptimizerTest.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/OptimizerTest.java @@ -1,5 +1,6 @@ package io.openems.edge.controller.ess.timeofusetariff.optimizer; +import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.CLOCK; import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.getOptimizer; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -12,10 +13,10 @@ public class OptimizerTest { @Test public void testEmpty() throws Exception { - var sut = getOptimizer(TimeOfUseTariffControllerImplTest.create()); + var sut = getOptimizer(TimeOfUseTariffControllerImplTest.create(CLOCK)); assertNull(sut.getParams()); - assertNull(sut.getCurrentPeriod()); - assertTrue(sut.getPeriods().isEmpty()); + assertNull(sut.getCurrentStateMachine()); + assertTrue(sut.getSchedule().isEmpty()); } } diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/ParamsUtilsTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/ParamsUtilsTest.java new file mode 100644 index 00000000000..61fa54d6c1f --- /dev/null +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/ParamsUtilsTest.java @@ -0,0 +1,41 @@ +package io.openems.edge.controller.ess.timeofusetariff.optimizer; + +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.ParamsUtils.calculateChargeEnergyInChargeGrid; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.ParamsUtils.calculatePeriodLengthHourFromIndex; +import static org.junit.Assert.assertEquals; + +import java.time.ZonedDateTime; + +import org.junit.Test; + +public class ParamsUtilsTest { + + @Test + public void testCalculateParamsMaxChargeEnergyInChargeGrid() { + assertEquals(1250, calculateChargeEnergyInChargeGrid(1000, 11000, new int[0], new int[0], new double[0])); + + assertEquals(583, calculateChargeEnergyInChargeGrid(1000, 11000, // + new int[] { 0, 100, 200 }, // + new int[] { 1000, 1100 }, // + new double[0])); + + assertEquals(496, calculateChargeEnergyInChargeGrid(1000, 11000, // + new int[] { 0, 100, 200, 300, 400, 500, 600, 700 }, // + new int[] { 700, 600, 500, 400, 300, 200, 100, 0 }, // + new double[] { 123, 124, 125, 126, 123, 122, 121, 120 })); + + assertEquals(468, calculateChargeEnergyInChargeGrid(1000, 11000, // + new int[] { 0, 100, 200, 300, 400, 500, 600, 700 }, // + new int[] { 700, 600, 500, 1140, 1150, 200, 100, 0 }, // + new double[] { 120, 121, 122, 126, 125, 122, 121, 120 })); + } + + @Test + public void testCalculatePeriodLengthHourFromIndex() { + assertEquals(24, calculatePeriodLengthHourFromIndex(ZonedDateTime.parse("2020-03-04T14:00:00.00Z"))); + assertEquals(24 + 3, calculatePeriodLengthHourFromIndex(ZonedDateTime.parse("2020-03-04T14:15:00.00Z"))); + assertEquals(24 + 2, calculatePeriodLengthHourFromIndex(ZonedDateTime.parse("2020-03-04T14:30:00.00Z"))); + assertEquals(24 + 1, calculatePeriodLengthHourFromIndex(ZonedDateTime.parse("2020-03-04T14:45:00.00Z"))); + assertEquals(24, calculatePeriodLengthHourFromIndex(ZonedDateTime.parse("2020-03-04T15:00:00.00Z"))); + } +} diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/PeriodTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/PeriodTest.java deleted file mode 100644 index bad0cd074f9..00000000000 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/PeriodTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.openems.edge.controller.ess.timeofusetariff.optimizer; - -import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.DELAY_DISCHARGE; -import static org.junit.Assert.assertEquals; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -import org.junit.Test; - -public class PeriodTest { - - @Test - public void testToString() { - var time = ZonedDateTime.of(2000, 1, 1, 0, 15, 0, 0, ZoneId.of("UTC")); - var p = new Period(time, 123, 234, 8000, DELAY_DISCHARGE, 345, 456, 567F, 678.); - - assertEquals( - "00:15 123 234 8000 DELAY_DISCHARGE 345 456 567.00 678.0000", - p.toString()); - - Period.fromLog(p.toString()); - } - -} diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/RunOptimizerFromLogApp.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/RunOptimizerFromLogApp.java index 590631f3b1e..935d969fc10 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/RunOptimizerFromLogApp.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/RunOptimizerFromLogApp.java @@ -29,8 +29,9 @@ public class RunOptimizerFromLogApp { * Run the Application. * * @param args the args + * @throws Exception on error */ - public static void main(String[] args) { + public static void main(String[] args) throws Exception { var params = IntegrationTests.parseParams(LOG); var schedule = getBestSchedule(params, EXECUTION_LIMIT_SECONDS); diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/SimulatorTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/SimulatorTest.java index 62072f749bf..6f34a0141b1 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/SimulatorTest.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/SimulatorTest.java @@ -6,32 +6,31 @@ import static io.openems.edge.controller.ess.timeofusetariff.TestData.CONSUMPTION_888_20231106; import static io.openems.edge.controller.ess.timeofusetariff.TestData.PRICES_888_20231106; import static io.openems.edge.controller.ess.timeofusetariff.TestData.PRODUCTION_888_20231106; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.calculateCost; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.getBestSchedule; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.simulate; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.interpolateArray; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.toEnergy; -import static java.lang.Math.abs; import static java.util.Arrays.stream; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import java.time.ZoneId; import java.time.ZonedDateTime; -import java.util.ArrayList; import java.util.Arrays; import java.util.Random; -import java.util.TreeMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.DoubleStream; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; +import com.google.common.collect.ImmutableSortedMap; + import io.jenetics.util.RandomRegistry; import io.openems.edge.controller.ess.timeofusetariff.ControlMode; import io.openems.edge.controller.ess.timeofusetariff.StateMachine; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.Period; public class SimulatorTest { @@ -44,98 +43,100 @@ public void before() { RandomRegistry.random(new Random(123)); } - private static Period calculatePeriodCost(StateMachine state, int production, int consumption, double price, + private static Period simulatePeriod(StateMachine state, int production, int consumption, double price, int essInitial) { var result = new AtomicReference(); - Simulator.calculatePeriodCost(// - Params.create() // - .time(TIME) // - .essTotalEnergy(22000) // - .essMinSocEnergy(0) // - .essMaxSocEnergy(20000) // - .essInitialEnergy(essInitial) // - .essMaxEnergyPerPeriod(3000 /* [Wh/15 Minutes] */) // - .maxBuyFromGrid(4000 /* [Wh/15 Minutes] */) // - .productions(new int[] { production }) // - .consumptions(new int[] { consumption }) // - .prices(new double[] { price }) // - .states(new StateMachine[] { state }) // - .existingSchedule() // - .build(), - 0, new StateMachine[] { state }, new AtomicInteger(essInitial), result::set); + var params = Params.create() // + .setTime(TIME) // + .setEssTotalEnergy(22000) // + .setEssMinSocEnergy(0) // + .setEssMaxSocEnergy(20000) // + .setEssInitialEnergy(essInitial) // + .setEssMaxChargeEnergy(3000 /* [Wh/15 Minutes] */) // + .setEssMaxDischargeEnergy(3000 /* [Wh/15 Minutes] */) // + .seMaxBuyFromGrid(4000 /* [Wh/15 Minutes] */) // + .setProductions(new int[] { production }) // + .setConsumptions(new int[] { consumption }) // + .setPrices(new double[] { price }) // + .setStates(new StateMachine[] { state }) // + .setExistingSchedule(ImmutableSortedMap.of()) // + .build(); + Simulator.simulatePeriod(params, params.optimizePeriods().get(0), state, new AtomicInteger(essInitial), + result::set); + return result.get(); } private static void assertPeriod(String message, Period period, int essChargeDischarge, int grid, double cost) { - assertEquals(period.state() + "-essChargeDischarge: " + message, essChargeDischarge, - period.essChargeDischarge()); - assertEquals(period.state() + "-grid: " + message, grid, period.grid()); - assertEquals(period.state() + "-cost: " + message, cost, period.cost() * 1000000, 0.1); + assertEquals(period.state() + "-essChargeDischarge: " + message, essChargeDischarge, period.ef().ess()); + assertEquals(period.state() + "-grid: " + message, grid, period.ef().grid()); } @Test public void testCalculatePeriodCostBalancing() { assertPeriod("Consumption > Production; SoC ok", // - calculatePeriodCost(BALANCING, 200, 300, 0.1, 10000), // + simulatePeriod(BALANCING, 200, 300, 0.1, 10000), // 100, 0, 0); assertPeriod("Consumption > Production; discharge limited by essMaxEnergyPerPeriod", // - calculatePeriodCost(BALANCING, 1000, 5000, 0.1, 10000), // + simulatePeriod(BALANCING, 1000, 5000, 0.1, 10000), // 3000, 1000, 100); assertPeriod("Consumption > Production; discharge limited by essMinSocEnergy", // - calculatePeriodCost(BALANCING, 1000, 5000, 0.1, 2500), // + simulatePeriod(BALANCING, 1000, 5000, 0.1, 2500), // 2500, 1500, 150); assertPeriod("Production > Consumption; SoC ok", // - calculatePeriodCost(BALANCING, 300, 200, 0.1, 10000), // + simulatePeriod(BALANCING, 300, 200, 0.1, 10000), // -100, 0, 0); assertPeriod("Production > Consumption; charge limited by essMaxEnergyPerPeriod", // - calculatePeriodCost(BALANCING, 5000, 1000, 0.1, 10000), // + simulatePeriod(BALANCING, 5000, 1000, 0.1, 10000), // -3000, -1000, 0); assertPeriod("Production > Consumption; charge limited by essTotalEnergy", // - calculatePeriodCost(BALANCING, 5000, 1000, 0.1, 19500), // + simulatePeriod(BALANCING, 5000, 1000, 0.1, 19500), // -2500, -1500, 0); } @Test public void testCalculatePeriodCostDelayDischarge() { assertPeriod("Consumption > Production", // - calculatePeriodCost(DELAY_DISCHARGE, 200, 300, 0.1, 10000), // + simulatePeriod(DELAY_DISCHARGE, 200, 300, 0.1, 10000), // 0, 100, 10); assertPeriod("Production > Consumption; SoC ok", // - calculatePeriodCost(DELAY_DISCHARGE, 300, 200, 0.1, 10000), // + simulatePeriod(DELAY_DISCHARGE, 300, 200, 0.1, 10000), // -100, 0, 0); assertPeriod("Production > Consumption; charge limited by essMaxEnergyPerPeriod", // - calculatePeriodCost(DELAY_DISCHARGE, 5000, 1000, 0.1, 10000), // + simulatePeriod(DELAY_DISCHARGE, 5000, 1000, 0.1, 10000), // -3000, -1000, 0); assertPeriod("Production > Consumption; charge limited by essTotalEnergy", // - calculatePeriodCost(DELAY_DISCHARGE, 5000, 1000, 0.1, 19500), // + simulatePeriod(DELAY_DISCHARGE, 5000, 1000, 0.1, 19500), // -2500, -1500, 0); } @Test public void testCalculatePeriodCostChargeGrid() { - // essMaxChargeInChargeGrid = 2500 - assertPeriod("Consumption > Production", // - calculatePeriodCost(CHARGE_GRID, 200, 300, 0.1, 10000), // - -2500, 2600 /* 2500 + 100 */, 302.5); + simulatePeriod(CHARGE_GRID, 200, 300, 0.1, 10000), // + -842, 942 /* 842 + 100 */, 302.5); assertPeriod("Consumption > Production; charge limited by maxBuyFromGrid", // - calculatePeriodCost(CHARGE_GRID, 0, 4500, 0.1, 10000), // - -1 /* exceptional charge */, 4501, 450.12); + simulatePeriod(CHARGE_GRID, 0, 4500, 0.1, 10000), // + 500, 4000, 450.12); assertPeriod("Production > Consumption", // - calculatePeriodCost(CHARGE_GRID, 300, 200, 0.1, 10000), // + simulatePeriod(CHARGE_GRID, 300, 200, 0.1, 10000), // -2600 /* 2500 + 100 */, 2500, 292.5); assertPeriod("Production > Consumption; charge limited by essMaxEnergyPerPeriod", // - calculatePeriodCost(CHARGE_GRID, 3000, 900, 0.1, 10000), // - -3000 /* 2100 from PV, 900 from grid */, 900, 105.3); + simulatePeriod(CHARGE_GRID, 3000, 900, 0.1, 10000), // + -3000, 900, 105.3); assertPeriod("Production > Consumption", // - calculatePeriodCost(CHARGE_GRID, 2000, 1700, 0.1, 10000), // - -2800 /* 300 from PV, 2500 from grid */, 2500, 292.5); + simulatePeriod(CHARGE_GRID, 2000, 1700, 0.1, 10000), // + -2800, 2500, 292.5); + + assertPeriod("Production > Consumption; battery nearly full", // + simulatePeriod(CHARGE_GRID, 3000, 100, 0.1, 19600), // + -400 /* 400 from PV; then full */, -2500 /* sell-to-grid */, 292.5); } @Test @@ -143,18 +144,19 @@ public void testGetFirstSchedule0() { var existingSchedule = new StateMachine[] { CHARGE_GRID, DELAY_DISCHARGE, CHARGE_GRID, BALANCING }; var p = Params.create() // - .time(TIME) // - .essTotalEnergy(22000) // - .essMinSocEnergy(0) // - .essMaxSocEnergy(22000) // - .essInitialEnergy((int) (22000 * 0.1)) // - .essMaxEnergyPerPeriod(toEnergy(10000)) // - .maxBuyFromGrid(toEnergy(24_000)) // - .productions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .consumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .prices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // - .states(ControlMode.CHARGE_CONSUMPTION.states) // - .existingSchedule(existingSchedule) // + .setTime(TIME) // + .setEssTotalEnergy(22000) // + .setEssMinSocEnergy(0) // + .setEssMaxSocEnergy(22000) // + .setEssInitialEnergy((int) (22000 * 0.1)) // + .setEssMaxChargeEnergy(toEnergy(10000)) // + .setEssMaxDischargeEnergy(toEnergy(10000)) // + .seMaxBuyFromGrid(toEnergy(24_000)) // + .setProductions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setConsumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setPrices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // + .setStates(ControlMode.CHARGE_CONSUMPTION.states) // + .setExistingSchedule(UtilsTest.prepareExistingSchedule(TIME, existingSchedule)) // .build(); var s = getBestSchedule(p, // /* executionLimitSeconds */ 30, // @@ -164,166 +166,30 @@ public void testGetFirstSchedule0() { assertArrayEquals(existingSchedule, Arrays.copyOfRange(s, 0, existingSchedule.length)); } - @Test - @Ignore - public void testOnlyBalancing888d20231106() { - var p = createParams888d20231106(BALANCING); - var schedule = getBestSchedule(p, // - /* executionLimitSeconds */ 10 * 60); - - // Cost: 1,9436 € - // Grid Buy: 7794 Wh - // Grid Sell: 1221 Wh - - logSchedule(p, schedule); - logCost(p, schedule); - logGridEnergy(p, schedule); - - assertArrayEquals( - new int[] { 77, 71, 96, 117, 120, 96, 116, 112, 72, 83, 86, 78, 446, 83, 75, 64, 93, 89, 69, 77, 77, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80, -208, -337, 85, -552, -242, -293, -997, -976, -970, - -1657, -1055, -861, -1528, -1773, -2266, -1980, -1310, -1487, -1546, -1099, -868, 0, 308, -218, - 48, 844, 171, 380, 755, 381, 632, 1265, 744, 764, 1210, 1048, 1118, 1187, 1219, 309, 348, 356, - 280, 841, 1022, 104, 109, 808, 376, 273, 463, 91, 157, 523, 138, 278, 452, 805, 407, 332, 66 }, - getEssChargeDischarges(p, schedule)); - } - - @Test - @Ignore - public void testOnlyDelayDischarge888d20231106() { - var p = createParams888d20231106(DELAY_DISCHARGE); - var schedule = getBestSchedule(p, // - /* executionLimitSeconds */ 10 * 60); - - // Cost: 1,9436 € - // Grid Buy: 7794 Wh - // Grid Sell: 1221 Wh - - logSchedule(p, schedule); - logCost(p, schedule); - logGridEnergy(p, schedule); - - assertArrayEquals(new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - getEssChargeDischarges(p, schedule)); - } - - @Test - @Ignore - public void testOnlyCharge888d20231106() { - var p = createParams888d20231106(CHARGE_GRID); - var schedule = getBestSchedule(p, // - /* executionLimitSeconds */ 10 * 60); - - // Cost: 1,9436 € - // Grid Buy: 7794 Wh - // Grid Sell: 1221 Wh - - logSchedule(p, schedule); - logCost(p, schedule); - logGridEnergy(p, schedule); - - assertArrayEquals(new int[] { -673, -679, -654, -633, -630, -654, -634, -638, -678, -667, -664, -672, -304, - -667, -675, -686, -657, -661, -681, -673, -673, -647, -652, -676, -22, 0, 0, 0, -632, 0, 0, -318, 0, - -705, -830, -958, -807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - getEssChargeDischarges(p, schedule)); - } - - @Test - @Ignore - public void testDelayDischarge888d20231106() { - var p = createParams888d20231106(ControlMode.DELAY_DISCHARGE.states); - var schedule = getBestSchedule(p, // - /* executionLimitSeconds */ 10 * 60); - - // Cost: 1,6973 € - // Grid Buy: 7794 Wh - // Grid Sell: 2597 Wh - - logSchedule(p, schedule); - logCost(p, schedule); - logGridEnergy(p, schedule); - - assertArrayEquals( - new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1454, - 0, 432, 314, 0, -80, 0, -337, 85, -552, -242, -293, -997, -976, -970, -1657, -1055, 0, 0, -1773, - -2266, -1980, -1310, -1487, -1546, -1099, -1297, -792, 308, -218, 48, 844, 171, 380, 755, 381, - 632, 1265, 744, 764, 1210, 1048, 1118, 1187, 1219, 309, 348, 356, 280, 841, 1022, 104, 109, 808, - 376, 273, 463, 91, 157, 523, 138, 278, 452, 805, 407, 332, 66 }, - getEssChargeDischarges(p, schedule)); - } - - @Test - @Ignore - public void testCharge888d20231106() { - var p = createParams888d20231106(ControlMode.CHARGE_CONSUMPTION.states); - var schedule = getBestSchedule(p, // - /* executionLimitSeconds */ 10 * 60); - - // Cost: 1,5012 € - // Grid Buy: 7794 Wh - // Grid Sell: 1439 Wh - - logSchedule(p, schedule); - logCost(p, schedule); - logGridEnergy(p, schedule); - - assertArrayEquals( - new int[] { 0, 0, -654, 0, 0, 0, -634, -638, 0, -667, 0, 0, 446, 83, 0, 0, 0, 0, -681, 0, 0, 0, 0, -676, - 728, 0, 1101, 0, 118, 1454, 951, 432, 811, 26, 0, -208, -337, 85, -552, 0, 0, -997, -976, -970, - -1657, -1055, -861, -1528, -1773, -2266, -1980, -1310, -1487, -1546, -1099, -1297, -186, 308, 0, - 48, 844, 171, 380, 755, 381, 632, 1265, 744, 764, 1210, 1048, 1118, 1187, 1219, 309, 348, 356, - 280, 841, 1022, 104, 109, 808, 376, 273, 463, 91, 157, 523, 138, 278, 452, 805, 407, 332, 66 }, - getEssChargeDischarges(p, schedule)); - } - - protected static Params createParams888d20231106(StateMachine... states) { + /** + * Creates dummy {@link Params}. + * + * @param states the allowed states + * @return {@link Params} + */ + public static Params createParams888d20231106(StateMachine... states) { return Params.create() // - .time(TIME) // - .essTotalEnergy(22000) // - .essMinSocEnergy(0) // - .essMaxSocEnergy(22000) // - .essMaxEnergyPerPeriod(toEnergy(10000)) // - .maxBuyFromGrid(toEnergy(24_000)) // - .productions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .consumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // - .prices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // - .states(states) // + .setTime(TIME) // + .setEssTotalEnergy(22000) // + .setEssMinSocEnergy(0) // + .setEssMaxSocEnergy(22000) // + .setEssMaxChargeEnergy(toEnergy(10000)) // + .setEssMaxDischargeEnergy(toEnergy(10000)) // + .seMaxBuyFromGrid(toEnergy(24_000)) // + .setProductions(stream(interpolateArray(PRODUCTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setConsumptions(stream(interpolateArray(CONSUMPTION_888_20231106)).map(v -> toEnergy(v)).toArray()) // + .setPrices(hourlyToQuarterly(interpolateArray(PRICES_888_20231106))) // + .setStates(states) // .build(); } - private static void logCost(Params p, StateMachine[] schedule) { - System.out.println("Cost: " // - + "%.4f €".formatted(calculateCost(p, schedule) / 1_000_000 /* convert to € */)); - } - protected static void logSchedule(Params p, StateMachine[] schedule) { - var periods = new TreeMap(); - calculateCost(p, schedule, period -> periods.put(period.time(), period)); - Utils.logSchedule(p, periods); - } - - private static int[] getEssChargeDischarges(Params p, StateMachine[] schedule) { - var periods = new ArrayList(); - calculateCost(p, schedule, period -> periods.add(period.essChargeDischarge())); - return periods.stream().mapToInt(Integer::intValue).toArray(); - } - - private static void logGridEnergy(Params p, StateMachine[] schedule) { - var gridBuy = new AtomicInteger(); - var gridSell = new AtomicInteger(); - - calculateCost(p, schedule, periods -> { - if (periods.grid() > 0) { - gridBuy.getAndUpdate(v -> v + periods.grid()); - } else { - gridSell.getAndUpdate(v -> v + abs(periods.grid())); - } - }); - System.out.println("Grid Buy: " + gridBuy.get() + " Wh"); - System.out.println("Grid Sell: " + gridSell.get() + " Wh"); + Utils.logSchedule(p, simulate(p, schedule)); } /** diff --git a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/UtilsTest.java b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/UtilsTest.java index e0fb788098c..bd3309a40c5 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/UtilsTest.java +++ b/io.openems.edge.controller.ess.timeofusetariff/test/io/openems/edge/controller/ess/timeofusetariff/optimizer/UtilsTest.java @@ -5,38 +5,35 @@ import static io.openems.common.utils.JsonUtils.getAsInt; import static io.openems.common.utils.JsonUtils.getAsJsonArray; import static io.openems.common.utils.JsonUtils.getAsJsonObject; +import static io.openems.common.utils.UuidUtils.getNilUuid; import static io.openems.edge.common.test.TestUtils.withValue; import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.BALANCING; import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.CHARGE_GRID; import static io.openems.edge.controller.ess.timeofusetariff.StateMachine.DELAY_DISCHARGE; import static io.openems.edge.controller.ess.timeofusetariff.TestData.CONSUMPTION_PREDICTION_QUARTERLY; -import static io.openems.edge.controller.ess.timeofusetariff.TestData.HOURLY_PRICES_SUMMER; import static io.openems.edge.controller.ess.timeofusetariff.TestData.PAST_HOURLY_PRICES; import static io.openems.edge.controller.ess.timeofusetariff.TestData.PAST_SOC; import static io.openems.edge.controller.ess.timeofusetariff.TestData.PAST_STATES; +import static io.openems.edge.controller.ess.timeofusetariff.TestData.PRODUCTION_888_20231106; import static io.openems.edge.controller.ess.timeofusetariff.TestData.PRODUCTION_PREDICTION_QUARTERLY; -import static io.openems.edge.controller.ess.timeofusetariff.TestData.STATES; -import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.getComponentManager; +import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.CLOCK; +import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.callCreateParams; import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.getContext; import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.getOptimizer; -import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.getPredictorManager; -import static io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest.getTimeOfUseTariff; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.EnergyFlowTest.NO_FLOW; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.SimulatorTest.TIME; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.SimulatorTest.createParams888d20231106; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.ESS_MAX_SOC; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_CONSUMPTION; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_ESS_DISCHARGE_POWER; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_ESS_SOC; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_GRID; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.SUM_PRODUCTION; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateBalancingEnergy; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateChargeGridEnergy; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateChargeGridPower; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateDelayDischargePower; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateEssChargeInChargeGridPowerFromParams; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateExecutionLimitSeconds; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateMaxChargeEnergy; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateMaxChargeProductionPower; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.calculateParamsChargeEnergyInChargeGrid; -import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.createSchedule; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.createSimulatorParams; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.findFirstPeakIndex; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.findFirstValleyIndex; @@ -50,8 +47,7 @@ import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.postprocessSimulatorState; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.toEnergy; import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.toPower; -import static java.time.temporal.ChronoUnit.DAYS; -import static java.util.UUID.randomUUID; +import static io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.updateSchedule; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -60,16 +56,18 @@ import java.time.Duration; import java.time.Instant; +import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; import java.util.List; import java.util.TreeMap; +import java.util.stream.IntStream; import org.junit.Test; +import com.google.common.collect.ImmutableSortedMap; + import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.test.TimeLeapClock; import io.openems.common.types.ChannelAddress; @@ -81,30 +79,37 @@ import io.openems.edge.controller.ess.timeofusetariff.ControlMode; import io.openems.edge.controller.ess.timeofusetariff.StateMachine; import io.openems.edge.controller.ess.timeofusetariff.TimeOfUseTariffControllerImplTest; -import io.openems.edge.controller.ess.timeofusetariff.optimizer.Utils.ScheduleData; +import io.openems.edge.controller.ess.timeofusetariff.optimizer.Simulator.Period; import io.openems.edge.ess.api.SymmetricEss; import io.openems.edge.ess.test.DummyHybridEss; import io.openems.edge.ess.test.DummyManagedSymmetricEss; -import io.openems.edge.predictor.api.prediction.Prediction; -import io.openems.edge.predictor.api.test.DummyPredictor; import io.openems.edge.timedata.test.DummyTimedata; -import io.openems.edge.timeofusetariff.api.TimeOfUsePrices; -import io.openems.edge.timeofusetariff.test.DummyTimeOfUseTariffProvider; public class UtilsTest { + protected static ImmutableSortedMap prepareExistingSchedule(ZonedDateTime fromDate, + StateMachine... existingSchedule) { + return IntStream.range(0, existingSchedule.length) // + .mapToObj(Integer::valueOf) // + .collect(ImmutableSortedMap.toImmutableSortedMap( + ZonedDateTime::compareTo, // + i -> fromDate.plusMinutes(i * 15), // + i -> existingSchedule[i])); + } + @Test public void testCreateSimulatorParams() throws Exception { - var context = getContext(TimeOfUseTariffControllerImplTest.create()); - var p = createSimulatorParams(context, new TreeMap<>()); - assertEquals(0, p.numberOfPeriods()); + final var context = getContext(TimeOfUseTariffControllerImplTest.create(CLOCK)); + final var p = createSimulatorParams(context, ImmutableSortedMap.of()); + final var op = p.optimizePeriods().get(0); + assertEquals(4, p.optimizePeriods().size()); assertEquals(10000, p.essTotalEnergy()); assertEquals(0, p.essMinSocEnergy()); - assertEquals(250, p.essMaxEnergyPerPeriod()); + assertEquals(250, op.essMaxChargeEnergy()); + assertEquals(250, op.essMaxDischargeEnergy()); assertEquals(6000, p.essInitialEnergy()); - assertEquals(250, p.essMaxEnergyPerPeriod()); - assertEquals(1125, p.essChargeInChargeGrid()); - assertEquals(0, p.maxBuyFromGrid()); + assertEquals(434, op.essChargeInChargeGrid()); + assertEquals(2500, op.maxBuyFromGrid()); assertArrayEquals(ControlMode.CHARGE_CONSUMPTION.states, p.states()); } @@ -156,51 +161,6 @@ public void testJoinConsumptionPredictions() { new Integer[] { 11, 22, 33, 44, 55, 66, 77, 88, 99 })); } - @Test - public void testCalculateMaxChargeEnergy() { - assertEquals(0, calculateMaxChargeEnergy(0, 0, 0)); - assertEquals(400, calculateMaxChargeEnergy(1000, 400, 0)); - assertEquals(300, calculateMaxChargeEnergy(1000, 400, 700)); - assertEquals(0, calculateMaxChargeEnergy(1000, 400, 1100)); - assertEquals(400, calculateMaxChargeEnergy(1000, 400, -100)); - } - - @Test - public void testCalculateMaxDischargeEnergy() { - assertEquals(300, Utils.calculateMaxDischargeEnergy(100, 300, 1000)); - assertEquals(200, Utils.calculateMaxDischargeEnergy(100, 300, 300)); - assertEquals(0, Utils.calculateMaxDischargeEnergy(100, 300, 0)); - } - - @Test - public void testCalculateBalancingEnergy() { - assertEquals(0, calculateBalancingEnergy(0, 0, 0, 0)); - assertEquals(-200, calculateBalancingEnergy(1000, 1000, 500, 300)); - assertEquals(200, calculateBalancingEnergy(1000, 1000, 500, 700)); - assertEquals(1000, calculateBalancingEnergy(1000, 1000, 5000, 7000)); - assertEquals(-1000, calculateBalancingEnergy(1000, 1000, 5000, 3000)); - } - - @Test - public void testCalculateParamsMaxChargeEnergyInChargeGrid() { - assertEquals(1250, calculateParamsChargeEnergyInChargeGrid(1000, 11000, new int[0], new int[0], new double[0])); - - assertEquals(250, calculateParamsChargeEnergyInChargeGrid(1000, 11000, // - new int[] { 0, 100, 200 }, // - new int[] { 1000, 1100 }, // - new double[0])); - - assertEquals(200, calculateParamsChargeEnergyInChargeGrid(1000, 11000, // - new int[] { 0, 100, 200, 300, 400, 500, 600, 700 }, // - new int[] { 700, 600, 500, 400, 300, 200, 100, 0 }, // - new double[] { 123, 124, 125, 126, 123, 122, 121, 120 })); - - assertEquals(199, calculateParamsChargeEnergyInChargeGrid(1000, 11000, // - new int[] { 0, 100, 200, 300, 400, 500, 600, 700 }, // - new int[] { 700, 600, 500, 1140, 1150, 200, 100, 0 }, // - new double[] { 120, 121, 122, 126, 125, 122, 121, 120 })); - } - @Test public void testFindFirstPeakIndex() { assertEquals(0, findFirstPeakIndex(0, new double[0])); @@ -221,26 +181,14 @@ public void testFindFirstValleyIndex() { assertEquals(5, findFirstValleyIndex(5, new double[0])); } - @Test - public void testCalculateChargeGridEnergy() { - assertEquals(1, calculateChargeGridEnergy(0, 0, 0, 0, 0)); - // essChargeInState wins - assertEquals(300, calculateChargeGridEnergy(1000, 300, 1000, 0, 0)); - // essMaxCharge wins - assertEquals(900, calculateChargeGridEnergy(900, 1000, 1000, 0, 100)); - assertEquals(800, calculateChargeGridEnergy(900, 1000, 1000, 100, 0)); - // maxBuyFromGrid wins - assertEquals(800, calculateChargeGridEnergy(1000, 1000, 900, 0, 100)); - assertEquals(900, calculateChargeGridEnergy(1000, 1000, 900, 100, 0)); - } - @Test public void testCalculateChargeGridPower() { var params = createParams888d20231106(ControlMode.CHARGE_CONSUMPTION.states); assertNull(calculateChargeGridPower(params, // new DummyManagedSymmetricEss("ess0"), // new DummySum(), // - /* maxChargePowerFromGrid */ 24_000)); + /* maxChargePowerFromGrid */ 24_000, // + /* limitChargePowerFor14aEnWG */ false)); assertEquals(-10000, calculateChargeGridPower(null, // new DummyManagedSymmetricEss("ess0") // @@ -248,22 +196,34 @@ public void testCalculateChargeGridPower() { .withActivePower(-6_000), // new DummySum() // .withGridActivePower(10_000), // - /* maxChargePowerFromGrid */ 20_000).intValue()); + /* maxChargePowerFromGrid */ 20_000, // + /* limitChargePowerFor14aEnWG */ false).intValue()); + assertEquals(-4200, calculateChargeGridPower(null, // + new DummyManagedSymmetricEss("ess0") // + .withCapacity(20_000) // + .withActivePower(-6_000), // + new DummySum() // + .withGridActivePower(10_000), // + /* maxChargePowerFromGrid */ 20_000, // + /* limitChargePowerFor14aEnWG */ true).intValue()); + assertEquals(-11000, calculateChargeGridPower(null, // new DummyManagedSymmetricEss("ess0") // .withCapacity(20_000) // .withActivePower(-6_000), // new DummySum() // .withGridActivePower(5_000), // - /* maxChargePowerFromGrid */ 20_000).intValue()); + /* maxChargePowerFromGrid */ 20_000, // + /* limitChargePowerFor14aEnWG */ false).intValue()); - assertEquals(-2364, calculateChargeGridPower(params, // + assertEquals(-5860, calculateChargeGridPower(params, // new DummyManagedSymmetricEss("ess0") // .withActivePower(-1000), // new DummySum() // .withGridActivePower(500), // - /* maxChargePowerFromGrid */ 24_000).intValue()); + /* maxChargePowerFromGrid */ 24_000, // + /* limitChargePowerFor14aEnWG */ false).intValue()); // Would be -3584, but limited to 5000 which is already surpassed // TODO if this should actually serve as blackout-protection, a positive value @@ -273,15 +233,17 @@ public void testCalculateChargeGridPower() { .withActivePower(1000), // new DummySum() // .withGridActivePower(9000), // - /* maxChargePowerFromGrid */ 5_000).intValue()); + /* maxChargePowerFromGrid */ 5_000, // + /* limitChargePowerFor14aEnWG */ false).intValue()); - assertEquals(-4864, calculateChargeGridPower(params, // + assertEquals(-8360, calculateChargeGridPower(params, // new DummyHybridEss("ess0") // .withActivePower(-1000) // .withDcDischargePower(-1500), // new DummySum() // .withGridActivePower(-2000), // - /* maxChargePowerFromGrid */ 24_000).intValue()); + /* maxChargePowerFromGrid */ 24_000, // + /* limitChargePowerFor14aEnWG */ false).intValue()); } @Test @@ -327,43 +289,43 @@ public void testCalculateDelayDischarge() { @Test public void testParamsAreValid() throws Exception { var builder = Params.create() // - .time(TIME) // - .essInitialEnergy(0) // - .essTotalEnergy(22000) // - .essMinSocEnergy(2_000) // - .essMaxSocEnergy(20_000) // - .maxBuyFromGrid(toEnergy(24_000)) // - .maxBuyFromGrid(0) // - .states(new StateMachine[0]); + .setTime(TIME) // + .setEssInitialEnergy(0) // + .setEssTotalEnergy(22000) // + .setEssMinSocEnergy(2_000) // + .setEssMaxSocEnergy(20_000) // + .seMaxBuyFromGrid(toEnergy(24_000)) // + .seMaxBuyFromGrid(0) // + .setStates(new StateMachine[0]); // No periods are available assertFalse(paramsAreValid(builder // - .productions() // - .consumptions() // - .prices() // + .setProductions() // + .setConsumptions() // + .setPrices() // .build())); // Production and Consumption predictions are all zero assertFalse(paramsAreValid(builder // - .productions(0, 0, 0) // - .consumptions(0, 0) // - .prices(123F) // + .setProductions(0, 0, 0) // + .setConsumptions(0, 0) // + .setPrices(123F) // .build())); // Prices are all the same assertFalse(paramsAreValid(builder // - .productions(0, 1, 3) // - .consumptions(0, 2) // - .prices(123F, 123F) // + .setProductions(0, 1, 3) // + .setConsumptions(0, 2) // + .setPrices(123F, 123F) // .build())); // Finally got it right... assertTrue(paramsAreValid(builder // - .productions(0, 1, 3) // - .consumptions(0, 2) // - .prices(123F, 124F) // + .setProductions(0, 1, 3) // + .setConsumptions(0, 2) // + .setPrices(123F, 124F) // .build())); - assertEquals(2, builder.build().numberOfPeriods()); + assertEquals(2, builder.build().optimizePeriods().size()); } private static class MyControllerEssLimitTotalDischarge @@ -418,7 +380,7 @@ public void testGetEssMinSocEnergy() { assertEquals(5000, getEssMinSocEnergy(new Context(// null, null, null, null, null, // List.of(t3), List.of(t1, t2), // - null, 0), // + null, 0, false), // 10000)); } @@ -426,10 +388,6 @@ public void testGetEssMinSocEnergy() { public void testHandleScheduleRequest() throws Exception { final var clock = new TimeLeapClock(Instant.parse("2020-03-04T14:19:00.00Z"), ZoneOffset.UTC); final var ctrl = TimeOfUseTariffControllerImplTest.create(clock); - final var predictorManager = getPredictorManager(ctrl); - final var componentManager = getComponentManager(ctrl); - final var timeOfUseTariff = getTimeOfUseTariff(ctrl); - final var sum = new DummySum(); // Simulate historic data var now = roundDownToQuarter(ZonedDateTime.now(clock)); @@ -437,79 +395,69 @@ public void testHandleScheduleRequest() throws Exception { var timedata = new DummyTimedata("timedata0"); for (var i = 0; i < 12; i++) { var quarter = fromDate.plusMinutes(i * 15); - timedata.add(quarter, new ChannelAddress("", "QuarterlyPrices"), PAST_HOURLY_PRICES[i]); - timedata.add(quarter, new ChannelAddress("", "StateMachine"), PAST_STATES[i]); + timedata.add(quarter, new ChannelAddress("ctrl0", "QuarterlyPrices"), PAST_HOURLY_PRICES[i]); + timedata.add(quarter, new ChannelAddress("ctrl0", "StateMachine"), PAST_STATES[i]); timedata.add(quarter, SUM_PRODUCTION, PRODUCTION_PREDICTION_QUARTERLY[i]); timedata.add(quarter, SUM_CONSUMPTION, CONSUMPTION_PREDICTION_QUARTERLY[i]); timedata.add(quarter, SUM_ESS_SOC, PAST_SOC[i]); + timedata.add(quarter, SUM_ESS_DISCHARGE_POWER, PRODUCTION_888_20231106[i]); + timedata.add(quarter, SUM_GRID, PRODUCTION_888_20231106[i]); } - final var midnight = now.truncatedTo(DAYS); - predictorManager.addPredictor(new DummyPredictor("predictor0", componentManager, - Prediction.from(sum, SUM_PRODUCTION, midnight, PRODUCTION_PREDICTION_QUARTERLY), SUM_PRODUCTION)); - predictorManager.addPredictor(new DummyPredictor("predictor0", componentManager, - Prediction.from(sum, SUM_CONSUMPTION, midnight, CONSUMPTION_PREDICTION_QUARTERLY), SUM_CONSUMPTION)); - timeOfUseTariff.setPrices(TimeOfUsePrices.from(now, 1., 1.)); - var optimizer = getOptimizer(ctrl); - optimizer.forever(); + callCreateParams(optimizer); // Testing only past data. For full data, optimizer has to be created as well. - var result = handleGetScheduleRequest(optimizer, randomUUID(), timedata, "", clock.now()).getResult(); + var result = handleGetScheduleRequest(optimizer, getNilUuid(), timedata, "ctrl0", clock.now()).getResult(); // JsonUtils.prettyPrint(result); var schedule = getAsJsonArray(result, "schedule"); - assertEquals(14, schedule.size()); + assertEquals(11, schedule.size()); { var period = getAsJsonObject(schedule.get(0)); assertEquals(PAST_HOURLY_PRICES[0], getAsFloat(period, "price"), 0.00F); assertEquals(PRODUCTION_PREDICTION_QUARTERLY[0] / 4, getAsInt(period, "production")); } - { - var period = getAsJsonObject(schedule.get(12)); - assertEquals(BALANCING.getValue(), getAsInt(period, "state")); - assertEquals(60, getAsInt(period, "soc")); - } - { - var period = getAsJsonObject(schedule.get(13)); - assertEquals(BALANCING.getValue(), getAsInt(period, "state")); - assertEquals(58, getAsInt(period, "soc")); - } } @Test public void testPostprocessPeriodState() { var p = Params.create() // - .time(TIME) // - .essInitialEnergy(0) // - .essTotalEnergy(22000) // - .essMinSocEnergy(2_000) // - .essMaxSocEnergy(20_000) // - .essMaxEnergyPerPeriod(0) // - .maxBuyFromGrid(toEnergy(24_000)) // - .productions() // - .consumptions() // - .prices(new double[] { 123 }) // - .states(new StateMachine[0]) // + .setTime(TIME) // + .setEssInitialEnergy(0) // + .setEssTotalEnergy(22000) // + .setEssMinSocEnergy(2_000) // + .setEssMaxSocEnergy(20_000) // + .setEssMaxChargeEnergy(0) // + .setEssMaxDischargeEnergy(0) // + .seMaxBuyFromGrid(toEnergy(24_000)) // + .setProductions() // + .setConsumptions() // + .setPrices(new double[] { 123 }) // + .setStates(new StateMachine[0]) // .build(); assertEquals("BALANCING stays BALANCING", // - BALANCING, postprocessSimulatorState(p, 0, 0, 0, BALANCING)); + BALANCING, postprocessSimulatorState(p, 0, BALANCING, NO_FLOW)); assertEquals("DELAY_DISCHARGE but battery is empty", // - BALANCING, postprocessSimulatorState(p, 0, 2000, 0, DELAY_DISCHARGE)); + BALANCING, postprocessSimulatorState(p, 2000, DELAY_DISCHARGE, NO_FLOW)); + assertEquals("DELAY_DISCHARGE and would discharge in balancing", // - DELAY_DISCHARGE, postprocessSimulatorState(p, 0, 2001, 1, DELAY_DISCHARGE)); + DELAY_DISCHARGE, postprocessSimulatorState(p, 2001, DELAY_DISCHARGE, NO_FLOW)); assertEquals("DELAY_DISCHARGE and would charge from PV in balancing", // - BALANCING, postprocessSimulatorState(p, -1000, 2001, -1000, DELAY_DISCHARGE)); + BALANCING, postprocessSimulatorState(p, 2001, DELAY_DISCHARGE, + new EnergyFlow(0, 0, 0, 0, 0, 0, 1 /* productionToEss */, 0, 0, 0))); assertEquals("CHARGE_GRID actually from grid", // - CHARGE_GRID, postprocessSimulatorState(p, -1000, 0, 0, StateMachine.CHARGE_GRID)); - assertEquals("CHARGE_GRID but fully supplied by excess PV", // - BALANCING, postprocessSimulatorState(p, -1000, 0, -1000, CHARGE_GRID)); + CHARGE_GRID, postprocessSimulatorState(p, 0, CHARGE_GRID, + new EnergyFlow(0, 0, 0, 0, 0, 0, 0, 0, 0, 1 /* gridToEss */))); + assertEquals("CHARGE_GRID but actually not charging", // + BALANCING, postprocessSimulatorState(p, 0, CHARGE_GRID, NO_FLOW)); assertEquals("CHARGE_GRID but battery is full", // - DELAY_DISCHARGE, postprocessSimulatorState(p, -1000, 20_001, 0, CHARGE_GRID)); + DELAY_DISCHARGE, postprocessSimulatorState(p, 20_001, CHARGE_GRID, + new EnergyFlow(0, 0, 0, 0, 0, 0, 0, 0, 0, 1 /* gridToEss */))); } @Test @@ -533,45 +481,6 @@ public void testPostprocessRunState() { CHARGE_GRID, postprocessRunState((int) ESS_MAX_SOC, (int) ESS_MAX_SOC, 0, CHARGE_GRID)); } - @Test - public void testCreateSchedule() { - final var clock = new TimeLeapClock(Instant.parse("2022-01-01T00:00:00.00Z"), ZoneOffset.UTC); - final var timestamp = roundDownToQuarter(ZonedDateTime.now(clock)).minusHours(3); - - // Price provider - final var quarterlyPrices = DummyTimeOfUseTariffProvider.fromHourlyPrices(clock, HOURLY_PRICES_SUMMER) - .getPrices().asArray(); - - var datas = new ArrayList(); - var size = quarterlyPrices.length; - for (var i = 0; i < size; i++) { - datas.add(new ScheduleData(// - quarterlyPrices[i], // - STATES[i], // - null, // Grid - PRODUCTION_PREDICTION_QUARTERLY[i], // - CONSUMPTION_PREDICTION_QUARTERLY[i], // - null, null)); - } - - final var result = createSchedule(datas, timestamp); - - // Check if the consumption power is converted to energy. - assertEquals(// - (int) toPower(CONSUMPTION_PREDICTION_QUARTERLY[0]), // - result.get(0).getAsJsonObject().get("consumption").getAsInt()); - - // Check if the result is same size as prices. - assertEquals(size, result.size()); - - var expectedLastTimestamp = timestamp.plusDays(1).minusMinutes(15).format(DateTimeFormatter.ISO_INSTANT) - .toString(); - var generatedLastTimestamp = result.get(95).getAsJsonObject().get("timestamp").getAsString(); - - // Check if the last timestamp is as expected. - assertEquals(expectedLastTimestamp, generatedLastTimestamp); - } - @Test public void testCalculateExecutionLimitSeconds() { final var clock = new TimeLeapClock(Instant.parse("2022-01-01T00:00:00.00Z"), ZoneOffset.UTC); @@ -604,6 +513,46 @@ public void testCalculateMaxChargeGridPowerFromParams() { assertEquals(7500, calculateEssChargeInChargeGridPowerFromParams(null, ess)); // With params (22 kWh; but few Consumption) - assertEquals(1864, calculateEssChargeInChargeGridPowerFromParams(params, ess)); + assertEquals(5360, calculateEssChargeInChargeGridPowerFromParams(params, ess)); + } + + @Test + public void testUpdateSchedule() { + final ZonedDateTime t = ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")); + final Period pOld = new Period(null, DELAY_DISCHARGE, 0, NO_FLOW); + final Period pNew = new Period(null, BALANCING, 0, NO_FLOW); + + var schedule = new TreeMap(); + schedule.put(t.minusMinutes(15), pOld); // old entry is removed + schedule.put(t, pOld); // current entry stays + schedule.put(t.plusMinutes(15), pOld); // is overridden + schedule.put(t.plusMinutes(30), pOld); // is overridden + schedule.put(t.plusMinutes(45), pOld); // timestamp is missing in new Schedule -> remove + + var newSchedule = ImmutableSortedMap.naturalOrder() // + .put(t, pNew) // + .put(t.plusMinutes(15), pNew) // + .put(t.plusMinutes(30), pNew) // + .build(); + + updateSchedule(t, schedule, newSchedule); + + // One old entry + assertEquals(1, schedule.values().stream().filter(v -> v == pOld).count()); + + // Two new entries + assertEquals(2, schedule.values().stream().filter(v -> v == pNew).count()); + + // No old entry + assertEquals(0, schedule.keySet().stream().filter(tz -> tz.isBefore(t)).count()); + + // Details + assertEquals(pOld, schedule.get(t)); + assertEquals(pNew, schedule.get(t.plusMinutes(15))); + assertEquals(pNew, schedule.get(t.plusMinutes(30))); + + // No current entry -> handle null + schedule.remove(t); + updateSchedule(t, schedule, newSchedule); } } diff --git a/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElement.java b/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElement.java index f9dc5e6e7d3..4e6fdb42ef7 100644 --- a/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElement.java +++ b/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElement.java @@ -15,7 +15,8 @@ public interface ControllerIoHeatingElement { public enum ChannelId implements io.openems.edge.common.channel.ChannelId { LEVEL(Doc.of(Level.values()) // - .text("Current Level")), + .text("Current Level") // + .persistencePriority(HIGH)), AWAITING_HYSTERESIS(Doc.of(INTEGER)), // PHASE1_TIME(Doc.of(INTEGER)// .unit(SECONDS)), // diff --git a/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElementImpl.java b/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElementImpl.java index 9c1993940f3..11f32531716 100644 --- a/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElementImpl.java +++ b/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/ControllerIoHeatingElementImpl.java @@ -77,7 +77,7 @@ public class ControllerIoHeatingElementImpl extends AbstractOpenemsComponent /** Holds the minimum time the phases should be switch on in [Ws]. */ private long minimumTotalPhaseTime; /** Current Level. */ - private Level currentLevel = Level.UNDEFINED; + private Level currentLevel = Level.LEVEL_0; /** Last Level change time, used for the hysteresis. */ private LocalDateTime lastLevelChange = LocalDateTime.MIN; private Config config; @@ -219,7 +219,7 @@ protected Status modeAutomatic() throws IllegalArgumentException, OpenemsNamedEx targetLevel = this.applyHysteresis(targetLevel); Status runState; - runState = targetLevel.equals(Level.LEVEL_0) || targetLevel.equals(Level.UNDEFINED) ? Status.INACTIVE + runState = targetLevel.equals(Level.LEVEL_0) ? Status.INACTIVE : Status.ACTIVE; var now = LocalTime.now(this.componentManager.getClock()); @@ -281,8 +281,6 @@ private static long calculateMinimumTotalPhaseTime(Config config) { return config.minTime() * 3600 * 2; case LEVEL_3: return config.minTime() * 3600 * 3; - case UNDEFINED: - return 0; } case NONE: return 0; @@ -309,7 +307,6 @@ private LocalTime calculateLatestForceHeatingStartTime() throws OpenemsException var endTime = DateUtils.parseLocalTimeOrError(this.config.endTime()); switch (this.config.defaultLevel()) { case LEVEL_0: - case UNDEFINED: case LEVEL_1: // keep value break; @@ -337,7 +334,6 @@ public void applyLevel(Level level) throws IllegalArgumentException, OpenemsName // Set phases accordingly switch (level) { - case UNDEFINED: case LEVEL_0: this.phase1.switchOff(); this.phase2.switchOff(); @@ -445,7 +441,6 @@ private void updateCumulatedActiveTime() { switch (this.currentLevel) { case LEVEL_0: - case UNDEFINED: break; case LEVEL_1: level1Active = true; diff --git a/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/enums/Level.java b/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/enums/Level.java index 6f2445f2767..57332774990 100644 --- a/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/enums/Level.java +++ b/io.openems.edge.controller.io.heatingelement/src/io/openems/edge/controller/io/heatingelement/enums/Level.java @@ -4,11 +4,7 @@ public enum Level implements OptionsEnum { /** - * Unknown state on first state. - */ - UNDEFINED(-1, "Undefined"), - /** - * Unknown state on first state. + * Switch off everything. */ LEVEL_0(0, "Switch off everything"), /** diff --git a/io.openems.edge.core/src/io/openems/edge/app/ess/FixActivePower.java b/io.openems.edge.core/src/io/openems/edge/app/ess/FixActivePower.java index cc39a74ac07..0f87982aaca 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/ess/FixActivePower.java +++ b/io.openems.edge.core/src/io/openems/edge/app/ess/FixActivePower.java @@ -158,6 +158,7 @@ protected ThrowingTriFunction, L public OpenemsAppPermissions getAppPermissions() { return OpenemsAppPermissions.create() // .setCanSee(Role.ADMIN) // + .setCanDelete(Role.ADMIN) // .build(); } diff --git a/io.openems.edge.core/src/io/openems/edge/app/ess/FixStateOfCharge.java b/io.openems.edge.core/src/io/openems/edge/app/ess/FixStateOfCharge.java new file mode 100644 index 00000000000..4ac58e3af14 --- /dev/null +++ b/io.openems.edge.core/src/io/openems/edge/app/ess/FixStateOfCharge.java @@ -0,0 +1,251 @@ +package io.openems.edge.app.ess; + +import static io.openems.edge.app.common.props.CommonProps.alias; + +import java.util.Map; +import java.util.function.Function; + +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +import com.google.common.collect.Lists; +import com.google.gson.JsonElement; + +import io.openems.common.channel.Unit; +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.function.ThrowingTriFunction; +import io.openems.common.oem.OpenemsEdgeOem; +import io.openems.common.session.Language; +import io.openems.common.session.Role; +import io.openems.common.types.EdgeConfig; +import io.openems.common.utils.JsonUtils; +import io.openems.edge.app.common.props.CommonProps; +import io.openems.edge.app.common.props.ComponentProps; +import io.openems.edge.app.ess.FixStateOfCharge.Property; +import io.openems.edge.common.component.ComponentManager; +import io.openems.edge.core.appmanager.AbstractOpenemsApp; +import io.openems.edge.core.appmanager.AbstractOpenemsAppWithProps; +import io.openems.edge.core.appmanager.AppConfiguration; +import io.openems.edge.core.appmanager.AppDef; +import io.openems.edge.core.appmanager.AppDescriptor; +import io.openems.edge.core.appmanager.ComponentManagerSupplier; +import io.openems.edge.core.appmanager.ComponentUtil; +import io.openems.edge.core.appmanager.ConfigurationTarget; +import io.openems.edge.core.appmanager.Nameable; +import io.openems.edge.core.appmanager.OpenemsApp; +import io.openems.edge.core.appmanager.OpenemsAppCardinality; +import io.openems.edge.core.appmanager.OpenemsAppCategory; +import io.openems.edge.core.appmanager.OpenemsAppPermissions; +import io.openems.edge.core.appmanager.Type; +import io.openems.edge.core.appmanager.Type.Parameter; +import io.openems.edge.core.appmanager.Type.Parameter.BundleParameter; +import io.openems.edge.core.appmanager.dependency.Tasks; +import io.openems.edge.core.appmanager.dependency.aggregatetask.SchedulerByCentralOrderConfiguration.SchedulerComponent; +import io.openems.edge.core.appmanager.formly.Exp; +import io.openems.edge.core.appmanager.formly.JsonFormlyUtil; +import io.openems.edge.core.appmanager.formly.enums.InputType; + +/** + * Describes a fix state of charge app. + * + *
+  {
+    "appId":"App.Ess.FixStateOfCharge",
+    "alias":"App.Ess.FixStateOfCharge",
+    "instanceId": UUID,
+    "image": base64,
+    "properties":{
+    	"ESS_ID": "ess0",
+    	"TARGET_SOC": 100,
+    	"TARGET_SPECIFIED_TIME": boolean,
+    	"TARGET_TIME": LocalDateTime,
+    	"TARGET_TIME_BUFFER": 0,
+    	"SELF_TERMINATION": boolean,
+    	"TERMINATION_BUFFER": 0,
+    	"CONDITIONAL_TERMINATION": boolean,
+    	"IS_RUNNING": boolean
+    },
+    "appDescriptor": {
+    	"websiteUrl": {@link AppDescriptor#getWebsiteUrl()}
+    }
+  }
+ * 
+ */ +@Component(name = "App.Ess.FixStateOfCharge") +public class FixStateOfCharge extends AbstractOpenemsAppWithProps + implements OpenemsApp { + + public enum Property implements Type, Nameable { + // Components + CTRL_FIX_STATE_OF_CHARGE_ID(AppDef.componentId("ctrlFixStateOfCharge0")), // + + // Properties + ALIAS(alias()), // + ESS_ID(ComponentProps.pickManagedSymmetricEssId()), // + TARGET_SOC(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".targetSoc.label") // + .setDefaultValue(100)// + .setRequired(true) // + .setField(JsonFormlyUtil::buildRangeFromNameable, (app, property, l, parameter, field) -> { + field.setMin(1); + field.setMax(100); + }))), // + TARGET_SPECIFIED_TIME(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".targetSpecifiedTime.label") // + .setDefaultValue(false)// + .setField(JsonFormlyUtil::buildCheckboxFromNameable) // + .setRequired(true))), // + TARGET_TIME(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".targetTime.label") // + .setField(JsonFormlyUtil::buildDateTimeFromNameable, (app, property, l, parameter, field) -> { + field.onlyShowIf(Exp.currentModelValue(TARGET_SPECIFIED_TIME).notNull()); + }) // + .setRequired(true))), // + TARGET_TIME_BUFFER(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".targetTimeBuffer.label") // + .setDefaultValue(0)// + .setField(JsonFormlyUtil::buildInputFromNameable, (app, property, l, parameter, field) -> { + field.setInputType(InputType.NUMBER); + field.onlyPositiveNumbers(); + field.setUnit(Unit.MINUTE, l); + }).setRequired(true))), // + SELF_TERMINATION(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".selfTermination.label") // + .setDefaultValue(true)// + .setField(JsonFormlyUtil::buildCheckboxFromNameable) // + .setRequired(true))), // + TERMINATION_BUFFER(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".terminationBuffer.label") // + .setDefaultValue(0)// + .setField(JsonFormlyUtil::buildInputFromNameable, (app, property, l, parameter, field) -> { + field.setInputType(InputType.NUMBER); + field.onlyPositiveNumbers(); + field.setUnit(Unit.MINUTE, l); + }).setRequired(true))), // + CONDITIONAL_TERMINATION(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".conditionalTermination.label") // + .setDefaultValue(false)// + .setField(JsonFormlyUtil::buildCheckboxFromNameable) // + .setRequired(true))), // + IS_RUNNING(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def // + .setTranslatedLabelWithAppPrefix(".isRunning.label") // + .setDefaultValue(true) // + .setField(JsonFormlyUtil::buildCheckboxFromNameable) // + .bidirectional(CTRL_FIX_STATE_OF_CHARGE_ID, "isRunning", // + ComponentManagerSupplier::getComponentManager))), // + ; + + private final AppDef def; + + private Property(AppDef def) { + this.def = def; + } + + @Override + public Property self() { + return this; + } + + @Override + public AppDef def() { + return this.def; + } + + @Override + public Function, BundleParameter> getParamter() { + return Parameter.functionOf(AbstractOpenemsApp::getTranslationBundle); + } + } + + @Activate + public FixStateOfCharge(// + @Reference final ComponentManager componentManager, // + final ComponentContext componentContext, // + @Reference final ConfigurationAdmin cm, // + @Reference final ComponentUtil componentUtil // + ) { + super(componentManager, componentContext, cm, componentUtil); + } + + @Override + public AppDescriptor getAppDescriptor(OpenemsEdgeOem oem) { + return AppDescriptor.create() // + .setWebsiteUrl(oem.getAppWebsiteUrl(this.getAppId())) // + .build(); + } + + @Override + public OpenemsAppCategory[] getCategories() { + return new OpenemsAppCategory[] { OpenemsAppCategory.ESS }; + } + + @Override + public OpenemsAppCardinality getCardinality() { + return OpenemsAppCardinality.SINGLE; + } + + @Override + protected ThrowingTriFunction, Language, AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() { + return (t, p, l) -> { + final var ctrlFixStateOfChargeId = this.getId(t, p, Property.CTRL_FIX_STATE_OF_CHARGE_ID); + + final var alias = this.getString(p, l, Property.ALIAS); + final var essId = this.getString(p, Property.ESS_ID); + final var targetSoc = this.getInt(p, Property.TARGET_SOC); + final var targetSpecifiedTime = this.getBoolean(p, Property.TARGET_SPECIFIED_TIME); + final var targetTimeBuffer = this.getInt(p, Property.TARGET_TIME_BUFFER); + final var selfTermination = this.getBoolean(p, Property.SELF_TERMINATION); + final var terminationBuffer = this.getInt(p, Property.TERMINATION_BUFFER); + final var conditionalTermination = this.getBoolean(p, Property.CONDITIONAL_TERMINATION); + final var isRunning = this.getBoolean(p, Property.IS_RUNNING); + + final var properties = JsonUtils.buildJsonObject() // + .addProperty("enabled", true) // + .addProperty("ess.id", essId) // + .addProperty("targetSoc", targetSoc) // + .addProperty("targetTimeSpecified", targetSpecifiedTime) // + .addProperty("targetTimeBuffer", targetTimeBuffer) // + .addProperty("terminationBuffer", terminationBuffer) // + .addProperty("conditionalTermination", conditionalTermination) // + .addProperty("selfTermination", selfTermination) // + .addProperty("isRunning", isRunning) // + .build(); + + if (targetSpecifiedTime) { + final var targetTime = this.getString(p, Property.TARGET_TIME); + properties.addProperty("targetTime", targetTime); + } + + final var components = Lists.newArrayList(// + new EdgeConfig.Component(ctrlFixStateOfChargeId, alias, "Controller.Ess.FixStateOfCharge", // + properties)); + + return AppConfiguration.create() // + .addTask(Tasks.component(components)) // + .addTask(Tasks.schedulerByCentralOrder(new SchedulerComponent(ctrlFixStateOfChargeId, + "Controller.Ess.FixStateOfCharge", this.getAppId()))) // + .build(); + }; + } + + @Override + public OpenemsAppPermissions getAppPermissions() { + return OpenemsAppPermissions.create() // + .setCanSee(Role.ADMIN) // + .setCanDelete(Role.ADMIN) // + .build(); + } + + @Override + protected Property[] propertyValues() { + return Property.values(); + } + + @Override + protected FixStateOfCharge getApp() { + return this; + } +} diff --git a/io.openems.edge.core/src/io/openems/edge/app/ess/PowerPlantController.java b/io.openems.edge.core/src/io/openems/edge/app/ess/PowerPlantController.java index 74fa8228704..b70373ea994 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/ess/PowerPlantController.java +++ b/io.openems.edge.core/src/io/openems/edge/app/ess/PowerPlantController.java @@ -142,6 +142,7 @@ protected Property[] propertyValues() { public OpenemsAppPermissions getAppPermissions() { return OpenemsAppPermissions.create() // .setCanSee(Role.ADMIN) // + .setCanDelete(Role.ADMIN) // .build(); } diff --git a/io.openems.edge.core/src/io/openems/edge/app/ess/PrepareBatteryExtension.java b/io.openems.edge.core/src/io/openems/edge/app/ess/PrepareBatteryExtension.java index a3d0c7d6833..f7e6ec1a3a6 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/ess/PrepareBatteryExtension.java +++ b/io.openems.edge.core/src/io/openems/edge/app/ess/PrepareBatteryExtension.java @@ -171,6 +171,7 @@ protected ThrowingTriFunction, L public OpenemsAppPermissions getAppPermissions() { return OpenemsAppPermissions.create() // .setCanSee(Role.ADMIN) // + .setCanDelete(Role.ADMIN) // .build(); } diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome.java index a6013d13827..833c1a2d55c 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome.java +++ b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome.java @@ -450,6 +450,7 @@ public OpenemsAppCardinality getCardinality() { public OpenemsAppPermissions getAppPermissions() { return OpenemsAppPermissions.create() // .setCanSee(Role.INSTALLER) // + .setCanDelete(Role.INSTALLER) // .build(); } diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome20.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome20.java index 23f9e6880ac..c5fa2b7406e 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome20.java +++ b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome20.java @@ -323,6 +323,7 @@ public AppDescriptor getAppDescriptor(OpenemsEdgeOem oem) { public OpenemsAppPermissions getAppPermissions() { return OpenemsAppPermissions.create() // .setCanSee(Role.INSTALLER) // + .setCanDelete(Role.INSTALLER) // .build(); } diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome30.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome30.java index c71f223d38c..3a61c8b5185 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome30.java +++ b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/FeneconHome30.java @@ -324,6 +324,7 @@ public AppDescriptor getAppDescriptor(OpenemsEdgeOem oem) { public OpenemsAppPermissions getAppPermissions() { return OpenemsAppPermissions.create() // .setCanSee(Role.INSTALLER) // + .setCanDelete(Role.INSTALLER) // .build(); } diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSComponents.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSComponents.java deleted file mode 100644 index 233ce8d2c07..00000000000 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSComponents.java +++ /dev/null @@ -1,402 +0,0 @@ -package io.openems.edge.app.integratedsystem.fenecon.industrial.s; - -import static io.openems.edge.core.appmanager.TranslationUtil.translate; - -import java.util.List; -import java.util.ResourceBundle; - -import com.google.gson.JsonPrimitive; - -import io.openems.common.types.EdgeConfig; -import io.openems.common.types.EdgeConfig.Component; -import io.openems.common.utils.JsonUtils; -import io.openems.edge.app.enums.MeterType; -import io.openems.edge.app.enums.Parity; -import io.openems.edge.app.meter.KdkMeter; -import io.openems.edge.core.appmanager.ConfigurationTarget; -import io.openems.edge.core.appmanager.TranslationUtil; -import io.openems.edge.core.appmanager.dependency.DependencyDeclaration; -import io.openems.edge.ess.power.api.SolverStrategy; - -public final class FeneconIndustrialSComponents { - - /** - * Creates a default bmw battery component for a FENECON Industrial S. - * - * @param bundle the translation bundle - * @param batteryId the id of the battery - * @param alias the alias of the battery - * @param modbusIdInternal the id of the internal modbus bridge - * @param modbusUnitId the modbus unit id of the battery - * @return the {@link Component} - */ - public static EdgeConfig.Component batteryBmw(// - final ResourceBundle bundle, // - final String batteryId, // - final String alias, // - final String modbusIdInternal, // - final int modbusUnitId // - ) { - return new EdgeConfig.Component(batteryId, translate(bundle, "App.IntegratedSystem.batteryN.alias", alias), - "Battery.Fenecon.F2B.BMW", JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("startStop", "AUTO") // - .addProperty("modbus.id", modbusIdInternal) // - .addProperty("modbusUnitId", modbusUnitId) // - .build()); - } - - /** - * Creates a default f2b parallel battery cluster component for a FENECON - * Industrial S. - * - * @param bundle the translation bundle - * @param batteryId the id of the battery - * @param alias the alias of the battery - * @param batteryIds the ids of the batteries - * @return the {@link Component} - */ - public static EdgeConfig.Component batteryf2bClusterParallel(// - final ResourceBundle bundle, // - final String batteryId, // - final String alias, // - final List batteryIds // - ) { - return new EdgeConfig.Component(batteryId, - translate(bundle, "App.IntegratedSystem.batteryParallelClusterN.alias", alias), - "Battery.Fenecon.F2B.Cluster.Parallel", JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("startStop", "AUTO") // - .add("battery.ids", batteryIds.stream() // - .map(JsonPrimitive::new) // - .collect(JsonUtils.toJsonArray())) // - .build()); - } - - /** - * Creates a default f2b serial battery cluster component for a FENECON - * Industrial S. - * - * @param bundle the translation bundle - * @param batteryId the id of the battery - * @param alias the alias of the battery - * @param batteryIds the ids of the batteries which are controlled by this - * cluster - * @return the {@link Component} - */ - public static EdgeConfig.Component batteryf2bClusterSerial(// - final ResourceBundle bundle, // - final String batteryId, // - final String alias, // - final List batteryIds // - ) { - return new EdgeConfig.Component(batteryId, - translate(bundle, "App.IntegratedSystem.batterySerialClusterN.alias", alias), - "Battery.Fenecon.F2B.Cluster.Serial", JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("startStop", "AUTO") // - .add("battery.ids", batteryIds.stream() // - .map(JsonPrimitive::new) // - .collect(JsonUtils.toJsonArray())) // - .build()); - } - - /** - * Creates a default battery-inverter component for a FENECON Industrial S. - * - * @param bundle the translation bundle - * @param number the number of the Battery-Inverter - * @return the {@link Component} - */ - public static EdgeConfig.Component batteryInverter(// - final ResourceBundle bundle, // - final int number // - ) { - return new EdgeConfig.Component("batteryInverter" + number, - translate(bundle, "App.IntegratedSystem.batteryInverterN.alias", number), - "Battery-Inverter.Kaco.BlueplanetGridsave", // - JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("activateWatchdog", true) // - .addProperty("modbus.id", "modbus" + number) // - .addProperty("startStop", "AUTO") // - .build()); - } - - /** - * Creates a default cycle component for a FENECON Industrial S. - * - * @return the {@link Component} - */ - public static EdgeConfig.Component cycle() { - return new EdgeConfig.Component("_cycle", "Core.Cycle", "Core.Cycle", // - JsonUtils.buildJsonObject() // - .addProperty("cycleTime", 200) // - .build()); - } - - /** - * Creates a default ess cluster component for a FENECON Industrial S. - * - * @param bundle the translation bundle - * @param clusterId the id of the ess-cluster - * @param essIds the ess ids which are controlled by this ess - * @return the {@link Component} - */ - public static EdgeConfig.Component essCluster(// - final ResourceBundle bundle, // - final String clusterId, // - final List essIds // - ) { - return new EdgeConfig.Component(clusterId, translate(bundle, "App.FENECON.Industrial.S.essCluster0.alias"), - "Ess.Cluster", // - JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("startStop", "AUTO") // - .add("ess.ids", essIds.stream() // - .map(JsonPrimitive::new) // - .collect(JsonUtils.toJsonArray())) // - .build()); - } - - /** - * Creates a default generic managed symmetric ess component for a FENECON - * Industrial S. - * - * @param bundle the translation bundle - * @param essId the id of the ess - * @param batteryId the id of the battery which is controlled by this - * ess - * @param batteryInverterId the id of the battery-inverter which is controlled - * by this ess - * @return the {@link Component} - */ - public static EdgeConfig.Component essGenericManagedSymmetric(// - final ResourceBundle bundle, // - final String essId, // - final String batteryId, // - final String batteryInverterId // - ) { - return essGenericManagedSymmetric(bundle, essId, null, batteryId, batteryInverterId); - } - - /** - * Creates a default generic managed symmetric ess component for a FENECON - * Industrial S. - * - * @param bundle the translation bundle - * @param essId the id of the ess - * @param alias the alias of the ess - * @param batteryId the id of the battery which is controlled by this - * ess - * @param batteryInverterId the id of the battery-inverter which is controlled - * by this ess - * @return the {@link Component} - */ - public static EdgeConfig.Component essGenericManagedSymmetric(// - final ResourceBundle bundle, // - final String essId, // - final String alias, // - final String batteryId, // - final String batteryInverterId // - ) { - final String c; - if (alias == null) { - c = translate(bundle, "App.FENECON.Industrial.S.ess0.alias"); - } else { - c = translate(bundle, "App.FENECON.Industrial.S.essN.alias", alias); - } - return new EdgeConfig.Component(essId, c, "Ess.Generic.ManagedSymmetric", // - JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("battery.id", batteryId) // - .addProperty("batteryInverter.id", batteryInverterId) // - .addProperty("startStop", "AUTO") // - .build()); - } - - /** - * Creates a default io component for a FENECON Industrial S. - * - * @param bundle the translation bundle - * @return the {@link Component} - */ - public static EdgeConfig.Component io(// - final ResourceBundle bundle // - ) { - return new EdgeConfig.Component("io0", translate(bundle, "App.FENECON.Industrial.S.io0"), "IO.Modberry", // - JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("gpioPath", "/sys/class") // - .addProperty("modberryType", "MODBERRY_X500_M40804_WB") // - .build()); - } - - /** - * Creates a default internal modbus bridge component for a FENECON Industrial - * S. - * - * @param bundle the translation bundle - * @param t the {@link ConfigurationTarget} of the current - * configuration - * @param modbusIdInternal the id of the internal modbus bridge - * @return the {@link Component} - */ - public static EdgeConfig.Component modbusInternal(// - final ResourceBundle bundle, // - final ConfigurationTarget t, // - final String modbusIdInternal // - ) { - return new EdgeConfig.Component(modbusIdInternal, translate(bundle, "App.IntegratedSystem.modbus0N.alias"), - "Bridge.Modbus.Serial", // - JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("baudRate", 9600) // - .addProperty("databits", 8) // - .onlyIf(t != ConfigurationTarget.VALIDATE, b -> { - b.addProperty("invalidateElementsAfterReadErrors", 3) // - .addProperty("logVerbosity", "NONE"); - }) // - .addProperty("parity", Parity.NONE) // - .addProperty("portName", "/dev/ttySC0") // - .addProperty("stopbits", "ONE") // - .build()); - } - - /** - * Creates a default modbus bridge to a battery-inverter component for a FENECON - * Industrial S. - * - * @param bundle the translation bundle - * @param t the {@link ConfigurationTarget} of the current configuration - * @param number the number of the modbus bridge to a Battery-Inverter - * @return the {@link Component} - */ - public static EdgeConfig.Component modbusToBatteryInverter(// - final ResourceBundle bundle, // - final ConfigurationTarget t, // - final int number // - ) { - return new EdgeConfig.Component("modbus" + number, - translate(bundle, "App.IntegratedSystem.modbus1N.alias", number), "Bridge.Modbus.Tcp", - JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .onlyIf(t != ConfigurationTarget.VALIDATE, b -> { - b.addProperty("invalidateElementsAfterReadErrors", 3) // - .addProperty("logVerbosity", "NONE"); - }) // - .addProperty("port", 502) // - .addProperty("ip", "172.23.22.1" + number) // - .build()); - } - - /** - * Creates a default modbus bridge to a grid-meter component for a FENECON - * Industrial S. - * - * @param bundle the translation bundle - * @param t the {@link ConfigurationTarget} of the current configuration - * @param modbusId the component id - * @return the {@link Component} - */ - public static EdgeConfig.Component modbusToGridMeter(// - final ResourceBundle bundle, // - final ConfigurationTarget t, // - final String modbusId // - ) { - return new EdgeConfig.Component(modbusId, // - TranslationUtil.getTranslation(bundle, "App.FENECON.Industrial.S.modbusToGridMeter.alias"), - "Bridge.Modbus.Serial", JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .addProperty("baudRate", 9600) // - .addProperty("databits", 8) // - .onlyIf(t != ConfigurationTarget.VALIDATE, b -> { - b.addProperty("invalidateElementsAfterReadErrors", 3) // - .addProperty("logVerbosity", "NONE"); - }) // - .addProperty("parity", Parity.NONE) // - .addProperty("portName", "/dev/ttyAMA0") // - .addProperty("stopbits", "ONE") // - .build()); - } - - /** - * Creates a default power component for a FENECON Industrial S. - * - * @return the {@link Component} - */ - public static EdgeConfig.Component power() { - return new EdgeConfig.Component("_power", "Ess.Power", "Ess.Power", // - JsonUtils.buildJsonObject() // - .addProperty("strategy", SolverStrategy.OPTIMIZE_BY_KEEPING_ALL_EQUAL) // - .build()); - } - - /** - * Creates a default system component for a FENECON Industrial S. - * - * @param t the {@link ConfigurationTarget} of the current configuration - * @param alias the alias of the component - * @param batteries the battery ids - * @return the {@link Component} - */ - public static EdgeConfig.Component system(// - final ConfigurationTarget t, // - final String alias, // - final List batteries // - ) { - return new EdgeConfig.Component("system0", alias, "System.Fenecon.Industrial.S", // - JsonUtils.buildJsonObject() // - .addProperty("enabled", true) // - .add("battery.ids", batteries.stream() // - .map(JsonPrimitive::new) // - .collect(JsonUtils.toJsonArray())) // - .addProperty("acknowledgeEmergencyStop", "io0/DigitalOutput2") // - .addProperty("emergencyStopState", "io0/DigitalInput3") // - .addProperty("ess.id", "ess0") // - .addProperty("fuseTripped", "io0/DigitalInput4") // - .addProperty("coolingUnitEnable", "io0/DigitalOutput1") // - .addProperty("coolingUnitError", "io0/DigitalInput1") // - .addProperty("coolingUnitMode", "AUTO") // - .addProperty("spdTripped", "io0/DigitalInput2") // - .onlyIf(t == ConfigurationTarget.ADD, b -> { - b.addProperty("startStop", "STOP"); - }) // - .build()); - } - - /** - * Creates a default grid-meter dependency for a FENECON Industrial S. - * - * @param bundle the translation bundle - * @param modbusIdInternal the id of the internal modbus bridge - * @param gridMeterId the grid-meter component id - * @return the {@link DependencyDeclaration} - */ - public static final DependencyDeclaration gridMeter(// - final ResourceBundle bundle, // - final String modbusIdInternal, // - final String gridMeterId // - ) { - return new DependencyDeclaration("GRID_METER", // - DependencyDeclaration.CreatePolicy.ALWAYS, // - DependencyDeclaration.UpdatePolicy.ALWAYS, // - DependencyDeclaration.DeletePolicy.IF_MINE, // - DependencyDeclaration.DependencyUpdatePolicy.ALLOW_ONLY_UNCONFIGURED_PROPERTIES, // - DependencyDeclaration.DependencyDeletePolicy.NOT_ALLOWED, // - DependencyDeclaration.AppDependencyConfig.create() // - .setAppId("App.Meter.Kdk") // - .setAlias(TranslationUtil.getTranslation(bundle, "App.Meter.gridMeter")) // - .setProperties(JsonUtils.buildJsonObject() // - .addProperty(KdkMeter.Property.TYPE.name(), MeterType.GRID) // - .addProperty(KdkMeter.Property.MODBUS_ID.name(), modbusIdInternal) // - .addProperty(KdkMeter.Property.METER_ID.name(), gridMeterId) // - .addProperty(KdkMeter.Property.MODBUS_UNIT_ID.name(), 6) // - .build()) - .build()); - } - - private FeneconIndustrialSComponents() { - } - -} diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSProps.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSProps.java deleted file mode 100644 index d3a72d505d0..00000000000 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/FeneconIndustrialSProps.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.openems.edge.app.integratedsystem.fenecon.industrial.s; - -import static io.openems.edge.app.common.props.CommonProps.defaultDef; - -import io.openems.edge.core.appmanager.AppDef; -import io.openems.edge.core.appmanager.Nameable; -import io.openems.edge.core.appmanager.OpenemsApp; -import io.openems.edge.core.appmanager.Type.Parameter.BundleProvider; -import io.openems.edge.core.appmanager.formly.Exp; -import io.openems.edge.core.appmanager.formly.JsonFormlyUtil; - -public final class FeneconIndustrialSProps { - - /** - * Creates a {@link AppDef} for selecting if the system has a grid-meter. - * - * @return the created {@link AppDef} - */ - public static final AppDef hasGridMeter() { - return AppDef.copyOfGeneric(defaultDef(), def -> def // - .setTranslatedLabel("App.FENECON.Industrial.S.hasGridMeter.label") // - .setDefaultValue(true) // - .setField(JsonFormlyUtil::buildCheckboxFromNameable) // - ); - } - - /** - * Creates a {@link AppDef} for selecting if the system has self-consumption - * optimization. - * - * @param hasGridMeter the {@link Nameable} to select if the system has a - * grid-meter; if no grid-meter is selected this field is - * hidden - * @return the created {@link AppDef} - */ - public static final AppDef hasSelfConsumptionOptimization(// - final Nameable hasGridMeter // - ) { - return AppDef.copyOfGeneric(defaultDef(), def -> def // - .setTranslatedLabel("App.FENECON.Industrial.S.hasSelfConsumptionOptimization.label") // - .setDefaultValue(true) // - .setField(JsonFormlyUtil::buildCheckboxFromNameable, (app, property, l, parameter, field) -> { - field.onlyShowIf(Exp.currentModelValue(hasGridMeter).notNull()); - }) // - ); - } - - private FeneconIndustrialSProps() { - } - -} diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk010.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk010.java deleted file mode 100644 index 2d1f558dfa0..00000000000 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk010.java +++ /dev/null @@ -1,191 +0,0 @@ -package io.openems.edge.app.integratedsystem.fenecon.industrial.s; - -import static io.openems.edge.app.common.props.CommonProps.alias; -import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryBmw; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryInverter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryf2bClusterSerial; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.cycle; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.essGenericManagedSymmetric; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.gridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.io; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusInternal; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusToBatteryInverter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusToGridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.power; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.system; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSProps.hasGridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSProps.hasSelfConsumptionOptimization; -import static java.util.List.of; - -import java.util.ArrayList; -import java.util.Map; -import java.util.function.Function; - -import org.osgi.service.cm.ConfigurationAdmin; -import org.osgi.service.component.ComponentContext; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; - -import com.google.common.collect.Lists; -import com.google.gson.JsonElement; - -import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; -import io.openems.common.function.ThrowingTriFunction; -import io.openems.common.oem.OpenemsEdgeOem; -import io.openems.common.session.Language; -import io.openems.common.session.Role; -import io.openems.edge.app.integratedsystem.fenecon.industrial.s.Isk010.Property; -import io.openems.edge.common.component.ComponentManager; -import io.openems.edge.core.appmanager.AbstractOpenemsApp; -import io.openems.edge.core.appmanager.AbstractOpenemsAppWithProps; -import io.openems.edge.core.appmanager.AppConfiguration; -import io.openems.edge.core.appmanager.AppDef; -import io.openems.edge.core.appmanager.AppDescriptor; -import io.openems.edge.core.appmanager.ComponentUtil; -import io.openems.edge.core.appmanager.ConfigurationTarget; -import io.openems.edge.core.appmanager.OpenemsApp; -import io.openems.edge.core.appmanager.OpenemsAppCardinality; -import io.openems.edge.core.appmanager.OpenemsAppCategory; -import io.openems.edge.core.appmanager.OpenemsAppPermissions; -import io.openems.edge.core.appmanager.Type; -import io.openems.edge.core.appmanager.Type.Parameter.BundleParameter; -import io.openems.edge.core.appmanager.dependency.DependencyDeclaration; -import io.openems.edge.core.appmanager.dependency.Tasks; - -@Component(name = "App.FENECON.Industrial.S.ISK010") -public class Isk010 extends AbstractOpenemsAppWithProps implements OpenemsApp { - - public enum Property implements Type { - ALIAS(alias()), // - HAS_GRID_METER(hasGridMeter()), // - HAS_SELF_CONSUMPTION_OPTIMIZATION(hasSelfConsumptionOptimization(HAS_GRID_METER)), // - ; - - private final AppDef def; - - private Property(AppDef def) { - this.def = def; - } - - @Override - public Type self() { - return this; - } - - @Override - public AppDef def() { - return this.def; - } - - @Override - public Function, BundleParameter> getParamter() { - return Parameter.functionOf(AbstractOpenemsApp::getTranslationBundle); - } - - } - - @Activate - public Isk010(// - @Reference final ComponentManager componentManager, // - final ComponentContext componentContext, // - @Reference final ConfigurationAdmin cm, // - @Reference final ComponentUtil componentUtil // - ) { - super(componentManager, componentContext, cm, componentUtil); - } - - @Override - public AppDescriptor getAppDescriptor(OpenemsEdgeOem oem) { - return AppDescriptor.create() // - .setWebsiteUrl(oem.getAppWebsiteUrl(this.getAppId())) // - .build(); - } - - @Override - public OpenemsAppCategory[] getCategories() { - return new OpenemsAppCategory[] { OpenemsAppCategory.INTEGRATED_SYSTEM }; - } - - @Override - public OpenemsAppCardinality getCardinality() { - return OpenemsAppCardinality.SINGLE_IN_CATEGORY; - } - - @Override - protected Isk010 getApp() { - return this; - } - - @Override - protected ThrowingTriFunction, Language, AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() { - return (t, p, l) -> { - final var bundle = AbstractOpenemsApp.getTranslationBundle(l); - - final var essId = "ess0"; - final var modbusIdInternal = "modbus0"; - final var modbusIdToGridMeter = "modbus2"; - final var batteryClusterId = "battery10"; - final var batteryId1 = "battery11"; - final var batteryId2 = "battery12"; - final var gridMeterId = "meter0"; - - final var components = Lists.newArrayList(// - // Core-Components - power(), cycle(), // - // Batteries - batteryf2bClusterSerial(bundle, batteryClusterId, "10", of(batteryId1, batteryId2)), // - batteryBmw(bundle, batteryId1, "11", modbusIdInternal, 1), // - batteryBmw(bundle, batteryId2, "12", modbusIdInternal, 2), // - // Battery-Inverter - batteryInverter(bundle, 1), // - // ESS - essGenericManagedSymmetric(bundle, essId, batteryClusterId, "batteryInverter1"), // - // Bridge - modbusInternal(bundle, t, modbusIdInternal), // - modbusToBatteryInverter(bundle, t, 1), // - // IO - io(bundle), // - // Misc. - system(t, "System Industrial S (ISK010)", of(batteryId1, batteryId2)) // - ); - - final var dependencies = new ArrayList(); - if (this.getBoolean(p, Property.HAS_GRID_METER)) { - components.add(modbusToGridMeter(bundle, t, modbusIdToGridMeter)); - dependencies.add(gridMeter(bundle, modbusIdToGridMeter, gridMeterId)); - if (this.getBoolean(p, Property.HAS_SELF_CONSUMPTION_OPTIMIZATION)) { - dependencies.add(selfConsumptionOptimization(t, essId, gridMeterId)); - } - } - - // TODO - // final var ips = Lists.newArrayList(// - // new InterfaceConfiguration("eth0") // - // .setDhcpRouteMetric(216), // - // new InterfaceConfiguration("eth1") // - // .setRouteGateway("172.23.22.2") // - // .setRouteMetric(512) // - // ); - - return AppConfiguration.create() // - .addTask(Tasks.component(components)) // - .addDependencies(dependencies) // - .build(); - }; - } - - @Override - public OpenemsAppPermissions getAppPermissions() { - return OpenemsAppPermissions.create() // - .setCanSee(Role.INSTALLER) // - .build(); - } - - @Override - protected Property[] propertyValues() { - return Property.values(); - } - -} diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk011.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk011.java deleted file mode 100644 index d8e2b775a50..00000000000 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk011.java +++ /dev/null @@ -1,203 +0,0 @@ -package io.openems.edge.app.integratedsystem.fenecon.industrial.s; - -import static io.openems.edge.app.common.props.CommonProps.alias; -import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryBmw; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryInverter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryf2bClusterParallel; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryf2bClusterSerial; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.cycle; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.essGenericManagedSymmetric; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.gridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.io; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusInternal; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusToBatteryInverter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusToGridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.power; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.system; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSProps.hasGridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSProps.hasSelfConsumptionOptimization; -import static java.util.List.of; - -import java.util.ArrayList; -import java.util.Map; -import java.util.function.Function; - -import org.osgi.service.cm.ConfigurationAdmin; -import org.osgi.service.component.ComponentContext; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; - -import com.google.common.collect.Lists; -import com.google.gson.JsonElement; - -import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; -import io.openems.common.function.ThrowingTriFunction; -import io.openems.common.oem.OpenemsEdgeOem; -import io.openems.common.session.Language; -import io.openems.common.session.Role; -import io.openems.edge.app.integratedsystem.fenecon.industrial.s.Isk011.Property; -import io.openems.edge.common.component.ComponentManager; -import io.openems.edge.core.appmanager.AbstractOpenemsApp; -import io.openems.edge.core.appmanager.AbstractOpenemsAppWithProps; -import io.openems.edge.core.appmanager.AppConfiguration; -import io.openems.edge.core.appmanager.AppDef; -import io.openems.edge.core.appmanager.AppDescriptor; -import io.openems.edge.core.appmanager.ComponentUtil; -import io.openems.edge.core.appmanager.ConfigurationTarget; -import io.openems.edge.core.appmanager.OpenemsApp; -import io.openems.edge.core.appmanager.OpenemsAppCardinality; -import io.openems.edge.core.appmanager.OpenemsAppCategory; -import io.openems.edge.core.appmanager.OpenemsAppPermissions; -import io.openems.edge.core.appmanager.Type; -import io.openems.edge.core.appmanager.Type.Parameter.BundleParameter; -import io.openems.edge.core.appmanager.dependency.DependencyDeclaration; -import io.openems.edge.core.appmanager.dependency.Tasks; - -@Component(name = "App.FENECON.Industrial.S.ISK011") -public class Isk011 extends AbstractOpenemsAppWithProps implements OpenemsApp { - - public enum Property implements Type { - ALIAS(alias()), // - HAS_GRID_METER(hasGridMeter()), // - HAS_SELF_CONSUMPTION_OPTIMIZATION(hasSelfConsumptionOptimization(HAS_GRID_METER)), // - ; - - private final AppDef def; - - private Property(AppDef def) { - this.def = def; - } - - @Override - public Type self() { - return this; - } - - @Override - public AppDef def() { - return this.def; - } - - @Override - public Function, BundleParameter> getParamter() { - return Parameter.functionOf(AbstractOpenemsApp::getTranslationBundle); - } - - } - - @Activate - public Isk011(// - @Reference final ComponentManager componentManager, // - final ComponentContext componentContext, // - @Reference final ConfigurationAdmin cm, // - @Reference final ComponentUtil componentUtil // - ) { - super(componentManager, componentContext, cm, componentUtil); - } - - @Override - public AppDescriptor getAppDescriptor(OpenemsEdgeOem oem) { - return AppDescriptor.create() // - .setWebsiteUrl(oem.getAppWebsiteUrl(this.getAppId())) // - .build(); - } - - @Override - public OpenemsAppCategory[] getCategories() { - return new OpenemsAppCategory[] { OpenemsAppCategory.INTEGRATED_SYSTEM }; - } - - @Override - public OpenemsAppCardinality getCardinality() { - return OpenemsAppCardinality.SINGLE_IN_CATEGORY; - } - - @Override - protected Isk011 getApp() { - return this; - } - - @Override - protected ThrowingTriFunction, Language, AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() { - return (t, p, l) -> { - final var bundle = AbstractOpenemsApp.getTranslationBundle(l); - - final var essId = "ess0"; - final var modbusIdInternal = "modbus0"; - final var modbusIdToGridMeter = "modbus2"; - final var batteryInverterId = "batteryInverter1"; - final var batteryParallelId = "battery1"; - final var batterySeriallId1 = "battery10"; - final var batterySeriallId2 = "battery20"; - - final var battery11Id = "battery11"; - final var battery12Id = "battery12"; - final var battery21Id = "battery21"; - final var battery22Id = "battery22"; - - final var gridMeterId = "meter0"; - - final var components = Lists.newArrayList(// - // Core-Components - power(), cycle(), // - // Batteries - batteryf2bClusterParallel(bundle, batteryParallelId, "1", of(batterySeriallId1, batterySeriallId2)), // - batteryf2bClusterSerial(bundle, batterySeriallId1, "10", of(battery11Id, battery12Id)), // - batteryBmw(bundle, battery11Id, "11", modbusIdInternal, 1), // - batteryBmw(bundle, battery12Id, "12", modbusIdInternal, 2), // - batteryf2bClusterSerial(bundle, batterySeriallId2, "20", of(battery21Id, battery22Id)), // - batteryBmw(bundle, battery21Id, "21", modbusIdInternal, 3), // - batteryBmw(bundle, battery22Id, "22", modbusIdInternal, 4), // - // Battery-Inverter - batteryInverter(bundle, 1), // - // ESS - essGenericManagedSymmetric(bundle, essId, batteryParallelId, batteryInverterId), // - // Bridge - modbusInternal(bundle, t, modbusIdInternal), // - modbusToBatteryInverter(bundle, t, 1), // - // IO - io(bundle), // - // Misc. - system(t, "System Industrial S (ISK011)", of(battery11Id, battery12Id, battery21Id, battery22Id)) // - ); - - final var dependencies = new ArrayList(); - if (this.getBoolean(p, Property.HAS_GRID_METER)) { - components.add(modbusToGridMeter(bundle, t, modbusIdToGridMeter)); - dependencies.add(gridMeter(bundle, modbusIdToGridMeter, gridMeterId)); - if (this.getBoolean(p, Property.HAS_SELF_CONSUMPTION_OPTIMIZATION)) { - dependencies.add(selfConsumptionOptimization(t, essId, gridMeterId)); - } - } - - // TODO - // final var ips = Lists.newArrayList(// - // new InterfaceConfiguration("eth0") // - // .setDhcpRouteMetric(216), // - // new InterfaceConfiguration("eth1") // - // .setRouteGateway("172.23.22.2") // - // .setRouteMetric(512) // - // ); - - return AppConfiguration.create() // - .addTask(Tasks.component(components)) // - .addDependencies(dependencies) // - .build(); - }; - } - - @Override - public OpenemsAppPermissions getAppPermissions() { - return OpenemsAppPermissions.create() // - .setCanSee(Role.INSTALLER) // - .build(); - } - - @Override - protected Property[] propertyValues() { - return Property.values(); - } - -} diff --git a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk110.java b/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk110.java deleted file mode 100644 index 70d44c5e263..00000000000 --- a/io.openems.edge.core/src/io/openems/edge/app/integratedsystem/fenecon/industrial/s/Isk110.java +++ /dev/null @@ -1,209 +0,0 @@ -package io.openems.edge.app.integratedsystem.fenecon.industrial.s; - -import static io.openems.edge.app.common.props.CommonProps.alias; -import static io.openems.edge.app.integratedsystem.FeneconHomeComponents.selfConsumptionOptimization; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryBmw; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryInverter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.batteryf2bClusterSerial; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.cycle; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.essCluster; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.essGenericManagedSymmetric; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.gridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.io; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusInternal; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusToBatteryInverter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.modbusToGridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.power; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSComponents.system; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSProps.hasGridMeter; -import static io.openems.edge.app.integratedsystem.fenecon.industrial.s.FeneconIndustrialSProps.hasSelfConsumptionOptimization; -import static java.util.List.of; - -import java.util.ArrayList; -import java.util.Map; -import java.util.function.Function; - -import org.osgi.service.cm.ConfigurationAdmin; -import org.osgi.service.component.ComponentContext; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; - -import com.google.common.collect.Lists; -import com.google.gson.JsonElement; - -import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; -import io.openems.common.function.ThrowingTriFunction; -import io.openems.common.oem.OpenemsEdgeOem; -import io.openems.common.session.Language; -import io.openems.common.session.Role; -import io.openems.edge.app.integratedsystem.fenecon.industrial.s.Isk110.Property; -import io.openems.edge.common.component.ComponentManager; -import io.openems.edge.core.appmanager.AbstractOpenemsApp; -import io.openems.edge.core.appmanager.AbstractOpenemsAppWithProps; -import io.openems.edge.core.appmanager.AppConfiguration; -import io.openems.edge.core.appmanager.AppDef; -import io.openems.edge.core.appmanager.AppDescriptor; -import io.openems.edge.core.appmanager.ComponentUtil; -import io.openems.edge.core.appmanager.ConfigurationTarget; -import io.openems.edge.core.appmanager.OpenemsApp; -import io.openems.edge.core.appmanager.OpenemsAppCardinality; -import io.openems.edge.core.appmanager.OpenemsAppCategory; -import io.openems.edge.core.appmanager.OpenemsAppPermissions; -import io.openems.edge.core.appmanager.Type; -import io.openems.edge.core.appmanager.Type.Parameter.BundleParameter; -import io.openems.edge.core.appmanager.dependency.DependencyDeclaration; -import io.openems.edge.core.appmanager.dependency.Tasks; - -@Component(name = "App.FENECON.Industrial.S.ISK110") -public class Isk110 extends AbstractOpenemsAppWithProps implements OpenemsApp { - - public enum Property implements Type { - ALIAS(alias()), // - HAS_GRID_METER(hasGridMeter()), // - HAS_SELF_CONSUMPTION_OPTIMIZATION(hasSelfConsumptionOptimization(HAS_GRID_METER)), // - ; - - private final AppDef def; - - private Property(AppDef def) { - this.def = def; - } - - @Override - public Type self() { - return this; - } - - @Override - public AppDef def() { - return this.def; - } - - @Override - public Function, BundleParameter> getParamter() { - return Parameter.functionOf(AbstractOpenemsApp::getTranslationBundle); - } - - } - - @Activate - public Isk110(// - @Reference final ComponentManager componentManager, // - final ComponentContext componentContext, // - @Reference final ConfigurationAdmin cm, // - @Reference final ComponentUtil componentUtil // - ) { - super(componentManager, componentContext, cm, componentUtil); - } - - @Override - public AppDescriptor getAppDescriptor(OpenemsEdgeOem oem) { - return AppDescriptor.create() // - .setWebsiteUrl(oem.getAppWebsiteUrl(this.getAppId())) // - .build(); - } - - @Override - public OpenemsAppCategory[] getCategories() { - return new OpenemsAppCategory[] { OpenemsAppCategory.INTEGRATED_SYSTEM }; - } - - @Override - public OpenemsAppCardinality getCardinality() { - return OpenemsAppCardinality.SINGLE_IN_CATEGORY; - } - - @Override - protected Isk110 getApp() { - return this; - } - - @Override - protected ThrowingTriFunction, Language, AppConfiguration, OpenemsNamedException> appPropertyConfigurationFactory() { - return (t, p, l) -> { - final var bundle = AbstractOpenemsApp.getTranslationBundle(l); - - final var modbusIdInternal = "modbus0"; - final var modbusIdToGridMeter = "modbus3"; - final var batteryInverter1Id = "batteryInverter1"; - final var batteryInverter2Id = "batteryInverter2"; - final var batterySeriallId1 = "battery10"; - final var batterySeriallId2 = "battery20"; - - final var battery11Id = "battery11"; - final var battery12Id = "battery12"; - final var battery21Id = "battery21"; - final var battery22Id = "battery22"; - - final var essId = "ess0"; - final var ess1Id = "ess1"; - final var ess2Id = "ess2"; - - final var gridMeterId = "meter0"; - - final var components = Lists.newArrayList(// - // Core-Components - power(), cycle(), // - // Batteries - batteryf2bClusterSerial(bundle, batterySeriallId1, "10", of(battery11Id, battery12Id)), // - batteryBmw(bundle, battery11Id, "11", modbusIdInternal, 1), // - batteryBmw(bundle, battery12Id, "12", modbusIdInternal, 2), // - batteryf2bClusterSerial(bundle, batterySeriallId2, "20", of(battery21Id, battery22Id)), // - batteryBmw(bundle, battery21Id, "21", modbusIdInternal, 3), // - batteryBmw(bundle, battery22Id, "22", modbusIdInternal, 4), // - // Battery-Inverter - batteryInverter(bundle, 1), // - batteryInverter(bundle, 2), // - // ESS - essCluster(bundle, essId, of(ess1Id, ess2Id)), // - essGenericManagedSymmetric(bundle, ess1Id, "1", batterySeriallId1, batteryInverter1Id), // - essGenericManagedSymmetric(bundle, ess2Id, "2", batterySeriallId2, batteryInverter2Id), // - // Bridge - modbusInternal(bundle, t, modbusIdInternal), // - modbusToBatteryInverter(bundle, t, 1), // - modbusToBatteryInverter(bundle, t, 2), // - // IO - io(bundle), // - // Misc. - system(t, "System Industrial S (ISK110)", of(battery11Id, battery12Id, battery21Id, battery22Id)) // - ); - - final var dependencies = new ArrayList(); - if (this.getBoolean(p, Property.HAS_GRID_METER)) { - components.add(modbusToGridMeter(bundle, t, modbusIdToGridMeter)); - dependencies.add(gridMeter(bundle, modbusIdToGridMeter, gridMeterId)); - if (this.getBoolean(p, Property.HAS_SELF_CONSUMPTION_OPTIMIZATION)) { - dependencies.add(selfConsumptionOptimization(t, essId, gridMeterId)); - } - } - - // TODO - // final var ips = Lists.newArrayList(// - // new InterfaceConfiguration("eth0") // - // .setDhcpRouteMetric(216), // - // new InterfaceConfiguration("eth1") // - // .setRouteGateway("172.23.22.2") // - // .setRouteMetric(512) // - // ); - - return AppConfiguration.create() // - .addTask(Tasks.component(components)) // - .addDependencies(dependencies) // - .build(); - }; - } - - @Override - public OpenemsAppPermissions getAppPermissions() { - return OpenemsAppPermissions.create() // - .setCanSee(Role.INSTALLER) // - .build(); - } - - @Override - protected Property[] propertyValues() { - return Property.values(); - } - -} diff --git a/io.openems.edge.core/src/io/openems/edge/app/pvinverter/KacoPvInverter.java b/io.openems.edge.core/src/io/openems/edge/app/pvinverter/KacoPvInverter.java index 0d2d8418f3e..e977e1c0e3e 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/pvinverter/KacoPvInverter.java +++ b/io.openems.edge.core/src/io/openems/edge/app/pvinverter/KacoPvInverter.java @@ -69,6 +69,8 @@ public static enum Property implements Type def // + .setDefaultValue(1))), // ; private final AppDef def; @@ -108,11 +110,13 @@ protected ThrowingTriFunction, L final var alias = this.getString(p, l, Property.ALIAS); final var ip = this.getString(p, Property.IP); final var port = this.getInt(p, Property.PORT); + final var modbusUnitId = this.getInt(p, Property.MODBUS_UNIT_ID); final var components = List.of(// new EdgeConfig.Component(pvInverterId, alias, "PV-Inverter.KACO.blueplanet", // JsonUtils.buildJsonObject() // .addProperty("modbus.id", modbusId) // + .addProperty("modbusUnitId", modbusUnitId) // .build()), // new EdgeConfig.Component(modbusId, alias, "Bridge.Modbus.Tcp", JsonUtils.buildJsonObject() // .addProperty("ip", ip) // diff --git a/io.openems.edge.core/src/io/openems/edge/app/timeofusetariff/Tibber.java b/io.openems.edge.core/src/io/openems/edge/app/timeofusetariff/Tibber.java index 34096b0ea79..bd3f77d65ec 100644 --- a/io.openems.edge.core/src/io/openems/edge/app/timeofusetariff/Tibber.java +++ b/io.openems.edge.core/src/io/openems/edge/app/timeofusetariff/Tibber.java @@ -14,9 +14,9 @@ import com.google.common.collect.Lists; import com.google.gson.JsonElement; import com.google.gson.JsonNull; +import com.google.gson.JsonPrimitive; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; -import io.openems.common.exceptions.OpenemsException; import io.openems.common.function.ThrowingTriFunction; import io.openems.common.oem.OpenemsEdgeOem; import io.openems.common.session.Language; @@ -40,6 +40,7 @@ import io.openems.edge.core.appmanager.Type; import io.openems.edge.core.appmanager.dependency.Tasks; import io.openems.edge.core.appmanager.dependency.aggregatetask.SchedulerByCentralOrderConfiguration.SchedulerComponent; +import io.openems.edge.core.appmanager.formly.Exp; import io.openems.edge.core.appmanager.formly.JsonFormlyUtil; import io.openems.edge.core.appmanager.validator.ValidatorConfig; @@ -75,21 +76,38 @@ public static enum Property implements Type def// .setTranslatedLabelWithAppPrefix(".accessToken.label") // .setTranslatedDescriptionWithAppPrefix(".accessToken.description") // .setRequired(true) // .setField(JsonFormlyUtil::buildInput, (app, prop, l, params, field) -> { field.setInputType(PASSWORD); }) // - .setAllowedToSave(false)), // - FILTER(AppDef.of(Tibber.class) // + .bidirectional(TIME_OF_USE_TARIFF_PROVIDER_ID, "accessToken", + ComponentManagerSupplier::getComponentManager, t -> { + return JsonUtils.getAsOptionalString(t) // + .map(s -> { + if (s.isEmpty()) { + return null; + } + return new JsonPrimitive("xxx"); + }) // + .orElse(null); + }))), // + MULTIPLE_HOMES_CHECK(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def// + .setTranslatedLabelWithAppPrefix(".multipleHomesCheck.label") // + .setDefaultValue(false) // + .setField(JsonFormlyUtil::buildCheckboxFromNameable))), + FILTER(AppDef.copyOfGeneric(CommonProps.defaultDef(), def -> def// .setTranslatedLabelWithAppPrefix(".filterForHome.label") // .setTranslatedDescriptionWithAppPrefix(".filterForHome.description") // .setDefaultValue((app, property, l, parameter) -> JsonNull.INSTANCE) - .setField(JsonFormlyUtil::buildInputFromNameable) // + .setField(JsonFormlyUtil::buildInputFromNameable, (app, property, l, parameter, field) -> { + field.onlyShowIf(Exp.currentModelValue(MULTIPLE_HOMES_CHECK).notNull() + .or(Exp.currentModelValue(property).notNull())); + }) // .bidirectional(TIME_OF_USE_TARIFF_PROVIDER_ID, "filter", - ComponentManagerSupplier::getComponentManager)); + ComponentManagerSupplier::getComponentManager))); private final AppDef def; @@ -130,18 +148,16 @@ protected ThrowingTriFunction, L final var accessToken = this.getValueOrDefault(p, Property.ACCESS_TOKEN, null); final var filter = this.getValueOrDefault(p, Property.FILTER, null); - if (t == ConfigurationTarget.ADD && (accessToken == null || accessToken.isBlank())) { - throw new OpenemsException("Access Token is required!"); - } - - var components = Lists.newArrayList(// + final var components = Lists.newArrayList(// new EdgeConfig.Component(ctrlEssTimeOfUseTariffId, alias, "Controller.Ess.Time-Of-Use-Tariff", JsonUtils.buildJsonObject() // .addProperty("ess.id", "ess0") // .build()), // new EdgeConfig.Component(timeOfUseTariffProviderId, this.getName(l), "TimeOfUseTariff.Tibber", JsonUtils.buildJsonObject() // - .addPropertyIfNotNull("accessToken", accessToken) // + .onlyIf(accessToken != null && !accessToken.equals("xxx"), b -> { + b.addProperty("accessToken", accessToken); + }) // .addPropertyIfNotNull("filter", filter) // .build())// ); diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/AppDef.java b/io.openems.edge.core/src/io/openems/edge/core/appmanager/AppDef.java index 0474c35d82a..806e0c79a63 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/AppDef.java +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/AppDef.java @@ -1,5 +1,7 @@ package io.openems.edge.core.appmanager; +import static io.openems.common.utils.FunctionUtils.supplier; + import java.util.Arrays; import java.util.Objects; import java.util.Optional; @@ -11,11 +13,14 @@ import org.slf4j.LoggerFactory; import com.google.gson.JsonElement; +import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.session.Language; import io.openems.common.session.Role; +import io.openems.common.utils.JsonUtils; import io.openems.edge.common.component.ComponentManager; import io.openems.edge.common.user.User; import io.openems.edge.core.appmanager.Type.Parameter; @@ -1003,11 +1008,23 @@ public AppDef bidirectional(// return null; } final var componentManager = componentManagerFunction.apply(app); - final var optionalComponent = componentManager.getEdgeConfig() // - .getComponent(componentId.getAsString()); - return optionalComponent.map(component -> { - return component.getProperty(property).orElse(null); - }).map(mapper).orElseGet(() -> this.getDefaultValue().get(app, prop, l, param)); + final var defaultValueSupplier = supplier(() -> { + final var a = this.getDefaultValue(); + if (a != null) { + return a.get(app, prop, l, param); + } + return JsonNull.INSTANCE; + }); + + try { + final var component = componentManager.getComponent(componentId.getAsString()); + return Optional.ofNullable(component.getComponentContext().getProperties().get(property)) // + .map(JsonUtils::getAsJsonElement) // + .map(mapper) // + .orElseGet(defaultValueSupplier); + } catch (OpenemsNamedException e) { + return defaultValueSupplier.get(); + } }; // set allowedToSave automatically to false this.isAllowedToSave = false; diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/OpenemsAppPermissions.java b/io.openems.edge.core/src/io/openems/edge/core/appmanager/OpenemsAppPermissions.java index cddb33776d2..179b69bbfa8 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/OpenemsAppPermissions.java +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/OpenemsAppPermissions.java @@ -2,12 +2,22 @@ import io.openems.common.session.Role; -public class OpenemsAppPermissions { - - public final Role canSee; +public record OpenemsAppPermissions(// + /** + * Defines if an app can be seen by an user with a role greater or equal this + * role. + */ + Role canSee, // + /** + * Defines if an app can be deleted by an user with a role greater or equal this + * role. + */ + Role canDelete // +) { public static final class Builder { private Role canSee = Role.OWNER; + private Role canDelete = Role.OWNER; private Builder() { super(); @@ -18,9 +28,15 @@ public Builder setCanSee(Role canSee) { return this; } + public Builder setCanDelete(Role canDelete) { + this.canDelete = canDelete; + return this; + } + public OpenemsAppPermissions build() { return new OpenemsAppPermissions(// - this.canSee // + this.canSee, // + this.canDelete // ); } @@ -35,9 +51,4 @@ public static final Builder create() { return new Builder(); } - private OpenemsAppPermissions(Role canSee) { - super(); - this.canSee = canSee; - } - } diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/AppManagerAppHelperImpl.java b/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/AppManagerAppHelperImpl.java index 477c0180b7d..b6b13ef0916 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/AppManagerAppHelperImpl.java +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/AppManagerAppHelperImpl.java @@ -777,10 +777,17 @@ public String toString() { } private UpdateValues deleteAppInternal(User user, OpenemsAppInstance instance) throws OpenemsNamedException { - final var language = user == null ? null : user.getLanguage(); final var bundle = getTranslationBundle(language); + final var app = this.appManagerUtil.findAppById(instance.appId).orElse(null); + if (app != null && user != null) { + final var permissions = app.getAppPermissions(); + if (user.getRole().isLessThan(permissions.canDelete())) { + throw new OpenemsException("Access denied for User with Role '" + user.getRole().name() + "'"); + } + } + BiFunction includeInstance = (p, i) -> { if (p != null) { // check if the parent should delete it diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/aggregatetask/SchedulerByCentralOrderAggregateTaskImpl.java b/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/aggregatetask/SchedulerByCentralOrderAggregateTaskImpl.java index 05c4bfabdb2..639fad889a4 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/aggregatetask/SchedulerByCentralOrderAggregateTaskImpl.java +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/dependency/aggregatetask/SchedulerByCentralOrderAggregateTaskImpl.java @@ -60,6 +60,7 @@ public static final class ProductionSchedulerOrderDefinition extends SchedulerOr public ProductionSchedulerOrderDefinition() { this.thenByFactoryId("Controller.Ess.PrepareBatteryExtension") // .thenByFactoryId("Controller.Ess.FixActivePower") // + .thenByFactoryId("Controller.Ess.FixStateOfCharge")// .thenByFactoryId("Controller.Ess.EmergencyCapacityReserve") // .thenBy(new SchedulerOrderDefinition() // .filterByFactoryId("Controller.Api.ModbusTcp.ReadWrite") // diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/JsonFormlyUtil.java b/io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/JsonFormlyUtil.java index 6f5398e62b9..9b6dac90949 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/JsonFormlyUtil.java +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/JsonFormlyUtil.java @@ -4,6 +4,7 @@ import io.openems.edge.core.appmanager.Nameable; import io.openems.edge.core.appmanager.formly.builder.CheckboxBuilder; +import io.openems.edge.core.appmanager.formly.builder.DateTimeBuilder; import io.openems.edge.core.appmanager.formly.builder.FieldGroupBuilder; import io.openems.edge.core.appmanager.formly.builder.InputBuilder; import io.openems.edge.core.appmanager.formly.builder.RangeBuilder; @@ -145,7 +146,17 @@ public static > RangeBuilder buildRange(T property) { public static RangeBuilder buildRangeFromNameable(Nameable nameable) { return new RangeBuilder(nameable); } - + + /** + * Creates a JsonObject Formly DateTime Builder for the given enum. + * + * @param nameable the {@link Nameable} property + * @return a {@link DateTimeBuilder} + */ + public static DateTimeBuilder buildDateTimeFromNameable(Nameable nameable) { + return new DateTimeBuilder(nameable); + } + /** * Creates a JsonObject Formly Repeat Builder for the given enum. * diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/builder/DateTimeBuilder.java b/io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/builder/DateTimeBuilder.java new file mode 100644 index 00000000000..e1406bd908e --- /dev/null +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/formly/builder/DateTimeBuilder.java @@ -0,0 +1,45 @@ +package io.openems.edge.core.appmanager.formly.builder; + +import com.google.gson.JsonObject; + +import io.openems.edge.core.appmanager.Nameable; + +/** + * A Builder for a Formly DateTime Picker. + * + *
+ * {
+ * 	"key": "key",
+ * 	"type": "datetime",
+ * 	"templateOptions": {
+ * 		"label": "label",
+ * 		"required": true
+ * 	},
+ * 	"expressionProperties": {
+ * 		"templateOptions.required": "model.PROPERTY"
+ * 	},
+ * 	"hideExpression": "!model.PROPERTY",
+ * 	"defaultValue": "defaultValue"
+ * }
+ * 
+ * + */ +public final class DateTimeBuilder extends FormlyBuilder { + + public DateTimeBuilder(Nameable property) { + super(property); + } + + @Override + public JsonObject build() { + final var result = super.build(); + this.templateOptions.addProperty("presentation", "date-time"); + return result; + } + + @Override + protected String getType() { + return "datetime"; + } + +} \ No newline at end of file diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/jsonrpc/GetApps.java b/io.openems.edge.core/src/io/openems/edge/core/appmanager/jsonrpc/GetApps.java index 70a2ddf8090..e5ee12319e4 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/jsonrpc/GetApps.java +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/jsonrpc/GetApps.java @@ -100,7 +100,7 @@ private static JsonArray createAppsArray(List availableApps, return availableApps.stream() // .filter(app -> { final var permissions = app.getAppPermissions(); - if (!userRole.isAtLeast(permissions.canSee)) { + if (!userRole.isAtLeast(permissions.canSee())) { return false; } return true; diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_de.properties b/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_de.properties index 4781fdc8dc7..43f56722dfc 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_de.properties +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_de.properties @@ -357,6 +357,7 @@ App.TimeOfUseTariff.Tibber.accessToken.label = Token App.TimeOfUseTariff.Tibber.accessToken.description = Für die Verknüpfung mit ihrem Tibber-Account benötigen Sie einen persönlichen Access-Token. Diesen können Sie unter "developer.tibber.com/settings/access-token" erstellen. App.TimeOfUseTariff.Tibber.filterForHome.label = Filter für Home App.TimeOfUseTariff.Tibber.filterForHome.description = Bei mehreren 'Homes', entweder ID (Format UUID) oder 'appNickname' für eindeutige indentifizierung eintragen +App.TimeOfUseTariff.Tibber.multipleHomesCheck.label = Haben Sie mehr als einen Vertrag mit Ihrem Tibber-Zugang verbunden? # PvSelfConsumption App.PvSelfConsumption.GridOptimizedCharge.Name = Netzdienliche Beladung @@ -384,3 +385,14 @@ App.Ess.PowerPlantController.Name.short = EZA-Regler App.Ess.FixActivePower.Name = Manuelle Be-/Entladung App.Ess.FixActivePower.Name.short = Manuelle Be-/Entladung + +App.Ess.FixStateOfCharge.Name = Ladezustand festlegen +App.Ess.FixStateOfCharge.Name.short = Ladezustand festlegen +App.Ess.FixStateOfCharge.targetSpecifiedTime.label = Zielzeit angegeben +App.Ess.FixStateOfCharge.targetSoc.label = Ziel-SoC +App.Ess.FixStateOfCharge.targetTime.label = Zielzeit +App.Ess.FixStateOfCharge.targetTimeBuffer.label = Zielzeitpuffer +App.Ess.FixStateOfCharge.selfTermination.label = Beendet sich selbst am Ende +App.Ess.FixStateOfCharge.terminationBuffer.label = Zeitpuffer zum Beenden +App.Ess.FixStateOfCharge.conditionalTermination.label = Beendet sich selbst nach separater Bedingung +App.Ess.FixStateOfCharge.isRunning.label = Kontroller aktiv? \ No newline at end of file diff --git a/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_en.properties b/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_en.properties index 1b440f43fe9..53bbdfccfc7 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_en.properties +++ b/io.openems.edge.core/src/io/openems/edge/core/appmanager/translation_en.properties @@ -356,6 +356,7 @@ App.TimeOfUseTariff.Tibber.accessToken.label = Token App.TimeOfUseTariff.Tibber.accessToken.description = To link to your Tibber account you need a personal access token. You can create this under "developer.tibber.com/settings/access-token". App.TimeOfUseTariff.Tibber.filterForHome.label = Filter for Home App.TimeOfUseTariff.Tibber.filterForHome.description = For multiple 'Homes', add either an ID (format UUID) or 'appNickname' for unambiguous identification +App.TimeOfUseTariff.Tibber.multipleHomesCheck.label = Do you have more than one contract connected toyour Tibber account? # PvSelfConsumption App.PvSelfConsumption.GridOptimizedCharge.Name = Grid-optimized charge @@ -383,3 +384,14 @@ App.Ess.PowerPlantController.Name.short = PPC App.Ess.FixActivePower.Name = Manual Charge/Discharge App.Ess.FixActivePower.Name.short = Manual Charge/Discharge + +App.Ess.FixStateOfCharge.Name = Fix State of Charge +App.Ess.FixStateOfCharge.Name.short = Fix State of Charge +App.Ess.FixStateOfCharge.targetSpecifiedTime.label = Target time specified +App.Ess.FixStateOfCharge.targetSoc.label = Target SoC +App.Ess.FixStateOfCharge.targetTime.label = Target time [YYYY-MM-DDTHH:mm:ssTZD eg. 2023-12-15T13:47:20+01:00] +App.Ess.FixStateOfCharge.targetTimeBuffer.label = Target time buffer +App.Ess.FixStateOfCharge.selfTermination.label = Terminates itself at the end +App.Ess.FixStateOfCharge.terminationBuffer.label = Terminate time buffer in min +App.Ess.FixStateOfCharge.conditionalTermination.label = Terminates itself after separate conditon +App.Ess.FixStateOfCharge.isRunning.label = Controller active? diff --git a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/EdgeConfigWorker.java b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/EdgeConfigWorker.java index 4c443a50fc5..23dbf32ea80 100644 --- a/io.openems.edge.core/src/io/openems/edge/core/componentmanager/EdgeConfigWorker.java +++ b/io.openems.edge.core/src/io/openems/edge/core/componentmanager/EdgeConfigWorker.java @@ -210,16 +210,16 @@ private TreeMap getChannels(OpenemsCompone for (OptionsEnum option : d.getOptions()) { values.put(option.getName(), new JsonPrimitive(option.getValue())); } - detail = new EdgeConfig.Component.Channel.ChannelDetailEnum(values); + detail = new EdgeConfig.Component.Channel.ChannelDetailEnum(values, doc.getPersistencePriority()); break; } case OPENEMS_TYPE: - detail = new ChannelDetailOpenemsType(); + detail = new ChannelDetailOpenemsType(doc.getPersistencePriority()); break; case STATE: var d = (StateChannelDoc) doc; var level = d.getLevel(); - detail = new ChannelDetailState(level); + detail = new ChannelDetailState(level, doc.getPersistencePriority()); break; } result.put(channelId.id(), new EdgeConfig.Component.Channel(// @@ -322,7 +322,7 @@ private boolean readConfigurations(EdgeConfig.ActualEdgeConfig.Builder builder, var factory = builder.getFactories().get(factoryPid); // Read all Properties - var propertyMap = convertProperties(properties, factory); + var propertyMap = convertProperties(componentId, properties, factory); // Read all Channels var channels = this.getChannels(componentId); @@ -371,6 +371,7 @@ private void readComponent(EdgeConfig.ActualEdgeConfig.Builder builder, OpenemsC // get configuration properties var properties = convertProperties(// + componentId, // component.getComponentContext().getProperties(), // builder.getFactories().get(factoryPid)); @@ -577,13 +578,14 @@ private static JsonElement getPropertyAsJsonElement(Dictionary p /** * Convert properties to a String/JsonElement Map. - * - * @param properties the component properties - * @param factory the {@link EdgeConfig.Factory} + * + * @param componentId the Component-ID + * @param properties the component properties + * @param factory the {@link EdgeConfig.Factory} * @return converted properties */ - private static TreeMap convertProperties(Dictionary properties, - EdgeConfig.Factory factory) { + private static TreeMap convertProperties(String componentId, + Dictionary properties, EdgeConfig.Factory factory) { var result = new TreeMap(); /* @@ -593,7 +595,7 @@ private static TreeMap convertProperties(Dictionary { - return Apps.of(t, // - Apps::feneconIsk110, // - Apps::feneconIsk010, // - Apps::feneconIsk011 // - ); - }); - } - - @Test - public void testCreateIndustrial110FullSettings() throws Exception { - this.createFullIndustrial("App.FENECON.Industrial.S.ISK110"); - } - - @Test - public void testCreateIndustrial010FullSettings() throws Exception { - this.createFullIndustrial("App.FENECON.Industrial.S.ISK010"); - } - - @Test - public void testCreateIndustrial011FullSettings() throws Exception { - this.createFullIndustrial("App.FENECON.Industrial.S.ISK011"); - } - - private final OpenemsAppInstance createFullIndustrial(final String appId) throws Exception { - var fullConfig = fullSettings(); - - this.appManagerTestBundle.sut.handleAddAppInstanceRequest(DUMMY_ADMIN, - new AddAppInstance.Request(appId, "key", "alias", fullConfig)); - - // make sure every dependency got installed - assertEquals(this.appManagerTestBundle.sut.getInstantiatedApps().size(), 1); - - // check properties of created apps - for (var instance : this.appManagerTestBundle.sut.getInstantiatedApps()) { - final var expectedDependencies = switch (instance.appId) { - default -> { - if (instance.appId.equals(appId)) { - yield 0; - } - throw new Exception("App with ID[" + instance.appId + "] should not have been created!"); - } - }; - if (expectedDependencies == 0 && instance.dependencies == null) { - continue; - } - assertEquals(expectedDependencies, instance.dependencies.size()); - } - - final var industrialApp = this.appManagerTestBundle.sut.getInstantiatedApps().stream() - .filter(t -> t.appId.equals(appId)).findAny().orElse(null); - - assertNotNull(industrialApp); - - return industrialApp; - } - - /** - * Gets a {@link JsonObject} with the full settings for a {@link Isk110}. - * - * @return the settings object - */ - public static final JsonObject fullSettings() { - return JsonUtils.buildJsonObject() // - .build(); - } - -} diff --git a/io.openems.edge.core/test/io/openems/edge/app/timeofusetariff/TestTibber.java b/io.openems.edge.core/test/io/openems/edge/app/timeofusetariff/TestTibber.java index a3e129b463c..63d398608c1 100644 --- a/io.openems.edge.core/test/io/openems/edge/app/timeofusetariff/TestTibber.java +++ b/io.openems.edge.core/test/io/openems/edge/app/timeofusetariff/TestTibber.java @@ -2,10 +2,12 @@ import static io.openems.edge.common.test.DummyUser.DUMMY_ADMIN; import static java.util.stream.Collectors.toSet; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.Set; @@ -17,6 +19,7 @@ import com.google.common.collect.ImmutableList; import com.google.gson.JsonElement; +import com.google.gson.JsonNull; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.jsonrpc.request.CreateComponentConfigRequest; @@ -57,7 +60,14 @@ public void testRemoveAccessToken() throws Exception { var response = this.appManagerTestBundle.sut.handleAddAppInstanceRequest(DUMMY_ADMIN, new AddAppInstance.Request(this.tibber.getAppId(), "key", "alias", properties)).get(); - assertFalse(response.instance.properties.has("ACCESS_TOKEN")); + // in response its set because the access token in the component is not empty + assertEquals("xxx", response.instance.properties.get("ACCESS_TOKEN").getAsString()); + + // in the actual instance there shouldn't be an access token, instead it should + // only be taken directly from the component + final var instance = this.appManagerTestBundle.appManagerUtil + .findInstanceByIdOrError(response.instance.instanceId); + assertFalse(instance.properties.has("ACCESS_TOKEN")); final var apps = this.appManagerTestBundle.getAppsFromConfig(); @@ -93,6 +103,33 @@ public void testOnlyCompatibleWithHome() throws Exception { new AddAppInstance.Request(this.tibber.getAppId(), "key", "alias", properties)).get(); } + @Test + public void testSetTokenValue() throws Exception { + this.installHome(); + final var properties = JsonUtils.buildJsonObject() // + .addProperty("ACCESS_TOKEN", "g78aw9ht2n112nb453") // + .build(); + final var response = this.appManagerTestBundle.sut.handleAddAppInstanceRequest(DUMMY_ADMIN, + new AddAppInstance.Request(this.tibber.getAppId(), "key", "alias", properties)).get(); + + final var accessTokenProp = Arrays.stream(this.tibber.getProperties()) // + .filter(t -> t.name.equals(Tibber.Property.ACCESS_TOKEN.name())) // + .findAny().orElse(null); + var value = accessTokenProp.bidirectionalValue.apply(response.instance.properties); + + assertEquals("xxx", value.getAsString()); + + this.appManagerTestBundle.componentManger.handleJsonrpcRequest(DUMMY_ADMIN, + new UpdateComponentConfigRequest(response.instance.properties + .get(Tibber.Property.TIME_OF_USE_TARIFF_PROVIDER_ID.name()).getAsString(), + List.of(new UpdateComponentConfigRequest.Property("accessToken", "")))) + .get(); + + value = accessTokenProp.bidirectionalValue.apply(response.instance.properties); + + assertEquals(JsonNull.INSTANCE, value); + } + private void createPredictor() throws Exception { this.appManagerTestBundle.componentManger.handleJsonrpcRequest(DUMMY_ADMIN, new CreateComponentConfigRequest("Predictor.PersistenceModel", List.of(// diff --git a/io.openems.edge.core/test/io/openems/edge/core/appmanager/AppPermissionTest.java b/io.openems.edge.core/test/io/openems/edge/core/appmanager/AppPermissionTest.java new file mode 100644 index 00000000000..bb0be50560b --- /dev/null +++ b/io.openems.edge.core/test/io/openems/edge/core/appmanager/AppPermissionTest.java @@ -0,0 +1,71 @@ +package io.openems.edge.core.appmanager; + +import static io.openems.edge.common.test.DummyUser.DUMMY_INSTALLER; +import static io.openems.edge.common.test.DummyUser.DUMMY_OWNER; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import io.openems.common.session.Role; +import io.openems.common.utils.JsonUtils; +import io.openems.edge.common.user.User; +import io.openems.edge.core.appmanager.jsonrpc.AddAppInstance; +import io.openems.edge.core.appmanager.jsonrpc.DeleteAppInstance; + +public class AppPermissionTest { + + private AppManagerTestBundle test; + + @Before + public void beforeEach() throws Exception { + this.test = new AppManagerTestBundle(null, null, t -> { + return List.of(// + DummyApp.create() // + .setAppId("App.Dummy") // + .setAppPermissions(OpenemsAppPermissions.create() // + .setCanDelete(Role.INSTALLER) // + .build()) // + .build() // + ); + }); + } + + @Test + public void testDeleteSuccess() throws Exception { + final var instance = this.createDummyApp(); + + this.test.assertInstalledApps(1); + this.deleteDummyApp(instance, DUMMY_INSTALLER); + this.test.assertInstalledApps(0); + } + + @Test + public void testDeleteAccessDenied() throws Exception { + final var instance = this.createDummyApp(); + + this.test.assertInstalledApps(1); + try { + this.deleteDummyApp(instance, DUMMY_OWNER); + fail(); + } catch (Exception e) { + assertNotNull(e); + } + this.test.assertInstalledApps(1); + } + + private OpenemsAppInstance createDummyApp() throws Exception { + return this.test.sut.handleAddAppInstanceRequest(DUMMY_INSTALLER, + new AddAppInstance.Request("App.Dummy", "key", "alias", JsonUtils.buildJsonObject() // + .build())) + .get().instance; + } + + private void deleteDummyApp(OpenemsAppInstance instance, User user) throws Exception { + this.test.sut.handleDeleteAppInstanceRequest(user, new DeleteAppInstance.Request(instance.instanceId)).get(); + } + +} diff --git a/io.openems.edge.core/test/io/openems/edge/core/appmanager/Apps.java b/io.openems.edge.core/test/io/openems/edge/core/appmanager/Apps.java index ac1de7ad14c..f599054f244 100644 --- a/io.openems.edge.core/test/io/openems/edge/core/appmanager/Apps.java +++ b/io.openems.edge.core/test/io/openems/edge/core/appmanager/Apps.java @@ -17,6 +17,7 @@ import io.openems.edge.app.api.RestJsonApiReadOnly; import io.openems.edge.app.api.RestJsonApiReadWrite; import io.openems.edge.app.ess.FixActivePower; +import io.openems.edge.app.ess.FixStateOfCharge; import io.openems.edge.app.ess.PowerPlantController; import io.openems.edge.app.ess.PrepareBatteryExtension; import io.openems.edge.app.evcs.AlpitronicEvcs; @@ -32,9 +33,6 @@ import io.openems.edge.app.integratedsystem.FeneconHome; import io.openems.edge.app.integratedsystem.FeneconHome20; import io.openems.edge.app.integratedsystem.FeneconHome30; -import io.openems.edge.app.integratedsystem.fenecon.industrial.s.Isk010; -import io.openems.edge.app.integratedsystem.fenecon.industrial.s.Isk011; -import io.openems.edge.app.integratedsystem.fenecon.industrial.s.Isk110; import io.openems.edge.app.loadcontrol.ManualRelayControl; import io.openems.edge.app.loadcontrol.ThresholdControl; import io.openems.edge.app.meter.CarloGavazziMeter; @@ -110,36 +108,6 @@ public static final FeneconHome30 feneconHome30(AppManagerTestBundle t) { return app(t, FeneconHome30::new, "App.FENECON.Home.30"); } - /** - * Test method for creating a {@link Isk110}. - * - * @param t the {@link AppManagerTestBundle} - * @return the {@link OpenemsApp} instance - */ - public static final Isk110 feneconIsk110(AppManagerTestBundle t) { - return app(t, Isk110::new, "App.FENECON.Industrial.S.ISK110"); - } - - /** - * Test method for creating a {@link Isk010}. - * - * @param t the {@link AppManagerTestBundle} - * @return the {@link OpenemsApp} instance - */ - public static final Isk010 feneconIsk010(AppManagerTestBundle t) { - return app(t, Isk010::new, "App.FENECON.Industrial.S.ISK010"); - } - - /** - * Test method for creating a {@link Isk011}. - * - * @param t the {@link AppManagerTestBundle} - * @return the {@link OpenemsApp} instance - */ - public static final Isk011 feneconIsk011(AppManagerTestBundle t) { - return app(t, Isk011::new, "App.FENECON.Industrial.S.ISK011"); - } - // TimeOfUseTariff /** @@ -542,6 +510,16 @@ public static final FixActivePower fixActivePower(AppManagerTestBundle t) { return app(t, FixActivePower::new, "App.Ess.FixActivePower"); } + /** + * Test method for creating a {@link FixStateOfCharge}. + * + * @param t the {@link AppManagerTestBundle} + * @return the {@link OpenemsApp} instance + */ + public static final FixStateOfCharge fixStateOfCharge(AppManagerTestBundle t) { + return app(t, FixStateOfCharge::new, "App.Ess.FixStateOfCharge"); + } + /** * Test method for creating a {@link PrepareBatteryExtension}. * diff --git a/io.openems.edge.core/test/io/openems/edge/core/appmanager/TestTranslations.java b/io.openems.edge.core/test/io/openems/edge/core/appmanager/TestTranslations.java index 3b9a806c878..b70a23488fd 100644 --- a/io.openems.edge.core/test/io/openems/edge/core/appmanager/TestTranslations.java +++ b/io.openems.edge.core/test/io/openems/edge/core/appmanager/TestTranslations.java @@ -18,7 +18,6 @@ import io.openems.edge.app.integratedsystem.TestFeneconHome; import io.openems.edge.app.integratedsystem.TestFeneconHome20; import io.openems.edge.app.integratedsystem.TestFeneconHome30; -import io.openems.edge.app.integratedsystem.TestFeneconIndustrial; public class TestTranslations { @@ -35,9 +34,6 @@ public void beforeEach() throws Exception { this.apps.add(new TestTranslation(Apps.feneconHome(t), true, TestFeneconHome.fullSettings())); this.apps.add(new TestTranslation(Apps.feneconHome20(t), true, TestFeneconHome20.fullSettings())); this.apps.add(new TestTranslation(Apps.feneconHome30(t), true, TestFeneconHome30.fullSettings())); - this.apps.add(new TestTranslation(Apps.feneconIsk010(t), true, TestFeneconIndustrial.fullSettings())); - this.apps.add(new TestTranslation(Apps.feneconIsk110(t), true, TestFeneconIndustrial.fullSettings())); - this.apps.add(new TestTranslation(Apps.feneconIsk011(t), true, TestFeneconIndustrial.fullSettings())); this.apps.add(new TestTranslation(Apps.awattarHourly(t), true, new JsonObject())); this.apps.add(new TestTranslation(Apps.entsoE(t), true, JsonUtils.buildJsonObject() // .addProperty("BIDDING_ZONE", "GERMANY") // @@ -131,6 +127,9 @@ public void beforeEach() throws Exception { this.apps.add(new TestTranslation(Apps.fixActivePower(t), true, JsonUtils.buildJsonObject() // .addProperty("ESS_ID", "ess0") // .build())); + this.apps.add(new TestTranslation(Apps.fixStateOfCharge(t), true, JsonUtils.buildJsonObject() // + .addProperty("ESS_ID", "ess0") // + .build())); this.apps.add(new TestTranslation(Apps.powerPlantController(t), true, new JsonObject())); this.apps.add(new TestTranslation(Apps.prepareBatteryExtension(t), true, new JsonObject())); return this.apps.stream().map(TestTranslation::app).toList(); diff --git a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImpl.java b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImpl.java index 529608ac457..c20446244e5 100644 --- a/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImpl.java +++ b/io.openems.edge.goodwe/src/io/openems/edge/goodwe/batteryinverter/GoodWeBatteryInverterImpl.java @@ -204,8 +204,7 @@ private void applyConfigIfNotSet(Config config, boolean onConfigUpdate) throws O if (onConfigUpdate) { // Mppt Shadow enable / disable - setWriteValueIfNotRead(this.channel(GoodWe.ChannelId.MPPT_FOR_SHADOW_ENABLE), - config.mpptForShadowEnable().booleanValue); + setWriteValueIfNotRead(this.channel(GoodWe.ChannelId.MPPT_FOR_SHADOW_ENABLE), false); // Feed-in settings var setFeedInPowerSettings = config.setfeedInPowerSettings(); diff --git a/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibber.java b/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibber.java index cc41e5388bc..406529c3854 100644 --- a/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibber.java +++ b/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibber.java @@ -11,8 +11,12 @@ public interface TimeOfUseTariffTibber extends TimeOfUseTariff, OpenemsComponent public enum ChannelId implements io.openems.edge.common.channel.ChannelId { HTTP_STATUS_CODE(Doc.of(OpenemsType.INTEGER) // .text("The HTTP status code")), // - UNABLE_TO_UPDATE_PRICES(Doc.of(Level.WARNING) // - .text("Unable to update prices from Tibber API")), // + STATUS_TIMEOUT(Doc.of(Level.WARNING) // + .text("Unable to update prices from Tibber: timout while reading from server")), // + STATUS_AUTHENTICATION_FAILED(Doc.of(Level.WARNING) // + .text("Unable to update prices from Tibber: access token authentication failed")), // + STATUS_SERVER_ERROR(Doc.of(Level.WARNING) // + .text("Unable to update prices from Tibber: unexpected server error")), // FILTER_IS_REQUIRED(Doc.of(Level.WARNING) // .text("Found multiple 'Homes'. Please configure either an ID (format UUID) " + "or 'appNickname' for unambiguous identification")) // diff --git a/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibberImpl.java b/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibberImpl.java index 66765799d5e..98a85d89e83 100644 --- a/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibberImpl.java +++ b/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/TimeOfUseTariffTibberImpl.java @@ -1,12 +1,10 @@ package io.openems.edge.timeofusetariff.tibber; import static io.openems.edge.timeofusetariff.api.utils.TimeOfUseTariffUtils.generateDebugLog; +import static io.openems.edge.timeofusetariff.tibber.Utils.calculateDelay; import java.io.IOException; -import java.time.Duration; import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; -import java.util.Random; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -46,6 +44,8 @@ public class TimeOfUseTariffTibberImpl extends AbstractOpenemsComponent implements TimeOfUseTariff, OpenemsComponent, TimeOfUseTariffTibber { private static final String TIBBER_API_URL = "https://api.tibber.com/v1-beta/gql"; + protected static final int CLIENT_ERROR_CODE = 400; + protected static final int TOO_MANY_REQUESTS_CODE = 429; private final Logger log = LoggerFactory.getLogger(TimeOfUseTariffTibberImpl.class); private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); @@ -96,7 +96,7 @@ protected void deactivate() { .addProperty("query", Utils.generateGraphQl()) // .build().toString(), MediaType.parse("application/json"))) // .build(); - int httpStatusCode = 0; + var httpStatusCode = 0; var filterIsRequired = false; var unableToUpdatePrices = false; @@ -122,29 +122,52 @@ protected void deactivate() { e.printStackTrace(); } - this.channel(TimeOfUseTariffTibber.ChannelId.HTTP_STATUS_CODE).setNextValue(httpStatusCode); - this.channel(TimeOfUseTariffTibber.ChannelId.FILTER_IS_REQUIRED).setNextValue(filterIsRequired); - this.channel(TimeOfUseTariffTibber.ChannelId.UNABLE_TO_UPDATE_PRICES).setNextValue(unableToUpdatePrices); + this.setChannelValues(httpStatusCode, filterIsRequired); - /* - * Schedule next price update at next hour; or try again after 5 minutes - */ - var now = ZonedDateTime.now(); - final ZonedDateTime nextRun; - if (unableToUpdatePrices) { - // If the prices are not updated, try again in 5 minutes. - nextRun = now.plusMinutes(5).truncatedTo(ChronoUnit.MINUTES); - this.logWarn(this.log, "Unable to Update the prices, Trying again at: " + nextRun); - } else { - nextRun = now.truncatedTo(ChronoUnit.HOURS).plusHours(1); + var delay = calculateDelay(httpStatusCode, filterIsRequired, unableToUpdatePrices); + if (delay != 0) { + this.executor.schedule(this.task, delay, TimeUnit.SECONDS); } - - this.executor.schedule(this.task, // - Duration.between(now, nextRun.plusSeconds(new Random().nextInt(60))) // randomly add a few seconds - .getSeconds(), - TimeUnit.SECONDS); }; + /** + * Sets the values of specific channels based on the provided parameters. + * + * @param httpStatusCode The HTTP status code received from the API. + * @param filterIsRequired A boolean indicating whether filter is required. + */ + private void setChannelValues(int httpStatusCode, boolean filterIsRequired) { + var authenticationFailed = false; + var serverError = false; + var timeout = false; + + switch (httpStatusCode) { + case CLIENT_ERROR_CODE: + authenticationFailed = true; + this.logWarn(this.log, "Authentication failed, please try again with valid token."); + break; + + case TOO_MANY_REQUESTS_CODE: + timeout = true; + break; + + default: + if (httpStatusCode >= 200 && httpStatusCode < 300) { + // No error + } else { + serverError = true; + this.logWarn(this.log, "An unexpected error occurred on the server. Please try again later"); + } + break; + } + + this.channel(TimeOfUseTariffTibber.ChannelId.HTTP_STATUS_CODE).setNextValue(httpStatusCode); + this.channel(TimeOfUseTariffTibber.ChannelId.FILTER_IS_REQUIRED).setNextValue(filterIsRequired); + this.channel(TimeOfUseTariffTibber.ChannelId.STATUS_TIMEOUT).setNextValue(timeout); + this.channel(TimeOfUseTariffTibber.ChannelId.STATUS_AUTHENTICATION_FAILED).setNextValue(authenticationFailed); + this.channel(TimeOfUseTariffTibber.ChannelId.STATUS_SERVER_ERROR).setNextValue(serverError); + } + @Override public TimeOfUsePrices getPrices() { return TimeOfUsePrices.from(ZonedDateTime.now(), this.prices.get()); diff --git a/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/Utils.java b/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/Utils.java index b188882cf63..07ccaa9304b 100644 --- a/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/Utils.java +++ b/io.openems.edge.timeofusetariff.tibber/src/io/openems/edge/timeofusetariff/tibber/Utils.java @@ -6,11 +6,16 @@ import static io.openems.common.utils.JsonUtils.getAsOptionalString; import static io.openems.common.utils.JsonUtils.getAsString; import static io.openems.common.utils.JsonUtils.parseToJsonObject; +import static io.openems.edge.timeofusetariff.tibber.TimeOfUseTariffTibberImpl.CLIENT_ERROR_CODE; +import static io.openems.edge.timeofusetariff.tibber.TimeOfUseTariffTibberImpl.TOO_MANY_REQUESTS_CODE; import static java.time.format.DateTimeFormatter.ISO_DATE_TIME; import static java.util.stream.Collectors.joining; +import java.time.Duration; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Random; import java.util.TreeMap; import org.slf4j.Logger; @@ -27,6 +32,9 @@ public class Utils { private static final Logger LOG = LoggerFactory.getLogger(Utils.class); + private static final int RETRY_AFTER_RATE_LIMIT_EXCEEDED_HOURS = 12; + private static final int RETRY_AFTER_UNABLE_TO_UPDATE_PRICES_MINUTES = 5; + private Utils() { } @@ -57,6 +65,13 @@ protected static TimeOfUsePrices parsePrices(String jsonData, String filter) thr TimeOfUsePrices result = null; OpenemsNamedException error = null; var successCount = 0; + + if (homes.size() == 1) { + // If there's only one home, filter is set to null so that it is ignored while + // parsing. + filter = null; + } + for (JsonElement home : homes) { try { var subResult = parseHome(home, filter); @@ -146,6 +161,38 @@ private static TimeOfUsePrices parseHome(JsonElement json, String filter) throws return TimeOfUsePrices.from(result); } + /** + * Calculates the delay until the next scheduled task run based on the HTTP + * status code and update availability. + * + * @param httpStatusCode The HTTP status code received from the request. + * @param filterIsRequired A boolean indicating whether filter is required. + * @param unableToUpdatePrices A boolean indicating whether the prices couldn't + * be updated. + * @return The delay in seconds until the next scheduled task run. + */ + protected static long calculateDelay(int httpStatusCode, boolean filterIsRequired, boolean unableToUpdatePrices) { + + final var now = ZonedDateTime.now(); + final ZonedDateTime nextRun; + + if (!filterIsRequired && !unableToUpdatePrices) { + // next price update at next hour for successful response + nextRun = now.truncatedTo(ChronoUnit.HOURS).plusHours(1); + } else if (httpStatusCode == TOO_MANY_REQUESTS_CODE) { + LOG.warn("Rate limit exceeded. Retrying after " + RETRY_AFTER_RATE_LIMIT_EXCEEDED_HOURS + " hours."); + nextRun = now.plusHours(RETRY_AFTER_RATE_LIMIT_EXCEEDED_HOURS); + } else if (filterIsRequired || httpStatusCode == CLIENT_ERROR_CODE) { + return 0; + } else { + nextRun = now.plusMinutes(RETRY_AFTER_UNABLE_TO_UPDATE_PRICES_MINUTES).truncatedTo(ChronoUnit.MINUTES); + LOG.warn("Unable to Update the prices, Retrying again at: " + nextRun); + } + + return Duration.between(now, nextRun.plusSeconds(new Random().nextInt(60))) // randomly add a few seconds + .getSeconds(); + } + /** * Generate a GraphQL query. * diff --git a/io.openems.edge.timeofusetariff.tibber/test/io/openems/edge/timeofusetariff/tibber/UtilsTest.java b/io.openems.edge.timeofusetariff.tibber/test/io/openems/edge/timeofusetariff/tibber/UtilsTest.java index 62c87c1ff3d..42c1ce726d7 100644 --- a/io.openems.edge.timeofusetariff.tibber/test/io/openems/edge/timeofusetariff/tibber/UtilsTest.java +++ b/io.openems.edge.timeofusetariff.tibber/test/io/openems/edge/timeofusetariff/tibber/UtilsTest.java @@ -1,5 +1,8 @@ package io.openems.edge.timeofusetariff.tibber; +import static io.openems.edge.timeofusetariff.tibber.TimeOfUseTariffTibberImpl.CLIENT_ERROR_CODE; +import static io.openems.edge.timeofusetariff.tibber.TimeOfUseTariffTibberImpl.TOO_MANY_REQUESTS_CODE; +import static io.openems.edge.timeofusetariff.tibber.Utils.calculateDelay; import static io.openems.edge.timeofusetariff.tibber.Utils.generateGraphQl; import static io.openems.edge.timeofusetariff.tibber.Utils.parsePrices; import static org.junit.Assert.assertEquals; @@ -12,129 +15,194 @@ public class UtilsTest { + private static final int SUCCESS_CODE = 200; + private static final int SERVER_ERROR_CODE = 500; + + private static String JSON_DATA = """ + { + "data": { + "viewer": { + "homes": [ + { + "id": "foo-bar", + "appNickname": "my-alias", + "address": { + "country": "DE" + }, + "currentSubscription": { + "priceInfo": { + "current": { + "total": 0.2466, + "energy": 0.0563, + "tax": 0.1903, + "startsAt": "2024-03-22T09:00:00.000+01:00" + }, + "today": [ + { + "total": 0.2466, + "energy": 0.0563, + "tax": 0.1903, + "startsAt": "2024-03-22T00:00:00.000+01:00" + }, + { + "total": 0.2417, + "energy": 0.0522, + "tax": 0.1895, + "startsAt": "2024-03-22T01:00:00.000+01:00" + }, + { + "total": 0.2387, + "energy": 0.0497, + "tax": 0.189, + "startsAt": "2024-03-22T02:00:00.000+01:00" + }, + { + "total": 0.2413, + "energy": 0.0518, + "tax": 0.1895, + "startsAt": "2024-03-22T03:00:00.000+01:00" + }, + { + "total": 0.2424, + "energy": 0.0528, + "tax": 0.1896, + "startsAt": "2024-03-22T04:00:00.000+01:00" + }, + { + "total": 0.2509, + "energy": 0.0599, + "tax": 0.191, + "startsAt": "2024-03-22T05:00:00.000+01:00" + }, + { + "total": 0.2678, + "energy": 0.0741, + "tax": 0.1937, + "startsAt": "2024-03-22T06:00:00.000+01:00" + }, + { + "total": 0.2598, + "energy": 0.0674, + "tax": 0.1924, + "startsAt": "2024-03-22T07:00:00.000+01:00" + }, + { + "total": 0.2606, + "energy": 0.0681, + "tax": 0.1925, + "startsAt": "2024-03-22T08:00:00.000+01:00" + }, + { + "total": 0.2466, + "energy": 0.0563, + "tax": 0.1903, + "startsAt": "2024-03-22T09:00:00.000+01:00" + }, + { + "total": 0.2412, + "energy": 0.0518, + "tax": 0.1894, + "startsAt": "2024-03-22T10:00:00.000+01:00" + }, + { + "total": 0.2389, + "energy": 0.0498, + "tax": 0.1891, + "startsAt": "2024-03-22T11:00:00.000+01:00" + }, + { + "total": 0.2388, + "energy": 0.0498, + "tax": 0.189, + "startsAt": "2024-03-22T12:00:00.000+01:00" + }, + { + "total": 0.2409, + "energy": 0.0515, + "tax": 0.1894, + "startsAt": "2024-03-22T13:00:00.000+01:00" + }, + { + "total": 0.2419, + "energy": 0.0524, + "tax": 0.1895, + "startsAt": "2024-03-22T14:00:00.000+01:00" + }, + { + "total": 0.2509, + "energy": 0.06, + "tax": 0.1909, + "startsAt": "2024-03-22T15:00:00.000+01:00" + }, + { + "total": 0.2711, + "energy": 0.0769, + "tax": 0.1942, + "startsAt": "2024-03-22T16:00:00.000+01:00" + }, + { + "total": 0.2855, + "energy": 0.089, + "tax": 0.1965, + "startsAt": "2024-03-22T17:00:00.000+01:00" + }, + { + "total": 0.3243, + "energy": 0.1216, + "tax": 0.2027, + "startsAt": "2024-03-22T18:00:00.000+01:00" + }, + { + "total": 0.3208, + "energy": 0.1187, + "tax": 0.2021, + "startsAt": "2024-03-22T19:00:00.000+01:00" + }, + { + "total": 0.2926, + "energy": 0.095, + "tax": 0.1976, + "startsAt": "2024-03-22T20:00:00.000+01:00" + }, + { + "total": 0.2775, + "energy": 0.0822, + "tax": 0.1953, + "startsAt": "2024-03-22T21:00:00.000+01:00" + }, + { + "total": 0.275, + "energy": 0.0802, + "tax": 0.1948, + "startsAt": "2024-03-22T22:00:00.000+01:00" + }, + { + "total": 0.2718, + "energy": 0.0775, + "tax": 0.1943, + "startsAt": "2024-03-22T23:00:00.000+01:00" + } + ], + "tomorrow": [] + } + } + } + ] + } + } + } + """; + @Test public void nonEmptyStringTest() throws OpenemsNamedException { // Parsing with custom data - var prices = parsePrices("{\n" // - + " \"data\": {\n" + " \"viewer\": {\n" // - + " \"homes\": [\n" // - + " {\n" // - + " \"id\": \"foo-bar\",\n" // - + " \"appNickname\": \"my-alias\",\n" // - + " \"currentSubscription\": {\n" // - + " \"priceInfo\": {\n" // - + " \"today\": [\n" // - + " {\n" // - + " \"total\": 0.187,\n" - + " \"startsAt\": \"2021-11-15T00:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1841,\n" - + " \"startsAt\": \"2021-11-15T01:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.18,\n" - + " \"startsAt\": \"2021-11-15T02:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1747,\n" - + " \"startsAt\": \"2021-11-15T03:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.179,\n" - + " \"startsAt\": \"2021-11-15T04:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1809,\n" - + " \"startsAt\": \"2021-11-15T05:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1795,\n" - + " \"startsAt\": \"2021-11-15T06:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1848,\n" - + " \"startsAt\": \"2021-11-15T07:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1868,\n" - + " \"startsAt\": \"2021-11-15T08:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1876,\n" - + " \"startsAt\": \"2021-11-15T09:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1874,\n" - + " \"startsAt\": \"2021-11-15T10:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1874,\n" - + " \"startsAt\": \"2021-11-15T11:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1875,\n" - + " \"startsAt\": \"2021-11-15T12:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1878,\n" - + " \"startsAt\": \"2021-11-15T13:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1868,\n" - + " \"startsAt\": \"2021-11-15T14:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1853,\n" - + " \"startsAt\": \"2021-11-15T15:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1848,\n" - + " \"startsAt\": \"2021-11-15T16:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1829,\n" - + " \"startsAt\": \"2021-11-15T17:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1835,\n" - + " \"startsAt\": \"2021-11-15T18:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1846,\n" - + " \"startsAt\": \"2021-11-15T19:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1851,\n" - + " \"startsAt\": \"2021-11-15T20:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1854,\n" - + " \"startsAt\": \"2021-11-15T21:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1853,\n" - + " \"startsAt\": \"2021-11-15T22:00:00.000+01:00\"\n" // - + " },\n" // - + " {\n" // - + " \"total\": 0.1831,\n" - + " \"startsAt\": \"2021-11-15T23:00:00.000+01:00\"\n" // - + " }\n" // - + " ],\n" // - + " \"tomorrow\": []\n" // - + " }\n" // - + " }\n" // - + " }\n" // - + " ]\n" // - + " }\n" // - + " }\n" // - + "}", null); // + var prices = parsePrices(JSON_DATA, null); // // To check if the Map is not empty assertFalse(prices.isEmpty()); // To check if a value is present in map. - assertEquals(0.187 * 1000, prices.getFirst(), 0.001); + assertEquals(0.2466 * 1000, prices.getFirst(), 0.001); // To check 15 minutes values are taken instead of one hour values. var firstHour = prices.pricePerQuarter.firstKey(); @@ -171,4 +239,64 @@ public void generateGraphQlTest() { } }""", generateGraphQl()); } + + @Test + public void testCalculateDelay() { + // case: client error + var httpStatusCode = CLIENT_ERROR_CODE; + var unableToUpdatePrices = true; + var filterIsRequired = false; + var delay = calculateDelay(httpStatusCode, filterIsRequired, unableToUpdatePrices); + assertEquals(0, delay); + + // case: filterIsRequired even though successful response. + httpStatusCode = 200; + filterIsRequired = true; + unableToUpdatePrices = false; + delay = calculateDelay(httpStatusCode, filterIsRequired, unableToUpdatePrices); + assertEquals(0, delay); + + /** + * Min and Max values are considered to handle random 60 seconds addition to the + * result in the method. + */ + // case: Rate Limit error. + httpStatusCode = TOO_MANY_REQUESTS_CODE; + unableToUpdatePrices = true; + delay = calculateDelay(httpStatusCode, filterIsRequired, unableToUpdatePrices); + var minRateLimitDelay = 43200; // 12 hours + var maxRateLimitDelay = 43260; // 12 hours + 60 seconds + assertTrue(delay >= minRateLimitDelay && delay <= maxRateLimitDelay); + + // Case: server error + httpStatusCode = SERVER_ERROR_CODE; + unableToUpdatePrices = true; + filterIsRequired = false; + delay = calculateDelay(httpStatusCode, filterIsRequired, unableToUpdatePrices); + var minDelay = 240; // 4 minutes and truncate to minutes is also considered. + var maxDelay = 360; // 6 minutes + assertTrue(delay >= minDelay && delay <= maxDelay); + + // case: no error. + httpStatusCode = SUCCESS_CODE; + unableToUpdatePrices = false; + filterIsRequired = false; + delay = calculateDelay(httpStatusCode, filterIsRequired, unableToUpdatePrices); + var minSuccesDelay = 0; // 0 hours and truncate to hours is also considered. + var maxSuccesDelay = 3660; // 1 hour + assertTrue(delay >= minSuccesDelay && delay <= maxSuccesDelay); + } + + @Test + public void singleHomeParseTest() throws OpenemsNamedException { + // Parsing with custom filter. Since the test is single home, the filter should + // be ignored + var prices = parsePrices(JSON_DATA, "tibber@openems.com"); // + + // To check if the Map is not empty + assertFalse(prices.isEmpty()); + + // To check if a value is present in map. + assertEquals(0.2466 * 1000, prices.getFirst(), 0.001); + } } diff --git a/io.openems.oem.openems/bnd.bnd b/io.openems.oem.openems/bnd.bnd index 21d3c2de27c..888e9800e4e 100644 --- a/io.openems.oem.openems/bnd.bnd +++ b/io.openems.oem.openems/bnd.bnd @@ -5,6 +5,7 @@ Bundle-Version: 1.0.0.${tstamp} -buildpath: \ ${buildpath},\ + io.openems.backend.common,\ io.openems.common,\ -testpath: \ diff --git a/io.openems.shared.influxdb/src/io/openems/shared/influxdb/DbDataUtils.java b/io.openems.shared.influxdb/src/io/openems/shared/influxdb/DbDataUtils.java index f25c81cc1dd..cb11a001652 100644 --- a/io.openems.shared.influxdb/src/io/openems/shared/influxdb/DbDataUtils.java +++ b/io.openems.shared.influxdb/src/io/openems/shared/influxdb/DbDataUtils.java @@ -45,42 +45,31 @@ public static SortedMap> n return null; } - // currently only works for days and months otherwise just return the table + // currently only works for days, months and years otherwise just return the + // table if (resolution.getUnit() != ChronoUnit.DAYS // - && resolution.getUnit() != ChronoUnit.MONTHS) { + && resolution.getUnit() != ChronoUnit.MONTHS // + && resolution.getUnit() != ChronoUnit.YEARS) { return table; } SortedMap> normalizedTable = new TreeMap<>(); var start = fromDate; while (start.isBefore(toDate)) { - ZonedDateTime end = null; - switch (resolution.getUnit()) { - case CENTURIES: - case DECADES: - case ERAS: - case FOREVER: - case HALF_DAYS: - case HOURS: - case MICROS: - case MILLENNIA: - case MILLIS: - case MINUTES: - case NANOS: - case SECONDS: - case WEEKS: - case YEARS: + ZonedDateTime end = switch (resolution.getUnit()) { + case CENTURIES, DECADES, ERAS, FOREVER, // + HALF_DAYS, HOURS, MICROS, MILLENNIA, // + MILLIS, MINUTES, NANOS, SECONDS, WEEKS -> { // No specific handling required - break; - case DAYS: - end = start.plusDays(resolution.getValue()) // - .truncatedTo(DurationUnit.ofDays(1)); - break; - case MONTHS: - end = start.plusMonths(resolution.getValue()) // - .withDayOfMonth(1); - break; + yield null; } + case DAYS -> start.plusDays(resolution.getValue()) // + .truncatedTo(DurationUnit.ofDays(1)); + case MONTHS -> start.plusMonths(resolution.getValue()) // + .withDayOfMonth(1); + case YEARS -> start.plusYears(resolution.getValue()) // + .withDayOfYear(1); + }; SortedMap foundData = null; for (var data : table.entrySet()) { diff --git a/io.openems.shared.influxdb/src/io/openems/shared/influxdb/proxy/InfluxQlProxy.java b/io.openems.shared.influxdb/src/io/openems/shared/influxdb/proxy/InfluxQlProxy.java index df048cc7e97..4a78e42f73b 100644 --- a/io.openems.shared.influxdb/src/io/openems/shared/influxdb/proxy/InfluxQlProxy.java +++ b/io.openems.shared.influxdb/src/io/openems/shared/influxdb/proxy/InfluxQlProxy.java @@ -13,6 +13,7 @@ import java.util.TreeMap; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import org.slf4j.Logger; @@ -106,24 +107,34 @@ public SortedMap> queryHis var query = this.buildHistoricDataQuery(bucket, measurement, influxEdgeId, fromDate, toDate, channels, resolution); var queryResult = this.executeQuery(influxConnection, bucket, query); - return convertHistoricDataQueryResult(queryResult, fromDate, resolution, channels, new Average()); + return convertHistoricDataQueryResult(queryResult, fromDate, resolution, channels, Average::new); } - // TODO maybe remove? - private static class Average implements BiFunction { + protected static class Average implements BiFunction { - private int count = 0; + private int count = 1; + // used to have a more accurate end-result + private JsonElement lastUnrounded = JsonNull.INSTANCE; @Override public JsonElement apply(JsonElement first, JsonElement second) { - if (!first.isJsonPrimitive() || !second.isJsonPrimitive() // - || !first.getAsJsonPrimitive().isNumber() || !second.getAsJsonPrimitive().isNumber()) { - return second; + if (JsonUtils.isNumber(this.lastUnrounded)) { + first = this.lastUnrounded; } - final var numberFirst = first.getAsNumber().longValue(); - final var numberSecond = first.getAsNumber().longValue(); + if (!JsonUtils.isNumber(first)) { + return this.lastUnrounded = second; + } + if (!JsonUtils.isNumber(second)) { + if (this.lastUnrounded.isJsonNull()) { + return this.lastUnrounded; + } + return new JsonPrimitive(Math.round(this.lastUnrounded.getAsDouble())); + } + final var numberFirst = first.getAsNumber().doubleValue(); + final var numberSecond = second.getAsNumber().doubleValue(); final var result = (numberFirst * this.count + numberSecond) / ++this.count; - return new JsonPrimitive(result); + this.lastUnrounded = new JsonPrimitive(result); + return new JsonPrimitive(Math.round(result)); } } @@ -142,7 +153,8 @@ public SortedMap> queryHis var query = this.buildHistoricEnergyPerPeriodQuery(bucket, measurement, influxEdgeId, fromDate, toDate, channels, resolution); var queryResult = this.executeQuery(influxConnection, bucket, query); - var result = convertHistoricDataQueryResult(queryResult, fromDate, resolution, channels, InfluxQlProxy::last); + var result = convertHistoricDataQueryResult(queryResult, fromDate, resolution, channels, + () -> InfluxQlProxy::last); return DbDataUtils.normalizeTable(result, channels, resolution, fromDate, toDate); } @@ -185,7 +197,11 @@ public SortedMap> queryRaw fromDate, channelsForBeforeValues); if (result.firstKey().isBefore(fromDate)) { - result.put(result.firstKey(), beforeValues); + // only update values which are newly queried + if (beforeValues != null && !beforeValues.isEmpty()) { + final var firstElement = result.get(result.firstKey()); + firstElement.putAll(beforeValues); + } } else { result.put(fromDate.minusDays(1), beforeValues); } @@ -245,6 +261,7 @@ protected String buildHistoricDataQuery(// if (influxEdgeId.isPresent()) { b.append(this.tag + " = '" + influxEdgeId.get() + "' AND "); } + b // .append("time >= ") // .append(String.valueOf(fromDate.toEpochSecond())) // @@ -254,6 +271,8 @@ protected String buildHistoricDataQuery(// .append("s") // .append(" GROUP BY time(") // .append(resolution.toSeconds()) // + .append("s,") // + .append(Math.negateExact(fromDate.getOffset().getTotalSeconds())) // .append("s)"); return b.toString(); } @@ -481,13 +500,14 @@ private static SortedMap> ZonedDateTime fromDate, // Resolution resolution, // Set channels, // - BiFunction aggregateFunction // + Supplier> aggregateFunction // ) throws OpenemsNamedException { if (queryResult == null) { return null; } final SortedMap> table = new TreeMap<>(); + final SortedMap>> aggregations = new TreeMap<>(); for (var result : queryResult.getResults()) { var seriess = result.getSeries(); if (seriess != null) { @@ -515,6 +535,7 @@ private static SortedMap> } } } + SortedMap tableRow; if (existingData != null) { tableRow = existingData; @@ -532,7 +553,9 @@ private static SortedMap> var value = convertToJsonElement(record.getValueByKey(column)); final var existingValue = tableRow.get(channel); if (existingValue != null) { - value = aggregateFunction.apply(existingValue, value); + final var subMap = aggregations.computeIfAbsent(timestamp, t -> new TreeMap<>()); + final var aggregate = subMap.computeIfAbsent(channel, t -> aggregateFunction.get()); + value = aggregate.apply(existingValue, value); } tableRow.put(ChannelAddress.fromString(column), value); @@ -565,14 +588,19 @@ private static SortedMap> var timestampInstant = Instant .ofEpochMilli(Long.parseLong((String) t.second().getValueByKey("time"))); var zonedDateTime = ZonedDateTime.ofInstant(timestampInstant, fromDate.getZone()); - if (resolution.getUnit() == ChronoUnit.MONTHS && zonedDateTime.isAfter(fromDate)) { - if (zonedDateTime.getMonthValue() == fromDate.getMonthValue() // - && zonedDateTime.getYear() == fromDate.getYear()) { - zonedDateTime = fromDate; - } else { - zonedDateTime = zonedDateTime.withDayOfMonth(1); - } + if (!zonedDateTime.isAfter(fromDate)) { + return zonedDateTime; + } + + if (resolution.getUnit() == ChronoUnit.MONTHS) { + zonedDateTime = zonedDateTime.withDayOfMonth(1); + } else if (resolution.getUnit() == ChronoUnit.YEARS) { + zonedDateTime = zonedDateTime.withDayOfYear(1); + } + if (zonedDateTime.isBefore(fromDate)) { + zonedDateTime = fromDate; } + return zonedDateTime.truncatedTo(DurationUnit.ofDays(1)); }, TreeMap::new, Collectors.toMap(Pair::first, r -> { final var channel = r.first(); diff --git a/io.openems.shared.influxdb/test/io/openems/shared/influxdb/DbDataUtilsTest.java b/io.openems.shared.influxdb/test/io/openems/shared/influxdb/DbDataUtilsTest.java new file mode 100644 index 00000000000..88f3c9e8bb2 --- /dev/null +++ b/io.openems.shared.influxdb/test/io/openems/shared/influxdb/DbDataUtilsTest.java @@ -0,0 +1,93 @@ +package io.openems.shared.influxdb; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.function.Consumer; + +import org.junit.Test; + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; + +import io.openems.common.timedata.Resolution; +import io.openems.common.types.ChannelAddress; + +public class DbDataUtilsTest { + + private static final ZoneId ZONE = ZoneId.of("UTC"); + + @Test + public void testNormalizeTable() { + final var dummyChannel = new ChannelAddress("cmp0", "chn0"); + final SortedMap> data = new TreeMap<>(); + data.put(ZonedDateTime.of(2020, 1, 1, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(10)); + })); + data.put(ZonedDateTime.of(2020, 1, 3, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(30)); + })); + data.put(ZonedDateTime.of(2020, 1, 5, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(50)); + })); + + final var normalizedTable = DbDataUtils.normalizeTable(data, Set.of(dummyChannel), + new Resolution(1, ChronoUnit.DAYS), ZonedDateTime.of(2020, 1, 1, 0, 0, 0, 0, ZONE), + ZonedDateTime.of(2020, 1, 6, 0, 0, 0, 0, ZONE)); + + assertEquals(5, normalizedTable.size()); + for (int i = 0; i < 5; i++) { + final var value = normalizedTable.get(ZonedDateTime.of(2020, 1, 1 + i, 0, 0, 0, 0, ZONE)); + if (i % 2 == 1) { + assertTrue(value.get(dummyChannel).isJsonNull()); + } else { + assertFalse(value.get(dummyChannel).isJsonNull()); + } + } + } + + @Test + public void testCalculateLastMinusFirst() { + final var dummyChannel = new ChannelAddress("cmp0", "chn0"); + final SortedMap> data = new TreeMap<>(); + data.put(ZonedDateTime.of(2020, 1, 1, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(10)); + })); + data.put(ZonedDateTime.of(2020, 1, 2, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(20)); + })); + data.put(ZonedDateTime.of(2020, 1, 3, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(30)); + })); + data.put(ZonedDateTime.of(2020, 1, 4, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(40)); + })); + data.put(ZonedDateTime.of(2020, 1, 5, 0, 0, 0, 0, ZONE), newMap(map -> { + map.put(dummyChannel, new JsonPrimitive(50)); + })); + + final var lastMinusFirstResult = DbDataUtils.calculateLastMinusFirst(data, + ZonedDateTime.of(2020, 1, 1, 0, 0, 0, 0, ZONE)); + + assertEquals(5, lastMinusFirstResult.size()); + for (var entry : lastMinusFirstResult.entrySet()) { + assertEquals(1, entry.getValue().size()); + final var value = entry.getValue().get(dummyChannel); + assertEquals(10, value.getAsDouble(), 0); + } + } + + private static TreeMap newMap(Consumer> consumer) { + var map = new TreeMap(); + consumer.accept(map); + return map; + } + +} diff --git a/io.openems.shared.influxdb/test/io/openems/shared/influxdb/proxy/InfluxQlProxyTest.java b/io.openems.shared.influxdb/test/io/openems/shared/influxdb/proxy/InfluxQlProxyTest.java new file mode 100644 index 00000000000..5d76d9c7f69 --- /dev/null +++ b/io.openems.shared.influxdb/test/io/openems/shared/influxdb/proxy/InfluxQlProxyTest.java @@ -0,0 +1,36 @@ +package io.openems.shared.influxdb.proxy; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Test; + +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonPrimitive; + +import io.openems.shared.influxdb.proxy.InfluxQlProxy.Average; + +public class InfluxQlProxyTest { + + @Test + public void testAverage() { + final var average = new Average(); + + JsonElement last = JsonNull.INSTANCE; + for (var next : List.of(// + new JsonPrimitive(3.5), // + JsonNull.INSTANCE, // + new JsonPrimitive(4.5), // + JsonNull.INSTANCE, // + new JsonPrimitive(4d), // + JsonNull.INSTANCE // + )) { + last = average.apply(last, next); + } + + assertEquals(4d, last.getAsDouble(), 0d); + } + +} diff --git a/ui/README.md b/ui/README.md index 7bf992b1590..b57cb48b67a 100644 --- a/ui/README.md +++ b/ui/README.md @@ -4,7 +4,7 @@ This project was generated with [angular-cli](https://github.com/angular/angular ## Theme OpenEMS -- OpenEMS Edge - expects a Edge *Controller.Api.Websocket* on default port `8075` +- OpenEMS Edge - expects a Edge *Controller.Api.Websocket* on default port `8085` - Serve to port `4200` @@ -84,4 +84,4 @@ ngOnDestroy() { ``` #### Debugging Angular PWA Via USB-Connection -Please follow this: https://medium.com/nerd-for-tech/google-chrome-how-to-inspect-websites-on-mobile-devices-804677f863ce \ No newline at end of file +Please follow this: https://medium.com/nerd-for-tech/google-chrome-how-to-inspect-websites-on-mobile-devices-804677f863ce diff --git a/ui/package-lock.json b/ui/package-lock.json index ca2b931dafc..8c30370b73e 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -77,7 +77,7 @@ } }, "node_modules/@aashutoshrathi/word-wrap": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, @@ -223,93 +223,48 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/magic-string": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", - "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz", + "integrity": "sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==", "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" + "optionalDependencies": { + "@esbuild/android-arm": "0.17.8", + "@esbuild/android-arm64": "0.17.8", + "@esbuild/android-x64": "0.17.8", + "@esbuild/darwin-arm64": "0.17.8", + "@esbuild/darwin-x64": "0.17.8", + "@esbuild/freebsd-arm64": "0.17.8", + "@esbuild/freebsd-x64": "0.17.8", + "@esbuild/linux-arm": "0.17.8", + "@esbuild/linux-arm64": "0.17.8", + "@esbuild/linux-ia32": "0.17.8", + "@esbuild/linux-loong64": "0.17.8", + "@esbuild/linux-mips64el": "0.17.8", + "@esbuild/linux-ppc64": "0.17.8", + "@esbuild/linux-riscv64": "0.17.8", + "@esbuild/linux-s390x": "0.17.8", + "@esbuild/linux-x64": "0.17.8", + "@esbuild/netbsd-x64": "0.17.8", + "@esbuild/openbsd-x64": "0.17.8", + "@esbuild/sunos-x64": "0.17.8", + "@esbuild/win32-arm64": "0.17.8", + "@esbuild/win32-ia32": "0.17.8", + "@esbuild/win32-x64": "0.17.8" } }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "node_modules/@angular-devkit/build-webpack": { @@ -357,6 +312,28 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/@angular-devkit/schematics": { "version": "15.2.9", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.9.tgz", @@ -375,17 +352,11 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/magic-string": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", - "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } + "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "node_modules/@angular-eslint/builder": { "version": "15.2.1", @@ -518,6 +489,30 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/cdk/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "optional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/@angular/cli": { "version": "15.2.9", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.9.tgz", @@ -552,6 +547,29 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@angular/common": { "version": "15.2.9", "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.9.tgz", @@ -616,15 +634,6 @@ "typescript": ">=4.8.2 <5.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { "version": "7.19.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", @@ -664,283 +673,57 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "node_modules/@angular/compiler-cli/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, + "node_modules/@angular/core": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.9.tgz", + "integrity": "sha512-w46Z1yUXCQfKV7XfnamOoLA2VD0MVUUYVrUjO73mHSskDXSXxfZAEHO9kfUS71Cj35PvhP3mbkqWscpea2WeYg==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", - "dev": true, + "node_modules/@angular/forms": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.9.tgz", + "integrity": "sha512-sk0pC2EFi2Ohg5J0q0NYptbT+2WOkoiERSMYA39ncDvlSZBWsNlxpkbGUSck7NIxjK2QfcVN1ldGbHlZTFvtqg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@angular/language-service": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.9.tgz", + "integrity": "sha512-B7lP4q/eHge2lZezOXS96EYzVf4stMCWfOnz7+pUUi0HbF+A5QCV65SWQddS/M+NM2jj8N2L/j+6UCH8lJjTQA==", "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/@angular/compiler-cli/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@angular/compiler-cli/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@angular/compiler-cli/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/compiler-cli/node_modules/reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@angular/core": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.9.tgz", - "integrity": "sha512-w46Z1yUXCQfKV7XfnamOoLA2VD0MVUUYVrUjO73mHSskDXSXxfZAEHO9kfUS71Cj35PvhP3mbkqWscpea2WeYg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" - } - }, - "node_modules/@angular/forms": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.9.tgz", - "integrity": "sha512-sk0pC2EFi2Ohg5J0q0NYptbT+2WOkoiERSMYA39ncDvlSZBWsNlxpkbGUSck7NIxjK2QfcVN1ldGbHlZTFvtqg==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": "15.2.9", - "@angular/core": "15.2.9", - "@angular/platform-browser": "15.2.9", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/language-service": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.9.tgz", - "integrity": "sha512-B7lP4q/eHge2lZezOXS96EYzVf4stMCWfOnz7+pUUi0HbF+A5QCV65SWQddS/M+NM2jj8N2L/j+6UCH8lJjTQA==", - "dev": true, - "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" } }, "node_modules/@angular/platform-browser": { @@ -1017,24 +800,33 @@ } }, "node_modules/@assemblyscript/loader": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.10.1", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/core": { "version": "7.20.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", @@ -1065,221 +857,172 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=6.9.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-module-transforms": { + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@babel/types": "^7.22.5" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@babel/core/node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/core/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/core/node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" + "@babel/types": "^7.22.5" }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/@babel/core/node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/semver": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -1288,54 +1031,46 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/core/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, @@ -1351,90 +1086,6 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1444,12 +1095,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -1473,14 +1118,14 @@ } }, "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1498,83 +1143,100 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-annotate-as-pure": { + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", @@ -1586,47 +1248,101 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/template": { + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", @@ -1640,144 +1356,151 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "node_modules/@babel/helpers": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@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.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1790,19 +1513,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", @@ -1815,19 +1530,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1840,19 +1547,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1865,19 +1581,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1890,19 +1598,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -1915,19 +1635,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1940,128 +1670,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "dependencies": { - "@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.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -2074,84 +1706,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, @@ -2162,17 +1718,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-class-properties": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, @@ -2183,17 +1730,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, @@ -2207,17 +1745,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, @@ -2228,17 +1757,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, @@ -2249,17 +1769,23 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, @@ -2270,17 +1796,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, @@ -2291,17 +1808,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, @@ -2312,17 +1820,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, @@ -2333,17 +1832,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, @@ -2354,17 +1844,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, @@ -2375,17 +1856,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, @@ -2396,17 +1868,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, @@ -2420,17 +1883,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, @@ -2444,13 +1898,19 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { @@ -2470,71 +1930,99 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/template": { + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", @@ -2548,15 +2036,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { - "@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/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2565,39 +2051,45 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", - "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2606,117 +2098,46 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2725,168 +2146,96 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "dependencies": { - "@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.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-plugin-utils": { + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2895,55 +2244,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2952,53 +2256,17 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -3007,18 +2275,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -3027,16 +2292,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3045,17 +2307,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3064,13 +2322,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -3079,10 +2338,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -3094,13 +2353,18 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -3109,36 +2373,22 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@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/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3147,14 +2397,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3163,10 +2413,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -3178,13 +2428,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -3194,10 +2443,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -3209,13 +2458,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -3225,12 +2473,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -3240,30 +2489,87 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -3272,921 +2578,503 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.1.90" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10.0.0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.39.4", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", + "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "comment-parser": "1.3.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "node_modules/@esbuild/android-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", + "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "node_modules/@esbuild/android-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", + "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "node_modules/@esbuild/android-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", + "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", + "integrity": "sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", + "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", + "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", + "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@esbuild/linux-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", + "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", + "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", + "cpu": [ + "arm64" + ], "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "optional": true, + "os": [ + "linux" ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", + "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "browserslist": "^4.21.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", + "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", + "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/@babel/preset-env/node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-env/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", - "dev": true, - "dependencies": { - "comment-parser": "1.3.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/linux-ppc64": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", - "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", + "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", "cpu": [ - "arm" + "ppc64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/linux-riscv64": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", - "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", + "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", "cpu": [ - "arm64" + "riscv64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/linux-s390x": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", - "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", + "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", "cpu": [ - "x64" + "s390x" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/linux-x64": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", - "integrity": "sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", + "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { + "node_modules/@esbuild/netbsd-x64": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", - "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", + "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "netbsd" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/freebsd-arm64": { + "node_modules/@esbuild/openbsd-x64": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", - "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", + "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "freebsd" + "openbsd" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/freebsd-x64": { + "node_modules/@esbuild/sunos-x64": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", - "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", + "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "freebsd" + "sunos" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-arm": { + "node_modules/@esbuild/win32-arm64": { "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", - "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", + "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", - "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", - "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", - "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", - "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", - "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", - "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", - "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", - "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", - "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", - "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", - "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", - "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", - "cpu": [ - "arm64" + "arm64" ], "dev": true, "optional": true, @@ -4214,7 +3102,7 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.17.8", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz", "integrity": "sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==", "cpu": [ @@ -4245,9 +3133,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -4325,6 +3213,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -4338,14 +3232,20 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -4360,12 +3260,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -4379,12 +3273,18 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, "node_modules/@ionic/angular": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.5.tgz", - "integrity": "sha512-nV8HP7RedjYkIAT8nVr5ifHNT0D3XzA74RPG3/WCCFJKunERNJ9SBiNkCTWhUpSkqsYYwEB4+SOOHz+R5NLk/w==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.4.tgz", + "integrity": "sha512-E41OEAXZFe7rhtseD0R+cEsE2qOxMBGeCGwNNdnoiWtU35+I60YM0M1NaXUd8iiSCUX6v794CETQQeazBxSORg==", "dependencies": { - "@ionic/core": "6.7.5", + "@ionic/core": "6.7.4", "ionicons": "^6.1.3", "jsonc-parser": "^3.0.0", "tslib": "^2.0.0" @@ -4409,9 +3309,9 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.12.tgz", - "integrity": "sha512-tg1+deEZdm3fgk2BQ6y7tujciL6qhtN5Ums266lX//kAZeZ4nNNXTBT+oY5xgfjvmLbW+xKg0XZrAS0oIRKY5g==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.13.tgz", + "integrity": "sha512-aIefeZcbjghQg/V6U9CTLtyB5fXDJ63KwYqVYkWP+i0XriS5A9puFgq2u/OVsWxAfYvqpDqp5AdQ0g0bi3CAsA==", "dev": true, "dependencies": { "ajv": "8.11.0", @@ -4435,12 +3335,12 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/schematics": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.12.tgz", - "integrity": "sha512-MN5yGR+SSSPPBBVMf4cifDJn9u0IYvxiHst+HWokH2AkBYy+vB1x8jYES2l1wkiISD7nvjTixfqX+Y95oMBoLg==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.13.tgz", + "integrity": "sha512-2zczyeNzeBcrT2HOysv52X9SH3tZoHfWJvVf6H0SIa74rfDKEl7hFpKNXnh3x8sIMLj5mZn05n5RCqGxCczcIg==", "dev": true, "dependencies": { - "@angular-devkit/core": "14.2.12", + "@angular-devkit/core": "14.2.13", "jsonc-parser": "3.1.0", "magic-string": "0.26.2", "ora": "5.4.1", @@ -4453,13 +3353,13 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@schematics/angular": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.12.tgz", - "integrity": "sha512-nCxoFzH/uh5vqhaAjAfQIBgGuCdV3RMjdSwD0VQ+GFiFvTe8rqFyDl+qpNCgETz4LwmGHb5HNjDH9+VyVLgfZQ==", + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.13.tgz", + "integrity": "sha512-MLxTpTU3E8QACQ/5c0sENMR2gRiMXpGaKeD5IHY+3wyU2fUSJVB0QPU/l1WhoyZbX8N9ospBgf5UEG7taVF9rg==", "dev": true, "dependencies": { - "@angular-devkit/core": "14.2.12", - "@angular-devkit/schematics": "14.2.12", + "@angular-devkit/core": "14.2.13", + "@angular-devkit/schematics": "14.2.13", "jsonc-parser": "3.1.0" }, "engines": { @@ -4468,47 +3368,22 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@ionic/angular-toolkit/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "node_modules/@ionic/angular-toolkit/node_modules/magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "sourcemap-codec": "^1.4.8" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@ionic/angular-toolkit/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@ionic/angular-toolkit/node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "dev": true - }, - "node_modules/@ionic/angular-toolkit/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, "node_modules/@ionic/core": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.5.tgz", - "integrity": "sha512-zRkRn+h/Vs3xt/EVgBdShMKDyeGOM4RU31NPF2icfu3CUTH+VrMV569MUnNjYvd1Lu2xK90pYy4TaicSWmC1Pw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.4.tgz", + "integrity": "sha512-IG6vQtt4xrJdas6k1CwqahD/BWsYK6Gi/BAIN8TumBmtfNMu38iOG6Dh05q4hCQzmDm2xDS/BVD3Qz7AmOKArA==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.1.3", @@ -4516,7 +3391,7 @@ } }, "node_modules/@isaacs/cliui": { - "version": "2023.10.0-SNAPSHOT", + "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, @@ -4532,6 +3407,18 @@ "node": ">=12" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4544,10 +3431,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/@isaacs/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { @@ -4567,6 +3466,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -4584,8 +3556,76 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/load-nyc-config": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, @@ -4600,17 +3640,8 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@istanbuljs/schema": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, @@ -4619,7 +3650,7 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, @@ -4631,11 +3662,44 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { "node": ">=6.0.0" } @@ -4647,31 +3711,22 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@kurkle/color": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true @@ -4693,9 +3748,9 @@ } }, "node_modules/@ngx-formly/core": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.1.8.tgz", - "integrity": "sha512-WVInXYF/fJx7aNUn8y8mqLUaotxAmxbdMzC5GJwJ4oNa8a2kmwWIBAzfoe7YhyWR/t/pGANTu9tsYZaFtQxPVQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.1.7.tgz", + "integrity": "sha512-hFale+MISRuRznbi4Q7HQaXDICl6wtMneJcnQGmYv8yjeaOYjBsogpD4cOeDf3GibrHYk7Ggh4mamGaLdCL65A==", "dependencies": { "tslib": "^2.0.0" }, @@ -4705,21 +3760,21 @@ } }, "node_modules/@ngx-formly/ionic": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-6.1.8.tgz", - "integrity": "sha512-eMYQ43hTbPW8v3SywxUJa/YRssYP5t6Fy66SQdKQ5Tot3OTAYxvYqgFPqTjy5hq6hmHNCv3F3TVkuZPqBRNXDg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-6.1.7.tgz", + "integrity": "sha512-T1rXjM2L8LvbtE2xdeyStECHjipy7ZqmixI7uVJ/2+7i4frD30UisAW25+Kg1E3Bq2SpQ+De+tEg/B1kOGclWA==", "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@ionic/angular": "^6.0.0", - "@ngx-formly/core": "6.1.8" + "@ngx-formly/core": "6.1.7" } }, "node_modules/@ngx-formly/schematics": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-6.1.8.tgz", - "integrity": "sha512-p5YC/IGae32LHM02XAOBOafooylYikVFugN3UHssPpq9w+jgBpPLz+6f8zdZx5PkXO6YH74M4sQeU+yxMd8jGw==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-6.1.7.tgz", + "integrity": "sha512-My7Caz9zNS8NQKtAQTF21YIZnJZ9KZTlh1GPjydlYRpLp2zkfsEiu7nUDBFZV6e0/pLLnlPuaeEkXEuK8SPCZw==", "dependencies": { "@angular-devkit/core": "^13.0.3", "@angular-devkit/schematics": "^13.0.3", @@ -4799,11 +3854,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@ngx-formly/schematics/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/@ngx-formly/schematics/node_modules/jsonc-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", @@ -4817,14 +3867,6 @@ "sourcemap-codec": "^1.4.4" } }, - "node_modules/@ngx-formly/schematics/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ngx-formly/schematics/node_modules/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -4833,12 +3875,6 @@ "node": ">= 8" } }, - "node_modules/@ngx-formly/schematics/node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" - }, "node_modules/@ngx-translate/core": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-14.0.0.tgz", @@ -4852,7 +3888,7 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, @@ -4864,51 +3900,8 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.scandir/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/@nodelib/fs.scandir/node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/@nodelib/fs.stat": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, @@ -4929,39 +3922,63 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.walk/node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@nodelib/fs.walk/node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/fs": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { - "semver": "^7.3.5" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.2", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "dev": true, @@ -4976,8 +3993,22 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@npmcli/node-gyp": { - "version": "2023.10.0-SNAPSHOT", + "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, @@ -4986,7 +4017,7 @@ } }, "node_modules/@npmcli/promise-spawn": { - "version": "2023.10.0-SNAPSHOT", + "version": "6.0.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, @@ -4997,12 +4028,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", @@ -5019,7 +4044,7 @@ } }, "node_modules/@npmcli/run-script": { - "version": "2023.10.0-SNAPSHOT", + "version": "6.0.2", "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, @@ -5034,119 +4059,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/run-script/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/@npmcli/run-script/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@npmcli/run-script/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@npmcli/run-script/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@npmcli/run-script/node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", @@ -5163,7 +4075,7 @@ } }, "node_modules/@pkgjs/parseargs": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, @@ -5188,6 +4100,12 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/angular/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/@sigstore/bundle": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", @@ -5200,7 +4118,7 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@sigstore/bundle/node_modules/@sigstore/protobuf-specs": { + "node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", @@ -5223,13 +4141,13 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "node_modules/@sigstore/sign/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { @@ -5285,9 +4203,9 @@ } }, "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5306,98 +4224,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@sigstore/tuf/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sigstore/tuf/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@sigstore/tuf/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@sigstore/tuf/node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@socket.io/component-emitter": { - "version": "2023.10.0-SNAPSHOT", + "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, "node_modules/@stencil/core": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.22.3", "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==", "bin": { @@ -5409,7 +4243,7 @@ } }, "node_modules/@tootallnate/once": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, @@ -5442,7 +4276,7 @@ "dev": true }, "node_modules/@tufjs/canonical-json": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "dev": true, @@ -5451,7 +4285,7 @@ } }, "node_modules/@tufjs/models": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "dev": true, @@ -5488,50 +4322,88 @@ } }, "node_modules/@types/body-parser": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" } }, - "node_modules/@types/connect": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, - "node_modules/@types/cookie": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/eslint": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -5541,9 +4413,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "dependencies": { "@types/node": "*", @@ -5552,28 +4424,25 @@ "@types/send": "*" } }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.17.36", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", - "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "@types/node": "*" } }, - "node_modules/@types/http-errors": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true - }, "node_modules/@types/jasmine": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.5.tgz", - "integrity": "sha512-9YHUdvuNDDRJYXZwHqSsO72Ok0vmqoJbNn73ttyITQp/VA60SarnZ+MPLD37rJAhVoKp+9BWOvJP5tHIRfZylQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.2.tgz", + "integrity": "sha512-lKkWBcbxEZX/7nxPqEtv/OjPLaBa2j0o+hmv5Yn83b/+11C1kfBAkgvmrb13WDkmizUJ3B+jYrWh4M0YRtrzEQ==", "dev": true }, "node_modules/@types/jasminewd2": { @@ -5586,27 +4455,27 @@ } }, "node_modules/@types/json-schema": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/mime": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", "dev": true }, "node_modules/@types/node-forge": { @@ -5618,26 +4487,32 @@ "@types/node": "*" } }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true + }, "node_modules/@types/q": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", "dev": true }, "node_modules/@types/qs": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/retry": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true @@ -5648,26 +4523,35 @@ "integrity": "sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, "node_modules/@types/send": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, - "node_modules/@types/send/node_modules/@types/mime": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", - "dev": true + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } }, "node_modules/@types/serve-static": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -5675,27 +4559,46 @@ "@types/node": "*" } }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/uuid": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.3.tgz", - "integrity": "sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.2.tgz", + "integrity": "sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==", "dev": true }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", - "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz", + "integrity": "sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/type-utils": "6.6.0", - "@typescript-eslint/utils": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/type-utils": "6.2.0", + "@typescript-eslint/utils": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -5716,26 +4619,31 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", - "dev": true + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz", + "integrity": "sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", - "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz", + "integrity": "sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/utils": "6.2.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -5756,9 +4664,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz", + "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5769,13 +4677,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", - "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz", + "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5796,17 +4704,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", - "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.0.tgz", + "integrity": "sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", "semver": "^7.5.4" }, "engines": { @@ -5820,6 +4728,43 @@ "eslint": "^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz", + "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5847,6 +4792,21 @@ "node": ">=10" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/parser": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.0.tgz", @@ -5892,6 +4852,46 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz", + "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz", + "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz", @@ -5909,30 +4909,79 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", - "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "node_modules/@typescript-eslint/parser/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "node_modules/@typescript-eslint/parser/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.48.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz", + "integrity": "sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/visitor-keys": "5.48.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -5966,7 +5015,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "5.48.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz", "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==", @@ -5979,7 +5028,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "5.48.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz", "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==", @@ -6006,126 +5055,33 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz", - "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.48.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/type-utils/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "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" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz", - "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz", - "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.2.0", - "@typescript-eslint/visitor-keys": "6.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz", - "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.2.0", - "eslint-visitor-keys": "^3.4.1" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/@typescript-eslint/utils": { @@ -6154,76 +5110,7 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@typescript-eslint/utils/node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", - "dev": true - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz", - "integrity": "sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz", - "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz", - "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "5.48.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz", "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==", @@ -6240,65 +5127,8 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/utils/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "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" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.6.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@webassemblyjs/ast": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, @@ -6308,25 +5138,25 @@ } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, @@ -6337,13 +5167,13 @@ } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, @@ -6355,7 +5185,7 @@ } }, "node_modules/@webassemblyjs/ieee754": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, @@ -6364,7 +5194,7 @@ } }, "node_modules/@webassemblyjs/leb128": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, @@ -6373,13 +5203,13 @@ } }, "node_modules/@webassemblyjs/utf8": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, @@ -6395,7 +5225,7 @@ } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, @@ -6407,5495 +5237,2285 @@ "@webassemblyjs/utf8": "1.11.1" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ajv/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/angular-mydatepicker": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.5.tgz", - "integrity": "sha512-nKXUA3NhzMJ02jX+AiqpEr0kl2lCS3tGaFeHcyBFhwlDao9BO9i3403NXaFliOCeN2M4VvUNQs8pggLE7DECIA==", - "dependencies": { - "tslib": "^1.9.0" - } - }, - "node_modules/angular-mydatepicker/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/aproba": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/are-we-there-yet": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/are-we-there-yet/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/aria-query/node_modules/deep-equal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", - "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.1", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/aria-query/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aria-query/node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-buffer-byte-length/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "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.10", - "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.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-includes/node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-includes/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes/node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "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.10", - "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.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flat/node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/array.prototype.flat/node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flat/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat/node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "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.10", - "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.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flatmap/node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/array.prototype.flatmap/node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flatmap/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap/node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/autoprefixer/node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/aws-sign2": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/axobject-query/node_modules/deep-equal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", - "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.1", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/axobject-query/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query/node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-loader/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/balanced-match": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64id": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/batch": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/bl/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/blocking-proxy": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "blocking-proxy": "built/lib/bin.js" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/blocking-proxy/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/boolbase": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/braces/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserstack": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", - "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", - "dev": true, - "dependencies": { - "https-proxy-agent": "^2.2.1" - } - }, - "node_modules/browserstack/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/browserstack/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/browserstack/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/buffer": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/builtins": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bytes": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", - "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^8.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacache/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/cacache/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/caseless": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "node_modules/chalk": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chart.js": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", - "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chartjs-adapter-date-fns": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-3.0.0.tgz", - "integrity": "sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg==", - "peerDependencies": { - "chart.js": ">=2.8.0", - "date-fns": ">=2.0.0" - } - }, - "node_modules/chartjs-plugin-zoom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", - "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", - "dependencies": { - "hammerjs": "^2.0.8" - }, - "peerDependencies": { - "chart.js": ">=3.2.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/chokidar/node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chokidar/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/chokidar/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "node_modules/chrome-trace-event": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, - "engines": { - "node": ">=6.0" + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/classlist.js": { - "version": "1.1.20150312", - "resolved": "https://registry.npmjs.org/classlist.js/-/classlist.js-1.1.20150312.tgz", - "integrity": "sha512-eR8yB970+yGslcTnJnROX2icsMa8v/KVLv/sgv3NhSvZSHgam64XNSF2TyJnKIfsnTFJBcTdrIneYqUIrvxLpg==" + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, - "node_modules/clean-stack": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/cli-cursor": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/cli-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" } }, - "node_modules/cli-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "dev": true, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "node_modules/cli-cursor/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" }, "engines": { - "node": ">=8" + "node": ">=8.9" } }, - "node_modules/cli-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/cli-width": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, "engines": { - "node": ">= 10" + "node": ">=8.9.0" } }, - "node_modules/cliui": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/adm-zip": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "engines": { + "node": ">=6.0" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "debug": "4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 6.0.0" } }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "humanize-ms": "^1.2.1" }, "engines": { - "node": ">=7.0.0" + "node": ">= 8.0.0" } }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dependencies": { - "ansi-regex": "^5.0.1" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/clone": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" + "node_modules/angular-mydatepicker": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.5.tgz", + "integrity": "sha512-nKXUA3NhzMJ02jX+AiqpEr0kl2lCS3tGaFeHcyBFhwlDao9BO9i3403NXaFliOCeN2M4VvUNQs8pggLE7DECIA==", + "dependencies": { + "tslib": "^1.9.0" } }, - "node_modules/clone-deep": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/angular-mydatepicker/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, "engines": { "node": ">=6" } }, - "node_modules/color-convert": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-convert/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/color-name": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, + "engines": [ + "node >= 0.8.0" + ], "bin": { - "color-support": "bin.js" + "ansi-html": "bin/ansi-html" } }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/combined-stream": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/commander": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/comment-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", - "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, "engines": { - "node": ">= 12.0.0" + "node": ">=14" } }, - "node_modules/commondir": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==" - }, - "node_modules/compressible": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/compression": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "deep-equal": "^2.0.5" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { - "ms": "2.0.0" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/connect": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "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" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/connect-history-api-fallback": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { - "node": ">=0.8" + "node": ">=8" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { - "ee-first": "1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/console-control-strings": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "node_modules/cookie": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.8" } }, - "node_modules/cookie-signature": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "node_modules/copy-anything": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "is-what": "^3.14.1" + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { - "webpack": "^5.1.0" + "postcss": "^8.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": "*" } }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "deep-equal": "^2.0.5" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "node_modules/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/copy-webpack-plugin/node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/copy-webpack-plugin/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" }, - "engines": { - "node": ">=8.6" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/copy-webpack-plugin/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/copy-webpack-plugin/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, - "engines": { - "node": ">=8.6" + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/copy-webpack-plugin/node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.0" + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "^4.5.0 || >= 5.9" } }, - "node_modules/copy-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "dependencies": { - "randombytes": "^2.1.0" + "tweetnacl": "^0.14.3" } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/core-util-is": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true, + "engines": { + "node": ">=8" + } }, - "node_modules/cors": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "minimist": "^1.2.0" + }, + "bin": { + "blocking-proxy": "built/lib/bin.js" }, "engines": { - "node": ">= 0.10" + "node": ">=6.9.x" } }, - "node_modules/cosmiconfig": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "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" }, "engines": { - "node": ">=10" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/cosmiconfig/node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, - "node_modules/cosmiconfig/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", - "pretty-bytes": "^5.3.0" + "ms": "2.0.0" } }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, "engines": { - "node": ">=8" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/critters/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/critters/node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "node_modules/browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", "dev": true, "dependencies": { - "parse5": "^6.0.1" + "https-proxy-agent": "^2.2.1" } }, - "node_modules/critters/node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/browserstack/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "es6-promisify": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/browserstack/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "ms": "^2.1.1" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/browserstack/node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "agent-base": "^4.3.0", + "debug": "^3.1.0" }, "engines": { - "node": ">= 8" + "node": ">= 4.5.0" } }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/cross-spawn/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/cross-spawn/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" + "semver": "^7.0.0" } }, - "node_modules/cross-spawn/node_modules/shebang-regex": { + "node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/cacache": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", + "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^8.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=12" } }, - "node_modules/css-loader/node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=6" } }, - "node_modules/css-loader/node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=6" } }, - "node_modules/css-loader/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "node_modules/caniuse-lite": { + "version": "1.0.30001576", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, - "node_modules/css-loader/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "node_modules/css-select": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select/node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, + "node_modules/chart.js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz", + "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==", "dependencies": { - "boolbase": "^1.0.0" + "@kurkle/color": "^0.3.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/css-what": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "pnpm": ">=7" } }, - "node_modules/cssesc": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "node_modules/chartjs-adapter-date-fns": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-3.0.0.tgz", + "integrity": "sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg==", + "peerDependencies": { + "chart.js": ">=2.8.0", + "date-fns": ">=2.0.0" } }, - "node_modules/custom-event": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "node_modules/chartjs-plugin-zoom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", + "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" + "hammerjs": "^2.0.8" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "chart.js": ">=3.2.0" } }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "internmap": "1 - 2" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=12" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/d3-array/node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=6.0" } }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, + "node_modules/classlist.js": { + "version": "1.1.20150312", + "resolved": "https://registry.npmjs.org/classlist.js/-/classlist.js-1.1.20150312.tgz", + "integrity": "sha512-eR8yB970+yGslcTnJnROX2icsMa8v/KVLv/sgv3NhSvZSHgam64XNSF2TyJnKIfsnTFJBcTdrIneYqUIrvxLpg==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dependencies": { - "d3-path": "1 - 3" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "engines": { - "node": ">=12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dependencies": { - "d3-array": "^3.2.0" - }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "dependencies": { - "delaunator": "5" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, - "node_modules/d3-delaunay/node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, + "color-name": "1.1.3" + } + }, + "node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" + "color-support": "bin.js" } }, - "node_modules/d3-dsv/node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=0.1.90" } }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { - "d3-dsv": "1 - 3" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "node_modules/comment-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", + "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">= 12.0.0" } }, - "node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compare-versions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, "dependencies": { - "d3-array": "2.5.0 - 3" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, "dependencies": { - "d3-color": "1 - 3" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.10.0" } }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=0.8" } }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" + "ee-first": "1.1.1" }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { - "d3-array": "2 - 3" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" + "is-what": "^3.14.1" }, - "peerDependencies": { - "d3-selection": "2 - 3" + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/dashdash": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=0.10" + "node": ">=10.13.0" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "node_modules/core-js-compat": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "url": "https://opencollective.com/core-js" } }, - "node_modules/date-fns/node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "node_modules/core-js-compat/node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "regenerator-runtime": "^0.14.0" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/date-fns/node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "dependencies": { - "ms": "2.1.2" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.10" } }, - "node_modules/decamelize": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/deep-is": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/default-gateway": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "dev": true, "dependencies": { - "execa": "^5.0.0" + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/define-lazy-prop": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/define-properties/node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/del": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "dev": true, "dependencies": { - "array-uniq": "^1.0.1" + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" }, "engines": { - "node": ">=0.10.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/del/node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/del/node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/del/node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "dependencies": { - "is-path-inside": "^1.0.0" + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/del/node_modules/is-path-inside": { + "node_modules/custom-event": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", - "dev": true, + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "dependencies": { - "path-is-inside": "^1.0.1" + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/del/node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dependencies": { - "glob": "^7.1.3" + "internmap": "1 - 2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=12" } }, - "node_modules/delayed-stream": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "engines": { - "node": ">=0.4.0" + "node": ">=12" } }, - "node_modules/delegates": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/dependency-graph": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=12" } }, - "node_modules/destroy": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=12" } }, - "node_modules/detect-node": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/di": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "node_modules/diff": { + "node_modules/d3-contour": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">=12" } }, - "node_modules/dir-glob": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dependencies": { - "path-type": "^4.0.0" + "delaunator": "5" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/doctrine": { + "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dependencies": { - "esutils": "^2.0.2" + "d3-dispatch": "1 - 3", + "d3-selection": "3" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/dom-serialize": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" } }, - "node_modules/dom-serialize/node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/dom-serializer": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "d3-dsv": "1 - 3" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">=12" } }, - "node_modules/domelementtype": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dependencies": { - "domelementtype": "^2.2.0" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">=12" } }, - "node_modules/domutils": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" } }, - "node_modules/eastasianwidth": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecc-jsbn/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/ee-first": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, + "d3-array": "2.5.0 - 3" + }, "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/encodeurl": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/encoding": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dependencies": { - "iconv-lite": "^0.6.2" + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ent": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "node_modules/entities": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" } }, - "node_modules/env-paths": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/err-code": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } }, - "node_modules/errno": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" } }, - "node_modules/error-ex": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dependencies": { - "is-arrayish": "^0.2.1" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "dependencies": { - "get-intrinsic": "^1.2.4" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" }, "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es-module-lexer": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/es-to-primitive": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "d3-path": "^3.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/es-to-primitive/node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dependencies": { - "has-tostringtag": "^1.0.0" + "d3-array": "2 - 3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/es-to-primitive/node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { - "has-symbols": "^1.0.2" + "d3-time": "1 - 3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/es6-promise": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "node_modules/es6-promisify": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "dev": true, - "dependencies": { - "es6-promise": "^4.0.3" + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" } }, - "node_modules/esbuild": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz", - "integrity": "sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { "node": ">=12" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.8", - "@esbuild/android-arm64": "0.17.8", - "@esbuild/android-x64": "0.17.8", - "@esbuild/darwin-arm64": "0.17.8", - "@esbuild/darwin-x64": "0.17.8", - "@esbuild/freebsd-arm64": "0.17.8", - "@esbuild/freebsd-x64": "0.17.8", - "@esbuild/linux-arm": "0.17.8", - "@esbuild/linux-arm64": "0.17.8", - "@esbuild/linux-ia32": "0.17.8", - "@esbuild/linux-loong64": "0.17.8", - "@esbuild/linux-mips64el": "0.17.8", - "@esbuild/linux-ppc64": "0.17.8", - "@esbuild/linux-riscv64": "0.17.8", - "@esbuild/linux-s390x": "0.17.8", - "@esbuild/linux-x64": "0.17.8", - "@esbuild/netbsd-x64": "0.17.8", - "@esbuild/openbsd-x64": "0.17.8", - "@esbuild/sunos-x64": "0.17.8", - "@esbuild/win32-arm64": "0.17.8", - "@esbuild/win32-ia32": "0.17.8", - "@esbuild/win32-x64": "0.17.8" + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/esbuild-wasm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz", - "integrity": "sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, "engines": { "node": ">=12" } }, - "node_modules/escape-html": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" }, - "bin": { - "eslint": "bin/eslint.js" + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.11" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, + "node_modules/date-fns/node_modules/@babel/runtime": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/date-fns/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=4.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "ms": "2.1.2" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/eslint-import-resolver-node/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, "engines": { "node": ">= 0.4" }, @@ -11903,1047 +7523,1102 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "dependencies": { - "debug": "^3.2.7" + "execa": "^5.0.0" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">= 10" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dependencies": { - "ms": "^2.1.1" + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-jsdoc": { - "version": "45.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-45.0.0.tgz", - "integrity": "sha512-l2+Jcs/Ps7oFA+SWY+0sweU/e5LgricnEl6EsDlyRTF5y0+NWL1y9Qwz9PHwHAxtdJq6lxPjEQWmYLMkvhzD4g==", + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.39.4", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "semver": "^7.5.1", - "spdx-expression-parse": "^3.0.1" + "array-uniq": "^1.0.1" }, "engines": { - "node": ">=16" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/del/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true, - "peerDependencies": { - "eslint": ">=2.0.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-unused-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", - "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", + "node_modules/del/node_modules/globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", "dev": true, "dependencies": { - "eslint-rule-composer": "^0.3.0" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "6 - 7", - "eslint": "8" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "node_modules/del/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "glob": "^7.1.3" }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { - "node": ">=8.0.0" + "node": ">=0.4.0" } }, - "node_modules/eslint-utils": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "node": ">= 0.8" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true, "engines": { - "node": ">=10" + "node": ">= 0.6.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=0.3.1" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "path-type": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "esutils": "^2.0.2" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.0.0" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "engines": { - "node": ">=4.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "domelementtype": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">= 4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.628", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.628.tgz", + "integrity": "sha512-2k7t5PHvLsufpP6Zwk0nof62yLOsCf032wZx7/q0mv8gwlXjhcxI3lz6f0jBr0GrnWKcm3burXzI3t5IrcdUxw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/eslint/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "iconv-lite": "^0.6.2" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" }, "engines": { - "node": ">=8" + "node": ">=10.2.0" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" + "node": ">=10.13.0" } }, - "node_modules/esrecurse": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "engines": { - "node": ">=4.0" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/estraverse": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/esutils": { + "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter-asyncresource": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/eventemitter3": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } }, - "node_modules/events": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "engines": { - "node": ">=0.8.x" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/execa": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "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.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "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.13" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/faye-websocket": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "websocket-driver": ">=0.5.1" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "hasown": "^2.0.0" } }, - "node_modules/file-entry-cache/node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/file-entry-cache/node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, - "node_modules/file-saver-es": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver-es/-/file-saver-es-2.0.5.tgz", - "integrity": "sha512-Kg0lt+is9nOyi/VDms9miScNGot25jVFbjFccXuCL/shd2Q+rt70MALxHVkXllsX83JEBLiHQNjDPGd/6FIOoQ==" - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "dev": true, "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" + "es6-promise": "^4.0.3" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz", + "integrity": "sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, - "node_modules/find-cache-dir": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "debug": "^3.2.7" }, "engines": { - "node": ">=8" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/find-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "ms": "^2.1.1" } }, - "node_modules/find-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" }, "engines": { - "node": ">=6" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/find-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" + "ms": "^2.1.1" } }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" + "dependencies": { + "esutils": "^2.0.2" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/for-each": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "is-callable": "^1.1.3" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/foreground-child": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "node_modules/eslint-plugin-jsdoc": { + "version": "45.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-45.0.0.tgz", + "integrity": "sha512-l2+Jcs/Ps7oFA+SWY+0sweU/e5LgricnEl6EsDlyRTF5y0+NWL1y9Qwz9PHwHAxtdJq6lxPjEQWmYLMkvhzD4g==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "@es-joy/jsdoccomment": "~0.39.4", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.3.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "semver": "^7.5.1", + "spdx-expression-parse": "^3.0.1" }, "engines": { - "node": ">=14" + "node": ">=16" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true, - "engines": { - "node": "*" + "peerDependencies": { + "eslint": ">=2.0.0" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/eslint-plugin-unused-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", + "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "eslint-rule-composer": "^0.3.0" }, "engines": { - "node": ">= 0.12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "6 - 7", + "eslint": "8" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } } }, - "node_modules/forwarded": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4.0.0" } }, - "node_modules/fresh": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">= 0.6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=10" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/functions-have-names": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/gauge": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "color-convert": "^2.0.1" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-intrinsic/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/get-stream": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=10" }, @@ -12951,1852 +8626,2190 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": "*" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob-to-regexp": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/glob/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/glob/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "wrappy": "1" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/glob/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/globals": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/globby": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/globby/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=0.10" } }, - "node_modules/globby/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 6" + "node": ">=4.0" } }, - "node_modules/globby/node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">= 8" + "node": ">=4.0" } }, - "node_modules/globby/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, "engines": { - "node": ">=8.6" + "node": ">=4.0" } }, - "node_modules/globby/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.10.0" } }, - "node_modules/gopd": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true }, - "node_modules/hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "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" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/handle-thing": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, "engines": { "node": ">=4" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">= 0.4.0" + "node": ">=8.6.0" } }, - "node_modules/has-bigints": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/has-symbols": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "websocket-driver": ">=0.5.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "dependencies": { - "has-symbols": "^1.0.3" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-unicode": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "function-bind": "^1.1.2" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">= 0.4" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/hosted-git-info": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, + "node_modules/file-saver-es": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver-es/-/file-saver-es-2.0.5.tgz", + "integrity": "sha512-Kg0lt+is9nOyi/VDms9miScNGot25jVFbjFccXuCL/shd2Q+rt70MALxHVkXllsX83JEBLiHQNjDPGd/6FIOoQ==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, "dependencies": { - "lru-cache": "^7.5.1" + "to-regex-range": "^5.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/hpack.js": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "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" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/hpack.js/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/hpack.js/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "ms": "2.0.0" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/hpack.js/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/http-parser-js": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 6" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/http-proxy-middleware": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" + "node": ">=4.0" }, "peerDependenciesMeta": { - "@types/express": { + "debug": { "optional": true } } }, - "node_modules/http-proxy-middleware/node_modules/@types/http-proxy": { - "version": "1.17.12", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.12.tgz", - "integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "@types/node": "*" + "is-callable": "^1.1.3" } }, - "node_modules/http-proxy-middleware/node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=8.6" + "node": ">= 0.12" } }, - "node_modules/http-proxy-middleware/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "engines": { - "node": ">=8.6" + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/http-proxy-middleware/node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=6 <7 || >=8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/human-signals": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/humanize-ms": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { - "ms": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/icss-utils": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=8.0.0" } }, - "node_modules/image-size": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "assert-plus": "^1.0.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/indent-string": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, - "node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" } }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "define-properties": "^1.1.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "get-intrinsic": "^1.1.3" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", "engines": { - "node": ">=7.0.0" + "node": ">=0.8.0" } }, - "node_modules/inquirer/node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, "engines": { "node": ">=4" } }, - "node_modules/inquirer/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/inquirer/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/inquirer/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/inquirer/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/inquirer/node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=0.12.0" + "node": ">=4" } }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "tslib": "^2.1.0" + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, - "node_modules/inquirer/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { - "os-tmpdir": "~1.0.2" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=0.6.0" + "node": ">= 0.4" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" } }, - "node_modules/ionicons": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.1.3.tgz", - "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==", - "dependencies": { - "@stencil/core": "^2.18.0" - } + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">= 12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ipaddr.js": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=12" } }, - "node_modules/is-arguments": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/is-arrayish": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/is-callable": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "has": "^1.0.3" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" } }, - "node_modules/is-docker": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "bin": { - "is-docker": "cli.js" + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-plain-obj": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, "engines": { - "node": ">=10" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/is-plain-object": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/is-stream": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "agent-base": "6", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 6" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.17.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "^2.0.0" } }, - "node_modules/is-what": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "is-docker": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/isobject": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "minimatch": "^9.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "semver": "^7.5.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "optional": true, + "bin": { + "image-size": "bin/image-size.js" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "node_modules/istanbul-reports/node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, - "node_modules/jasmine-spec-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", - "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { - "colors": "1.4.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, "engines": { "node": ">=12.0.0" } }, - "node_modules/jsesc": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/json5/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/jsonparse": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "node_modules/inquirer/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "engines": [ - "node >= 0.2.0" - ] + "dependencies": { + "tslib": "^2.1.0" + } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=8" } }, - "node_modules/jszip": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/jszip/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/jszip/node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } }, - "node_modules/jszip/node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, + "node_modules/ionicons": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.1.3.tgz", + "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==", "dependencies": { - "immediate": "~3.0.5" + "@stencil/core": "^2.18.0" } }, - "node_modules/jszip/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/jszip/node_modules/process-nextick-args": { + "node_modules/ip": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", "dev": true }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">= 10" } }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/jszip/node_modules/string_decoder": { + "node_modules/is-arguments": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jszip/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/karma": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", - "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" + "has-bigints": "^1.0.1" }, - "bin": { - "karma": "bin/karma" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/karma-chrome-launcher": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", - "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { - "which": "^1.2.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma-chrome-launcher/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "hasown": "^2.0.0" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma-coverage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", - "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/mattlewis92" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { - "jasmine-core": "^4.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, - "peerDependencies": { - "karma": "^6.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", - "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", "dev": true, - "peerDependencies": { - "jasmine-core": "^4.0.0 || ^5.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "dependencies": { - "source-map-support": "^0.5.5" + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/@types/cors": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", - "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", "dev": true, "dependencies": { - "@types/node": "*" + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "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" + "isobject": "^3.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "ms": "2.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma/node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "dev": true, - "engines": { - "node": ">=4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma/node_modules/engine.io": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", - "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=10.2.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma/node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma/node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma/node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/karma/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "which-typed-array": "^1.1.11" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/karma/node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/karma/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/karma/node_modules/isbinaryfile": { + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", @@ -14808,2292 +10821,2468 @@ "url": "https://github.com/sponsors/gjtorikian/" } }, - "node_modules/karma/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "node_modules/karma/node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/karma/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/karma/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { - "minimist": "^1.2.6" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/karma/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/karma/node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "engines": { - "node": ">=0.9" - } - }, - "node_modules/karma/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/karma/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/karma/node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/karma/node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/karma/node_modules/socket.io": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", - "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" + "semver": "^7.5.3" }, "engines": { - "node": ">=10.2.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma/node_modules/socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "debug": "~4.3.4", - "ws": "~8.11.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/karma/node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" } }, - "node_modules/karma/node_modules/source-map": { + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/karma/node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=8.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/karma/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" }, - "engines": { - "node": ">=8" + "bin": { + "jasmine": "bin/jasmine.js" } }, - "node_modules/karma/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/jasmine-core": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", + "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", + "dev": true + }, + "node_modules/jasmine-spec-reporter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "colors": "1.4.0" } }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/jasmine/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "rimraf": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8.17.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/karma/node_modules/ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "node_modules/jasmine/node_modules/jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", + "dev": true + }, + "node_modules/jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], "engines": { - "node": "*" + "node": ">= 6.9.x" } }, - "node_modules/karma/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">= 10.13.0" } }, - "node_modules/karma/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "json-buffer": "3.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/kind-of": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" } }, - "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" + "bin": { + "jsesc": "bin/jsesc" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { - "lessc": "bin/lessc" + "json5": "lib/cli.js" }, "engines": { "node": ">=6" - }, + } + }, + "node_modules/jsonc-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", + "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" + "graceful-fs": "^4.1.6" } }, - "node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "dependencies": { - "klona": "^2.0.4" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" + "node": ">=0.6.0" } }, - "node_modules/less-loader/node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, - "engines": { - "node": ">= 8" + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, - "node_modules/less/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "optional": true + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "optional": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" + "safe-buffer": "~5.1.0" } }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/karma": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", "dev": true, - "optional": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, "bin": { - "mime": "cli.js" + "karma": "bin/karma" }, "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/less/node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, - "optional": true, "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" }, "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" + "which": "bin/which" } }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, - "optional": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" } }, - "node_modules/less/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/karma-coverage-istanbul-reporter/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/levn/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/levn/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/karma-coverage-istanbul-reporter/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "webpack-sources": "^3.0.0" + "glob": "^7.1.3" }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } + "bin": { + "rimraf": "bin.js" } }, - "node_modules/license-webpack-plugin/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "node_modules/karma-coverage-istanbul-reporter/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "engines": { - "node": ">=10.13.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/lines-and-columns": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "node_modules/karma-coverage-istanbul-reporter/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">= 12.13.0" + "node": ">=0.10.0" } }, - "node_modules/locate-path": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "jasmine-core": "^4.1.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "karma": "^6.0.0" } }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.debounce": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "node_modules/karma-jasmine-html-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", + "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", + "dev": true, + "peerDependencies": { + "jasmine-core": "^4.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/magic-string": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/magic-string/node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/karma/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.0.0" } }, - "node_modules/merge-descriptors": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/methods": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/karma/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "rimraf": "^3.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=8.17.0" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "schema-utils": "^4.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=10" } }, - "node_modules/mini-css-extract-plugin/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=10" } }, - "node_modules/minimalistic-assert": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, "engines": { "node": ">= 8" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "klona": "^2.0.4" }, "engines": { - "node": ">= 8" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "optional": true, "dependencies": { - "yallist": "^4.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/minipass-json-stream": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "optional": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "optional": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "webpack-sources": "^3.0.0" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } } }, - "node_modules/minipass-sized": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" + "immediate": "~3.0.5" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6.11.5" } }, - "node_modules/minizlib": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, "engines": { - "node": ">= 8" + "node": ">= 12.13.0" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/multicast-dns": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, - "bin": { - "multicast-dns": "cli.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multicast-dns/node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ng2-charts": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-4.1.1.tgz", - "integrity": "sha512-iHwXDbmX86lfeH8VRcsaW2tJATsuAZo4kvvC/Yk2l35zOHjevja1qBvO6BAibiDazi9r9aS6ZRJOqWPsz1pP2w==", + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "lodash-es": "^4.17.15", - "tslib": "^2.3.0" + "color-name": "~1.1.4" }, - "peerDependencies": { - "@angular/cdk": ">=14.0.0", - "@angular/common": ">=14.0.0", - "@angular/core": ">=14.0.0", - "chart.js": "^3.4.0 || ^4.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/ngx-cookie-service": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-15.0.0.tgz", - "integrity": "sha512-KU1JCjfpDTvD6L0FhHN9W/oP3Sue8yMAAK6XY3h/MEhrPS7vx6t3+h0ulY8l8R/9d1cmlQVyTHn1Jd1Jdf5K+g==", + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "tslib": "^2.0.0" + "has-flag": "^4.0.0" }, - "peerDependencies": { - "@angular/common": "^15.0.0", - "@angular/core": "^15.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/ngx-spinner": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/ngx-spinner/-/ngx-spinner-15.0.1.tgz", - "integrity": "sha512-7DjETmBpuXTwI68ad1xMKpwt4Cyz1eyu8E7AJcFiKa+8JAnbo0k1qfvWur0aemncRNxDxHoyl6jw42MsnE/B+g==", + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, "dependencies": { - "tslib": "^2.3.0" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" }, - "peerDependencies": { - "@angular/common": "^15.0.0", - "@angular/core": "^15.0.0" + "engines": { + "node": ">=8.0" } }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" + "yallist": "^3.0.2" } }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", "dev": true, - "optional": true + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/node-forge": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">= 6.13.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "optional": true, "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "semver": "bin/semver.js" } }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node_modules/nopt": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/normalize-package-data": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/normalize-range": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm-bundled": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/npm-normalize-package-bin": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-packlist": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "dependencies": { - "ignore-walk": "^6.0.0" + "minipass": "^3.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm-packlist/node_modules/brace-expansion": { + "node_modules/make-fetch-happen/node_modules/unique-filename": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm-packlist/node_modules/ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "dependencies": { - "minimatch": "^9.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm-packlist/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.6" } }, - "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" + "fs-monkey": "^1.0.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "node_modules/npm-pick-manifest/node_modules/npm-install-checks": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.6" } }, - "node_modules/npm-registry-fetch": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8.6" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "mime-db": "1.52.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": ">= 0.6" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=6" } }, - "node_modules/npm-run-path": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/mini-css-extract-plugin": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, - "node_modules/npmlog": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/npmlog/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.values/node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "dependencies": { - "possible-typed-array-names": "^1.0.0" + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">= 0.4" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/object.values/node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "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.10", - "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.10" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/object.values/node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.values/node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" } }, - "node_modules/object.values/node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.values/node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "minipass": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/object.values/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/object.values/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.values/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/object.values/node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 8" } }, - "node_modules/object.values/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.values/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/object.values/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/object.values/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/object.values/node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, + "optional": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" }, - "engines": { - "node": ">= 0.4" + "bin": { + "needle": "bin/needle" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 4.4.x" } }, - "node_modules/object.values/node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/ng2-charts": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-4.1.1.tgz", + "integrity": "sha512-iHwXDbmX86lfeH8VRcsaW2tJATsuAZo4kvvC/Yk2l35zOHjevja1qBvO6BAibiDazi9r9aS6ZRJOqWPsz1pP2w==", + "dependencies": { + "lodash-es": "^4.17.15", + "tslib": "^2.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@angular/cdk": ">=14.0.0", + "@angular/common": ">=14.0.0", + "@angular/core": ">=14.0.0", + "chart.js": "^3.4.0 || ^4.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/object.values/node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, + "node_modules/ngx-cookie-service": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-15.0.0.tgz", + "integrity": "sha512-KU1JCjfpDTvD6L0FhHN9W/oP3Sue8yMAAK6XY3h/MEhrPS7vx6t3+h0ulY8l8R/9d1cmlQVyTHn1Jd1Jdf5K+g==", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" + "tslib": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@angular/common": "^15.0.0", + "@angular/core": "^15.0.0" } }, - "node_modules/object.values/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, + "node_modules/ngx-spinner": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/ngx-spinner/-/ngx-spinner-15.0.1.tgz", + "integrity": "sha512-7DjETmBpuXTwI68ad1xMKpwt4Cyz1eyu8E7AJcFiKa+8JAnbo0k1qfvWur0aemncRNxDxHoyl6jw42MsnE/B+g==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "tslib": "^2.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@angular/common": "^15.0.0", + "@angular/core": "^15.0.0" } }, - "node_modules/object.values/node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" } }, - "node_modules/object.values/node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "optional": true }, - "node_modules/object.values/node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6.13.0" } }, - "node_modules/obuf": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "dependencies": { - "ee-first": "1.1.1" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 0.8" + "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/on-headers": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", "dev": true, - "engines": { - "node": ">= 0.8" + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/optionator/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "node_modules/optionator/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1" + "abbrev": "^1.0.0" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/ora/node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora/node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, "dependencies": { - "clone": "^1.0.2" + "semver": "^7.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "ignore-walk": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora/node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, "dependencies": { - "defaults": "^1.0.3" + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/p-locate": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/p-retry": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, "engines": { - "node": ">= 4" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/pacote": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", - "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "boolbase": "^1.0.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/pacote/node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "*" } }, - "node_modules/pacote/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/pacote/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pacote/node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "dependencies": { - "minipass": "^7.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pacote/node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" } }, - "node_modules/pacote/node_modules/glob": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", - "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pacote/node_modules/glob/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pacote/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "node_modules/pacote/node_modules/jackspeak": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", - "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" + "ee-first": "1.1.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "node": ">= 0.8" } }, - "node_modules/pacote/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.8" } }, - "node_modules/pacote/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pacote/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/open": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", + "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pacote/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pacote/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pacote/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": ">=8" } }, - "node_modules/pacote/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.10.0" } }, - "node_modules/pacote/node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pacote/node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": "14 || >=16.14" + "node": ">=8" } }, - "node_modules/pacote/node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pacote/node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" + "@types/retry": "0.12.0", + "retry": "^0.13.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/pacote/node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/pacote/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "node_modules/pacote": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", + "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" }, "bin": { - "node-which": "bin/which.js" + "pacote": "lib/bin.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -17107,7 +13296,7 @@ } }, "node_modules/parse-json": { - "version": "2023.10.0-SNAPSHOT", + "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, @@ -17124,14 +13313,8 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "node_modules/parse-node-version": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, @@ -17140,16 +13323,10 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "devOptional": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", @@ -17177,8 +13354,29 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, "node_modules/parse5-sax-parser": { - "version": "2023.10.0-SNAPSHOT", + "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, @@ -17189,11 +13387,11 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { + "node_modules/parse5-sax-parser/node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.12" }, @@ -17201,6 +13399,18 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -17211,7 +13421,7 @@ } }, "node_modules/path-exists": { - "version": "2023.10.0-SNAPSHOT", + "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, @@ -17219,12 +13429,85 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -17237,10 +13520,31 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -17258,15 +13562,6 @@ "node": ">=0.10.0" } }, - "node_modules/pinkie-promise/node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/piscina": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", @@ -17281,31 +13576,8 @@ "nice-napi": "^1.0.2" } }, - "node_modules/piscina/node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/piscina/node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "node_modules/piscina/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "node_modules/pkg-dir": { - "version": "2023.10.0-SNAPSHOT", + "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, @@ -17316,15 +13588,6 @@ "node": ">=8" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -17371,20 +13634,43 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, "engines": { - "node": ">= 8" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz", + "integrity": "sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==", "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -17393,7 +13679,7 @@ } }, "node_modules/postcss-modules-values": { - "version": "2023.10.0-SNAPSHOT", + "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, @@ -17407,41 +13693,48 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-value-parser": { - "version": "2023.10.0-SNAPSHOT", + "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.8.0" } }, - "node_modules/postcss/node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/proc-log": { - "version": "2023.10.0-SNAPSHOT", + "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true, @@ -17449,6 +13742,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -17468,6 +13767,15 @@ "node": ">=10" } }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -17499,18 +13807,6 @@ "node": ">=10.13.x" } }, - "node_modules/protractor/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/protractor/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -17589,139 +13885,26 @@ "node": ">=7.0.0" } }, - "node_modules/protractor/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/protractor/node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/protractor/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/protractor/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/protractor/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", - "dev": true, - "dependencies": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/protractor/node_modules/jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", - "dev": true - }, - "node_modules/protractor/node_modules/jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", - "dev": true, - "engines": { - "node": ">= 6.9.x" - } - }, - "node_modules/protractor/node_modules/q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/protractor/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/protractor/node_modules/saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "node_modules/protractor/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "https-proxy-agent": "^2.2.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/protractor/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, "node_modules/protractor/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -17740,41 +13923,6 @@ "source-map": "^0.5.6" } }, - "node_modules/protractor/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/protractor/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -17796,12 +13944,6 @@ "node": ">=0.8.0" } }, - "node_modules/protractor/node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, "node_modules/protractor/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -17894,7 +14036,7 @@ } }, "node_modules/proxy-addr": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, @@ -17916,7 +14058,7 @@ } }, "node_modules/prr": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, @@ -17929,15 +14071,34 @@ "dev": true }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "engines": { "node": ">=6" } }, + "node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, "node_modules/qs": { - "version": "2023.10.0-SNAPSHOT", + "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, @@ -17951,27 +14112,42 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qs/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/qs/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" } }, "node_modules/raw-body": { @@ -17989,6 +14165,15 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -18001,42 +14186,213 @@ "node": ">=0.10.0" } }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/read-package-json-fast": { - "version": "2023.10.0-SNAPSHOT", + "version": "3.0.2", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, + "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" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/regenerate": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, "node_modules/regjsparser": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, @@ -18107,13 +14463,42 @@ "uuid": "bin/uuid" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -18149,24 +14534,6 @@ "node": ">=12" } }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/resolve-url-loader/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -18190,33 +14557,43 @@ "node": ">=0.10.0" } }, - "node_modules/resolve/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/resolve/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, "node_modules/retry": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "engines": { "node": ">= 4" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -18232,6 +14609,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/roboto-fontface": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz", @@ -18242,6 +14639,43 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -18259,13 +14693,13 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -18301,6 +14735,23 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.1.tgz", + "integrity": "sha512-Y5NejJTTliTyY4H7sipGqY+RX5P87i3F7c4Rcepy72nq+mNLhIsD0W4c7kEmduMDQCSqtPsXPlSTsFhh2LQv+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -18361,44 +14812,79 @@ } } }, - "node_modules/sass-loader/node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "node_modules/saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, + "dependencies": { + "https-proxy-agent": "^2.2.1" + }, "engines": { - "node": ">= 8" + "node": "*" } }, - "node_modules/sass-loader/node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "node_modules/saucelabs/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } }, - "node_modules/sass/node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "node_modules/saucelabs/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/saucelabs/node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "dev": true }, - "node_modules/sass/node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "dev": true - }, "node_modules/select-hose": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true @@ -18418,6 +14904,26 @@ "node": ">= 6.9.0" } }, + "node_modules/selenium-webdriver/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/selenium-webdriver/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -18430,6 +14936,31 @@ "rimraf": "bin.js" } }, + "node_modules/selenium-webdriver/node_modules/tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", @@ -18457,8 +14988,14 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/send": { - "version": "2023.10.0-SNAPSHOT", + "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, @@ -18496,35 +15033,23 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "randombytes": "^2.1.0" } }, "node_modules/serve-index": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, @@ -18602,7 +15127,7 @@ } }, "node_modules/serve-static": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, @@ -18616,37 +15141,43 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", "dev": true, "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/set-function-length/node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, "node_modules/setimmediate": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true @@ -18658,711 +15189,530 @@ "dev": true }, "node_modules/shallow-clone": { - "version": "2023.10.0-SNAPSHOT", + "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/sockjs": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", - "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/source-map": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", - "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, - "node_modules/source-map-loader/node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-correct/node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-expression-parse/node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse/node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/spdy": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "dependencies": { + "kind-of": "^6.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/spdy-transport": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/spdy-transport/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/spdy-transport/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "node_modules/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "dev": true, "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" }, "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "sigstore": "bin/sigstore.js" }, "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sshpk/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { - "minipass": "^7.0.3" + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "node_modules/sigstore/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">= 0.8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, "engines": { - "node": ">= 0.4" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/stop-iteration-iterator/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stop-iteration-iterator/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/stop-iteration-iterator/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/socket.io": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.3.tgz", + "integrity": "sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10.2.0" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "ws": "~8.11.0" } }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "node_modules/string.prototype.trim/node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "dependencies": { - "possible-typed-array-names": "^1.0.0" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "node_modules/string.prototype.trim/node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "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.10", - "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.10" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10" } }, - "node_modules/string.prototype.trim/node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "node_modules/string.prototype.trim/node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trim/node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 14.15.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" } }, - "node_modules/string.prototype.trim/node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/string.prototype.trim/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trim/node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/string.prototype.trim/node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/string.prototype.trim/node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/string.prototype.trim/node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/string.prototype.trim/node_modules/is-shared-array-buffer": { + "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trim/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/string.prototype.trim/node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/string.prototype.trim/node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trim/node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0" } }, - "node_modules/string.prototype.trim/node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/string.prototype.trim/node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trim/node_modules/string.prototype.trimend": { + "node_modules/string.prototype.trimend": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", @@ -19376,7 +15726,7 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trim/node_modules/string.prototype.trimstart": { + "node_modules/string.prototype.trimstart": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", @@ -19390,47 +15740,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trim/node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "2023.10.0-SNAPSHOT", + "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -19438,20 +15751,17 @@ "node": ">=8" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=4" } }, "node_modules/strip-final-newline": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, @@ -19471,6 +15781,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -19480,6 +15814,15 @@ "node": ">=0.10" } }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tar": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", @@ -19530,6 +15873,12 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/terser": { "version": "5.16.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", @@ -19548,58 +15897,181 @@ "node": ">=10" } }, - "node_modules/terser/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/terser/node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/thunky": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, "node_modules/tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "dependencies": { - "os-tmpdir": "~1.0.1" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=0.4.0" + "node": ">=0.6.0" } }, "node_modules/to-fast-properties": { @@ -19611,6 +16083,18 @@ "node": ">=4" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -19643,9 +16127,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, "engines": { "node": ">=16.13.0" @@ -19698,9 +16182,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -19709,225 +16193,207 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { - "safe-buffer": "^5.0.1" + "tslib": "^1.8.1" }, "engines": { - "node": "*" + "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" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/type-fest": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" }, "engines": { - "node": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/typed-array-byte-length/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/tuf-js/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">= 0.4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/typed-array-byte-offset/node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/typed-array-byte-offset/node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "safe-buffer": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "*" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=4.2.0" + "node": ">= 0.8.0" } }, - "node_modules/unbox-primitive": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unbox-primitive/node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6" } }, - "node_modules/unbox-primitive/node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -19936,13 +16402,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -19951,39 +16421,79 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/is-symbol": { + "node_modules/typed-array-length": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/which-boxed-primitive": { + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, @@ -19992,7 +16502,7 @@ } }, "node_modules/unicode-match-property-ecmascript": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, @@ -20005,7 +16515,7 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, @@ -20014,7 +16524,7 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2023.10.0-SNAPSHOT", + "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, @@ -20023,7 +16533,7 @@ } }, "node_modules/unique-filename": { - "version": "2023.10.0-SNAPSHOT", + "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, @@ -20035,7 +16545,7 @@ } }, "node_modules/unique-slug": { - "version": "2023.10.0-SNAPSHOT", + "version": "4.0.0", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, @@ -20046,6 +16556,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -20056,9 +16575,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -20085,15 +16604,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-browserslist-db/node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -20102,6 +16612,11 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -20126,7 +16641,7 @@ "dev": true }, "node_modules/validate-npm-package-license": { - "version": "2023.10.0-SNAPSHOT", + "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, @@ -20136,7 +16651,7 @@ } }, "node_modules/validate-npm-package-name": { - "version": "2023.10.0-SNAPSHOT", + "version": "5.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, @@ -20170,8 +16685,36 @@ "extsprintf": "^1.2.0" } }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/wbuf": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, @@ -20179,6 +16722,14 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webdriver-js-extender": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", @@ -20193,7 +16744,7 @@ } }, "node_modules/webdriver-manager": { - "version": "2023.10.0-SNAPSHOT", + "version": "12.1.9", "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", "integrity": "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==", "dev": true, @@ -20217,15 +16768,6 @@ "node": ">=6.9.x" } }, - "node_modules/webdriver-manager/node_modules/adm-zip": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", - "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/webdriver-manager/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -20260,16 +16802,24 @@ "node": ">=0.10.0" } }, - "node_modules/webdriver-manager/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "node_modules/webdriver-manager/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/webdriver-manager/node_modules/ini": { @@ -20278,25 +16828,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "node_modules/webdriver-manager/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/webdriver-manager/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/webdriver-manager/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -20369,102 +16900,44 @@ "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", - "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.12", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, + }, + "bin": { + "webpack": "bin/webpack.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/webpack-dev-middleware": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", + "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/webpack-dev-server": { @@ -20513,287 +16986,19 @@ "type": "opencollective", "url": "https://opencollective.com/webpack" }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/@types/bonjour": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.11.tgz", - "integrity": "sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/webpack-dev-server/node_modules/@types/connect-history-api-fallback": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", - "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/webpack-dev-server/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/@types/serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/webpack-dev-server/node_modules/@types/serve-static": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", - "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/webpack-dev-server/node_modules/@types/sockjs": { - "version": "0.3.34", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.34.tgz", - "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/webpack-dev-server/node_modules/@types/ws": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", - "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/webpack-dev-server/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/webpack-dev-server/node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/webpack-dev-server/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/webpack-dev-server/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -20813,27 +17018,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", @@ -20847,11 +17031,14 @@ "node": ">=10.0.0" } }, - "node_modules/webpack-merge/node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", @@ -20874,61 +17061,6 @@ } } }, - "node_modules/webpack-subresource-integrity/node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "node_modules/webpack/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/webpack/node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/webpack/node_modules/@types/eslint-scope": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz", - "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/webpack/node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -20954,90 +17086,12 @@ "ajv": "^6.9.1" } }, - "node_modules/webpack/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/webpack/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/webpack/node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/webpack/node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/webpack/node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/webpack/node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -21056,162 +17110,92 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/webpack/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/webpack/node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=0.8.0" } }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, "engines": { - "node": ">=10.13.0" + "node": ">=0.8.0" } }, - "node_modules/websocket-driver": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=0.8.0" + "node": ">= 8" } }, - "node_modules/websocket-extensions": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "engines": { - "node": ">=0.8.0" + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array/node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { - "possible-typed-array-names": "^1.0.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -21221,7 +17205,7 @@ } }, "node_modules/wide-align": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, @@ -21229,44 +17213,14 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "2023.10.0-SNAPSHOT", + "node_modules/wrap-ansi": { + "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, @@ -21282,7 +17236,7 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -21297,7 +17251,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -21309,52 +17263,23 @@ "node": ">=7.0.0" } }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/ws": { - "version": "2023.10.0-SNAPSHOT", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -21387,14 +17312,23 @@ "node": ">=4.0" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yaml": { - "version": "2023.10.0-SNAPSHOT", + "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, @@ -21421,7 +17355,7 @@ } }, "node_modules/yargs-parser": { - "version": "2023.10.0-SNAPSHOT", + "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, @@ -21429,148 +17363,31 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/yargs/node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/yargs/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/yargs/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zone.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", - "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.0.tgz", + "integrity": "sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==", "dependencies": { "tslib": "^2.3.0" } diff --git a/ui/src/app/app-routing.module.ts b/ui/src/app/app-routing.module.ts index 706fa454c62..dfc0e25f4e5 100644 --- a/ui/src/app/app-routing.module.ts +++ b/ui/src/app/app-routing.module.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core'; import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; import { environment } from 'src/environments'; + import { ChangelogViewComponent } from './changelog/view/view'; import { EdgeComponent } from './edge/edge.component'; import { OverviewComponent as ChannelthresholdChartOverviewComponent } from './edge/history/Controller/ChannelThreshold/overview/overview'; @@ -39,9 +40,9 @@ import { NetworkComponent as EdgeSettingsNetworkComponent } from './edge/setting import { AliasUpdateComponent } from './edge/settings/profile/aliasupdate.component'; import { ProfileComponent as EdgeSettingsProfileComponent } from './edge/settings/profile/profile.component'; import { SettingsComponent as EdgeSettingsComponent } from './edge/settings/settings.component'; +import { SystemComponent as EdgeSettingsSystemComponent } from './edge/settings/system/system.component'; import { SystemExecuteComponent as EdgeSettingsSystemExecuteComponent } from './edge/settings/systemexecute/systemexecute.component'; import { SystemLogComponent as EdgeSettingsSystemLogComponent } from './edge/settings/systemlog/systemlog.component'; -import { SystemUpdateComponent as EdgeSettingsSystemUpdateComponent } from './edge/settings/systemupdate/systemupdate.component'; import { LoginComponent } from './index/login.component'; import { OverViewComponent } from './index/overview/overview.component'; import { DataService } from './shared/genericComponents/shared/dataservice'; @@ -57,7 +58,7 @@ const routes: Routes = [ { path: 'overview', component: OverViewComponent }, { path: 'user', component: UserComponent }, - { path: 'changelog', component: ChangelogViewComponent }, + { path: 'changelog', component: ChangelogViewComponent, data: { navbarTitleToBeTranslated: 'Menu.changelog' } }, // Edge Pages { @@ -109,7 +110,7 @@ const routes: Routes = [ { path: 'settings/profile/:componentId', component: AliasUpdateComponent }, { path: 'settings/systemexecute', component: EdgeSettingsSystemExecuteComponent }, { path: 'settings/systemlog', component: EdgeSettingsSystemLogComponent }, - { path: 'settings/systemupdate', component: EdgeSettingsSystemUpdateComponent }, + { path: 'settings/system', component: EdgeSettingsSystemComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.SYSTEM' } }, { path: 'settings/app', data: { navbarTitle: environment.edgeShortName + ' Apps' }, component: EdgeSettingsAppIndex }, { path: 'settings/app/install/:appId', component: EdgeSettingsAppInstall }, { path: 'settings/app/update/:appId', component: EdgeSettingsAppUpdate }, diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html index dfb2e5f8180..0fed6720b56 100644 --- a/ui/src/app/app.component.html +++ b/ui/src/app/app.component.html @@ -77,4 +77,6 @@

Index.connectionFailed

- \ No newline at end of file + + + diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index a4052ccd37c..db0bc53c50d 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -1,5 +1,4 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Title } from '@angular/platform-browser'; import { Router } from '@angular/router'; import { MenuController, ModalController, Platform, ToastController } from '@ionic/angular'; import { Subject } from 'rxjs'; @@ -24,6 +23,7 @@ export class AppComponent implements OnInit, OnDestroy { private ngUnsubscribe: Subject = new Subject(); protected isUserAllowedToSeeOverview: boolean = false; + protected isUserAllowedToSeeFooter: boolean = false; constructor( private platform: Platform, @@ -34,13 +34,13 @@ export class AppComponent implements OnInit, OnDestroy { public toastController: ToastController, public websocket: Websocket, private globalRouteChangeHandler: GlobalRouteChangeHandler, - private titleService: Title, private meta: Meta, ) { service.setLang(Language.getByKey(localStorage.LANGUAGE) ?? Language.getByBrowserLang(navigator.language)); this.service.metadata.pipe(filter(metadata => !!metadata)).subscribe(metadata => { this.isUserAllowedToSeeOverview = UserPermission.isUserAllowedToSeeOverview(metadata.user); + this.isUserAllowedToSeeFooter = UserPermission.isUserAllowedToSeeFooter(metadata.user); }); } @@ -51,7 +51,6 @@ export class AppComponent implements OnInit, OnDestroy { this.environment.debugMode = JSON.parse(localStorage.getItem("DEBUGMODE")); } - this.titleService.setTitle(environment.edgeShortName); this.service.notificationEvent.pipe(takeUntil(this.ngUnsubscribe)).subscribe(async notification => { const toast = await this.toastController.create({ message: notification.message, diff --git a/ui/src/app/changelog/view/component/changelog.component.html b/ui/src/app/changelog/view/component/changelog.component.html index 30ab3b63b4b..2d0040df9da 100644 --- a/ui/src/app/changelog/view/component/changelog.component.html +++ b/ui/src/app/changelog/view/component/changelog.component.html @@ -42,11 +42,13 @@ - - - Alle anzeigen - - + + + + Alle anzeigen + + + diff --git a/ui/src/app/changelog/view/component/changelog.component.ts b/ui/src/app/changelog/view/component/changelog.component.ts index a7ad48f4fbb..174c598fe38 100644 --- a/ui/src/app/changelog/view/component/changelog.component.ts +++ b/ui/src/app/changelog/view/component/changelog.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { environment } from 'src/environments'; @@ -10,7 +10,7 @@ import { Changelog } from './changelog.constants'; selector: 'changelog', templateUrl: './changelog.component.html', }) -export class ChangelogComponent implements OnInit { +export class ChangelogComponent { public environment = environment; @@ -22,10 +22,6 @@ export class ChangelogComponent implements OnInit { private route: ActivatedRoute, ) { } - ngOnInit() { - this.service.setCurrentComponent({ languageKey: 'Menu.changelog' }, this.route); - } - public readonly roleIsAtLeast = Role.isAtLeast; public numberToRole(role: number): string { return Role[role].toLowerCase(); diff --git a/ui/src/app/edge/edge.component.ts b/ui/src/app/edge/edge.component.ts index a7418eeada1..90d88be7e0a 100644 --- a/ui/src/app/edge/edge.component.ts +++ b/ui/src/app/edge/edge.component.ts @@ -47,7 +47,7 @@ export class EdgeComponent implements OnInit, OnDestroy { if (!this.edge) { return; } - this.edge.unsubscribeChannels(this.websocket, ''); + this.edge.unsubscribeAllChannels(this.websocket); + this.service.currentEdge.next(null); } - } diff --git a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts index 99e8ca19e08..e51d62b69b9 100644 --- a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts +++ b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts @@ -40,37 +40,37 @@ export class ChartComponent extends AbstractHistoryChart { name: 'Soc', powerChannel: ChannelAddress.fromString('_sum/EssSoc'), }, + { + name: 'GridBuy', + powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), + converter: HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO, + }, ], output: (data: HistoryUtils.ChannelData) => { return [{ name: this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'), - converter: () => { - return this.getDataset(data, this.TimeOfUseTariffState.Balancing); - }, + converter: () => this.getDataset(data, this.TimeOfUseTariffState.Balancing), color: 'rgb(51,102,0)', stack: 1, + order: 1, }, { name: this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'), - converter: () => { - return this.getDataset(data, this.TimeOfUseTariffState.ChargeGrid); - }, + converter: () => this.getDataset(data, this.TimeOfUseTariffState.ChargeGrid), color: 'rgb(0, 204, 204)', stack: 1, + order: 1, }, { name: this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'), - converter: () => { - return this.getDataset(data, this.TimeOfUseTariffState.DelayDischarge); - }, + converter: () => this.getDataset(data, this.TimeOfUseTariffState.DelayDischarge), color: 'rgb(0,0,0)', stack: 1, + order: 1, }, { name: this.translate.instant('General.soc'), - converter: () => { - return data['Soc']?.map(value => Utils.multiplySafely(value, 1000)); - }, + converter: () => data['Soc']?.map(value => Utils.multiplySafely(value, 1000)), color: 'rgb(189, 195, 199)', borderDash: [10, 10], yAxisId: ChartAxis.RIGHT, @@ -81,6 +81,18 @@ export class ChartComponent extends AbstractHistoryChart { }, order: 0, }, + { + name: this.translate.instant('General.gridBuy'), + converter: () => data['GridBuy'], + color: 'rgb(0,0,0)', + yAxisId: ChartAxis.RIGHT_2, + custom: { + type: 'line', + formatNumber: '1.0-0', + }, + hiddenOnInit: true, + order: 2, + }, ]; }, tooltip: { @@ -97,6 +109,12 @@ export class ChartComponent extends AbstractHistoryChart { yAxisId: ChartAxis.RIGHT, displayGrid: false, }, + { + unit: YAxisTitle.POWER, + position: 'right', + yAxisId: ChartAxis.RIGHT_2, + displayGrid: false, + }, ], }; } @@ -106,20 +124,17 @@ export class ChartComponent extends AbstractHistoryChart { this.errorResponse = null; const unit: Resolution = { unit: ChronoUnit.Type.MINUTES, value: 15 }; - let displayValues; - this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to, unit) .then((dataResponse) => { this.chartType = 'line'; this.chartObject = this.getChartData(); - displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse); + const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse); this.datasets = displayValues.datasets; this.legendOptions = displayValues.legendOptions; this.labels = displayValues.labels; this.setChartLabel(); - let values = this.chartObject.output(dataResponse.result.data); this.options.scales.x['time'].unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; this.options.scales.x.ticks['source'] = 'auto'; this.options.scales.x.grid = { offset: false }; @@ -144,7 +159,7 @@ export class ChartComponent extends AbstractHistoryChart { this.options.scales[ChartAxis.LEFT]['title'].text = this.currencyLabel; this.datasets = this.datasets.map((el) => { - let opacity = el.type === 'line' ? 0.2 : 0.5; + const opacity = el.type === 'line' ? 0.2 : 0.5; el.backgroundColor = ColorUtils.changeOpacityFromRGBA(el.backgroundColor.toString(), opacity); el.borderColor = ColorUtils.changeOpacityFromRGBA(el.borderColor.toString(), 1); @@ -152,6 +167,7 @@ export class ChartComponent extends AbstractHistoryChart { }); this.options.scales.x['offset'] = false; + this.options['animation'] = false; }); } @@ -163,12 +179,12 @@ export class ChartComponent extends AbstractHistoryChart { * @returns the desired state array data. */ private getDataset(data: HistoryUtils.ChannelData, desiredState): any[] { - var prices = data['QuarterlyPrice'] + const prices = data['QuarterlyPrice'] .map(val => TimeOfUseTariffUtils.formatPrice(Utils.multiplySafely(val, 1000))); - var states = data['StateMachine'] + const states = data['StateMachine'] .map(val => Utils.multiplySafely(val, 1000)); - var length = prices.length; - var dataset = Array(length).fill(null); + const length = prices.length; + const dataset = Array(length).fill(null); for (let index = 0; index < length; index++) { const quarterlyPrice = prices[index]; diff --git a/ui/src/app/edge/history/abstracthistorychart.ts b/ui/src/app/edge/history/abstracthistorychart.ts index 8a5a35447dc..6685b5d5b3a 100644 --- a/ui/src/app/edge/history/abstracthistorychart.ts +++ b/ui/src/app/edge/history/abstracthistorychart.ts @@ -1,18 +1,18 @@ import { TranslateService } from '@ngx-translate/core'; import * as Chart from 'chart.js'; import { AbstractHistoryChart as NewAbstractHistoryChart } from 'src/app/shared/genericComponents/chart/abstracthistorychart'; +import { ChartConstants } from 'src/app/shared/genericComponents/chart/chart.constants'; import { JsonrpcResponseError } from 'src/app/shared/jsonrpc/base'; import { QueryHistoricTimeseriesDataRequest } from "src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest"; import { QueryHistoricTimeseriesEnergyPerPeriodRequest } from 'src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest'; import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "src/app/shared/shared"; +import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; +import { ChannelAddress, Edge, EdgeConfig, Service } from 'src/app/shared/shared'; import { DateUtils } from 'src/app/shared/utils/date/dateutils'; import { DateTimeUtils } from 'src/app/shared/utils/datetime/datetime-utils'; -import { calculateResolution, DEFAULT_TIME_CHART_OPTIONS, EMPTY_DATASET, Resolution } from './shared'; -import { ChronoUnit, setLabelVisible } from './shared'; +import { calculateResolution, ChronoUnit, DEFAULT_TIME_CHART_OPTIONS, EMPTY_DATASET, Resolution, setLabelVisible } from './shared'; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load export abstract class AbstractHistoryChart { @@ -399,8 +399,6 @@ export abstract class AbstractHistoryChart { chart.update(); }; - options = NewAbstractHistoryChart.getYAxisOptions(options, yAxis, this.translate, 'line', locale); - const timeFormat = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; options.scales.x['time'].unit = timeFormat; switch (timeFormat) { @@ -414,10 +412,13 @@ export abstract class AbstractHistoryChart { break; } + const scaleOptions: { min: number, max: number, stepSize: number } | null = ChartConstants.getScaleOptions(this.datasets, yAxis); + // Only one yAxis defined + options = NewAbstractHistoryChart.getYAxisOptions(options, yAxis, this.translate, 'line', locale, false, scaleOptions); + options.scales.x['stacked'] = true; options.scales[ChartAxis.LEFT]['stacked'] = false; - - NewAbstractHistoryChart.applyChartTypeSpecificOptionsChanges('line', options, this.service, chartObject); + options = NewAbstractHistoryChart.applyChartTypeSpecificOptionsChanges('line' + this.spinnerId, options, this.service, chartObject); /** Overwrite default yAxisId */ this.datasets = this.datasets diff --git a/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts b/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts index 1030258130b..db26031999e 100644 --- a/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts +++ b/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts @@ -1,4 +1,5 @@ -import { ChartConfig, DummyConfig } from "src/app/shared/edge/edgeconfig.spec"; +import { DummyConfig } from "src/app/shared/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/genericComponents/shared/testing/common"; import { sharedSetup, TestContext } from "../../../../../shared/test/utils.spec"; import { DATA, LABELS } from "../../energy/chart/chart.constants.spec"; @@ -30,7 +31,9 @@ describe('History Consumption', () => { DATA('Sonstiger: 63,3 kWh', [null, null, null, 0.5658045977011494, 0.3871815181518151, 0.561425925925926, 0.5732169811320755, 0.5658080808080809, 0.5879803921568627, 0.5842389380530973, 0.6074818181818182, 0.6050275229357799, 0.5956407766990292, 0.6025294117647059, 0.5781684210526317, 0.5816813186813187, 0.6495166666666666, 0.5602999999999999, 0.56703738317757, 0.6297672413793104, 0.5688613861386138, 0.5896039603960396, 0.5245090909090909, 0.5093300330033004, 0.6177196261682243, 0.608122641509434, 0.60278, 0.6508155339805825, 0.6058877551020408, 0.5943904761904762, 0.57636, 0.5650660377358491, 0.587495145631068, 0.626375, 0.6819428571428572, 0.6504629629629629, 0.6313738317757009, 0.68725, 0.5602452830188679, 0.5278952380952382, 0.6202222222222221, 0.4016355140186916, 0.5878130841121496, 0.604, 0.616295918367347, 0.5789405940594059, 0.5943396226415094, 0.6481078431372549, null, null, null, 0.5652183908045977, 0.5736481481481481, 0.5365462962962964, 0.558081081081081, 0.5747543859649124, 0.5743557692307693, 0.5969047619047619, 0.6540720720720721, 0.5018766666666667, 0.6128045977011494, 0.6361100000000001, 0.6137948717948718, 0.5388857142857142, 0.5371157894736842, 0.5511634615384615, 0.5588809523809524, 0.5591222222222223, 0.6185576923076923, 0.6543287671232877, 0.6160574712643678, 0.5889056603773585, 0.5787096774193549, 0.583036036036036, 0.572570093457944, 0.5952631578947368, 0.7450888888888888, 0.7073990610328639, -1.452950549450549, 2.233161450571287, 1.1458434343434352, 1.2180771929824568, 0.9178416666666669, 0.9020510752688171, 1.3458171717171723, 1.1460410714285718, 0.9853455165691996, 1.189936077481839, -1.4153224202237875, 0.6774427860696518, 0.9827305699481865, 0.8582012987012987, 0.7678924050632912, 0.761950495049505, 0.6821319796954315, 0.5954198473282443, 0.7021286549707602, 0.7309484536082475, 0.739, 0.730572864321608, 0.7547467532467532, 0.657373417721519, 0.6409480519480519, 0.6698156424581005, 0.7876280991735537, 2.931229357798165, 1.9542808988764044, 0.7775346534653466, 1.098538860103627, 1.2441524390243903, 2.9194913793103447, 2.9874188034188034, 3.4140294117647056, 1.2151999999999998, 2.7142824427480914, 2.6578703703703703, 2.8738923076923077, 4.013462078651685, 3.791560606060606, 2.845578947368421, 1.7741875, 0.89646, 1.2468691588785048, 1.0760386740331491, 0.8393491124260355, 1.194960199004975, 1.0562878787878787, 3.133, 3.78845625, 1.288096153846154, 3.4541666666666666, 2.0936967871485943, 2.384391025641026, 1.6707888888888887, 1.5589767441860465, 2.8620799999999997, 2.3241241379310345, 1.9640169491525423, 1.8084, 3.4660503597122303, 2.2974397590361444, 2.5300493827160495, 2.439358490566038, 2.0079060773480664, 1.7515, 1.4163181818181818, 1.4292298850574712, 1.4520298507462688, 1.4897204301075269, 1.6330952380952382, 1.8262928571428572, 1.6101904761904762, 1.680929292929293, 2.881743119266055, 3.5851634615384613, 3.6891666666666665, 3.6573402777777777, 3.6435348837209305, 3.7148645833333336, 3.731375, 3.74479, 3.6362363636363635, 4.273113924050633, 3.4461999999999997, 3.5387142857142857, 3.7906065573770493, 3.5276750000000003, 3.4676712328767123, 3.5595, 3.7982, 5.460666666666667, 1.3094406779661016, 1.5357454545454545, 3.4238260869565216, 3.3823636363636367, 3.4006315789473684, 2.95075, 3.386731707317073, 2.506, 1.4471666666666667, 1.4425999999999999, 0.946, 0.9425789473684211, 0.9507142857142856, 0.947, 0.9762857142857143, 1.7862857142857143, 1.5135777777777777, 1.4995625, 1.338, 1.3278125, 1.2739175257731958, 1.4387457627118645, 1.2484186046511627, 1.2866693548387098, 1.2848934911242604, 1.2237952755905512, 0.74809375, 0.8717684210526315, 0.8445338983050847, 0.7916749999999999, 0.8041932773109244, 0.7303737373737375, 0.7055024390243902, 0.6872407407407407, 0.6909939759036144, 0.751, 0.765139344262295, 0.686871794871795, 0.6697434210526315, 1.7678091603053436, 0.7246764705882353, 0.7482772277227723, 0.9401142857142858, 0.750368, 1.3660232558139536, 0.7274137931034482, 0.710719512195122, 0.6898555555555557, 0.739453488372093, 0.817875, 0.7304303797468354, 0.7355890410958904, 0.738225806451613, 1.906921739130435, 2.290785714285714, 1.2075072463768115, 1.1675890410958905, 1.2290208333333332, 1.1923777777777778, 1.2088717948717949, 1.367715909090909, 1.284223300970874, 1.1631739130434782, 1.15253, 1.1614545454545455, 1.2195681818181818, 1.183752808988764, 1.197778947368421, 1.2338888888888888, 1.275070588235294, 1.235554054054054, 1.20783908045977, 1.2416184210526318, 1.159042735042735, 1.1382948717948718, 1.1069915966386554, 1.1714504504504506, 1.223822429906542, 1.1221696428571428, 1.018892857142857, 0.9818285714285714, 0.9988363636363636, 0.8434776785714284, 1.4379482009925546, 1.4043499341238475, 1.7165029190992493, 1.781351488095238, 1.8585528255528247, 3.6707709585574175, 4.427144379844961, 4.301046195652174, 4.194778846153845, 4.150229357798166, 4.055816642120766, 3.976974967061925, 2.711485714285714, 1.0600519480519486, 0.954382608695652, 0.7914855072463762, 0.9272300420168067, 0.28519157088122604, 0.8123142857142857, 0.8095892857142857, 0.8664786324786324, 0.8778319327731092, 0.8108141592920354, 0.8157121212121212, 0.7706470588235294, 0.7633157894736842, 0.7815151515151515, 0.8075833333333333, 0.824743119266055, 0.8762151898734176, 0.882424, 0.7502213114754098, 0.675954954954955, 0.6371222222222223]), ], labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), - options: ChartConfig.LINE_CHART_OPTIONS('hour', 'line'), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS('hour', 'line', { + ["left"]: { scale: { min: -2, max: 11 }, ticks: { stepSize: 3.25 } }, + }), }, }); } @@ -47,7 +50,9 @@ describe('History Consumption', () => { DATA('Sonstiger: 97,1 kWh', [0.6360308446701046, 0.9095864441102458, 0.7335808811402847, 0.5718131699718612, 0.9616446485934361, 0.6381720132750589, 1.02619037791046, 1.0145027809280902, 0.6390464755453447, 0.7096512022948386, 0.819995628581571, 0.935642813016216, 0.5254472085206601, 1.8851739940941776, 0.863444783197832, 1.1921009009810684, 0.5202376219567795, 0.7444045122530605, 0.901856453684574, 0.8104459244359407, 1.0830737950562592, 0.8714288985355628, 0.7780086316183336, 0.9590122781645534, 0.58627825521263, 0.8413148987905428, 0.8796668002158831, 0.6461976914860288, 0.8006733468796897, 0.8250297170962498, 0.825867009418173, 0.8407590098644301, 1.2782520162083928, 0.9299547986301717, 1.100431849409396, 0.881695115377627, -3.0801277220264014, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), ], labels: LABELS(History.WEEK.dataChannelWithValues.result.timestamps), - options: ChartConfig.LINE_CHART_OPTIONS('day', 'line'), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS('day', 'line', { + ["left"]: { scale: { min: -4, max: 5 }, ticks: { stepSize: 2.25 } }, + }), }, }); } @@ -64,7 +69,9 @@ describe('History Consumption', () => { DATA('Sonstiger: 683,3 kWh', [1.1707523832922395, 0.941219247423001, 0.9813072961027226, 0.9147731344893865, 0.9179723719850451, 1.0221279641612842, 0.966452725206484, 0.9473972354717355, 0.9621558239123786, 1.0389565290773752, 0.719602808727641, 0.7164739453418082, 0.8312551527306125, 1.0513294309882544, 1.0642356695090618, 1.064549904209455, 0.8827148020023398, 1.0886724659066331, 0.9617007570391821, 1.2024244259088868, 1.4752269957477093, 1.149323439144603, 1.2039544333297325, 1.0275239776315197, 0.9588534351033258, 1.0445672257542986, 1.1028960998629487, 0.9010854319660326, 0.8581094263176695, null, null]), ], labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), - options: ChartConfig.BAR_CHART_OPTIONS('day', 'bar'), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS('day', 'bar', { + ["left"]: { scale: { min: 0, max: 3 }, ticks: { stepSize: 0.75 } }, + }), }, }); } @@ -81,7 +88,9 @@ describe('History Consumption', () => { DATA('Sonstiger: 10.883,9 kWh', [1275.767, 1390.6460000000002, 1480.519, 1565.359, 1387.424, 1027.67, 1412.9189999999999, 1344.913, 0, 0, 0, 0]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: ChartConfig.BAR_CHART_OPTIONS('month', 'bar'), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS('month', 'bar', { + ["left"]: { scale: { min: 0, max: 2307 }, ticks: { stepSize: 576.75 } }, + }), }, }); } diff --git a/ui/src/app/edge/history/common/energy/chart/channels.spec.ts b/ui/src/app/edge/history/common/energy/chart/channels.spec.ts index 8597a469099..9d76eb3cc97 100644 --- a/ui/src/app/edge/history/common/energy/chart/channels.spec.ts +++ b/ui/src/app/edge/history/common/energy/chart/channels.spec.ts @@ -1,4 +1,5 @@ import { TimeUnit } from "chart.js"; +import { ChartConstants } from "src/app/shared/genericComponents/chart/chart.constants"; import { OeTester } from "src/app/shared/genericComponents/shared/testing/common"; import { OeChartTester } from "src/app/shared/genericComponents/shared/testing/tester"; import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; @@ -7,16 +8,42 @@ import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/re export namespace History { - export const LINE_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar'): OeChartTester.Dataset.Option => ({ + export const LINE_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min: number, max: number }, ticks: { stepSize: number } } }): OeChartTester.Dataset.Option => ({ type: 'option', options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} } }, "scales": { "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} }, "right": { ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, "max": 100, "min": 0, "type": "linear", "title": { "text": "%", "display": true, "font": { "size": 11 } }, "position": "right", "grid": { "display": false }, "ticks": { "padding": 5, "stepSize": 20 } } }, + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} } }, "scales": { + "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, + "left": { + ...options["left"].scale, ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + "ticks": { ...options["left"].ticks, "color": '', "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS }, + }, + "right": { + ...options["right"].scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, "max": 100, "min": 0, "type": "linear", "title": { "text": "%", "display": true, "font": { "size": 11 }, "padding": 5 }, "position": "right", "grid": { "display": false }, + "ticks": { + ...options["right"].ticks, + "color": '', + "padding": 5, + "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, + }, + }, + }, }, }); - export const BAR_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar'): OeChartTester.Dataset.Option => ({ + export const BAR_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min?: number, max?: number }, ticks: { stepSize?: number } } }): OeChartTester.Dataset.Option => ({ type: 'option', options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} } }, "scales": { "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} } }, + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} } }, "scales": { + "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, + "left": { + ...options["left"].scale, ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + "ticks": { + ...options["left"].ticks, + "color": '', + "padding": 5, + "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, + }, + }, + }, }, }); diff --git a/ui/src/app/edge/history/common/energy/chart/chart.spec.ts b/ui/src/app/edge/history/common/energy/chart/chart.spec.ts index be77dd1532b..f2fde360c3e 100644 --- a/ui/src/app/edge/history/common/energy/chart/chart.spec.ts +++ b/ui/src/app/edge/history/common/energy/chart/chart.spec.ts @@ -32,11 +32,11 @@ describe('History EnergyMonitor', () => { DATA('Ladezustand', History.DAY.dataChannelWithValues.result.data['_sum/EssSoc']), ], labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), - options: History.LINE_CHART_OPTIONS('hour', 'line'), + options: History.LINE_CHART_OPTIONS('hour', 'line', { + ["left"]: { scale: { min: 0, max: 7 }, ticks: { stepSize: 1.75 } }, ["right"]: { scale: { min: 0, max: 1003 }, ticks: { stepSize: 25 } }, + }), }, - }); - } { @@ -54,7 +54,9 @@ describe('History EnergyMonitor', () => { DATA('Ladezustand', History.WEEK.dataChannelWithValues.result.data['_sum/EssSoc']), ], labels: LABELS(History.WEEK.dataChannelWithValues.result.timestamps), - options: History.LINE_CHART_OPTIONS('day', 'line'), + options: History.LINE_CHART_OPTIONS('day', 'line', { + ["left"]: { scale: { min: 0, max: 9 }, ticks: { stepSize: 2.25 } }, ["right"]: { scale: { min: 0, max: 1003 }, ticks: { stepSize: 25 } }, + }), }, }); } @@ -77,7 +79,9 @@ describe('History EnergyMonitor', () => { DATA('Verbrauch: 9.976,1 kWh', [320.342, 346.615, 341.433, 333.054, 358.458, 347.872, 289.283, null, 556.51, 311.366, 314.722, 355.556, 381.671, 384.558, 366.19, 349.336, 303.696, 288.727, 357.434, 388.659, 402.625, null, 713.771, 320.238, 332.099, null, 756.429, 384.136, 371.322, null]), ], labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('day', 'bar'), + options: History.BAR_CHART_OPTIONS('day', 'bar', { + ["left"]: { scale: { min: 0, max: 1579 }, ticks: { stepSize: 394.75 } }, + }), }, }); } @@ -100,7 +104,9 @@ describe('History EnergyMonitor', () => { DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar'), + options: History.BAR_CHART_OPTIONS('month', 'bar', { + ["left"]: { scale: { min: 0, max: 22491 }, ticks: { stepSize: 5622.75 } }, + }), }, }); } @@ -112,7 +118,9 @@ describe('History EnergyMonitor', () => { datasets: { data: [], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar'), + options: History.BAR_CHART_OPTIONS('month', 'bar', { + ["left"]: { scale: {}, ticks: {} }, + }), }, }); } @@ -135,7 +143,9 @@ describe('History EnergyMonitor', () => { DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar'), + options: History.BAR_CHART_OPTIONS('month', 'bar', { + ["left"]: { scale: { min: 0, max: 12839 }, ticks: { stepSize: 3209.75 } }, ["right"]: { scale: { min: 0, max: 1003 }, ticks: { stepSize: 25 } }, + }), }, }); } @@ -155,7 +165,9 @@ describe('History EnergyMonitor', () => { DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar'), + options: History.BAR_CHART_OPTIONS('month', 'bar', { + ["left"]: { scale: { min: 0, max: 12839 }, ticks: { stepSize: 3209.75 } }, + }), }, }); } @@ -175,7 +187,9 @@ describe('History EnergyMonitor', () => { DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar'), + options: History.BAR_CHART_OPTIONS('month', 'bar', { + ["left"]: { scale: { min: 0, max: 11635 }, ticks: { stepSize: 2908.75 } }, + }), }, }); } diff --git a/ui/src/app/edge/history/common/energy/chart/chart.ts b/ui/src/app/edge/history/common/energy/chart/chart.ts index 505419d20fd..9348c1e964e 100644 --- a/ui/src/app/edge/history/common/energy/chart/chart.ts +++ b/ui/src/app/edge/history/common/energy/chart/chart.ts @@ -20,7 +20,6 @@ export class ChartComponent extends AbstractHistoryChart { config?.widgets.classes.reduce((arr: HistoryUtils.InputChannel[], key) => { let newObj = []; switch (key) { - case 'Energymonitor': case 'Consumption': newObj.push({ @@ -81,12 +80,8 @@ export class ChartComponent extends AbstractHistoryChart { return [ { name: translate.instant('General.production'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data['_sum/ProductionActiveEnergy']; - }, - converter: () => { - return data['ProductionActivePower']; - }, + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/ProductionActiveEnergy'], + converter: () => data['ProductionActivePower'], color: 'rgb(45,143,171)', stack: 0, hiddenOnInit: chartType == 'line' ? false : true, @@ -110,15 +105,11 @@ export class ChartComponent extends AbstractHistoryChart { // Charge Power { name: translate.instant('General.chargePower'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data['_sum/EssDcChargeEnergy']; - }, - converter: () => { - return chartType === 'line' ? - data['EssCharge']?.map((value, index) => { - return HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(Utils.subtractSafely(value, data['ProductionDcActual']?.[index])); - }) : data['EssCharge']; - }, + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/EssDcChargeEnergy'], + converter: () => chartType === 'line' // + ? data['EssCharge']?.map((value, index) => { + return HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(Utils.subtractSafely(value, data['ProductionDcActual']?.[index])); + }) : data['EssCharge'], color: 'rgb(0,223,0)', stack: 1, ...(chartType === 'line' && { order: 6 }), @@ -127,9 +118,7 @@ export class ChartComponent extends AbstractHistoryChart { // Discharge Power { name: translate.instant('General.dischargePower'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data['_sum/EssDcDischargeEnergy']; - }, + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/EssDcDischargeEnergy'], converter: () => { return chartType === 'line' ? data['EssDischarge']?.map((value, index) => { @@ -144,12 +133,8 @@ export class ChartComponent extends AbstractHistoryChart { // Sell to grid { name: translate.instant('General.gridSellAdvanced'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data['_sum/GridSellActiveEnergy']; - }, - converter: () => { - return data['GridSell']; - }, + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/GridSellActiveEnergy'], + converter: () => data['GridSell'], color: 'rgb(0,0,200)', stack: 1, ...(chartType === 'line' && { order: 4 }), @@ -158,12 +143,8 @@ export class ChartComponent extends AbstractHistoryChart { // Buy from Grid { name: translate.instant('General.gridBuyAdvanced'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data['_sum/GridBuyActiveEnergy']; - }, - converter: () => { - return data['GridBuy']; - }, + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/GridBuyActiveEnergy'], + converter: () => data['GridBuy'], color: 'rgb(0,0,0)', stack: 2, ...(chartType === 'line' && { order: 2 }), @@ -172,12 +153,8 @@ export class ChartComponent extends AbstractHistoryChart { // Consumption { name: translate.instant('General.consumption'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data['_sum/ConsumptionActiveEnergy']; - }, - converter: () => { - return data['Consumption']; - }, + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/ConsumptionActiveEnergy'], + converter: () => data['Consumption'], color: 'rgb(253,197,7)', stack: 3, hiddenOnInit: chartType == 'line' ? false : true, @@ -186,9 +163,7 @@ export class ChartComponent extends AbstractHistoryChart { ...[chartType === 'line' && { name: translate.instant('General.soc'), - converter: () => { - return data['EssSoc']?.map(value => Utils.multiplySafely(value, 1000)); - }, + converter: () => data['EssSoc']?.map(value => Utils.multiplySafely(value, 1000)), color: 'rgb(189, 195, 199)', borderDash: [10, 10], yAxisId: ChartAxis.RIGHT, diff --git a/ui/src/app/edge/history/common/grid/chart/chart.spec.ts b/ui/src/app/edge/history/common/grid/chart/chart.spec.ts index d4971e1d400..e44f5fc6a5c 100644 --- a/ui/src/app/edge/history/common/grid/chart/chart.spec.ts +++ b/ui/src/app/edge/history/common/grid/chart/chart.spec.ts @@ -27,7 +27,10 @@ describe('History Grid', () => { DATA('Bezug: 0,9 kWh', [null, null, null, 0.031, 0.018, 0, 0.02, 0.016, 0.015, 0.014, 0.009, 0.02, 0.025, 0.025, 0.025, 0.021, 0.012, 0.009, 0.01, 0.011, 0.005, 0.003, 0, 0.015, 0.018, 0.023, 0, 0, 0, 0.002, 0.002, 0.003, 0.015, 0.008, 0.022, 0.027, 0.016, 0.003, 0.002, 0, 0.028, 0.027, 0.017, 0.001, 0, 0, 0, null, null, null, null, 0.011, 0.01, 0.004, 0.006, 0.007, 0.018, 0.008, 0.012, 0.009, 0.004, 0.013, 0.015, 0.012, 0, 0, 0, 0.002, 0, 0.005, 0.001, 0.03, 0.062, 0, 0, 0, 0, 0, 0, 0, 0, 0.015, 0.005, 0.004, 0.007, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0, 0.021, 0, 0, 0, 0, 0, 0.003, 0, 0.004, 0, 0, 0.032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), ], labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.LINE_CHART_OPTIONS('hour', 'line'), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS('hour', 'line', { + ["left"]: { scale: { min: 0, max: 7 }, ticks: { stepSize: 1.75 } }, + }, + ), }, }, false); } @@ -41,7 +44,9 @@ describe('History Grid', () => { DATA('Bezug: 2,4 kWh', [0, 0.011916666666666666, 0.01633333333333333, 0.00609090909090909, 0.015333333333333334, 0.011666666666666665, 0.0024166666666666664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02425, 0.004416666666666667, 0.0035833333333333333, 0, 0, 0, 0.04441666666666667, 0, 0.013111111111111112, 0.001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0011666666666666668, 0, 0, 0, 0.0015833333333333333, 0.013333333333333334, 0.020416666666666666, 0.01125, 0.019727272727272725, 0.012444444444444445, 0.009583333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.007666666666666667, 0, 0.0023333333333333335, 0.0125, 0.01609090909090909, 0.02016666666666667, 0.014083333333333333, 0.006363636363636363, 0.01955555555555556, 0.04841666666666666, 0.011166666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.014222222222222221, 0.00225, 0, 0.0036666666666666666, 0.032916666666666664, 0.014666666666666666, 0.0135, 0.017363636363636362, 0.013333333333333334, 0.022083333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0009166666666666666, 0, 0.0021666666666666666, 0, 0, 0, 0.0005, 0.04841666666666666, 0, 0.005555555555555556, 0.02716666666666667, 0.017333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0023333333333333335, 0.008333333333333333, 0.003, 0.015916666666666666, 0.00325, 0, 0.004333333333333333, 0.001, 0, 0, 0.019545454545454546, 0.0017777777777777776, 0.006416666666666667, 0.017666666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0058, 0.005625, 0, 0]), ], labels: LABELS(History.WEEK.dataChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.LINE_CHART_OPTIONS('day', 'line'), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS('day', 'line', { + ["left"]: { scale: { min: 0, max: 7 }, ticks: { stepSize: 1.75 } }, + }), }, }, false); @@ -56,7 +61,9 @@ describe('History Grid', () => { DATA('Bezug: 773 kWh', [16, 6, 3, 3, 5, 48, 4, null, 5, 26, 17, 62, 8, 66, 13, 21, 4, 3, 18, 27, 29, null, 118, 85, 2, null, 72, 28, 84, null]), ], labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.BAR_CHART_OPTIONS('day', 'bar'), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS('day', 'bar', { + ["left"]: { scale: { min: 0, max: 1003 }, ticks: { stepSize: 250.75 } }, + }), }, }, false); @@ -71,7 +78,9 @@ describe('History Grid', () => { DATA('Bezug: 23.209 kWh', [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.BAR_CHART_OPTIONS('month', 'bar'), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS('month', 'bar', { + ["left"]: { scale: { min: 0, max: 12839 }, ticks: { stepSize: 3209.75 } }, + }), }, }, false); } diff --git a/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts b/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts index f1e3b5df05b..b7b275ec69e 100644 --- a/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts +++ b/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts @@ -1,6 +1,7 @@ import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; +import { ChartConstants } from 'src/app/shared/genericComponents/chart/chart.constants'; import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; @@ -189,7 +190,7 @@ export class GridOptimizedChargeChartComponent extends AbstractHistoryChart impl } private applyControllerSpecificOptions() { - const yAxis: HistoryUtils.yAxes = { + const yAxisRight: HistoryUtils.yAxes = { unit: YAxisTitle.PERCENTAGE, position: 'right', yAxisId: ChartAxis.RIGHT, @@ -197,7 +198,13 @@ export class GridOptimizedChargeChartComponent extends AbstractHistoryChart impl }; const locale = this.service.translate.currentLang; - this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, yAxis, this.translate, 'line', locale); + const showYAxisTitle = true; + + const yAxisLeft: HistoryUtils.yAxes = { position: 'left', unit: YAxisTitle.ENERGY, yAxisId: ChartAxis.LEFT }; + [yAxisRight, yAxisLeft].forEach(yAxis => { + const scaleOptions = ChartConstants.getScaleOptions(this.datasets, yAxis); + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, yAxis, this.translate, 'line', locale, showYAxisTitle, scaleOptions); + }); this.datasets = this.datasets.map((el, index, arr) => { diff --git a/ui/src/app/edge/history/shared.ts b/ui/src/app/edge/history/shared.ts index 87d578f2e63..1bae6f9e240 100644 --- a/ui/src/app/edge/history/shared.ts +++ b/ui/src/app/edge/history/shared.ts @@ -314,50 +314,62 @@ export function calculateActiveTimeOverPeriod(channel: ChannelAddress, queryResu */ export function calculateResolution(service: Service, fromDate: Date, toDate: Date): { resolution: Resolution, timeFormat: 'day' | 'month' | 'hour' | 'year' } { let days = Math.abs(differenceInDays(toDate, fromDate)); - let resolution: { resolution: Resolution, timeFormat: 'day' | 'month' | 'hour' | 'year' }; + let result: { resolution: Resolution, timeFormat: 'day' | 'month' | 'hour' | 'year' }; if (days <= 1) { - resolution = { resolution: { value: 5, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 5 Minutes + if (service.isSmartphoneResolution) { + result = { resolution: { value: 20, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 1 Day + } else { + result = { resolution: { value: 5, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 5 Minutes + } } else if (days == 2) { if (service.isSmartphoneResolution) { - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'hour' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'hour' }; // 1 Day } else { - resolution = { resolution: { value: 10, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 1 Hour + result = { resolution: { value: 10, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 1 Hour } } else if (days <= 4) { if (service.isSmartphoneResolution) { - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day } else { - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: 'hour' }; // 1 Hour + result = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: 'hour' }; // 1 Hour } } else if (days <= 6) { - // >> show Hours - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: 'day' }; // 1 Day + + + if (service.isSmartphoneResolution) { + result = { resolution: { value: 8, unit: ChronoUnit.Type.HOURS }, timeFormat: 'day' }; // 1 Day + } else { + // >> show Hours + result = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: 'day' }; // 1 Day + } + } else if (days <= 31 && service.isSmartphoneResolution) { // Smartphone-View: show 31 days in daily view - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day } else if (days <= 90) { - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day } else if (days <= 144) { // >> show Days if (service.isSmartphoneResolution == true) { - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: 'month' }; // 1 Month + result = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: 'month' }; // 1 Month } else { - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day } } else if (days <= 365) { - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: 'month' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: 'month' }; // 1 Day } else { // >> show Years - resolution = { resolution: { value: 1, unit: ChronoUnit.Type.YEARS }, timeFormat: 'year' }; // 1 Month + result = { resolution: { value: 1, unit: ChronoUnit.Type.YEARS }, timeFormat: 'year' }; // 1 Month } - return resolution; + + return result; } /** diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts index 43e4c227f18..2baf5db81e0 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts @@ -3,8 +3,8 @@ import { BrowserModule } from "@angular/platform-browser"; import { SharedModule } from "src/app/shared/shared.module"; import { FlatComponent } from "./flat/flat"; import { ModalComponent } from "./modal/modal"; -import { ScheduleStateAndPriceChartComponent } from "./modal/statePriceChart"; import { SchedulePowerAndSocChartComponent } from "./modal/powerSocChart"; +import { ScheduleStateAndPriceChartComponent } from "./modal/statePriceChart"; @NgModule({ imports: [ @@ -27,4 +27,5 @@ import { SchedulePowerAndSocChartComponent } from "./modal/powerSocChart"; FlatComponent, ], }) -export class Controller_Ess_TimeOfUseTariff { } +export class Controller_Ess_TimeOfUseTariff { +} diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts index a74da363843..bba1865508f 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts @@ -3,11 +3,11 @@ import { ActivatedRoute } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import * as Chart from 'chart.js'; import { AbstractHistoryChart } from 'src/app/edge/history/abstracthistorychart'; -import { DEFAULT_TIME_CHART_OPTIONS } from 'src/app/edge/history/shared'; import { AbstractHistoryChart as NewAbstractHistoryChart } from 'src/app/shared/genericComponents/chart/abstracthistorychart'; +import { ChartConstants } from 'src/app/shared/genericComponents/chart/chart.constants'; import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils, Websocket } from 'src/app/shared/shared'; +import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; import { GetScheduleRequest } from '../../../../../../shared/jsonrpc/request/getScheduleRequest'; import { GetScheduleResponse } from '../../../../../../shared/jsonrpc/response/getScheduleResponse'; @@ -55,18 +55,19 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl new ComponentJsonApiRequest({ componentId: this.component.id, payload: new GetScheduleRequest() }), ).then(response => { const result = (response as GetScheduleResponse).result; + const schedule = result.schedule; const datasets = []; // Extracting prices and states from the schedule array const { gridBuyArray, gridSellArray, productionArray, consumptionArray, essDischargeArray, essChargeArray, socArray, labels } = { - gridBuyArray: result.schedule.map(entry => HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(entry.grid)), - gridSellArray: result.schedule.map(entry => HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(entry.grid)), - productionArray: result.schedule.map(entry => entry.production), - consumptionArray: result.schedule.map(entry => entry.consumption), - essDischargeArray: result.schedule.map(entry => HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(entry.ess)), - essChargeArray: result.schedule.map(entry => HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(entry.ess)), - socArray: result.schedule.map(entry => entry.soc), - labels: result.schedule.map(entry => new Date(entry.timestamp)), + gridBuyArray: schedule.map(entry => HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(entry.grid)), + gridSellArray: schedule.map(entry => HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(entry.grid)), + productionArray: schedule.map(entry => entry.production), + consumptionArray: schedule.map(entry => entry.consumption), + essDischargeArray: schedule.map(entry => HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(entry.ess)), + essChargeArray: schedule.map(entry => HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(entry.ess)), + socArray: schedule.map(entry => entry.soc), + labels: schedule.map(entry => new Date(entry.timestamp)), }; datasets.push({ @@ -74,8 +75,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl label: this.translate.instant('General.gridBuy'), data: gridBuyArray, hidden: true, - yAxisID: 'yAxis1', - position: 'right', order: 1, }); this.colors.push({ @@ -88,8 +87,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl label: this.translate.instant('General.gridSell'), data: gridSellArray, hidden: true, - yAxisID: 'yAxis1', - position: 'right', order: 1, }); this.colors.push({ @@ -102,8 +99,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl label: this.translate.instant('General.production'), data: productionArray, hidden: false, - yAxisID: 'yAxis1', - position: 'right', order: 1, }); this.colors.push({ @@ -116,8 +111,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl label: this.translate.instant('General.consumption'), data: consumptionArray, hidden: false, - yAxisID: 'yAxis1', - position: 'right', order: 1, }); this.colors.push({ @@ -130,8 +123,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl label: this.translate.instant('General.chargePower'), data: essChargeArray, hidden: true, - yAxisID: 'yAxis1', - position: 'right', order: 1, }); this.colors.push({ @@ -144,8 +135,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl label: this.translate.instant('General.dischargePower'), data: essDischargeArray, hidden: true, - yAxisID: 'yAxis1', - position: 'right', order: 1, }); this.colors.push({ @@ -187,18 +176,22 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl private applyControllerSpecificOptions() { const rightYAxis: HistoryUtils.yAxes = { position: 'right', unit: YAxisTitle.PERCENTAGE, yAxisId: ChartAxis.RIGHT }; + const leftYAxis: HistoryUtils.yAxes = { position: 'left', unit: YAxisTitle.ENERGY, yAxisId: ChartAxis.LEFT }; const locale = this.service.translate.currentLang; - this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYAxis, this.translate, 'line', locale); - this.datasets = this.datasets.map((el, index, arr) => { + const scaleOptionsLeft = ChartConstants.getScaleOptions(this.datasets, leftYAxis); + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYAxis, this.translate, 'line', locale, true, scaleOptionsLeft); + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, leftYAxis, this.translate, 'line', locale, true); - // align last element to right yAxis - if ((arr.length - 1) === index) { + this.datasets = this.datasets.map((el: Chart.ChartDataset) => { + + // align particular dataset element to right yAxis + if (el.label === this.translate.instant('General.soc')) { el['yAxisID'] = ChartAxis.RIGHT; - el['yAxisId'] = ChartAxis.RIGHT; } return el; }); + this.options.scales.x['ticks'] = { source: 'auto', autoSkip: false }; this.options.scales.x.ticks.callback = function (value, index, values) { var date = new Date(value); @@ -211,16 +204,15 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl }; protected setLabel() { - const options = Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS); + this.options = this.createDefaultChartOptions(); const translate = this.translate; - options.plugins.tooltip.callbacks.label = function (item: Chart.TooltipItem) { + this.options.plugins.tooltip.callbacks.label = function (item: Chart.TooltipItem) { const label = item.dataset.label; const value = item.dataset.data[item.dataIndex]; return TimeOfUseTariffUtils.getLabel(value, label, translate); }; - this.options = options; } protected getChannelAddresses(): Promise { @@ -228,8 +220,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl } public getChartHeight(): number { - return this.service.isSmartphoneResolution - ? window.innerHeight / 3 - : window.innerHeight / 4; + return TimeOfUseTariffUtils.getChartHeight(this.service.isSmartphoneResolution); } } diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts index 731f882af59..bf900b61e4c 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts @@ -3,8 +3,9 @@ import { ActivatedRoute } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import * as Chart from 'chart.js'; import { AbstractHistoryChart } from 'src/app/edge/history/abstracthistorychart'; +import { AbstractHistoryChart as NewAbstractHistoryChart } from 'src/app/shared/genericComponents/chart/abstracthistorychart'; import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { ChartAxis, TimeOfUseTariffUtils, YAxisTitle } from 'src/app/shared/service/utils'; +import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, YAxisTitle } from 'src/app/shared/service/utils'; import { ChannelAddress, Currency, Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; import { calculateResolution } from 'src/app/edge/history/shared'; @@ -57,23 +58,23 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im new ComponentJsonApiRequest({ componentId: this.component.id, payload: new GetScheduleRequest() }), ).then(response => { const result = (response as GetScheduleResponse).result; - const length = result.schedule.length; + const schedule = result.schedule; // Extracting prices, states, timestamps from the schedule array - const { priceArray, stateArray, timestampArray } = { - priceArray: result.schedule.map(entry => entry.price), - stateArray: result.schedule.map(entry => entry.state), - timestampArray: result.schedule.map(entry => entry.timestamp), + const { priceArray, stateArray, timestampArray, gridBuyArray, socArray } = { + priceArray: schedule.map(entry => entry.price), + stateArray: schedule.map(entry => entry.state), + timestampArray: schedule.map(entry => entry.timestamp), + gridBuyArray: schedule.map(entry => HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(entry.grid)), + socArray: schedule.map(entry => entry.soc), }; - let datasets = []; - const scheduleChartData = TimeOfUseTariffUtils.getScheduleChartData(length, priceArray, stateArray, timestampArray, this.translate, this.component.properties.controlMode); + const scheduleChartData = TimeOfUseTariffUtils.getScheduleChartData(schedule.length, priceArray, stateArray, timestampArray, gridBuyArray, socArray, this.translate, this.component.properties.controlMode); - datasets = scheduleChartData.datasets; this.colors = scheduleChartData.colors; this.labels = scheduleChartData.labels; - this.datasets = datasets; + this.datasets = scheduleChartData.datasets; this.loading = false; this.setLabel(); this.stopSpinner(); @@ -84,26 +85,32 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im }).finally(async () => { this.unit = YAxisTitle.CURRENCY; await this.setOptions(this.options); - this.applyControllerSpecificOptions(this.options); + this.applyControllerSpecificOptions(); }); } - private applyControllerSpecificOptions(options: Chart.ChartOptions) { + private applyControllerSpecificOptions() { + const locale = this.service.translate.currentLang; + const rightYaxisSoc: HistoryUtils.yAxes = { position: 'right', unit: YAxisTitle.PERCENTAGE, yAxisId: ChartAxis.RIGHT }; + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYaxisSoc, this.translate, 'line', locale); - options.scales.x['time'].unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; - options.scales.x['ticks'] = { source: 'auto', autoSkip: false }; - options.scales.x.ticks.maxTicksLimit = 18; - options.scales.x['offset'] = false; - options.scales.x.ticks.callback = function (value, index, values) { - var date = new Date(value); + const rightYAxisPower: HistoryUtils.yAxes = { position: 'right', unit: YAxisTitle.POWER, yAxisId: ChartAxis.RIGHT_2 }; + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYAxisPower, this.translate, 'line', locale); + + this.options.scales.x['time'].unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; + this.options.scales.x['ticks'] = { source: 'auto', autoSkip: false }; + this.options.scales.x.ticks.maxTicksLimit = 30; + this.options.scales.x['offset'] = false; + this.options.scales.x.ticks.callback = function (value) { + const date = new Date(value); // Display the label only if the minutes are zero (full hour) return date.getMinutes() === 0 ? date.getHours() + ':00' : ''; }; // options.plugins. - options.plugins.tooltip.mode = 'index'; - options.plugins.tooltip.callbacks.labelColor = (item: Chart.TooltipItem) => { + this.options.plugins.tooltip.mode = 'index'; + this.options.plugins.tooltip.callbacks.labelColor = (item: Chart.TooltipItem) => { if (!item) { return; } @@ -113,8 +120,16 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im }; }; + this.options.plugins.tooltip.callbacks.label = (item: Chart.TooltipItem) => { + + const label = item.dataset.label; + const value = item.dataset.data[item.dataIndex]; + + return TimeOfUseTariffUtils.getLabel(value, label, this.translate, this.currencyLabel); + }; + this.datasets = this.datasets.map((el) => { - let opacity = el.type === 'line' ? 0.2 : 0.5; + const opacity = el.type === 'line' ? 0.2 : 0.5; if (el.backgroundColor && el.borderColor) { el.backgroundColor = ColorUtils.changeOpacityFromRGBA(el.backgroundColor.toString(), opacity); @@ -123,15 +138,22 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im return el; }); - options.plugins.tooltip.callbacks.label = (item: Chart.TooltipItem) => { + this.datasets = this.datasets.map((el: Chart.ChartDataset) => { - const label = item.dataset.label; - const value = item.dataset.data[item.dataIndex]; + // align particular dataset element to right yAxis + if (el.label == this.translate.instant('General.gridBuy')) { + el['yAxisID'] = ChartAxis.RIGHT_2; + } else if (el.label == this.translate.instant('General.soc')) { + el['yAxisID'] = ChartAxis.RIGHT; + } - return TimeOfUseTariffUtils.getLabel(value, label, this.translate, this.currencyLabel); - }; + return el; + }); - options.scales[ChartAxis.LEFT]['title'].display = false; + this.options.scales[ChartAxis.LEFT]['title'].text = this.currencyLabel; + this.options.scales[ChartAxis.RIGHT].grid.display = false; + this.options.scales[ChartAxis.RIGHT_2].grid.display = false; + this.options['animation'] = false; } protected setLabel() { @@ -143,8 +165,6 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im } public getChartHeight(): number { - return this.service.isSmartphoneResolution - ? window.innerHeight / 3 - : window.innerHeight / 4; + return TimeOfUseTariffUtils.getChartHeight(this.service.isSmartphoneResolution); } } diff --git a/ui/src/app/edge/live/Controller/Evcs/flat/flat.html b/ui/src/app/edge/live/Controller/Evcs/flat/flat.html index 5e5e7ca21e5..2ec4d329a1d 100644 --- a/ui/src/app/edge/live/Controller/Evcs/flat/flat.html +++ b/ui/src/app/edge/live/Controller/Evcs/flat/flat.html @@ -1,4 +1,4 @@ - @@ -56,4 +56,4 @@ [name]="'Edge.Index.Widgets.EVCS.NoConnection.description' | translate"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts b/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts index 79967ef81a1..e135023969c 100644 --- a/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts @@ -43,14 +43,7 @@ export class FlatComponent extends AbstractFlatWidget { protected status: string; protected override getChannelAddresses(): ChannelAddress[] { - let controllers = this.config.getComponentsByFactory("Controller.Evcs"); - for (let controller of controllers) { - let properties = controller.properties; - if ("evcs.id" in properties && properties["evcs.id"] === this.componentId) { - this.controller = controller; - } - } - return [ + const result = [ new ChannelAddress(this.component.id, 'ChargePower'), new ChannelAddress(this.component.id, 'Phases'), new ChannelAddress(this.component.id, 'Plug'), @@ -61,8 +54,17 @@ export class FlatComponent extends AbstractFlatWidget { new ChannelAddress(this.component.id, 'MinimumHardwarePower'), new ChannelAddress(this.component.id, 'MaximumHardwarePower'), new ChannelAddress(this.component.id, 'SetChargePowerLimit'), - new ChannelAddress(this.controller.id, '_PropertyEnabledCharging'), ]; + + let controllers = this.config.getComponentsByFactory("Controller.Evcs"); + for (let controller of controllers) { + let properties = controller.properties; + if ("evcs.id" in properties && properties["evcs.id"] === this.componentId) { + this.controller = controller; + result.push(new ChannelAddress(controller.id, '_PropertyEnabledCharging')); + } + } + return result; } protected override onCurrentData(currentData: CurrentData) { diff --git a/ui/src/app/edge/live/common/storage/modal/modal.component.html b/ui/src/app/edge/live/common/storage/modal/modal.component.html index 9752202590f..d0c77b98de7 100644 --- a/ui/src/app/edge/live/common/storage/modal/modal.component.html +++ b/ui/src/app/edge/live/common/storage/modal/modal.component.html @@ -918,8 +918,8 @@ Edge.Index.RETROFITTING.UPDATE_TO_NEW_VERSION - ? -
@@ -934,4 +934,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/index.component.html b/ui/src/app/edge/settings/app/index.component.html index 77a9c83e4e5..48926c47bdf 100644 --- a/ui/src/app/edge/settings/app/index.component.html +++ b/ui/src/app/edge/settings/app/index.component.html @@ -87,7 +87,7 @@

- {{ 'Edge.Config.App.updateAvailable' | translate: { edgeShortName: environment.edgeShortName } }} @@ -96,12 +96,20 @@

- - + + Edge.Config.App.Key.useKey + {{numberOfUnusedRegisteredKeys}} + + + Edge.Config.App.UNUSED_REGISTERED_KEY_AVAILABLE + + @@ -167,4 +175,4 @@

- \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/index.component.ts b/ui/src/app/edge/settings/app/index.component.ts index b28384ff91e..e5b4ac9e39b 100644 --- a/ui/src/app/edge/settings/app/index.component.ts +++ b/ui/src/app/edge/settings/app/index.component.ts @@ -1,6 +1,6 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; +import { IonPopover, ModalController } from '@ionic/angular'; import { TranslateService } from '@ngx-translate/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -8,7 +8,7 @@ import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componen import { Role } from 'src/app/shared/type/role'; import { Environment, environment } from 'src/environments'; import { Edge, Service, Websocket } from '../../../shared/shared'; -import { ExecuteSystemUpdate } from '../systemupdate/executeSystemUpdate'; +import { ExecuteSystemUpdate } from '../system/executeSystemUpdate'; import { GetApps } from './jsonrpc/getApps'; import { AppCenter } from './keypopup/appCenter'; import { AppCenterGetPossibleApps } from './keypopup/appCenterGetPossibleApps'; @@ -18,6 +18,7 @@ import { canEnterKey } from './permissions'; import { Flags } from './jsonrpc/flag/flags'; import { App } from './keypopup/app'; import { InstallAppComponent } from './install.component'; +import { AppCenterGetRegisteredKeys } from './keypopup/appCenterGetRegisteredKeys'; @Component({ selector: IndexComponent.SELECTOR, @@ -59,10 +60,13 @@ export class IndexComponent implements OnInit, OnDestroy { private useMasterKey: boolean = false; protected selectedBundle: number | null = null; - // check if update is available protected isUpdateAvailable: boolean = false; + protected canEnterKey: boolean = false; + protected numberOfUnusedRegisteredKeys: number = 0; + protected showPopover: boolean = false; + private hasSeenPopover: boolean = false; - protected canEnterKey: boolean | undefined; + @ViewChild('hasKeyPopover') private hasKeyPopover: IonPopover; private stopOnDestroy: Subject = new Subject(); @@ -99,6 +103,7 @@ export class IndexComponent implements OnInit, OnDestroy { .pipe(takeUntil(this.stopOnDestroy)) .subscribe(entry => { this.canEnterKey = canEnterKey(edge, entry.user); + this.updateHasUnusedKeysPopover(); }); edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ @@ -107,6 +112,7 @@ export class IndexComponent implements OnInit, OnDestroy { })).then(response => { this.service.stopSpinner(this.spinnerId); + this.apps = (response as GetApps.Response).result.apps.map(app => { app.imageUrl = environment.links.APP_CENTER.APP_IMAGE(this.translate.currentLang, app.appId); return app; @@ -123,6 +129,13 @@ export class IndexComponent implements OnInit, OnDestroy { this.updateSelection(); + edge.sendRequest(this.websocket, new AppCenter.Request({ + payload: new AppCenterGetRegisteredKeys.Request({}), + })).then(response => { + const result = (response as AppCenterGetRegisteredKeys.Response).result; + this.numberOfUnusedRegisteredKeys = result.keys.length; + this.updateHasUnusedKeysPopover(); + }).catch(this.service.handleError); }).catch(InstallAppComponent.errorToast(this.service, error => 'Error while receiving available apps: ' + error)); const systemUpdate = new ExecuteSystemUpdate(edge, this.websocket); @@ -140,6 +153,26 @@ export class IndexComponent implements OnInit, OnDestroy { this.stopOnDestroy.complete(); } + private updateHasUnusedKeysPopover() { + if (this.hasSeenPopover) { + return; + } + if (!this.canEnterKey) { + return; + } + if (this.numberOfUnusedRegisteredKeys === 0) { + return; + } + + this.hasSeenPopover = true; + + this.hasKeyPopover.event = { + type: 'willPresent', + target: document.querySelector('#redeemKeyCard'), + }; + this.showPopover = true; + } + /** * Updates the selected categories. * @param event the event of a click on a 'ion-fab-list' to stop it from closing diff --git a/ui/src/app/edge/settings/app/update.component.html b/ui/src/app/edge/settings/app/update.component.html index 807b8d78b18..b773512c8e0 100644 --- a/ui/src/app/edge/settings/app/update.component.html +++ b/ui/src/app/edge/settings/app/update.component.html @@ -17,8 +17,7 @@ [disabled]="(!((!varinstance.form.pristine) && (varinstance.form.valid))) || varinstance.isDeleting || varinstance.isUpdating" translate> Edge.Config.App.updateApp - + Edge.Config.App.deleteApp
@@ -31,4 +30,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/channels/channels.component.html b/ui/src/app/edge/settings/channels/channels.component.html index 2d0edb2acf1..eca4d6c2c62 100644 --- a/ui/src/app/edge/settings/channels/channels.component.html +++ b/ui/src/app/edge/settings/channels/channels.component.html @@ -140,6 +140,13 @@ + + + + Warnung: + Channelwert wird nicht sekündlich zum Online-Monitoring übertragen + + @@ -166,4 +173,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/channels/channels.component.ts b/ui/src/app/edge/settings/channels/channels.component.ts index 0badd89bad6..a0c297d6691 100644 --- a/ui/src/app/edge/settings/channels/channels.component.ts +++ b/ui/src/app/edge/settings/channels/channels.component.ts @@ -1,10 +1,11 @@ import { Component } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; +import { PersistencePriority } from 'src/app/shared/edge/edgeconfig'; import { SetChannelValueRequest } from 'src/app/shared/jsonrpc/request/setChannelValueRequest'; +import { environment } from 'src/environments'; import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from '../../../shared/shared'; -import { environment } from 'src/environments'; export type ComponentChannels = { [componentId: string]: ChannelAddress[]; @@ -25,7 +26,8 @@ export class ChannelsComponent { protected channelsToBeSubscribed: ChannelAddress[] = []; private channels: ChannelAddress[] = []; protected componentChannels: ComponentChannels[] = []; - protected componentChannelConfig: Map = new Map(); + protected componentChannelConfig: Map = new Map(); + constructor( private service: Service, private websocket: Websocket, @@ -63,15 +65,21 @@ export class ChannelsComponent { this.componentChannels[componentId] = [address]; } this.channelsToBeSubscribed.push(address); - this.componentChannelConfig.set(address.toString(), this.config.getChannel(address)); + this.componentChannelConfig.set(address.toString(), { ...this.config.getChannel(address), ...{ showPersistencePriority: false } }); if (this.config) { + const globalPersistencePriority = this.config.getComponentsByFactory("Controller.Api.Backend")?.[0]?.properties['persistencePriority'] ?? PersistencePriority.DEFAULT_GLOBAL_PRIORITY; + let channelConfig = this.config.getChannel(address); if (channelConfig) { if (channelConfig.accessMode == "WO") { // do not subscribe Write-Only Channels return; } + + if (PersistencePriority.isAtLeast(channelConfig.persistencePriority, globalPersistencePriority)) { + this.componentChannelConfig.set(address.toString(), { ...this.config.getChannel(address), ...{ showPersistencePriority: true } }); + } } } diff --git a/ui/src/app/edge/settings/profile/profile.component.html b/ui/src/app/edge/settings/profile/profile.component.html index d0f6a5e361b..a5adddc50c3 100644 --- a/ui/src/app/edge/settings/profile/profile.component.html +++ b/ui/src/app/edge/settings/profile/profile.component.html @@ -144,4 +144,4 @@

{{ item.alias }} - {{ environment.edgeShortName }} Systemupdate + {{ environment.edgeShortName }} System - + @@ -188,4 +188,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/settings.component.ts b/ui/src/app/edge/settings/settings.component.ts index 98ba871c6de..5076ca530a8 100644 --- a/ui/src/app/edge/settings/settings.component.ts +++ b/ui/src/app/edge/settings/settings.component.ts @@ -24,7 +24,7 @@ export class SettingsComponent implements OnInit { } public ngOnInit() { - this.service.setCurrentComponent({ languageKey: 'Menu.edgeSettings' }, this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.canSeeAppCenter = canSeeAppCenter(this.edge); }); diff --git a/ui/src/app/edge/settings/settings.module.ts b/ui/src/app/edge/settings/settings.module.ts index 24aa0aac0af..4c5b3920c50 100644 --- a/ui/src/app/edge/settings/settings.module.ts +++ b/ui/src/app/edge/settings/settings.module.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; import { ChangelogModule } from 'src/app/changelog/changelog.module'; + import { SharedModule } from './../../shared/shared.module'; import { AlertingComponent } from './alerting/alerting.component'; import { AppModule } from './app/app.module'; @@ -12,9 +13,10 @@ import { NetworkComponent } from './network/network.component'; import { AliasUpdateComponent } from './profile/aliasupdate.component'; import { ProfileComponent } from './profile/profile.component'; import { SettingsComponent } from './settings.component'; +import { MaintenanceComponent } from './system/maintenance/maintenance'; +import { OeSystemUpdateComponent } from './system/oe-system-update.component'; +import { SystemComponent } from './system/system.component'; import { SystemExecuteComponent } from './systemexecute/systemexecute.component'; -import { OeSystemUpdateComponent } from './systemupdate/oe-system-update.component'; -import { SystemUpdateComponent } from './systemupdate/systemupdate.component'; @NgModule({ imports: [ @@ -23,19 +25,20 @@ import { SystemUpdateComponent } from './systemupdate/systemupdate.component'; ChangelogModule, ], declarations: [ + AlertingComponent, AliasUpdateComponent, ChannelsComponent, ComponentInstallComponent, ComponentInstallIndexComponent, ComponentUpdateComponent, ComponentUpdateIndexComponent, + MaintenanceComponent, NetworkComponent, OeSystemUpdateComponent, ProfileComponent, SettingsComponent, + SystemComponent, SystemExecuteComponent, - SystemUpdateComponent, - AlertingComponent, ], entryComponents: [ ], diff --git a/ui/src/app/edge/settings/systemupdate/executeSystemUpdate.ts b/ui/src/app/edge/settings/system/executeSystemUpdate.ts similarity index 100% rename from ui/src/app/edge/settings/systemupdate/executeSystemUpdate.ts rename to ui/src/app/edge/settings/system/executeSystemUpdate.ts diff --git a/ui/src/app/edge/settings/systemupdate/executeSystemUpdateRequest.ts b/ui/src/app/edge/settings/system/executeSystemUpdateRequest.ts similarity index 100% rename from ui/src/app/edge/settings/systemupdate/executeSystemUpdateRequest.ts rename to ui/src/app/edge/settings/system/executeSystemUpdateRequest.ts diff --git a/ui/src/app/edge/settings/systemupdate/executesystemupdate.component.html b/ui/src/app/edge/settings/system/executesystemupdate.component.html similarity index 100% rename from ui/src/app/edge/settings/systemupdate/executesystemupdate.component.html rename to ui/src/app/edge/settings/system/executesystemupdate.component.html diff --git a/ui/src/app/edge/settings/systemupdate/executesystemupdate.component.ts b/ui/src/app/edge/settings/system/executesystemupdate.component.ts similarity index 100% rename from ui/src/app/edge/settings/systemupdate/executesystemupdate.component.ts rename to ui/src/app/edge/settings/system/executesystemupdate.component.ts diff --git a/ui/src/app/edge/settings/systemupdate/getSystemUpdateStateRequest.ts b/ui/src/app/edge/settings/system/getSystemUpdateStateRequest.ts similarity index 100% rename from ui/src/app/edge/settings/systemupdate/getSystemUpdateStateRequest.ts rename to ui/src/app/edge/settings/system/getSystemUpdateStateRequest.ts diff --git a/ui/src/app/edge/settings/systemupdate/getSystemUpdateStateResponse.ts b/ui/src/app/edge/settings/system/getSystemUpdateStateResponse.ts similarity index 100% rename from ui/src/app/edge/settings/systemupdate/getSystemUpdateStateResponse.ts rename to ui/src/app/edge/settings/system/getSystemUpdateStateResponse.ts diff --git a/ui/src/app/edge/settings/system/maintenance/maintenance.html b/ui/src/app/edge/settings/system/maintenance/maintenance.html new file mode 100644 index 00000000000..a7a0a296ea1 --- /dev/null +++ b/ui/src/app/edge/settings/system/maintenance/maintenance.html @@ -0,0 +1,39 @@ + + + + + + {{option.info}} + + + + + + + + {{option.message}} + + + + + + + +
+ +
+
+
+
+
+ + + + {{option.button.label}} + + +
+
+
diff --git a/ui/src/app/edge/settings/system/maintenance/maintenance.ts b/ui/src/app/edge/settings/system/maintenance/maintenance.ts new file mode 100644 index 00000000000..08ab7952400 --- /dev/null +++ b/ui/src/app/edge/settings/system/maintenance/maintenance.ts @@ -0,0 +1,190 @@ +import { Component, OnInit } from '@angular/core'; +import { AlertController } from '@ionic/angular'; +import { TranslateService } from '@ngx-translate/core'; +import { BehaviorSubject, Subscription } from 'rxjs'; +import { skip } from 'rxjs/operators'; +import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; +import { ExecuteSystemRestartRequest, Type } from 'src/app/shared/jsonrpc/request/executeSystemRestartRequest'; +import { Role } from 'src/app/shared/type/role'; +import { environment } from 'src/environments'; + +import { Edge, Service, Utils, Websocket } from '../../../../shared/shared'; + +enum SystemRestartState { + INITIAL, // No restart + RESTARTING, // System is restarting + RESTARTED, // System was restarted successfully + FAILED, // System restart failed +} + +@Component({ + selector: MaintenanceComponent.SELECTOR, + templateUrl: './maintenance.html', + styles: [` + :host { + ion-card: { + cursor: auto !important;; + } + } + `], +}) +export class MaintenanceComponent implements OnInit { + + private static readonly SELECTOR: string = 'oe-maintenance'; + private static readonly TIMEOUT: number = 3000; + protected readonly environment = environment; + + protected edge: Edge | null = null; + protected options: { key: string, message: string, color: 'success' | 'warning' | null, info: string, roleIsAtLeast: Role, button: { disabled: boolean, label: string, callback: () => void } }[] = [ + { + key: Type.HARD, message: null, color: null, info: this.translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: environment.edgeShortName }), roleIsAtLeast: Role.OWNER, button: { + callback: () => this.presentAlert(Type.HARD), disabled: false, label: this.translate.instant('SETTINGS.SYSTEM_UPDATE.EMS_RESTARTING', { edgeShortName: environment.edgeShortName }), + }, + }, + ]; + + protected systemRestartState: BehaviorSubject<{ key: Type, state: SystemRestartState }> = new BehaviorSubject({ key: null, state: SystemRestartState.INITIAL }); + protected spinnerId: string = MaintenanceComponent.SELECTOR; + protected readonly SystemRestartState = SystemRestartState; + + constructor( + protected utils: Utils, + private websocket: Websocket, + protected service: Service, + private translate: TranslateService, + private alertCtrl: AlertController, + ) { + } + + ngOnInit() { + this.service.startSpinner(this.spinnerId); + this.service.getCurrentEdge().then((edge) => { + this.service.getConfig().then(() => { + this.edge = edge; + + this.options = this.options.map(option => { + option.button.disabled = !this.edge.roleIsAtLeast(option.roleIsAtLeast); + return option; + }); + }); + }); + + this.systemRestartState.subscribe(state => { + this.updateOptions(state.key); + }); + } + + /** + * Updates the options + * + * @param type the restart type + */ + private updateOptions(type: Type): void { + let message: string | null = null; + let disableButtons: boolean = false; + let showInfo: boolean = false; + let color: 'warning' | 'success' | null = null; + const system = type === Type.HARD ? environment.edgeShortName : this.translate.instant('General.SYSTEM'); + + switch (this.systemRestartState?.value?.state) { + case SystemRestartState.FAILED: + message = this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_FAILED", { system: system }); + color = 'warning'; + disableButtons = false; + showInfo = true; + break; + case SystemRestartState.RESTARTING: + this.service.startSpinnerTransparentBackground(this.spinnerId + type); + this.checkSystemState(type); + disableButtons = true; + message = this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTARTING", { system: system, minutes: 10 }); + break; + case SystemRestartState.RESTARTED: + this.service.stopSpinner(this.spinnerId + type); + disableButtons = false; + color = 'success'; + message = this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTARTED", { system: system }); + showInfo = true; + break; + } + + if (!message) { + return; + } + + this.options = this.options.map(option => { + if (option.key === type) { + option.message = message; + } + // Hide and show buttons + option.button.disabled = disableButtons ? disableButtons : !this.edge.roleIsAtLeast(option.roleIsAtLeast); + option.color = color; + option.info = showInfo ? this.translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: environment.edgeShortName }) : null; + return option; + }); + } + + /** + * Executes the system restart + * + * @param type the restart type + */ + private execRestart(type: Type) { + + const request = new ComponentJsonApiRequest({ componentId: '_host', payload: new ExecuteSystemRestartRequest({ type: type }) }); + + // Workaround, there could be no response + this.edge.sendRequest(this.websocket, request).catch(() => { + this.systemRestartState.next({ key: type, state: SystemRestartState.FAILED }); + return; + }); + + setTimeout(() => { + if (this.systemRestartState?.value?.state === SystemRestartState.FAILED) { + return; + } + + this.systemRestartState.next({ key: type, state: SystemRestartState.RESTARTING }); + }, MaintenanceComponent.TIMEOUT); + } + + /** + * Checks the system state and waits for a getEdgeConfig notification + * + * @param type the restart type + */ + private checkSystemState(type: Type): void { + + const subscription: Subscription = new Subscription(); + subscription.add( + + // wait for next edgeConfig + this.edge.getConfig(this.websocket).pipe(skip(1)).subscribe(() => { + subscription.unsubscribe(); + this.systemRestartState.next({ key: type, state: SystemRestartState.RESTARTED }); + }), + ); + } + + /** + * Present confirmation alert + */ + async presentAlert(type: Type) { + const translate = this.translate; + const system = type === Type.HARD ? environment.edgeShortName : 'OpenEMS'; + let alert = this.alertCtrl.create({ + subHeader: translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_CONFIRMATION', { system: system }), + message: translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: system }), + buttons: [{ + text: translate.instant('General.cancel'), + role: 'cancel', + }, + { + text: translate.instant('General.RESTART'), + handler: () => this.execRestart(type), + }], + cssClass: 'alertController', + }); + (await alert).present(); + } +} diff --git a/ui/src/app/edge/settings/systemupdate/oe-system-update.component.html b/ui/src/app/edge/settings/system/oe-system-update.component.html similarity index 97% rename from ui/src/app/edge/settings/systemupdate/oe-system-update.component.html rename to ui/src/app/edge/settings/system/oe-system-update.component.html index 59aaa43f6c6..8d72981632f 100644 --- a/ui/src/app/edge/settings/systemupdate/oe-system-update.component.html +++ b/ui/src/app/edge/settings/system/oe-system-update.component.html @@ -5,7 +5,7 @@ - {{ 'SETTINGS.SYSTEM_UPDATE.RESTARTING' | translate: + {{ 'SETTINGS.SYSTEM_UPDATE.EDGE_RESTARTING' | translate: { edge: environment.edgeShortName } }}
{{ 'SETTINGS.SYSTEM_UPDATE.UPDATE_TIME'| translate}}
@@ -145,7 +145,7 @@ - + {{ 'SETTINGS.SYSTEM_UPDATE.NEW_VERSION_INSTALLING'| translate }} @@ -157,4 +157,4 @@
- \ No newline at end of file + diff --git a/ui/src/app/edge/settings/systemupdate/oe-system-update.component.ts b/ui/src/app/edge/settings/system/oe-system-update.component.ts similarity index 100% rename from ui/src/app/edge/settings/systemupdate/oe-system-update.component.ts rename to ui/src/app/edge/settings/system/oe-system-update.component.ts diff --git a/ui/src/app/edge/settings/systemupdate/systemupdate.component.html b/ui/src/app/edge/settings/system/system.component.html similarity index 85% rename from ui/src/app/edge/settings/systemupdate/systemupdate.component.html rename to ui/src/app/edge/settings/system/system.component.html index b1e3a2d072c..fb00b72fee6 100644 --- a/ui/src/app/edge/settings/systemupdate/systemupdate.component.html +++ b/ui/src/app/edge/settings/system/system.component.html @@ -2,6 +2,11 @@ + + + + + @@ -23,4 +28,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/systemupdate/systemupdate.component.ts b/ui/src/app/edge/settings/system/system.component.ts similarity index 53% rename from ui/src/app/edge/settings/systemupdate/systemupdate.component.ts rename to ui/src/app/edge/settings/system/system.component.ts index 14990101572..c88f08fb295 100644 --- a/ui/src/app/edge/settings/systemupdate/systemupdate.component.ts +++ b/ui/src/app/edge/settings/system/system.component.ts @@ -1,24 +1,26 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { environment } from 'src/environments'; -import { Edge, Service, Utils } from '../../../shared/shared'; +import { Edge, Service, UserPermission, Utils } from '../../../shared/shared'; @Component({ - selector: SystemUpdateComponent.SELECTOR, - templateUrl: './systemupdate.component.html', + selector: SystemComponent.SELECTOR, + templateUrl: './system.component.html', }) -export class SystemUpdateComponent implements OnInit { +export class SystemComponent implements OnInit { - private static readonly SELECTOR = "systemUpdate"; + private static readonly SELECTOR = "system"; public readonly environment = environment; - public readonly spinnerId: string = SystemUpdateComponent.SELECTOR; + public readonly spinnerId: string = SystemComponent.SELECTOR; public showLog: boolean = false; public readonly ESTIMATED_REBOOT_TIME = 600; // Seconds till the openems service is restarted after update public edge: Edge; public restartTime: number = this.ESTIMATED_REBOOT_TIME; + protected canSeeSystemRestart: boolean = false; + constructor( private route: ActivatedRoute, protected utils: Utils, @@ -26,9 +28,9 @@ export class SystemUpdateComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent("", this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; + this.canSeeSystemRestart = UserPermission.isAllowedToSeeSystemRestart(this.service.currentUser, edge); }); } - } diff --git a/ui/src/app/shared/edge/edge.ts b/ui/src/app/shared/edge/edge.ts index 859979190c1..ac05c50c7cd 100644 --- a/ui/src/app/shared/edge/edge.ts +++ b/ui/src/app/shared/edge/edge.ts @@ -1,7 +1,7 @@ import { compareVersions } from 'compare-versions'; import { BehaviorSubject, Subject } from 'rxjs'; - import { SumState } from 'src/app/index/shared/sumState'; + import { JsonrpcRequest, JsonrpcResponseSuccess } from '../jsonrpc/base'; import { CurrentDataNotification } from '../jsonrpc/notification/currentDataNotification'; import { EdgeConfigNotification } from '../jsonrpc/notification/edgeConfigNotification'; @@ -14,7 +14,7 @@ import { SubscribeChannelsRequest } from '../jsonrpc/request/subscribeChannelsRe import { SubscribeSystemLogRequest } from '../jsonrpc/request/subscribeSystemLogRequest'; import { UpdateComponentConfigRequest } from '../jsonrpc/request/updateComponentConfigRequest'; import { GetEdgeConfigResponse } from '../jsonrpc/response/getEdgeConfigResponse'; -import { ArrayUtils } from '../service/arrayutils'; +import { ArrayUtils } from '../utils/array/array.utils'; import { Websocket } from '../service/websocket'; import { ChannelAddress } from '../type/channeladdress'; import { Role } from '../type/role'; @@ -134,6 +134,16 @@ export class Edge { this.sendSubscribeChannels(websocket); } + /** + * Removes all Channels from subscription + * + * @param websocket the Websocket + */ + public unsubscribeAllChannels(websocket: Websocket) { + this.subscribedChannels = {}; + this.sendSubscribeChannels(websocket); + } + /** * Unsubscribes from passed channels * diff --git a/ui/src/app/shared/edge/edgeconfig.ts b/ui/src/app/shared/edge/edgeconfig.ts index c632b5d95c7..1a8a14a68e9 100644 --- a/ui/src/app/shared/edge/edgeconfig.ts +++ b/ui/src/app/shared/edge/edgeconfig.ts @@ -622,6 +622,27 @@ export class EdgeConfig { } } +export enum PersistencePriority { + VERY_LOW = "VERY_LOW", // + LOW = "LOW", // + MEDIUM = "MEDIUM", // + HIGH = "HIGH", // + VERY_HIGH = "VERY_HIGH", // +} + +export namespace PersistencePriority { + + export const DEFAULT_CHANNEL_PRIORITY: string = PersistencePriority.VERY_LOW; + export const DEFAULT_GLOBAL_PRIORITY: string = PersistencePriority.HIGH; + + export function isAtLeast(prio1: string, prio2: string) { + if (typeof prio1 !== 'string' || typeof prio2 !== 'string') { + return false; + } + return Object.keys(PersistencePriority).indexOf(prio1) <= Object.keys(PersistencePriority).indexOf(prio2); + } +} + export module EdgeConfig { export class ComponentChannel { public readonly type: "BOOLEAN" | "SHORT" | "INTEGER" | "LONG" | "FLOAT" | "DOUBLE" | "STRING"; @@ -629,6 +650,7 @@ export module EdgeConfig { public readonly unit: string; public readonly category: "OPENEMS_TYPE" | "ENUM" | "STATE"; public readonly level: "INFO" | "OK" | "WARNING" | "FAULT"; + public readonly persistencePriority: PersistencePriority; } export class Component { diff --git a/ui/src/app/shared/footer/footer.html b/ui/src/app/shared/footer/footer.html new file mode 100644 index 00000000000..44f7cf74119 --- /dev/null +++ b/ui/src/app/shared/footer/footer.html @@ -0,0 +1,23 @@ + + + + + + + {{displayValues.comment}} + | + + + {{displayValues.id}} + + | + + + Version {{(displayValues.version | version:role)}} + + + + + + + diff --git a/ui/src/app/shared/footer/footer.ts b/ui/src/app/shared/footer/footer.ts new file mode 100644 index 00000000000..5e9f34f986f --- /dev/null +++ b/ui/src/app/shared/footer/footer.ts @@ -0,0 +1,80 @@ +import { Component, HostBinding, OnInit } from "@angular/core"; +import { Title } from "@angular/platform-browser"; +import { filter } from "rxjs/operators"; + +import { environment } from '../../../environments'; +import { User } from "../jsonrpc/shared"; +import { Edge, Service } from "../shared"; +import { Role } from "../type/role"; + +@Component({ + selector: 'oe-footer', + styles: [` + + :host[data-isSmartPhone=true] { + position: relative; + } + + :host[data-isSmartPhone=false] { + position: sticky; + bottom: 0; + width: 100%; + + font-size: 14px !important; + ion-row: { + text-align: center; + } + + ion-item: { + --min-height: initial !important; + font-size: inherit; + } + } + `], + templateUrl: 'footer.html', +}) +export class FooterComponent implements OnInit { + + protected user: User | null = null; + protected edge: Edge | null = null; + protected displayValues: { version: string, id: string, comment: string } | null = null; + protected isAtLeastOwner: boolean | null = null; + + @HostBinding('attr.data-isSmartPhone') + public isSmartPhone: boolean = this.service.isSmartphoneResolution; + + constructor( + protected service: Service, + private title: Title, + ) { } + + ngOnInit() { + this.service.currentEdge.subscribe((edge) => { + this.edge = edge; + + this.service.metadata.pipe(filter(metadata => !!metadata)).subscribe((metadata) => { + this.user = metadata.user; + + let title = environment.edgeShortName; + if (edge) { + this.displayValues = FooterComponent.getDisplayValues(edge); + + if (this.user.hasMultipleEdges) { + title += " | " + edge.id; + } + } + + this.title.setTitle(title); + this.isAtLeastOwner = Role.isAtLeast(this.user.globalRole, Role.OWNER); + }); + }); + } + + private static getDisplayValues(edge: Edge): { version: string; id: string; comment: string; } { + return { + comment: edge?.comment, + id: edge.id, + version: edge.version, + }; + } +} diff --git a/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts b/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts index d4305108ae7..3734575550f 100644 --- a/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts +++ b/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts @@ -3,10 +3,11 @@ import { ChangeDetectorRef, Directive, Input, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import * as Chart from 'chart.js'; +import { calculateResolution, ChronoUnit, DEFAULT_TIME_CHART_OPTIONS, isLabelVisible, Resolution, setLabelVisible } from 'src/app/edge/history/shared'; import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse'; import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import 'chartjs-adapter-date-fns'; -import { DEFAULT_TIME_CHART_OPTIONS, isLabelVisible, calculateResolution, ChronoUnit, Resolution, setLabelVisible } from 'src/app/edge/history/shared'; +import { v4 as uuidv4 } from 'uuid'; + import { JsonrpcResponseError } from '../../jsonrpc/base'; import { QueryHistoricTimeseriesDataRequest } from '../../jsonrpc/request/queryHistoricTimeseriesDataRequest'; import { QueryHistoricTimeseriesEnergyPerPeriodRequest } from '../../jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest'; @@ -14,15 +15,17 @@ import { QueryHistoricTimeseriesEnergyRequest } from '../../jsonrpc/request/quer import { QueryHistoricTimeseriesDataResponse } from '../../jsonrpc/response/queryHistoricTimeseriesDataResponse'; import { QueryHistoricTimeseriesEnergyResponse } from '../../jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; import { FormatSecondsToDurationPipe } from '../../pipe/formatSecondsToDuration/formatSecondsToDuration.pipe'; -import { HistoryUtils, ChartAxis, YAxisTitle } from '../../service/utils'; -import { EdgeConfig, Edge, Service, Utils, ChannelAddress, Currency } from '../../shared'; +import { ChartAxis, HistoryUtils, YAxisTitle } from '../../service/utils'; +import { ChannelAddress, Currency, Edge, EdgeConfig, Service, Utils } from '../../shared'; import { Language } from '../../type/language'; import { ColorUtils } from '../../utils/color/color.utils'; import { DateUtils } from '../../utils/date/dateutils'; import { DateTimeUtils } from '../../utils/datetime/datetime-utils'; import { TimeUtils } from '../../utils/time/timeutils'; import { Converter } from '../shared/converter'; -import { v4 as uuidv4 } from 'uuid'; +import { ChartConstants as ChartConstants } from './chart.constants'; + +import 'chartjs-adapter-date-fns'; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load @@ -544,13 +547,16 @@ export abstract class AbstractHistoryChart implements OnInit { * @returns options */ public static getOptions(chartObject: HistoryUtils.ChartData, chartType: 'line' | 'bar', service: Service, - translate: TranslateService, legendOptions: { label: string, strokeThroughHidingStyle: boolean }[], channelData: { data: { [name: string]: number[] } }, locale: string, config: EdgeConfig): Chart.ChartOptions { + translate: TranslateService, legendOptions: { label: string, strokeThroughHidingStyle: boolean }[], channelData: { data: { [name: string]: number[] } }, locale: string, config: EdgeConfig, datasets: Chart.ChartDataset[]): Chart.ChartOptions { let tooltipsLabel: string | null = null; let options: Chart.ChartOptions = Utils.deepCopy(Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS)); + let displayValues: HistoryUtils.DisplayValues[] = chartObject.output(channelData.data); + const showYAxisTitle: boolean = chartObject.yAxes.length > 1; chartObject.yAxes.forEach((element) => { - options = AbstractHistoryChart.getYAxisOptions(options, element, translate, chartType, locale); + const scaleOptions: { min: number, max: number, stepSize: number } | null = ChartConstants.getScaleOptions(datasets, element); + options = AbstractHistoryChart.getYAxisOptions(options, element, translate, chartType, locale, showYAxisTitle, scaleOptions); }); options.plugins.tooltip.callbacks.title = (tooltipItems: Chart.TooltipItem[]): string => { @@ -586,7 +592,6 @@ export abstract class AbstractHistoryChart implements OnInit { options.scales.x['time'].unit = calculateResolution(service, service.historyPeriod.value.from, service.historyPeriod.value.to).timeFormat; - let displayValues = chartObject.output(channelData.data); options.plugins.tooltip.callbacks.labelColor = (item: Chart.TooltipItem) => { return { borderColor: ColorUtils.changeOpacityFromRGBA(item.dataset.borderColor, 1), @@ -695,58 +700,59 @@ export abstract class AbstractHistoryChart implements OnInit { * @param locale the current locale * @returns the chart options {@link Chart.ChartOptions} */ - public static getYAxisOptions(options: Chart.ChartOptions, element: HistoryUtils.yAxes, translate: TranslateService, chartType: 'line' | 'bar', locale: string): Chart.ChartOptions { + public static getYAxisOptions(options: Chart.ChartOptions, element: HistoryUtils.yAxes, translate: TranslateService, chartType: 'line' | 'bar', locale: string, showYAxisTitle?: boolean, data?: { min: number, max: number, stepSize: number }): Chart.ChartOptions { + + const baseConfig = { + title: { + text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), + display: showYAxisTitle, + padding: 5, + font: { + size: 11, + }, + }, + position: element.position, + grid: { + display: element.displayGrid ?? true, + }, + ...(data?.min != null && { min: data.min }), + ...(data?.max != null && { max: data.max }), + + ticks: { + color: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-text'), + padding: 5, + maxTicksLimit: ChartConstants.NUMBER_OF_Y_AXIS_TICKS, + ...(data?.stepSize && { stepSize: data.stepSize }), + }, + }; + switch (element.unit) { case YAxisTitle.RELAY: if (chartType === 'line') { options.scales[element.yAxisId] = { - position: element.position, + ...baseConfig, min: 0, max: 1, beginAtZero: true, - - title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), - display: true, - padding: 10, - font: { - size: 11, - }, - }, - - grid: { - display: element.displayGrid ?? true, - }, ticks: { - color: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-text'), + ...baseConfig.ticks, // Two states are possible callback: function (value, index, ticks) { return Converter.ON_OFF(translate)(value); }, padding: 5, - stepSize: 20, }, }; } if (chartType === 'bar') { options.scales[element.yAxisId] = { - position: element.position, + ...baseConfig, min: 0, beginAtZero: true, - title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), - display: true, - padding: 5, - font: { - size: 11, - }, - }, - grid: { - display: element.displayGrid ?? true, - }, ticks: { + ...baseConfig.ticks, callback: function (value, index, values) { if (typeof value !== 'number') { @@ -761,44 +767,26 @@ export abstract class AbstractHistoryChart implements OnInit { break; case YAxisTitle.PERCENTAGE: options.scales[element.yAxisId] = { + ...baseConfig, stacked: true, beginAtZero: true, max: 100, min: 0, type: 'linear', - title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), - display: true, - font: { - size: 11, - }, - }, - position: element.position, - grid: { - display: element.displayGrid ?? true, - }, ticks: { + ...baseConfig.ticks, padding: 5, - stepSize: 20, + stepSize: 25, }, }; break; case YAxisTitle.TIME: options.scales[element.yAxisId] = { + ...baseConfig, min: 0, - position: element.position, - title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), - display: true, - font: { - size: 11, - }, - }, - grid: { - display: element.displayGrid ?? true, - }, ticks: { + ...baseConfig.ticks, callback: function (value, index, values) { if (typeof value === 'number') { @@ -811,60 +799,18 @@ export abstract class AbstractHistoryChart implements OnInit { case YAxisTitle.POWER: case YAxisTitle.ENERGY: case YAxisTitle.VOLTAGE: - options.scales[element.yAxisId] = { - title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), - display: true, - padding: 5, - font: { - size: 11, - }, - }, - position: element.position, - grid: { - display: element.displayGrid ?? true, - }, - ticks: {}, - }; + case YAxisTitle.NONE: + options.scales[element.yAxisId] = baseConfig; break; case YAxisTitle.CURRENCY: options.scales[element.yAxisId] = { - title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), - display: true, - padding: 5, - font: { - size: 11, - }, - }, - position: element.position, - grid: { - display: element.displayGrid ?? true, - }, + ...baseConfig, beginAtZero: false, ticks: { source: 'auto', }, }; break; - case YAxisTitle.NONE: - options.scales[element.yAxisId] = { - title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), - display: true, - padding: 5, - font: { - size: 11, - }, - }, - position: element.position, - grid: { - display: element.displayGrid ?? true, - }, - beginAtZero: false, - ticks: {}, - }; - break; } return options; } @@ -875,7 +821,7 @@ export abstract class AbstractHistoryChart implements OnInit { */ protected setChartLabel() { const locale = this.service.translate.currentLang; - this.options = AbstractHistoryChart.getOptions(this.chartObject, this.chartType, this.service, this.translate, this.legendOptions, this.channelData, locale, this.config); + this.options = AbstractHistoryChart.getOptions(this.chartObject, this.chartType, this.service, this.translate, this.legendOptions, this.channelData, locale, this.config, this.datasets); this.loading = false; this.stopSpinner(); } diff --git a/ui/src/app/shared/genericComponents/chart/chart.constants.spec.ts b/ui/src/app/shared/genericComponents/chart/chart.constants.spec.ts new file mode 100644 index 00000000000..7024335ee16 --- /dev/null +++ b/ui/src/app/shared/genericComponents/chart/chart.constants.spec.ts @@ -0,0 +1,33 @@ +import { ChartDataset } from "chart.js"; +import { History } from "src/app/edge/history/common/energy/chart/channels.spec"; + +import { ChartAxis, HistoryUtils, YAxisTitle } from "../../service/utils"; +import { ChartConstants } from "./chart.constants"; + +describe('Chart constants', () => { + it('#calculateStepSize', () => { + expect(ChartConstants.calculateStepSize(0, 10)).toEqual(2.5); + expect(ChartConstants.calculateStepSize(0, null)).toEqual(null); + expect(ChartConstants.calculateStepSize(-10, 0)).toEqual(2.5); + expect(ChartConstants.calculateStepSize(undefined, 0)).toEqual(null); + + // min higher than max + expect(ChartConstants.calculateStepSize(10, 0)).toEqual(null); + }); + + it('#getScaleOptions', () => { + const yAxis: HistoryUtils.yAxes = { unit: YAxisTitle.ENERGY, position: 'left', yAxisId: ChartAxis.LEFT }; + const datasets: ChartDataset[] = [ + { + data: History.DAY.dataChannelWithValues.result.data['_sum/ConsumptionActivePower'], + label: 'consumption', + yAxisID: ChartAxis.LEFT, + }, + ]; + + expect(ChartConstants.getScaleOptions([], yAxis)).toEqual({ min: null, max: null, stepSize: null }); + expect(ChartConstants.getScaleOptions(datasets, yAxis)).toEqual({ min: 0, max: 1892, stepSize: 473 }); + expect(ChartConstants.getScaleOptions(null, yAxis)).toEqual(null); + expect(ChartConstants.getScaleOptions(null, null)).toEqual(null); + }); +}); diff --git a/ui/src/app/shared/genericComponents/chart/chart.constants.ts b/ui/src/app/shared/genericComponents/chart/chart.constants.ts new file mode 100644 index 00000000000..f239cbaf399 --- /dev/null +++ b/ui/src/app/shared/genericComponents/chart/chart.constants.ts @@ -0,0 +1,57 @@ +import { ChartDataset } from "chart.js"; + +import { ArrayUtils } from "../../utils/array/array.utils"; +import { HistoryUtils, Utils } from "../../service/utils"; + +export class ChartConstants { + public static readonly NUMBER_OF_Y_AXIS_TICKS: number = 6; + + /** + * Gets the scale options for all datasets of the passed yAxis + * + * @param datasets the datasets + * @param yAxis the yAxis + * @returns min, max and stepsize for datasets belonging to this yAxis + */ + public static getScaleOptions(datasets: ChartDataset[], yAxis: HistoryUtils.yAxes): { min: number; max: number; stepSize: number; } | null { + + return datasets?.filter(el => el['yAxisID'] === yAxis.yAxisId) + .reduce((arr, dataset) => { + const min = Math.floor(Math.min(arr.min, ArrayUtils.findSmallestNumber(dataset.data as number[]))) ?? null; + const max = Math.ceil(Math.max(arr.max, ArrayUtils.findBiggestNumber(dataset.data as number[]))) ?? null; + + if (max === null || min === null) { + return arr; + } + + arr = { + min: min, + max: max, + stepSize: Math.max(arr.stepSize, ChartConstants.calculateStepSize(min, max)), + }; + + return arr; + }, { min: null, max: null, stepSize: null }) + ?? null; + } + + /** + * Calculates the stepSize + * + * @param min the minimum + * @param max the maximum + * @returns the stepSize if max and min are not null and min is smaller than max + */ + public static calculateStepSize(min: number, max: number): number | null { + + if (min == null || max == null || min > max) { + return null; + } + + const difference = max - min; + + return parseFloat(Utils.divideSafely(difference, + /* Subtracting 0, because there is always one interval less than amount of ticks*/ + ChartConstants.NUMBER_OF_Y_AXIS_TICKS - 2).toString()); + } +} diff --git a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts index 7795dc44706..7cf848aa4f0 100644 --- a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts +++ b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts @@ -7,10 +7,18 @@ import { ChannelAddress, Edge, Service, Websocket } from "src/app/shared/shared" import { v4 as uuidv4 } from 'uuid'; import { DataService } from "../shared/dataservice"; +import { Filter } from "../shared/filter"; @Directive() export abstract class AbstractFlatWidgetLine implements OnChanges, OnDestroy { + /** + * Use `filter` to remove a line depending on a value. + * + * @param value the current data value + * @returns converter function + */ + @Input() public filter: Filter = Filter.NO_FILTER; /** * Use `converter` to convert/map a CurrentData value to another value, e.g. an Enum number to a text. * @@ -32,6 +40,7 @@ export abstract class AbstractFlatWidgetLine implements OnChanges, OnDestroy { } private _channelAddress: ChannelAddress | null = null; + protected show: boolean = true; /** * displayValue is the displayed @Input value in html @@ -59,6 +68,9 @@ export abstract class AbstractFlatWidgetLine implements OnChanges, OnDestroy { protected setValue(value: any) { this.displayValue = this.converter(value); + if (this.filter) { + this.show = this.filter(value); + } } protected subscribe(channelAddress: ChannelAddress) { diff --git a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts index 6e0a3baecdd..f2b30f795ac 100644 --- a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts +++ b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts @@ -52,9 +52,7 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { // announce initialized this.isInitialized = true; - this.afterIsInitialized(); - // get the channel addresses that should be subscribed let channelAddresses: Set = new Set(this.getChannelAddresses()); let channelIds = this.getChannelIds(); diff --git a/ui/src/app/shared/genericComponents/flat/flat-widget-line/flat-widget-line.html b/ui/src/app/shared/genericComponents/flat/flat-widget-line/flat-widget-line.html index afd647c4c82..48644948aae 100644 --- a/ui/src/app/shared/genericComponents/flat/flat-widget-line/flat-widget-line.html +++ b/ui/src/app/shared/genericComponents/flat/flat-widget-line/flat-widget-line.html @@ -1,4 +1,4 @@ - +
diff --git a/ui/src/app/shared/genericComponents/shared/filter.ts b/ui/src/app/shared/genericComponents/shared/filter.ts index ecc50004168..4203954819f 100644 --- a/ui/src/app/shared/genericComponents/shared/filter.ts +++ b/ui/src/app/shared/genericComponents/shared/filter.ts @@ -20,5 +20,15 @@ export namespace Filter { */ export const GRID_MODE_IS_OFF_GRID: Filter = (value): boolean => value === GridMode.OFF_GRID; + /** + * Filter to check if the value is not null or undefined. + * + * @param value the value to check + * @returns true if the value is neither null nor undefined + */ + export const NOT_NULL_OR_UNDEFINED: Filter = (value): boolean => { + return value !== null && value !== undefined; + }; + export const HIDE_NEGATIVE_VALUES: Filter = (value: number): boolean => value < 0; } diff --git a/ui/src/app/shared/genericComponents/shared/testing/common.ts b/ui/src/app/shared/genericComponents/shared/testing/common.ts index df13d1a4020..a05d77e00ad 100644 --- a/ui/src/app/shared/genericComponents/shared/testing/common.ts +++ b/ui/src/app/shared/genericComponents/shared/testing/common.ts @@ -3,6 +3,7 @@ import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/resp import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse"; import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartConstants } from "../../chart/chart.constants"; import { OeChartTester } from "./tester"; export namespace OeTester { @@ -21,16 +22,37 @@ export namespace OeTester { } export namespace ChartOptions { - export const LINE_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', title?: string): OeChartTester.Dataset.Option => ({ + export const LINE_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min: number, max: number }, ticks: { stepSize: number } } }, title?: string): OeChartTester.Dataset.Option => ({ type: 'option', options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} } }, "scales": { "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} } }, + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} } }, "scales": { + "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { + ...options["left"].scale, ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kW", "display": false, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + "ticks": { + ...options["left"].ticks, + "color": '', + "padding": 5, + "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, + }, + }, + }, }, }); - export const BAR_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', title?: string): OeChartTester.Dataset.Option => ({ + export const BAR_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min: number, max: number }, ticks: { stepSize: number } } }, title?: string): OeChartTester.Dataset.Option => ({ type: 'option', options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} } }, "scales": { "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} } }, + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} } }, "scales": { + "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, + "left": { + ...options["left"].scale, ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kWh", "display": false, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + "ticks": { + ...options["left"].ticks, + "color": '', + "padding": 5, + "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, + }, + }, + }, }, }); } diff --git a/ui/src/app/shared/genericComponents/shared/testing/tester.ts b/ui/src/app/shared/genericComponents/shared/testing/tester.ts index d65a86d2c4f..3e6d3bcc9dd 100644 --- a/ui/src/app/shared/genericComponents/shared/testing/tester.ts +++ b/ui/src/app/shared/genericComponents/shared/testing/tester.ts @@ -237,7 +237,7 @@ export class OeChartTester { let configuration = AbstractHistoryChart.fillChart(chartType, chartData, channelData, channels.energyChannelWithValues); let data: OeChartTester.Dataset.Data[] = OeChartTester.convertChartDatasetsToDatasets(configuration.datasets); let labels: OeChartTester.Dataset.LegendLabel = OeChartTester.convertChartLabelsToLegendLabels(configuration.labels); - let options: OeChartTester.Dataset.Option = OeChartTester.convertChartDataToOptions(chartData, chartType, testContext, channels, testContext.translate.currentLang, config); + let options: OeChartTester.Dataset.Option = OeChartTester.convertChartDataToOptions(chartData, chartType, testContext, channels, testContext.translate.currentLang, config, configuration.datasets); return { datasets: { @@ -291,7 +291,7 @@ export class OeChartTester { * @param channels the channels * @returns dataset options */ - public static convertChartDataToOptions(chartData: HistoryUtils.ChartData, chartType: 'line' | 'bar', testContext: TestContext, channels: OeTester.Types.Channels, locale: string, config: EdgeConfig): OeChartTester.Dataset.Option { + public static convertChartDataToOptions(chartData: HistoryUtils.ChartData, chartType: 'line' | 'bar', testContext: TestContext, channels: OeTester.Types.Channels, locale: string, config: EdgeConfig, datasets: Chart.ChartDataset[]): OeChartTester.Dataset.Option { let channelData: QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse = OeChartTester.getChannelDataByCharttype(chartType, channels); let displayValues = chartData.output(channelData.result.data); @@ -305,7 +305,7 @@ export class OeChartTester { return { type: 'option', - options: AbstractHistoryChart.getOptions(chartData, chartType, testContext.service, testContext.translate, legendOptions, channelData.result, locale, config), + options: AbstractHistoryChart.getOptions(chartData, chartType, testContext.service, testContext.translate, legendOptions, channelData.result, locale, config, datasets), }; } diff --git a/ui/src/app/shared/jsonrpc/request/executeSystemRestartRequest.ts b/ui/src/app/shared/jsonrpc/request/executeSystemRestartRequest.ts new file mode 100644 index 00000000000..27b0ce89892 --- /dev/null +++ b/ui/src/app/shared/jsonrpc/request/executeSystemRestartRequest.ts @@ -0,0 +1,34 @@ +import { JsonrpcRequest } from "../base"; + +/** + * Represents a JSON-RPC Request to execute a system restart. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": "UUID",
+ *   "method": "executeSystemRestart",
+ *   "params": {
+ *      "type": "SOFT" | "HARD",
+ *   }
+ * }
+ * 
+ */ +export class ExecuteSystemRestartRequest extends JsonrpcRequest { + + private static METHOD: string = "executeSystemRestart"; + + public constructor( + public override readonly params: { + type: Type, + }, + ) { + super(ExecuteSystemRestartRequest.METHOD, params); + } + +} + +export enum Type { + SOFT = "SOFT", + HARD = "HARD", +} diff --git a/ui/src/app/shared/jsonrpc/request/get24HoursPredictionRequest.ts b/ui/src/app/shared/jsonrpc/request/get24HoursPredictionRequest.ts deleted file mode 100644 index e2a3e08b5c3..00000000000 --- a/ui/src/app/shared/jsonrpc/request/get24HoursPredictionRequest.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ChannelAddress } from "../../../shared/type/channeladdress"; -import { JsonrpcRequest } from "../base"; -import { JsonRpcUtils } from "../jsonrpcutils"; - -/** - * Represents a JSON-RPC Request to query a 24 Hours Prediction. - * - *
- * {
- *   "jsonrpc": "2.0",
- *   "id": UUID,
- *   "method": "get24HoursPredictionRequest",
- *   "params": {
- *     "channels": ChannelAddress[]
- *   }
- * }
- * 
- */ -export class Get24HoursPredictionRequest extends JsonrpcRequest { - - private static METHOD: string = "get24HoursPrediction"; - - public constructor( - private channels: ChannelAddress[], - ) { - super(Get24HoursPredictionRequest.METHOD, { - channels: JsonRpcUtils.channelsToStringArray(channels), - }); - // delete local fields, otherwise they are sent with the JSON-RPC Request - delete this.channels; - } - -} diff --git a/ui/src/app/shared/jsonrpc/request/getUserAlertingConfigsRequest.ts b/ui/src/app/shared/jsonrpc/request/getUserAlertingConfigsRequest.ts index d2e372afb38..c8f6b4a7692 100644 --- a/ui/src/app/shared/jsonrpc/request/getUserAlertingConfigsRequest.ts +++ b/ui/src/app/shared/jsonrpc/request/getUserAlertingConfigsRequest.ts @@ -9,7 +9,7 @@ import { JsonrpcRequest } from "src/app/shared/jsonrpc/base"; * "id": "UUID", * "method": "getUserAlertingConfigs", * "params": { - * "edgeId": "string" + * "edgeId": "string", * } * } * diff --git a/ui/src/app/shared/jsonrpc/response/executeSystemRestartResponse.ts b/ui/src/app/shared/jsonrpc/response/executeSystemRestartResponse.ts new file mode 100644 index 00000000000..8c224b9e875 --- /dev/null +++ b/ui/src/app/shared/jsonrpc/response/executeSystemRestartResponse.ts @@ -0,0 +1,27 @@ +import { JsonrpcResponseSuccess } from "../base"; + +/** + * JSON-RPC Response to a "executeSystemRestart" Request. + * + *
+ * {
+ *   "jsonrpc": "2.0",
+ *   "id": "UUID",
+ *   "result": {
+ *     "stdout": string[],
+ *     "stderr": string[],
+ *     "exitcode": number (exit code of application: 0 = successful; otherwise error)
+ *   }
+ * }
+ * 
+ */ +export class ExecuteSystemRestartResponse extends JsonrpcResponseSuccess { + + public constructor( + public override readonly id: string, + public override readonly result: string, + ) { + super(id, result); + } + +} diff --git a/ui/src/app/shared/jsonrpc/response/get24HoursPredictionResponse.ts b/ui/src/app/shared/jsonrpc/response/get24HoursPredictionResponse.ts deleted file mode 100644 index fd5c561a6da..00000000000 --- a/ui/src/app/shared/jsonrpc/response/get24HoursPredictionResponse.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { JsonrpcResponseSuccess } from "../base"; - -export class Prediction { - [channelAddress: string]: number[] -} - -/** - * Wraps a JSON-RPC Response for a Get24HoursPredictionRequest. - * - *
- * {
- *   "jsonrpc": "2.0",
- *   "id": UUID,
- *   "result": {
- *     "componentId/channelId": [
- *       value1, value2,...
- *     ]
- *   }
- * }
- * 
- */ -export class Get24HoursPredictionResponse extends JsonrpcResponseSuccess { - - public constructor( - public readonly id: string, - public readonly result: Prediction, - ) { - super(id, result); - } -} diff --git a/ui/src/app/shared/jsonrpc/response/getScheduleResponse.ts b/ui/src/app/shared/jsonrpc/response/getScheduleResponse.ts index b90f2df6bb4..568e7e5b269 100644 --- a/ui/src/app/shared/jsonrpc/response/getScheduleResponse.ts +++ b/ui/src/app/shared/jsonrpc/response/getScheduleResponse.ts @@ -24,10 +24,11 @@ import { JsonrpcResponseSuccess } from "src/app/shared/jsonrpc/base"; */ export class GetScheduleResponse extends JsonrpcResponseSuccess { + public constructor( public override readonly id: string, public override readonly result: { - schedule: [{ + schedule: { timestamp: string; price: number; state: number; @@ -36,7 +37,7 @@ export class GetScheduleResponse extends JsonrpcResponseSuccess { consumption: number, ess: number, soc: number, - }] + }[] }, ) { super(id, result); diff --git a/ui/src/app/shared/pickdate/pickdate.component.ts b/ui/src/app/shared/pickdate/pickdate.component.ts index 64b15636731..0819dd7a7b2 100644 --- a/ui/src/app/shared/pickdate/pickdate.component.ts +++ b/ui/src/app/shared/pickdate/pickdate.component.ts @@ -1,4 +1,4 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { PopoverController } from '@ionic/angular'; import { TranslateService } from '@ngx-translate/core'; import { addMonths, addYears, differenceInDays, differenceInMilliseconds, endOfDay, endOfMonth, endOfYear, isAfter, isBefore, startOfDay, startOfMonth, startOfWeek, startOfYear, subMonths, subYears } from 'date-fns'; @@ -23,6 +23,8 @@ export class PickDateComponent implements OnInit, OnDestroy { private changePeriodTimeout = null; private edge: Edge | null = null; + @Input() public historyPeriods: DefaultTypes.PeriodStringValues[] = []; + constructor( public service: Service, public translate: TranslateService, @@ -348,6 +350,7 @@ export class PickDateComponent implements OnInit, OnDestroy { componentProps: { setDateRange: this.setDateRange, edge: this.edge, + historyPeriods: this.historyPeriods, }, }); await popover.present(); diff --git a/ui/src/app/shared/pickdate/popover/popover.component.ts b/ui/src/app/shared/pickdate/popover/popover.component.ts index c8e48ace95d..5bbb076d201 100644 --- a/ui/src/app/shared/pickdate/popover/popover.component.ts +++ b/ui/src/app/shared/pickdate/popover/popover.component.ts @@ -17,6 +17,7 @@ export class PickDatePopoverComponent implements OnInit { @Input() public setDateRange: (period: DefaultTypes.HistoryPeriod) => void; @Input() public edge: Edge | null = null; + @Input() public historyPeriods: DefaultTypes.PeriodStringValues[] = []; private readonly TODAY = new Date(); private readonly TOMORROW = addDays(new Date(), 1); @@ -60,7 +61,7 @@ export class PickDatePopoverComponent implements OnInit { this.locale = this.translate.getBrowserLang(); // Filter out custom due to different on click event - this.periods = EdgePermission.getAllowedHistoryPeriods(this.edge).filter(period => period !== DefaultTypes.PeriodString.CUSTOM); + this.periods = EdgePermission.getAllowedHistoryPeriods(this.edge, this.historyPeriods).filter(period => period !== DefaultTypes.PeriodString.CUSTOM); } /** diff --git a/ui/src/app/shared/service/arrayutils.ts b/ui/src/app/shared/service/arrayutils.ts index 28bfadd535d..9735b3dfe6a 100644 --- a/ui/src/app/shared/service/arrayutils.ts +++ b/ui/src/app/shared/service/arrayutils.ts @@ -3,4 +3,25 @@ export namespace ArrayUtils { return a.length === b.length && a.every((v, i) => v === b[i]); } + + /** + * Sort arrays alphabetically, according to the string returned by fn. + * Elements for which fn returns null or undefined are sorted to the end in an undefined order. + * + * @param array to sort + * @param fn to get a string to sort by + * @returns sorted array + */ + export function sortedAlphabetically(array: Type[], fn: (arg: Type) => string): Type[] { + return array.sort((a: Type, b: Type) => { + const aVal = fn(a); + const bVal = fn(b); + if (!aVal) { + return !bVal ? 0 : 1; + } else if (!bVal) { + return -1; + } + return aVal.localeCompare(bVal, undefined, { sensitivity: 'accent' }); + }); + } } diff --git a/ui/src/app/shared/service/defaulttypes.ts b/ui/src/app/shared/service/defaulttypes.ts index 7b22d865498..a2d2a28b946 100644 --- a/ui/src/app/shared/service/defaulttypes.ts +++ b/ui/src/app/shared/service/defaulttypes.ts @@ -94,6 +94,9 @@ export module DefaultTypes { export enum PeriodString { DAY = 'day', WEEK = 'week', MONTH = 'month', YEAR = 'year', TOTAL = 'total', CUSTOM = 'custom' }; + /** Values of {@link DefaultTypes.PeriodString} */ + export type PeriodStringValues = Exclude<`${DefaultTypes.PeriodString}`, "custom">; + export namespace History { export enum YAxisTitle { diff --git a/ui/src/app/shared/service/utils.ts b/ui/src/app/shared/service/utils.ts index 03c6b2ecd04..baea7523ea2 100644 --- a/ui/src/app/shared/service/utils.ts +++ b/ui/src/app/shared/service/utils.ts @@ -622,7 +622,8 @@ export enum YAxisTitle { export enum ChartAxis { LEFT = 'left', - RIGHT = 'right' + RIGHT = 'right', + RIGHT_2 = 'right2', } export namespace HistoryUtils { @@ -689,8 +690,11 @@ export namespace HistoryUtils { afterTitle: (channelData?: { [name: string]: number[] }) => string, stackIds: number[] }], - /** The smaller the number, the further forward it is displayed */ - order?: number + /** + * The drawing order of dataset. Also affects order for stacking, tooltip and legend. + * @default Number.MAX_VALUE + */ + order?: number, } /** @@ -811,19 +815,21 @@ export namespace TimeOfUseTariffUtils { * @param prices The Time-of-Use-Tariff quarterly price array * @param states The Time-of-Use-Tariff state array * @param timestamps The Time-of-Use-Tariff timestamps array + * @param gridBuy The Time-of-Use-Tariff gridBuy array + * @param socArray The Time-of0Use-Tariff soc Array. * @param translate The Translate service * @param controlMode The Control mode of the controller. * @returns The ScheduleChartData. */ - export function getScheduleChartData(size: number, prices: number[], states: number[], timestamps: string[], translate: TranslateService, controlMode: ControlMode): ScheduleChartData { + export function getScheduleChartData(size: number, prices: number[], states: number[], timestamps: string[], gridBuy: number[], socArray: number[], translate: TranslateService, controlMode: ControlMode): ScheduleChartData { const datasets: ChartDataset[] = []; const colors: any[] = []; const labels: Date[] = []; // Initializing States. - var barChargeGrid = Array(size).fill(null); - var barBalancing = Array(size).fill(null); - var barDelayDischarge = Array(size).fill(null); + const barChargeGrid = Array(size).fill(null); + const barBalancing = Array(size).fill(null); + const barDelayDischarge = Array(size).fill(null); for (let index = 0; index < size; index++) { const quarterlyPrice = formatPrice(prices[index]); @@ -850,7 +856,7 @@ export namespace TimeOfUseTariffUtils { type: 'bar', label: translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'), data: barBalancing, - order: 3, + order: 1, }); colors.push({ // Dark Green @@ -864,7 +870,7 @@ export namespace TimeOfUseTariffUtils { type: 'bar', label: translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'), data: barChargeGrid, - order: 3, + order: 1, }); colors.push({ // Sky blue @@ -878,7 +884,7 @@ export namespace TimeOfUseTariffUtils { type: 'bar', label: translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'), data: barDelayDischarge, - order: 3, + order: 1, }); colors.push({ // Black @@ -886,6 +892,34 @@ export namespace TimeOfUseTariffUtils { borderColor: 'rgba(0,0,0,0.9)', }); + // State of charge data + datasets.push({ + type: 'line', + label: translate.instant('General.soc'), + data: socArray, + hidden: false, + yAxisID: ChartAxis.RIGHT, + borderDash: [10, 10], + order: 0, + }); + colors.push({ + backgroundColor: 'rgba(189, 195, 199,0.2)', + borderColor: 'rgba(189, 195, 199,1)', + }); + + datasets.push({ + type: 'line', + label: translate.instant('General.gridBuy'), + data: gridBuy, + hidden: true, + yAxisID: ChartAxis.RIGHT_2, + order: 2, + }); + colors.push({ + backgroundColor: 'rgba(0,0,0, 0.2)', + borderColor: 'rgba(0,0,0, 1)', + }); + const scheduleChartData: ScheduleChartData = { colors: colors, datasets: datasets, @@ -915,6 +949,7 @@ export namespace TimeOfUseTariffUtils { const dischargeLabel = translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'); const chargeConsumptionLabel = translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'); const balancingLabel = translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'); + const gridBuyLabel = translate.instant('General.gridBuy'); // Switch case to handle different labels switch (label) { @@ -927,9 +962,22 @@ export namespace TimeOfUseTariffUtils { // Show floating point number for values between 0 and 1 return label + ": " + formatNumber(value, 'de', '1.0-4') + " " + currencyLabel; + case gridBuyLabel: + return label + ": " + formatNumber(value, 'de', '1.0-0') + " kW"; + default: // Power values return label + ": " + formatNumber(value, 'de', '1.0-0') + ' ' + 'W'; } } + + /** + * Retrieves the height for a chart based on the current resolution. + * + * @param isSmartphoneResolution indicates whether the current resolution is considered to be smartphone resolution. + * @returns The height of the chart. + */ + export function getChartHeight(isSmartphoneResolution: boolean): number { + return isSmartphoneResolution ? window.innerHeight / 3 : window.innerHeight / 4; + } } diff --git a/ui/src/app/shared/shared.module.ts b/ui/src/app/shared/shared.module.ts index 2c14ab7e406..0f7b7fdeef8 100644 --- a/ui/src/app/shared/shared.module.ts +++ b/ui/src/app/shared/shared.module.ts @@ -36,6 +36,7 @@ import { FormlyFieldCheckboxWithImageComponent } from './formly/formly-field-che import { HeaderComponent } from './header/header.component'; import { Service } from './service/service'; import { Websocket } from './shared'; +import { FooterComponent } from './footer/footer'; export function IpValidator(control: FormControl): ValidationErrors { return /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(control.value) ? null : { 'ip': true }; @@ -116,6 +117,7 @@ export function SubnetmaskValidatorMessage(err, field: FormlyFieldConfig) { PanelWrapperComponent, FormlyFieldWithLoadingAnimationComponent, FormlyFieldCheckboxWithImageComponent, + FooterComponent, ], exports: [ // modules @@ -140,6 +142,7 @@ export function SubnetmaskValidatorMessage(err, field: FormlyFieldConfig) { HistoryDataErrorComponent, PercentageBarComponent, FormlyFieldWithLoadingAnimationComponent, + FooterComponent, ], providers: [ appRoutingProviders, diff --git a/ui/src/app/shared/shared.spec.ts b/ui/src/app/shared/shared.spec.ts index 8fd29c0ed4f..33611a2cf17 100644 --- a/ui/src/app/shared/shared.spec.ts +++ b/ui/src/app/shared/shared.spec.ts @@ -4,14 +4,31 @@ import { Role } from "./type/role"; describe('EdgePermission', () => { - const edge = new Edge("", "", "", "", Role.ADMIN, true, new Date(), SumState.OK, null); + const edge = new Edge("", "", "", "2024.2.2", Role.ADMIN, true, new Date(), SumState.OK, null); it('#getAllowedHistoryPeriods - no first ibn date', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edge)).toEqual(['day', 'week', 'month', 'year', 'custom']); + expect(EdgePermission.getAllowedHistoryPeriods(edge, ['day', 'week', 'month', 'year'])).toEqual(['day', 'week', 'month', 'year']); }); const edgeWithFirstIbnDate = new Edge("", "", "", "", Role.ADMIN, true, new Date(), SumState.OK, new Date()); it('#getAllowedHistoryPeriods - first ibn date', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate)).toEqual(['day', 'week', 'month', 'year', 'total', 'custom']); + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, ['day', 'week', 'month', 'year', 'total'])).toEqual(['day', 'week', 'month', 'year', 'total']); + }); + + it('#getAllowedHistoryPeriods - historyPeriods: []', () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, [])).toEqual(['day', 'week', 'month', 'year', 'total', 'custom']); + }); + + it('#getAllowedHistoryPeriods - historyPeriod: null', () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, null)).toEqual(['day', 'week', 'month', 'year', 'total', 'custom']); + }); + + it('#getAllowedHistoryPeriods - historyPeriod: undefined', () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, undefined)).toEqual(['day', 'week', 'month', 'year', 'total', 'custom']); + }); + + const edgeWithoutFirstIbnDate = new Edge("", "", "", "", Role.ADMIN, true, new Date(), SumState.OK, null); + it('#getAllowedHistoryPeriods - no first ibn date', () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithoutFirstIbnDate)).toEqual(['day', 'week', 'month', 'year', 'custom']); }); }); diff --git a/ui/src/app/shared/shared.ts b/ui/src/app/shared/shared.ts index 21b4eb5b368..2653ae81df8 100644 --- a/ui/src/app/shared/shared.ts +++ b/ui/src/app/shared/shared.ts @@ -10,13 +10,12 @@ export { GridMode } from "./type/general"; export { SystemLog } from "./type/systemlog"; export { Widget, WidgetFactory, WidgetNature, Widgets } from "./type/widget"; +import { addIcons } from 'ionicons'; +import { Edge } from "./edge/edge"; import { User } from "./jsonrpc/shared"; import { DefaultTypes } from "./service/defaulttypes"; -import { Edge } from "./shared"; import { Role } from "./type/role"; -import { addIcons } from 'ionicons'; - addIcons({ 'oe-consumption': 'assets/img/icon/consumption.svg', 'oe-evcs': 'assets/img/icon/evcs.svg', @@ -30,12 +29,19 @@ addIcons({ export class EdgePermission { /** - * Gets the allowed history periods for this edge, used in {@link PickDatePopoverComponent} - * - * @param edge the edge - * @returns the list of allowed periods for this edge - */ - public static getAllowedHistoryPeriods(edge: Edge) { + * Gets the allowed history periods for this edge, used in {@link PickDatePopoverComponent} + * and if histroyPeriods exist, it gets the correspondent periods accordingly + * + * @param edge the edge + * @param historyPeriods the historyPeriods i.e 'day', 'week' or 'custom' + * @returns the list of allowed periods for this edge + */ + public static getAllowedHistoryPeriods(edge: Edge, historyPeriods?: DefaultTypes.PeriodStringValues[]) { + + if (historyPeriods?.length > 0) { + return historyPeriods; + } + return Object.values(DefaultTypes.PeriodString).reduce((arr, el) => { // hide total, if no first ibn date @@ -50,6 +56,17 @@ export class EdgePermission { } export class UserPermission { + + /** + * Checks if user is allowed to see {@link FooterComponent} + * + * @param user the current user + * @returns true, if user is at least {@link Role.GUEST} + */ + public static isUserAllowedToSeeFooter(user: User): boolean { + return Role.isAtLeast(user.globalRole, Role.GUEST); + } + public static isUserAllowedToSeeOverview(user: User): boolean { if (Role.isAtLeast(user.globalRole, Role.INSTALLER)) { @@ -58,6 +75,17 @@ export class UserPermission { return user.hasMultipleEdges; } + + /** + * Checks if user is allowed to see {@link SystemRestartComponent} + * + * @param user the current user + * @returns true, if user is at least {@link Role.ADMIN} and edge version is at least 2024.2.2 + */ + public static isAllowedToSeeSystemRestart(user: User, edge: Edge) { + const isAllowed = edge?.isVersionAtLeast('2024.2.2'); + return Role.isAtLeast(user?.globalRole, Role.OWNER) && isAllowed; + } } export namespace Currency { diff --git a/ui/src/app/shared/status/single/status.component.spec.ts b/ui/src/app/shared/status/single/status.component.spec.ts index 5db63a8de0f..dcafd1a9ee9 100644 --- a/ui/src/app/shared/status/single/status.component.spec.ts +++ b/ui/src/app/shared/status/single/status.component.spec.ts @@ -1,12 +1,13 @@ import { TestBed } from "@angular/core/testing"; import { ModalController } from "@ionic/angular"; + +import { PersistencePriority } from "../../edge/edgeconfig"; import { DummyService } from "../../service/test/dummyservice"; import { DummyWebsocket } from "../../service/test/dummywebsocket"; import { EdgeConfig, Service, Websocket } from "../../shared"; import { DummyModalController } from "../../test/DummyModalController"; import { StatusSingleComponent } from "./status.component"; - describe('StatusComponent', () => { const testComponent = new EdgeConfig.Component("test", {}, { "testChannel": { @@ -15,6 +16,7 @@ describe('StatusComponent', () => { type: "BOOLEAN", unit: "W", level: "OK", + persistencePriority: PersistencePriority.HIGH, }, }); let statusComponent: StatusSingleComponent; diff --git a/ui/src/app/shared/type/language.spec.ts b/ui/src/app/shared/type/language.spec.ts new file mode 100644 index 00000000000..e4fdefcec4c --- /dev/null +++ b/ui/src/app/shared/type/language.spec.ts @@ -0,0 +1,11 @@ +import { Language } from "./language"; + +describe('Language', () => { + + it('#geti18nLocaleByKey', () => { + expect(Language.geti18nLocaleByKey('DE')).toBe('de'); + expect(Language.geti18nLocaleByKey('Zz')).toBe(Language.DEFAULT.i18nLocaleKey); + expect(Language.geti18nLocaleByKey(null)).toBe(Language.DEFAULT.i18nLocaleKey); + expect(Language.geti18nLocaleByKey(undefined)).toBe(Language.DEFAULT.i18nLocaleKey); + }); +}); diff --git a/ui/src/app/shared/type/language.ts b/ui/src/app/shared/type/language.ts index 993ab5a1295..beb03815b9e 100644 --- a/ui/src/app/shared/type/language.ts +++ b/ui/src/app/shared/type/language.ts @@ -76,6 +76,22 @@ export class Language { } } + /** + * Gets the i18n locale with passed key + * + * @param language the language + * @returns the i18n locale + */ + public static geti18nLocaleByKey(language: string) { + const lang = this.getByBrowserLang(language?.toLowerCase()); + + if (!lang) { + console.warn(`Key ${language} not part of ${Language.ALL.map(lang => lang.title + ":" + lang.key)}`); + } + + return lang?.i18nLocaleKey ?? Language.DEFAULT.i18nLocaleKey; + } + constructor( public readonly title: string, public readonly key: string, diff --git a/ui/src/app/shared/utils/array/array.utils.spec.ts b/ui/src/app/shared/utils/array/array.utils.spec.ts new file mode 100644 index 00000000000..47984ef938f --- /dev/null +++ b/ui/src/app/shared/utils/array/array.utils.spec.ts @@ -0,0 +1,26 @@ +import { ArrayUtils } from "./array.utils"; + +describe('Array-Utils', () => { + it('#findSmallestNumber', () => { + expect(ArrayUtils.findSmallestNumber([])).toEqual(null); + expect(ArrayUtils.findSmallestNumber([null, null])).toEqual(null); + expect(ArrayUtils.findSmallestNumber([0, -1])).toEqual(-1); + expect(ArrayUtils.findSmallestNumber([null, undefined])).toEqual(null); + }); + it('#findBiggestNumber', () => { + expect(ArrayUtils.findBiggestNumber([])).toEqual(null); + expect(ArrayUtils.findBiggestNumber([null, null])).toEqual(null); + expect(ArrayUtils.findBiggestNumber([0, -1])).toEqual(0); + expect(ArrayUtils.findBiggestNumber([null, undefined])).toEqual(null); + }); + + it('#sortAlphabeticaly', () => { + const inputArr = ['A', null, 'C', undefined, 'B', 'a', '1']; + const sortedArr = ['1', 'A', 'a', 'B', 'C', null, undefined]; + + expect(ArrayUtils.sortedAlphabetically(inputArr, a => a)).toEqual(sortedArr); + expect(ArrayUtils.sortedAlphabetically(inputArr, _a => null)).toEqual(inputArr); + + expect(() => ArrayUtils.sortedAlphabetically(inputArr, null)).toThrow(); + }); +}); diff --git a/ui/src/app/shared/utils/array/array.utils.ts b/ui/src/app/shared/utils/array/array.utils.ts new file mode 100644 index 00000000000..f9e50f938b4 --- /dev/null +++ b/ui/src/app/shared/utils/array/array.utils.ts @@ -0,0 +1,54 @@ +export namespace ArrayUtils { + export function equalsCheck(a: any[], b: any[]) { + return a.length === b.length && + a.every((v, i) => v === b[i]); + } + + /** + * Finds the smallest number in a array + * + * @param arr the arr + * @returns a number if arr not empty, else null + */ + export function findSmallestNumber(arr: number[]): number | null { + if (arr?.length === 0 || arr?.every(el => el == null)) { + return null; // Return undefined for an empty array or handle it based on your requirements + } + return Math.min(...(arr.filter(Number.isFinite))); + } + + /** + * Finds the biggest number in a array + * + * @param arr the arr + * @returns a number if arr not empty, else null + */ + export function findBiggestNumber(arr: number[]): number | null { + if (arr?.length === 0 || arr?.every(el => el == null)) { + return null; // Return undefined for an empty array or handle it based on your requirements + } + + return Math.max(...(arr.filter(Number.isFinite))); + } + + /** + * Sort arrays alphabetically, according to the string returned by fn. + * Elements for which fn returns null or undefined are sorted to the end in an undefined order. + * + * @param array to sort + * @param fn to get a string to sort by + * @returns sorted array + */ + export function sortedAlphabetically(array: Type[], fn: (arg: Type) => string): Type[] { + return array.sort((a: Type, b: Type) => { + const aVal = fn(a); + const bVal = fn(b); + if (!aVal) { + return !bVal ? 0 : 1; + } else if (!bVal) { + return -1; + } + return aVal.localeCompare(bVal, undefined, { sensitivity: 'accent' }); + }); + } +} diff --git a/ui/src/app/shared/utils/time/timeutils.ts b/ui/src/app/shared/utils/time/timeutils.ts index 8297c805975..b0db593142e 100644 --- a/ui/src/app/shared/utils/time/timeutils.ts +++ b/ui/src/app/shared/utils/time/timeutils.ts @@ -1,4 +1,5 @@ import { DecimalPipe } from "@angular/common"; + import { Language } from "../../type/language"; export class TimeUtils { @@ -26,4 +27,30 @@ export class TimeUtils { return decimalPipe.transform(hours, '1.0-0') + 'h'; } } + + /** + * Formats a value in seconds to a valid duration + * + * @param seconds the value + * @returns a time string with hours and minutes + */ + public static formatSecondsToRelevantDuration(seconds: number, threshold: number, locale: string): string { + + if (seconds == null) { + return null; + } + + if (seconds < threshold) { + return null; + } + + const decimalPipe: DecimalPipe = new DecimalPipe(locale); + const minutes = Math.floor(seconds / 60); + + if (minutes > 0) { + return decimalPipe.transform(minutes, '1.0-0') + ' min'; + } else { + return decimalPipe.transform(seconds, '1.0-0') + ' s'; + } + } } diff --git a/ui/src/assets/i18n/cz.json b/ui/src/assets/i18n/cz.json index 605e156bb4f..410c67d8382 100644 --- a/ui/src/assets/i18n/cz.json +++ b/ui/src/assets/i18n/cz.json @@ -88,7 +88,15 @@ "save": "Uložit", "temperature": "Teplota", "subscribed_successfully": "Úspěšně uloženy odebírané kanály", - "loaded_subscribed_successfully": "Načtená uložená konfigurace kanálu" + "loaded_subscribed_successfully": "Načtená uložená konfigurace kanálu", + "TIME": { + "HOUR": "Hodina", + "HOURS": "Hodiny", + "MINUTE": "Minuta", + "MINUTES": "Minuty", + "DAY": "Den", + "DAYS": "Dny" + } }, "Menu": { "accessLevel": "Úroveň přístupu", @@ -482,22 +490,12 @@ "newConnection": "Nové připojení...", "newDevice": "Nové zařízení..." }, - "Alerting": { - "activate": "Aktivace", - "delay": "Zpoždění", - "save": "Uložit", - "options": {}, - "toast": { - "success": "Přijatá nastavení", - "error": "Chyba při načítání nastavení" - }, - "interval": { - "hour": "Hodina", - "hours": "Hodiny", - "minute": "Minuta", - "minutes": "Minuty", - "day": "Den", - "days": "Dny" + "ALERTING": { + "ACTIVATE": "Activate", + "DELAY": "Delay", + "TOAST": { + "SUCCESS": "Přijatá nastavení", + "ERROR": "Chyba při načítání nastavení" } }, "App": { diff --git a/ui/src/assets/i18n/de.json b/ui/src/assets/i18n/de.json index 5d607d0f561..30132ccecef 100644 --- a/ui/src/assets/i18n/de.json +++ b/ui/src/assets/i18n/de.json @@ -321,7 +321,8 @@ "systemExecute": "System-Befehl ausführen", "systemProfile": "Anlagenprofil", "alerting": "Benachrichtigung", - "networkConfiguration": "Netzwerkkonfiguration" + "networkConfiguration": "Netzwerkkonfiguration", + "SYSTEM": "System" }, "PROFILE": { "ERROR_DOWNLOADING_MODBUS_PROTOCOL": "Fehler beim Herunterladen des Modbus-Protokolls" @@ -360,25 +361,16 @@ "newConnection": "Neue Verbindung...", "newDevice": "Neues Gerät..." }, - "Alerting": { - "offlineAlerting": "Offline Benachrichtigung", - "faultAlerting": "Fehler Benachrichtigung", - "warningAlerting": "Warnungs Benachrichtigung", - "deactivated": "Deaktiviert", - "activate": "Aktivieren", - "delay": "Verzögerung", - "save": "Speichern", - "toast": { - "success": "Einstellungen übernommen", - "error": "Fehler beim Laden der Einstellungen" - }, - "interval": { - "hour": "Stunde", - "hours": "Stunden", - "minute": "Minute", - "minutes": "Minuten", - "day": "Tag", - "days": "Tage" + "ALERTING": { + "OFFLINE": "Offline Benachrichtigung", + "FAULT": "Fehler Benachrichtigung", + "WARNING": "Warnungs Benachrichtigung", + "DEACTIVATED": "Deaktiviert", + "ACTIVATE": "Aktivieren", + "DELAY": "Verzögerung", + "TOAST": { + "SUCCESS": "Einstellungen übernommen", + "ERROR": "Fehler beim Laden der Einstellungen" } }, "App": { @@ -386,6 +378,7 @@ "NAME_WITH_EDGE_NAME": "{{ edgeShortName }} App Center", "header": "Der App-Manager befindet sich aktuell in einer ersten Testversion.", "updateAvailable": "Es ist eine neue {{ edgeShortName }} Version verfügbar! Bitte aktualisieren Sie das {{ edgeShortName }}, damit alle neuen {{ edgeShortName }} Apps im App Center angezeigt werden.", + "UNUSED_REGISTERED_KEY_AVAILABLE": "Es steht noch eine App zur Installation bereit! Klicken Sie auf 'Lizenzschlüssel einlösen', um sie zu installieren.", "installed": "Installiert", "available": "Verfügbar", "incompatible": "Inkompatibel", @@ -445,7 +438,10 @@ "advancedMode": "erweiterte Ansicht", "submit": "Anwenden" }, - "title": "{{ edgeShortName }}" + "title": "{{ edgeShortName }}", + "FOOTER": { + "REFRESHED_LAST": "vor {{period}} aktualisiert" + } }, "General": { "active": "Aktiv", @@ -551,7 +547,17 @@ "yes": "Ja", "no": "Nein", "value": "Wert", - "SUM_STATE": "Systemzustand" + "SUM_STATE": "Systemzustand", + "SYSTEM": "System", + "RESTART": "Neu starten", + "TIME": { + "HOUR": "Stunde", + "HOURS": "Stunden", + "MINUTE": "Minute", + "MINUTES": "Minuten", + "DAY": "Tag", + "DAYS": "Tage" + } }, "Index": { "allConnected": "Alle Verbindungen hergestellt.", @@ -662,8 +668,6 @@ "SUMMARY": "Zusammenfassung", "TIME_OF_INSTALLATION": "Zeitpunkt der Installation", "WARRANTY_TERMS": "Garantiebedingungen", - "APPS": "Apps", - "HECKERT": "Ihre gewählte kostenlose App", "ACCEPT": "akzeptieren", "ALIAS_WITH_LABEL_HOME_DC": "Alias MPPT{{mppt}} PV{{pv}}", "VALUE_WITH_LABEL_HOME_DC": "Wert MPPT{{ mppt }} PV{{ pv }} {{ symbol }}", @@ -916,11 +920,17 @@ "NEW_VERSION_INSTALLING": "Neueste Version installieren", "NEW_VERSION": "Neueste Version:", "OFFLINE": "Das {{ edgeShortName }} ist offline.", - "RESTARTING": "Das {{ edge }} wird neu gestartet...", + "EDGE_RESTARTING": "Das {{ edge }} wird neu gestartet...", "UPDATE_NOT_POSSIBLE": "System kann nicht geupdatet werden!", "UPDATE_PROGRESS": "Update wird ausgeführt...", "UPDATE_SEARCH": "Suche nach Updates...", - "UPDATE_TIME": "(Dies kann bis zu 10 min dauern)" + "UPDATE_TIME": "(Dies kann bis zu 10 min dauern)", + "EMS_RESTARTING": "{{edgeShortName}} neu starten", + "RESTARTING": "{{system}} wird neu gestartet (Dies kann bis zu {{minutes}} Minuten dauern)", + "RESTARTED": "{{system}} neu starten war erfolgreich.", + "RESTART_FAILED": "{{system}}-Neustart fehlgeschlagen.", + "RESTART_CONFIRMATION": "Möchten Sie {{system}} neu starten?", + "RESTART_WARNING": "Während {{system}} neu startet ist die Kommunikation unterbrochen. In dieser Zeit werden keine Daten aufgezeichnet oder Komponenten angesteuert. Bitte stellen Sie sicher, dass sich das Gesamtsystem in einem sicheren Zustand befindet." } }, "CHANNELS": { diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json index 87b3211ee40..e16096007cf 100644 --- a/ui/src/assets/i18n/en.json +++ b/ui/src/assets/i18n/en.json @@ -322,7 +322,8 @@ "systemExecute": "Execute system command", "systemProfile": "System Profile", "alerting": "Alerting", - "networkConfiguration": "Network Configuration" + "networkConfiguration": "Network Configuration", + "SYSTEM": "System" }, "PROFILE": { "ERROR_DOWNLOADING_MODBUS_PROTOCOL": "Error while downloading the Modbus Protocol" @@ -361,26 +362,16 @@ "newConnection": "New connection...", "newDevice": "New device..." }, - "Alerting": { - "offlineAlerting": "Offline Notifications", - "faultAlerting": "Fault Notifications", - "warningAlerting": "Warning Notifications", - "deactivated": "Deactivated", - "activate": "Activate", - "delay": "Delay", - "save": "Save", - "options": {}, - "toast": { - "success": "Settings applied", - "error": "Error loading the settings" - }, - "interval": { - "hour": "Hour", - "hours": "Hours", - "minute": "Minute", - "minutes": "Minutes", - "day": "Day", - "days": "Days" + "ALERTING": { + "OFFLINE": "Offline Notifications", + "FAULT": "Fault Notifications", + "WARNING": "Warning Notifications", + "DEACTIVATED": "Deactivated", + "ACTIVATE": "Activate", + "DELAY": "Delay", + "TOAST": { + "SUCCESS": "Settings applied", + "ERROR": "Error loading the settings" } }, "App": { @@ -388,6 +379,7 @@ "NAME_WITH_EDGE_NAME": "{{ edgeShortName }} App Center", "header": "The App Manager is currently in a first test version.", "updateAvailable": "There is a new {{ edgeShortName }} version available! Please update the {{ edgeShortName }} so that all new {{ edgeShortName }} Apps are displayed in the App Center.", + "UNUSED_REGISTERED_KEY_AVAILABLE": "There's still an App available for installation! You can install it by clicking the 'redeem license key' button.", "installed": "Installed", "available": "Available", "incompatible": "Incompatible", @@ -447,7 +439,10 @@ "advancedMode": "Advanced Mode", "submit": "Submit" }, - "title": "{{ edgeShortName }}" + "title": "{{ edgeShortName }}", + "FOOTER": { + "REFRESHED_LAST": "updated {{period}} ago" + } }, "General": { "active": "Active", @@ -475,6 +470,8 @@ "directConsumption": "Direct consumption", "dischargePower": "Discharge power", "fault": "Fault", + "FAILED": "failed", + "WILL_BE_EXECUTED": "will be executed", "grid": "Grid", "gridBuy": "Buy from grid", "gridBuyAdvanced": "Buy", @@ -552,7 +549,17 @@ "yes": "Yes", "no": "No", "value": "value", - "SUM_STATE": "System state" + "SUM_STATE": "System state", + "SYSTEM": "system", + "RESTART": "Restart", + "TIME": { + "HOUR": "Hour", + "HOURS": "Hours", + "MINUTE": "Minute", + "MINUTES": "Minutes", + "DAY": "Day", + "DAYS": "Days" + } }, "Index": { "allConnected": "All connections established.", @@ -663,8 +670,6 @@ "SUMMARY": "Summary", "TIME_OF_INSTALLATION": "Time of the installation", "WARRANTY_TERMS": "Warranty terms", - "APPS": "Apps", - "HECKERT": "Your chosen free app", "ACCEPT": "acceptation", "ALIAS_WITH_LABEL_HOME_DC": "Alias MPPT{{mppt}} PV{{pv}}", "VALUE_WITH_LABEL_HOME_DC": "Value MPPT{{ mppt }} PV{{ pv }} {{ symbol }}", @@ -918,11 +923,17 @@ "NEW_VERSION_INSTALLING": "Install latest version", "NEW_VERSION": "Latest version:", "OFFLINE": "The {{ edgeShortName }} is offline.", - "RESTARTING": "The {{ edge }} is restarting...", + "EDGE_RESTARTING": "The {{ edge }} is restarting...", "UPDATE_NOT_POSSIBLE": "System cannot be updated!", "UPDATE_PROGRESS": "Update in progress.", "UPDATE_SEARCH": "Checking for updates...", - "UPDATE_TIME": "(This can take up to 10 minutes)" + "UPDATE_TIME": "(This can take up to 10 minutes)", + "EMS_RESTARTING": "Restart {{edgeShortName}}", + "RESTART_FAILED": "Restart of {{system}} failed.", + "RESTARTING": "Restarting {{system}}. (This can take up to {{minutes}} minutes)", + "RESTARTED": "{{system}} restarting successful.", + "RESTART_CONFIRMATION": "Would you like to restart {{system}}?", + "RESTART_WARNING": "Communication is interrupted while {{system}} is restarting. No data is recorded or components controlled during this time. Please ensure that the entire system is in a safe state." } }, "CHANNELS": { diff --git a/ui/src/assets/i18n/es.json b/ui/src/assets/i18n/es.json index 4fed955e422..f9bea4738bc 100644 --- a/ui/src/assets/i18n/es.json +++ b/ui/src/assets/i18n/es.json @@ -83,7 +83,15 @@ "november": "Noviembre", "december": "Diciembre" }, - "save": "Ahorrar" + "save": "Ahorrar", + "TIME": { + "HOUR": "Hora", + "HOURS": "Horas", + "MINUTE": "Minuto", + "MINUTES": "Minutos", + "DAY": "Día", + "DAYS": "Días" + } }, "Menu": { "accessLevel": "Nivel de acceso", @@ -471,22 +479,12 @@ "newConnection": "Nueva conexión...", "newDevice": "Nuevo dispositivo..." }, - "Alerting": { - "activate": "Activar", - "delay": "Retraso", - "save": "Guardar", - "options": {}, - "toast": { - "success": "Ajustes adoptados", - "error": "Error al cargar la configuración" - }, - "interval": { - "hours": "Horas", - "minute": "Minuto", - "minutes": "Minutos", - "day": "Día", - "days": "Días", - "hour": "Hora" + "ALERTING": { + "ACTIVATE": "Activar", + "DELAY": "Retraso", + "TOAST": { + "SUCCESS": "Ajustes adoptados", + "ERROR": "Error al cargar la configuración" } }, "App": { diff --git a/ui/src/assets/i18n/fr.json b/ui/src/assets/i18n/fr.json index dfda1f860fd..6c72db794c9 100644 --- a/ui/src/assets/i18n/fr.json +++ b/ui/src/assets/i18n/fr.json @@ -85,7 +85,15 @@ "november": "November", "december": "December" }, - "save": "sauvegarder" + "save": "sauvegarder", + "TIME": { + "HOUR": "Heure", + "HOURS": "Heures", + "MINUTE": "Minute", + "MINUTES": "Minutes", + "DAY": "Journée", + "DAYS": "Journées" + } }, "Menu": { "accessLevel": "Niveau d'accès", @@ -472,22 +480,12 @@ "newConnection": "Nouvelle connexion...", "newDevice": "Nouvel appareil..." }, - "Alerting": { - "activate": "Activer", - "delay": "Retard", - "save": "Enregistrer", - "options": {}, - "toast": { - "success": "Paramètres adoptés", - "error": "Erreur lors du chargement des paramètres" - }, - "interval": { - "hours": "Heures", - "minute": "Minute", - "minutes": "Minutes", - "day": "Journée", - "days": "Journées", - "hour": "Heure" + "ALERTING": { + "ACTIVATE": "Activer", + "DELAY": "Retard", + "TOAST": { + "SUCCESS": "Paramètres adoptés", + "ERROR": "Erreur lors du chargement des paramètres" } }, "App": { diff --git a/ui/src/assets/i18n/nl.json b/ui/src/assets/i18n/nl.json index f2a8c367450..cc2ddce0c21 100644 --- a/ui/src/assets/i18n/nl.json +++ b/ui/src/assets/i18n/nl.json @@ -80,7 +80,15 @@ "november": "November", "december": "December" }, - "save": "Opslaan" + "save": "Opslaan", + "TIME": { + "HOUR": "Uur", + "HOURS": "Uur", + "MINUTE": "Minuut", + "MINUTES": "Minuten", + "DAY": "Dag", + "DAYS": "Dagen" + } }, "Menu": { "accessLevel": "Toegangsniveau", @@ -467,22 +475,12 @@ "newConnection": "Nieuwe verbinding...", "newDevice": "Nieuw apparaat…" }, - "Alerting": { - "activate": "Activeer", - "delay": "Vertraging", - "save": "Save", - "options": {}, - "toast": { - "success": "Goedgekeurde instellingen", - "error": "Fout bij het laden van de instellingen" - }, - "interval": { - "hours": "Uur", - "minute": "Minuut", - "minutes": "Minuten", - "day": "Dag", - "days": "Dagen", - "hour": "Uur" + "ALERTING": { + "ACTIVATE": "Activeer", + "DELAY": "Vertraging", + "TOAST": { + "SUCCESS": "Goedgekeurde instellingen", + "ERROR": "Fout bij het laden van de instellingen" } }, "App": { diff --git a/ui/src/environments/index.ts b/ui/src/environments/index.ts index 7ca279f35ae..d0180b57ae8 100644 --- a/ui/src/environments/index.ts +++ b/ui/src/environments/index.ts @@ -52,7 +52,7 @@ export interface Environment { readonly COMMERCIAL: { readonly EN: string, readonly DE: string, - } + }, } readonly GTC: { @@ -87,7 +87,7 @@ export interface Environment { * @returns the url of the image or null if not provided */ APP_IMAGE: (language: string, appId: string) => string | null; - } + }, }, readonly PRODUCT_TYPES: (translate: TranslateService) => Filter } diff --git a/ui/src/global.scss b/ui/src/global.scss index 9d87462b39a..fa6bb9d10a4 100644 --- a/ui/src/global.scss +++ b/ui/src/global.scss @@ -249,11 +249,7 @@ formly-input-section { width: 25% !important; .alert-button-group { - justify-content: center; - display: grid; - grid-template-columns: auto auto; - column-gap: 35%; - + justify-content: space-between; .alert-button { color: $primary-color; font-size: small; From b3f2eeefd154d2da763cdb947b6e6a21c0324fc1 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Thu, 28 Mar 2024 15:10:35 +0100 Subject: [PATCH 24/28] Fix Javadoc build for https://openems.github.io/openems.io/javadoc/ --- .../controller/ess/timeofusetariff/optimizer/Context.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Context.java b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Context.java index 5cb593c67c0..d7d5dd8724c 100644 --- a/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Context.java +++ b/io.openems.edge.controller.ess.timeofusetariff/src/io/openems/edge/controller/ess/timeofusetariff/optimizer/Context.java @@ -138,7 +138,7 @@ public Builder setMaxChargePowerFromGrid(int maxChargePowerFromGrid) { } /** - * Always apply 14a EnWG limit of 4.2 kW. + * Always apply 14a EnWG limit of 4.2 kW. * * @param limitChargePowerFor14aEnWG boolean * @return myself @@ -169,4 +169,4 @@ public static Builder create() { return new Context.Builder(); } -} \ No newline at end of file +} From dc3d4d9256c04225814e3a698f316fba0ee11ab2 Mon Sep 17 00:00:00 2001 From: Hannes Date: Sun, 31 Mar 2024 15:30:48 +0200 Subject: [PATCH 25/28] UI: fix & update translations (#2595) * Fix Emergency-Slider Translation * Fix EMERGENCY_RESERVE Case Match --- .../history/storage/socchart.component.ts | 2 +- .../common/storage/modal/modal.component.html | 12 +++++----- .../settings/alerting/alerting.component.html | 22 +++++++++---------- .../settings/alerting/alerting.component.ts | 16 +++++++------- ui/src/assets/i18n/cz.json | 4 ++-- ui/src/assets/i18n/de.json | 4 ++-- ui/src/assets/i18n/en.json | 4 ++-- ui/src/assets/i18n/es.json | 4 ++-- ui/src/assets/i18n/fr.json | 4 ++-- ui/src/assets/i18n/ja.json | 4 ++-- ui/src/assets/i18n/nl.json | 4 ++-- 11 files changed, 40 insertions(+), 40 deletions(-) diff --git a/ui/src/app/edge/history/storage/socchart.component.ts b/ui/src/app/edge/history/storage/socchart.component.ts index 05648a9d981..908a9978918 100644 --- a/ui/src/app/edge/history/storage/socchart.component.ts +++ b/ui/src/app/edge/history/storage/socchart.component.ts @@ -96,7 +96,7 @@ export class SocStorageChartComponent extends AbstractHistoryChart implements On if (channelAddress.channelId === 'ActualReserveSoc') { datasets.push({ label: - this.emergencyCapacityReserveComponents.length > 1 ? component.alias : this.translate.instant("Edge.Index.EmergencyReserve.emergencyReserve"), + this.emergencyCapacityReserveComponents.length > 1 ? component.alias : this.translate.instant("Edge.Index.EmergencyReserve.EMERGENCY_RESERVE"), data: data, borderDash: [3, 3], diff --git a/ui/src/app/edge/live/common/storage/modal/modal.component.html b/ui/src/app/edge/live/common/storage/modal/modal.component.html index d0c77b98de7..4e83cd402e7 100644 --- a/ui/src/app/edge/live/common/storage/modal/modal.component.html +++ b/ui/src/app/edge/live/common/storage/modal/modal.component.html @@ -106,7 +106,7 @@
- Edge.Index.EmergencyReserve.emergencyReserve + Edge.Index.EmergencyReserve.EMERGENCY_RESERVE {{formGroup.value[component.id]?.['emergencyReserveController']?.reserveSoc| @@ -133,7 +133,7 @@ - Edge.Index.EmergencyReserve.InfoForEmergencyReserveSlider + Edge.Index.EmergencyReserve.INFO_FOR_EMERGENCY_RESERVE_SLIDER @@ -486,7 +486,7 @@
- Edge.Index.EmergencyReserve.emergencyReserve + Edge.Index.EmergencyReserve.EMERGENCY_RESERVE {{formGroup.value[component.id]?.['emergencyReserveController']?.reserveSoc| @@ -515,7 +515,7 @@ - Edge.Index.EmergencyReserve.InfoForEmergencyReserveSlider + Edge.Index.EmergencyReserve.INFO_FOR_EMERGENCY_RESERVE_SLIDER @@ -720,7 +720,7 @@
- Edge.Index.EmergencyReserve.emergencyReserve + Edge.Index.EmergencyReserve.EMERGENCY_RESERVE {{formGroup.value[component.id]?.['emergencyReserveController']?.reserveSoc| @@ -747,7 +747,7 @@ - Edge.Index.EmergencyReserve.InfoForEmergencyReserveSlider + Edge.Index.EmergencyReserve.INFO_FOR_EMERGENCY_RESERVE_SLIDER diff --git a/ui/src/app/edge/settings/alerting/alerting.component.html b/ui/src/app/edge/settings/alerting/alerting.component.html index a2f62d76593..0177269976c 100644 --- a/ui/src/app/edge/settings/alerting/alerting.component.html +++ b/ui/src/app/edge/settings/alerting/alerting.component.html @@ -31,12 +31,12 @@ - Edge.Config.Alerting.activate + Edge.Config.ALERTING.ACTIVATE - Edge.Config.Alerting.delay + Edge.Config.ALERTING.DELAY @@ -47,7 +47,7 @@ - Edge.Config.Alerting.offlineAlerting + Edge.Config.ALERTING.OFFLINE @@ -72,7 +72,7 @@ - Edge.Config.Alerting.faultAlerting + Edge.Config.ALERTING.FAULT @@ -97,7 +97,7 @@ - Edge.Config.Alerting.warningAlerting + Edge.Config.ALERTING.WARNING @@ -153,17 +153,17 @@ - Edge.Config.Alerting.offlineAlerting + Edge.Config.ALERTING.OFFLINE - Edge.Config.Alerting.faultAlerting + Edge.Config.ALERTING.FAULT - Edge.Config.Alerting.warningAlerting + Edge.Config.ALERTING.WARNING @@ -182,7 +182,7 @@ - Edge.Config.Alerting.deactivated + Edge.Config.ALERTING.DEACTIVATED @@ -197,7 +197,7 @@ - Edge.Config.Alerting.deactivated + Edge.Config.ALERTING.DEACTIVATED @@ -212,7 +212,7 @@ - Edge.Config.Alerting.deactivated + Edge.Config.ALERTING.DEACTIVATED diff --git a/ui/src/app/edge/settings/alerting/alerting.component.ts b/ui/src/app/edge/settings/alerting/alerting.component.ts index d65fe7cdfb4..e95c2b35109 100644 --- a/ui/src/app/edge/settings/alerting/alerting.component.ts +++ b/ui/src/app/edge/settings/alerting/alerting.component.ts @@ -185,22 +185,22 @@ export class AlertingComponent implements OnInit { */ protected getLabelToDelay(delay: number): string { if (delay <= 0) { - return this.translate.instant("Edge.Config.Alerting.deactivated"); + return this.translate.instant("Edge.Config.ALERTING.DEACTIVATED"); } if (delay >= 1440) { delay = delay / 1440; return delay + ' ' + (delay == 1 - ? this.translate.instant("Edge.Config.Alerting.interval.day") - : this.translate.instant("Edge.Config.Alerting.interval.days")); + ? this.translate.instant("General.TIME.DAY") + : this.translate.instant("General.TIME.DAYS")); } else if (delay >= 60) { delay = delay / 60; return delay + ' ' + (delay == 1 - ? this.translate.instant("Edge.Config.Alerting.interval.hour") - : this.translate.instant("Edge.Config.Alerting.interval.hours")); + ? this.translate.instant("General.TIME.HOUR") + : this.translate.instant("General.TIME.HOURS")); } else { return delay + ' ' + (delay == 1 - ? this.translate.instant("Edge.Config.Alerting.interval.minute") - : this.translate.instant("Edge.Config.Alerting.interval.minutes")); + ? this.translate.instant("General.TIME.MINUTE") + : this.translate.instant("General.TIME.MINUTES")); } } @@ -292,7 +292,7 @@ export class AlertingComponent implements OnInit { }).catch(reason => { let error = reason.error; console.error(error); - this.errorToast(this.translate.instant('Edge.Config.Alerting.toast.error'), error.message); + this.errorToast(this.translate.instant('Edge.Config.ALERTING.TOAST.ERROR'), error.message); reject(reason); }).finally(() => { this.service.stopSpinner(this.spinnerId); diff --git a/ui/src/assets/i18n/cz.json b/ui/src/assets/i18n/cz.json index 410c67d8382..04ac9dd63ec 100644 --- a/ui/src/assets/i18n/cz.json +++ b/ui/src/assets/i18n/cz.json @@ -169,8 +169,8 @@ "Edge": { "Index": { "EmergencyReserve": { - "InfoForEmergencyReserveSlider": "Aktivací nouzové rezervy výkonu lze libovolně zvolit hodnotu mezi 5 % a 100 %.", - "emergencyReserve": "pohotovostní rezerva" + "INFO_FOR_EMERGENCY_RESERVE_SLIDER": "Aktivací nouzové rezervy výkonu lze libovolně zvolit hodnotu mezi 5 % a 100 %.", + "EMERGENCY_RESERVE": "pohotovostní rezerva" }, "Energymonitor": { "activePower": "Činný výkon", diff --git a/ui/src/assets/i18n/de.json b/ui/src/assets/i18n/de.json index 30132ccecef..0b5f4c8cd9e 100644 --- a/ui/src/assets/i18n/de.json +++ b/ui/src/assets/i18n/de.json @@ -11,8 +11,8 @@ "Edge": { "Index": { "EmergencyReserve": { - "InfoForEmergencyReserveSlider": "Durch Aktivieren kann eine Notstromreserve zwischen 5 % und 100 % der Batteriekapazität eingestellt werden.", - "emergencyReserve": "Notstromreserve" + "INFO_FOR_EMERGENCY_RESERVE_SLIDER": "Durch Aktivieren kann eine Notstromreserve zwischen 5 % und 100 % der Batteriekapazität eingestellt werden.", + "EMERGENCY_RESERVE": "Notstromreserve" }, "Energymonitor": { "activePower": "Ausgabeleistung", diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json index e16096007cf..fa02d57c5e8 100644 --- a/ui/src/assets/i18n/en.json +++ b/ui/src/assets/i18n/en.json @@ -11,8 +11,8 @@ "Edge": { "Index": { "EmergencyReserve": { - "InfoForEmergencyReserveSlider": "By activating the emergency power reserve, the value can be freely selected between 5% and 100%.", - "emergencyReserve": "Emergencyreserve" + "INFO_FOR_EMERGENCY_RESERVE_SLIDER": "By activating the emergency power reserve, the value can be freely selected between 5% and 100%.", + "EMERGENCY_RESERVE": "Emergencyreserve" }, "Energymonitor": { "activePower": "Active power", diff --git a/ui/src/assets/i18n/es.json b/ui/src/assets/i18n/es.json index f9bea4738bc..251dd41029d 100644 --- a/ui/src/assets/i18n/es.json +++ b/ui/src/assets/i18n/es.json @@ -161,8 +161,8 @@ "Edge": { "Index": { "EmergencyReserve": { - "InfoForEmergencyReserveSlider": "Al activar la reserva de energía de emergencia, el valor puede seleccionarse libremente entre el 5% y el 100%.", - "emergencyReserve": "reserva de emergencia" + "INFO_FOR_EMERGENCY_RESERVE_SLIDER": "Al activar la reserva de energía de emergencia, el valor puede seleccionarse libremente entre el 5% y el 100%.", + "EMERGENCY_RESERVE": "reserva de emergencia" }, "Energymonitor": { "activePower": "Potencia de salida", diff --git a/ui/src/assets/i18n/fr.json b/ui/src/assets/i18n/fr.json index 6c72db794c9..2ead4d8e8c0 100644 --- a/ui/src/assets/i18n/fr.json +++ b/ui/src/assets/i18n/fr.json @@ -163,8 +163,8 @@ "Edge": { "Index": { "EmergencyReserve": { - "InfoForEmergencyReserveSlider": "En activant la réserve d'énergie de secours, la valeur peut être librement choisie entre 5 % et 100 %.", - "emergencyReserve": "réserve d'urgence" + "INFO_FOR_EMERGENCY_RESERVE_SLIDER": "En activant la réserve d'énergie de secours, la valeur peut être librement choisie entre 5 % et 100 %.", + "EMERGENCY_RESERVE": "réserve d'urgence" }, "Energymonitor": { "activePower": "Puissance Active", diff --git a/ui/src/assets/i18n/ja.json b/ui/src/assets/i18n/ja.json index b9178238ecd..06a7294eb4f 100644 --- a/ui/src/assets/i18n/ja.json +++ b/ui/src/assets/i18n/ja.json @@ -11,8 +11,8 @@ "Edge": { "Index": { "EmergencyReserve": { - "InfoForEmergencyReserveSlider": "緊急電力予備を有効にすることで、値は5%から100%まで自由に選択することができます。", - "emergencyReserve": "緊急予備" + "INFO_FOR_EMERGENCY_RESERVE_SLIDER": "緊急電力予備を有効にすることで、値は5%から100%まで自由に選択することができます。", + "EMERGENCY_RESERVE": "緊急予備" }, "Energymonitor": { "activePower": "アクティブパワー", diff --git a/ui/src/assets/i18n/nl.json b/ui/src/assets/i18n/nl.json index cc2ddce0c21..77d013c0482 100644 --- a/ui/src/assets/i18n/nl.json +++ b/ui/src/assets/i18n/nl.json @@ -158,8 +158,8 @@ "Edge": { "Index": { "EmergencyReserve": { - "InfoForEmergencyReserveSlider": "Door de noodstroomreserve te activeren, kan de waarde vrij worden gekozen tussen 5% en 100%.", - "emergencyReserve": "noodreserve" + "INFO_FOR_EMERGENCY_RESERVE_SLIDER": "Door de noodstroomreserve te activeren, kan de waarde vrij worden gekozen tussen 5% en 100%.", + "EMERGENCY_RESERVE": "noodreserve" }, "Energymonitor": { "activePower": "Actief vermogen", From 62e019a98cb639288204e503a8e483fef3289f47 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Sun, 31 Mar 2024 16:00:31 +0200 Subject: [PATCH 26/28] Gitpod: add names+descriptions to ports (#2600) --- .gitpod.yml | 51 ++++++++++++------- .../config.d/Edge/Websocket.config | 6 ++- .../config.d/Metadata/Odoo.config | 15 ++++-- .../config.d/Ui/Websocket.config | 6 ++- .../config.d/org/ops4j/pax/logging.config | 12 ++++- ...pache_felix_cm_impl_DynamicBindings.config | 2 +- ...7b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config | 6 +-- ...e15c5d6-3005-49a4-9a96-68fa5f39740f.config | 6 ++- .../config.d/org/ops4j/pax/logging.config | 18 ++++--- ...pache_felix_cm_impl_DynamicBindings.config | 2 +- 10 files changed, 84 insertions(+), 40 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 5fcbc3ca0c8..92720a1340d 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -36,29 +36,46 @@ tasks: command: odoo -d prod --addons-path=/workspace/odoo/addons-enabled -i base,partner_firstname,web_m2x_options,stock,openems ports: - # Backend - - port: 8075 # Backend-to-Backend JSON/REST Api + - name: OpenEMS UI + description: OpenEMS User-Interface. Login admin:admin + port: 4200 + onOpen: open-browser + - name: OpenEMS Backend - Odoo. Login admin:admin + description: Odoo - Open Source ERP und CRM + port: 8069 + onOpen: open-browser + - name: OpenEMS Backend - Apache Felix Web Console + description: Configure Backend OSGi components via `/system/console/configMgr` + port: 8079 onOpen: ignore - - port: 8076 # Backend-to-Backend JSON/Websocket Api + - name: OpenEMS Edge - Apache Felix Web Console + description: Configure Edge OSGi components via `/system/console/configMgr` + port: 8080 onOpen: ignore - - port: 8079 # Apache Felix Web Console + - name: OpenEMS Backend - Backend-to-Backend JSON/REST Api + description: Cloud-side JSON/REST Api + port: 8075 onOpen: ignore - - port: 8081 # Edge-Websocket + - name: OpenEMS Backend - Backend-to-Backend JSON/Websocket Api + description: Cloud-side JSON/Websocket Api + port: 8076 onOpen: ignore - - port: 8082 # UI-Websocket + - name: OpenEMS Backend - Odoo XML-RPC Api + port: 5432 onOpen: ignore - # Edge - - port: 8080 # Apache Felix Web Console + - name: OpenEMS Backend - Edge-Websocket + description: OpenEMS Edges connect here + port: 8081 onOpen: ignore - - port: 8084 # JSON/REST Api + - name: OpenEMS Backend - UI-Websocket + description: OpenEMS UIs connect here + port: 8082 onOpen: ignore - - port: 8085 # JSON/Websocket Api + - name: OpenEMS Edge - JSON/REST Api + description: Local JSON/REST Api + port: 8084 onOpen: ignore - # UI - - port: 4200 - onOpen: open-browser - # Odoo - - port: 8069 - onOpen: open-browser - - port: 5432 + - name: OpenEMS Edge - JSON/Websocket Api + description: Local JSON/Websocket Api + port: 8085 onOpen: ignore \ No newline at end of file diff --git a/tools/gitpod/openems-backend/config.d/Edge/Websocket.config b/tools/gitpod/openems-backend/config.d/Edge/Websocket.config index 2e18ccb8c07..add7f45c496 100644 --- a/tools/gitpod/openems-backend/config.d/Edge/Websocket.config +++ b/tools/gitpod/openems-backend/config.d/Edge/Websocket.config @@ -1,3 +1,5 @@ -:org.apache.felix.configadmin.revision:=L"1" +:org.apache.felix.configadmin.revision:=L"3" +debugMode="OFF" +poolSize=I"10" port=I"8081" -service.pid="Edge.Websocket" +service.pid="Edge.Websocket" \ No newline at end of file diff --git a/tools/gitpod/openems-backend/config.d/Metadata/Odoo.config b/tools/gitpod/openems-backend/config.d/Metadata/Odoo.config index 407ed0ca61a..7c556c9996c 100644 --- a/tools/gitpod/openems-backend/config.d/Metadata/Odoo.config +++ b/tools/gitpod/openems-backend/config.d/Metadata/Odoo.config @@ -1,6 +1,15 @@ -:org.apache.felix.configadmin.revision:=L"1" +:org.apache.felix.configadmin.revision:=L"2" database="prod" -pgUser="gitpod" -service.pid="Metadata.Odoo" +debugMode="OFF" +odooHost="localhost" odooPassword="admin" +odooPort=I"8069" +odooProtocol="HTTP" odooUid=I"2" +pgConnectionPoolSize=I"40" +pgHost="localhost" +pgPassword="" +pgPort=I"5432" +pgUser="gitpod" +poolSize=I"30" +service.pid="Metadata.Odoo" \ No newline at end of file diff --git a/tools/gitpod/openems-backend/config.d/Ui/Websocket.config b/tools/gitpod/openems-backend/config.d/Ui/Websocket.config index 277deb50b4d..e249f28eb23 100644 --- a/tools/gitpod/openems-backend/config.d/Ui/Websocket.config +++ b/tools/gitpod/openems-backend/config.d/Ui/Websocket.config @@ -1,3 +1,5 @@ -:org.apache.felix.configadmin.revision:=L"1" +:org.apache.felix.configadmin.revision:=L"2" +debugMode="OFF" +poolSize=I"10" port=I"8082" -service.pid="Ui.Websocket" +service.pid="Ui.Websocket" \ No newline at end of file diff --git a/tools/gitpod/openems-backend/config.d/org/ops4j/pax/logging.config b/tools/gitpod/openems-backend/config.d/org/ops4j/pax/logging.config index 99e79c9618e..b8a86c204e2 100644 --- a/tools/gitpod/openems-backend/config.d/org/ops4j/pax/logging.config +++ b/tools/gitpod/openems-backend/config.d/org/ops4j/pax/logging.config @@ -1,3 +1,11 @@ :org.apache.felix.configadmin.revision:=L"1" -_felix_.cm.newConfiguration=B"true" -service.pid="org.ops4j.pax.logging" +log4j2.appender.console.layout.pattern="%d{ISO8601}\ [%-8.8t]\ %-5p\ [%-30.30c]\ %m%n" +log4j2.appender.console.layout.type="PatternLayout" +log4j2.appender.console.name="console" +log4j2.appender.console.type="Console" +log4j2.appender.paxosgi.name="paxosgi" +log4j2.appender.paxosgi.type="PaxOsgi" +log4j2.rootLogger.appenderRef.console.ref="console" +log4j2.rootLogger.appenderRef.paxosgi.ref="paxosgi" +log4j2.rootLogger.level="INFO" +service.pid="org.ops4j.pax.logging" \ No newline at end of file diff --git a/tools/gitpod/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config b/tools/gitpod/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config index 8977e092dd1..f0c520a09c8 100644 --- a/tools/gitpod/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config +++ b/tools/gitpod/openems-backend/config.d/org_apache_felix_cm_impl_DynamicBindings.config @@ -1 +1 @@ -org.ops4j.pax.logging="jar/pax-logging-log4j1-2.0.5.jar" +org.ops4j.pax.logging="jar/pax-logging-log4j2-2.2.1.jar \ No newline at end of file diff --git a/tools/gitpod/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config b/tools/gitpod/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config index 6c21fe32014..121cfe51123 100644 --- a/tools/gitpod/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Api/ModbusTcp/ReadOnly/17b969c5-fd9f-4cc3-9fba-fe7f41ff7146.config @@ -1,5 +1,5 @@ -:org.apache.felix.configadmin.revision:=L"3" -Component.target="(&(enabled\=true)(!(service.pid\=Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146))(|(id\=_sum)))" +:org.apache.felix.configadmin.revision:=L"4" +Component.target="(&(!(service.pid\=Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146))(|(id\=_sum)))" _lastChangeAt="2020-09-15T19:21:03" _lastChangeBy="UNDEFINED" alias="" @@ -11,4 +11,4 @@ id="ctrlApiModbusTcp0" maxConcurrentConnections=I"5" port=I"502" service.factoryPid="Controller.Api.ModbusTcp.ReadOnly" -service.pid="Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146" +service.pid="Controller.Api.ModbusTcp.ReadOnly.17b969c5-fd9f-4cc3-9fba-fe7f41ff7146" \ No newline at end of file diff --git a/tools/gitpod/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config b/tools/gitpod/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config index 7f47aea6211..677e6a5f520 100644 --- a/tools/gitpod/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config +++ b/tools/gitpod/openems-edge/config.d/Controller/Symmetric/Balancing/6e15c5d6-3005-49a4-9a96-68fa5f39740f.config @@ -1,9 +1,11 @@ -:org.apache.felix.configadmin.revision:=L"1" +:org.apache.felix.configadmin.revision:=L"3" alias="Self-consumption\ optimization" enabled=B"true" ess.id="ess0" +ess.target="(&(enabled\=true)(!(service.pid\=Controller.Symmetric.Balancing.6e15c5d6-3005-49a4-9a96-68fa5f39740f))(|(id\=ess0)))" id="ctrlBalancing0" meter.id="meter0" +meter.target="(&(enabled\=true)(!(service.pid\=Controller.Symmetric.Balancing.6e15c5d6-3005-49a4-9a96-68fa5f39740f))(|(id\=meter0)))" service.factoryPid="Controller.Symmetric.Balancing" service.pid="Controller.Symmetric.Balancing.6e15c5d6-3005-49a4-9a96-68fa5f39740f" -targetGridSetpoint=I"0" +targetGridSetpoint=I"0" \ No newline at end of file diff --git a/tools/gitpod/openems-edge/config.d/org/ops4j/pax/logging.config b/tools/gitpod/openems-edge/config.d/org/ops4j/pax/logging.config index 8149a098b3f..577e56c3f18 100644 --- a/tools/gitpod/openems-edge/config.d/org/ops4j/pax/logging.config +++ b/tools/gitpod/openems-edge/config.d/org/ops4j/pax/logging.config @@ -1,7 +1,11 @@ -:org.apache.felix.configadmin.revision:=L"1" -log4j.appender.CONSOLE="org.apache.log4j.ConsoleAppender" -log4j.appender.CONSOLE.layout="org.apache.log4j.PatternLayout" -log4j.appender.CONSOLE.layout.ConversionPattern="%d{ISO8601}\ [%-8.8t]\ %-5p\ [%-30.30c]\ %m%n" -log4j.logger.org.eclipse.osgi="WARN" -log4j.rootLogger="INFO,\ CONSOLE,\ osgi:*" -service.pid="org.ops4j.pax.logging" +:org.apache.felix.configadmin.revision:=L"2" +log4j2.appender.console.layout.pattern="%d{ISO8601}\ [%-8.8t]\ %-5p\ [%-30.30c]\ %m%n" +log4j2.appender.console.layout.type="PatternLayout" +log4j2.appender.console.name="console" +log4j2.appender.console.type="Console" +log4j2.appender.paxosgi.name="paxosgi" +log4j2.appender.paxosgi.type="PaxOsgi" +log4j2.rootLogger.appenderRef.console.ref="console" +log4j2.rootLogger.appenderRef.paxosgi.ref="paxosgi" +log4j2.rootLogger.level="INFO" +service.pid="org.ops4j.pax.logging" \ No newline at end of file diff --git a/tools/gitpod/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config b/tools/gitpod/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config index 8977e092dd1..4eb37f3c96e 100644 --- a/tools/gitpod/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config +++ b/tools/gitpod/openems-edge/config.d/org_apache_felix_cm_impl_DynamicBindings.config @@ -1 +1 @@ -org.ops4j.pax.logging="jar/pax-logging-log4j1-2.0.5.jar" +org.ops4j.pax.logging="jar/pax-logging-log4j2-2.2.1.jar" \ No newline at end of file From 5a0623d057f267628cdcb9d29c45bd07da7bc2dc Mon Sep 17 00:00:00 2001 From: Hiromasa Ihara Date: Sun, 31 Mar 2024 23:02:51 +0900 Subject: [PATCH 27/28] UI: add eslint:recommended and plugin:@typescript-eslint/recommended (#2577) * add "eslint:recommended", "plugin:@typescript-eslint/recommended" to eslintrc * `eslint --fix src/` --- ui/.eslintrc.json | 28 +- ui/package-lock.json | 371 ------------------ ui/src/app/appupdateservice.ts | 5 - .../chart/totalchart.component.ts | 8 +- .../Controller/ChannelThreshold/flat/flat.ts | 6 +- .../app/edge/history/abstracthistorychart.ts | 28 +- .../app/edge/history/abstracthistorywidget.ts | 6 +- .../edge/history/chpsoc/chart.component.ts | 30 +- .../edge/history/chpsoc/widget.component.ts | 10 +- .../consumption/chart/chart.constants.spec.ts | 2 +- .../energy/chart/chart.constants.spec.ts | 2 +- .../edge/history/common/energy/chart/chart.ts | 4 +- .../edge/history/common/energy/flat/flat.ts | 16 +- .../common/grid/chart/chart.constants.spec.ts | 2 +- .../edge/history/common/grid/chart/chart.ts | 4 +- .../production/chart/productionMeterChart.ts | 4 +- .../common/production/chart/totalAcChart.ts | 2 +- .../common/production/chart/totalChart.ts | 22 +- .../delayedselltogrid/chart.component.ts | 28 +- .../fixdigitaloutput/singlechart.component.ts | 16 +- .../fixdigitaloutput/totalchart.component.ts | 16 +- .../fixdigitaloutput/widget.component.ts | 10 +- .../app/edge/history/grid/chart.component.ts | 26 +- .../gridoptimizedcharge/chart.component.ts | 18 +- .../sellToGridLimitChart.component.ts | 18 +- .../gridoptimizedcharge/widget.component.ts | 6 +- .../history/heatingelement/chart.component.ts | 19 +- .../heatingelement/widget.component.ts | 12 +- .../edge/history/heatpump/chart.component.ts | 16 +- .../edge/history/heatpump/widget.component.ts | 6 +- ui/src/app/edge/history/history.component.ts | 2 +- ui/src/app/edge/history/historydataservice.ts | 8 +- .../peakshaving/asymmetric/chart.component.ts | 36 +- .../peakshaving/symmetric/chart.component.ts | 28 +- .../peakshaving/timeslot/chart.component.ts | 30 +- ui/src/app/edge/history/shared.ts | 18 +- .../singlethreshold/chart.component.ts | 36 +- .../singlethreshold/widget.component.ts | 8 +- .../history/storage/chargerchart.component.ts | 16 +- .../history/storage/esschart.component.ts | 20 +- .../history/storage/singlechart.component.ts | 24 +- .../history/storage/socchart.component.ts | 14 +- .../history/storage/totalchart.component.ts | 28 +- .../edge/history/storage/widget.component.ts | 4 +- .../Channelthreshold/Channelthreshold.ts | 2 +- .../app/edge/live/Controller/ChpSoc/ChpSoc.ts | 2 +- .../ChpSoc/modal/modal.component.ts | 12 +- .../Ess/GridOptimizedCharge/modal/modal.ts | 6 +- .../modal/predictionChart.ts | 42 +- .../Ess/TimeOfUseTariff/flat/flat.ts | 4 +- .../Ess/TimeOfUseTariff/modal/modal.ts | 4 +- .../TimeOfUseTariff/modal/powerSocChart.ts | 6 +- .../TimeOfUseTariff/modal/statePriceChart.ts | 2 +- .../administration.component.ts | 2 +- .../edge/live/Controller/Evcs/flat/flat.ts | 8 +- .../edge/live/Controller/Evcs/modal/modal.ts | 10 +- .../Io_ChannelSingleThreshold.ts | 2 +- .../modal/modal.component.ts | 7 +- .../FixDigitalOutput/Io_FixDigitalOutput.ts | 2 +- .../FixDigitalOutput/modal/modal.component.ts | 4 +- .../Controller/Io/HeatingElement/flat/flat.ts | 2 +- .../Io/HeatingElement/modal/modal.ts | 8 +- .../Io/Heatpump/modal/modal.component.ts | 8 +- .../PeakShaving/Asymmetric/Asymmetric.ts | 4 +- .../Asymmetric/modal/modal.component.ts | 2 +- .../Symmetric/modal/modal.component.ts | 6 +- .../modal/modal.component.ts | 6 +- .../Api_DigitalInput/Io_Api_DigitalInput.ts | 6 +- .../Evcs_Api_Cluster/Evcs_Api_Cluster.ts | 8 +- .../modal/evcs-chart/evcs.chart.ts | 17 +- .../modal/evcsCluster-modal.page.ts | 30 +- .../live/common/autarchy/modal/modal.spec.ts | 2 +- .../edge/live/common/consumption/flat/flat.ts | 10 +- .../consumption/modal/modal.constants.spec.ts | 2 +- .../live/common/consumption/modal/modal.ts | 4 +- ui/src/app/edge/live/common/grid/flat/flat.ts | 4 +- .../live/common/grid/modal/constants.spec.ts | 2 +- .../app/edge/live/common/grid/modal/modal.ts | 8 +- .../live/common/production/modal/modal.ts | 2 +- .../selfconsumption/modal/modal.spec.ts | 2 +- .../common/storage/modal/modal.component.ts | 64 +-- .../live/common/storage/storage.component.ts | 24 +- .../modal/modal.component.ts | 6 +- .../energymonitor/chart/chart.component.ts | 6 +- .../section/abstractsection.component.ts | 34 +- .../chart/section/consumption.component.ts | 16 +- .../chart/section/grid.component.ts | 16 +- .../chart/section/production.component.ts | 16 +- .../chart/section/storage.component.ts | 16 +- ui/src/app/edge/live/livedataservice.ts | 8 +- .../settings/alerting/alerting.component.ts | 44 +-- .../app/edge/settings/app/index.component.ts | 6 +- .../edge/settings/app/install.component.ts | 12 +- .../settings/app/jsonrpc/addAppInstance.ts | 2 +- .../settings/app/jsonrpc/flag/flagType.ts | 4 +- .../edge/settings/app/jsonrpc/flag/flags.ts | 4 +- .../settings/app/jsonrpc/getAppAssistant.ts | 297 +++++++------- .../settings/app/jsonrpc/updateAppInstance.ts | 2 +- .../settings/app/keypopup/modal.component.ts | 6 +- .../app/edge/settings/app/single.component.ts | 12 +- .../app/edge/settings/app/update.component.ts | 14 +- .../settings/channels/channels.component.ts | 16 +- .../component/install/index.component.ts | 6 +- .../component/install/install.component.ts | 32 +- .../component/update/index.component.ts | 10 +- .../component/update/update.component.ts | 22 +- .../settings/network/network.component.ts | 21 +- .../settings/profile/aliasupdate.component.ts | 4 +- .../settings/profile/profile.component.ts | 8 +- .../settings/system/executeSystemUpdate.ts | 8 +- .../system/maintenance/maintenance.ts | 2 +- .../systemexecute/systemexecute.component.ts | 18 +- .../settings/systemlog/systemlog.component.ts | 6 +- ui/src/app/index/filter/filter.component.ts | 2 +- ui/src/app/index/login.component.ts | 2 +- .../app/index/overview/overview.component.ts | 6 +- ui/src/app/index/shared/sumState.ts | 2 +- .../app/registration/modal/modal.component.ts | 12 +- .../chartoptions/chartoptions.component.ts | 2 +- ui/src/app/shared/edge/currentdata.ts | 2 +- ui/src/app/shared/edge/edge.ts | 20 +- ui/src/app/shared/edge/edgeconfig.spec.ts | 10 +- ui/src/app/shared/edge/edgeconfig.ts | 100 ++--- .../edge/meter/electricity/modal.component.ts | 6 +- .../form-field-default-cases.wrapper.ts | 2 +- .../abstracthistorywidget.ts | 12 +- .../chart/abstractHistoryChartOverview.ts | 12 +- .../chart/abstracthistorychart.ts | 142 +++---- .../flat/abstract-flat-widget-line.ts | 2 +- .../flat/abstract-flat-widget.ts | 10 +- .../modal/abstract-modal-line.ts | 14 +- .../genericComponents/modal/abstractModal.ts | 12 +- .../modal/help-button/help-button.ts | 2 +- .../modal/modal-phases/modal-phases.ts | 8 +- .../shared/genericComponents/modal/modal.ts | 6 +- .../genericComponents/shared/converter.ts | 27 +- .../shared/oe-formly-component.ts | 2 +- .../shared/testing/tester.ts | 48 +-- ui/src/app/shared/header/header.component.ts | 13 +- .../shared/history-data-error.component.ts | 2 +- ui/src/app/shared/interface/interface.ts | 2 +- ui/src/app/shared/jsonrpc/jsonrpcutils.ts | 4 +- .../pickdate/pickdate.component.spec.ts | 4 +- .../app/shared/pickdate/pickdate.component.ts | 39 +- .../shared/pipe/classname/classname.pipe.ts | 2 +- .../formatSecondsToDuration.pipe.ts | 2 +- ui/src/app/shared/pipe/keys/keys.pipe.ts | 4 +- ui/src/app/shared/pipe/sign/sign.pipe.ts | 2 +- ui/src/app/shared/service/defaulttypes.ts | 2 +- ui/src/app/shared/service/myerrorhandler.ts | 4 +- ui/src/app/shared/service/service.ts | 40 +- ui/src/app/shared/service/utils.ts | 30 +- ui/src/app/shared/service/websocket.ts | 20 +- ui/src/app/shared/service/wsdata.ts | 4 +- .../status/single/status.component.spec.ts | 5 - .../shared/status/single/status.component.ts | 2 +- ui/src/app/shared/test/utils.spec.ts | 2 +- ui/src/app/shared/type/channeladdress.ts | 2 +- ui/src/app/shared/type/language.ts | 4 +- ui/src/app/shared/type/widget.ts | 22 +- ui/src/app/shared/utils/color/color.utils.ts | 4 +- ui/src/app/shared/utils/date/dateutils.ts | 4 +- .../shared/utils/datetime/datetime-utils.ts | 10 +- ui/src/app/shared/utils/time/timeutils.ts | 2 +- ui/src/app/user/user.component.ts | 6 +- 165 files changed, 1177 insertions(+), 1546 deletions(-) diff --git a/ui/.eslintrc.json b/ui/.eslintrc.json index c0fa15fbf26..6d53fb393b4 100644 --- a/ui/.eslintrc.json +++ b/ui/.eslintrc.json @@ -8,6 +8,11 @@ "files": [ "*.ts" ], + "env": { + "browser": true, + "node": true, + "jest": true + }, "parserOptions": { "project": [ "tsconfig.json" @@ -18,6 +23,8 @@ "unused-imports" ], "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", "plugin:@angular-eslint/recommended", "plugin:@angular-eslint/template/process-inline-templates" ], @@ -65,7 +72,26 @@ "error", "always" ], - "no-trailing-spaces": "error" + "no-trailing-spaces": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "none" + } + ], + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-namespace": 0, + "@typescript-eslint/ban-types": [ + "error", + { + "extendDefaults": true, + "types": { + "{}": false, + "Object": false, + "Function": false + } + } + ] } }, { diff --git a/ui/package-lock.json b/ui/package-lock.json index 8c30370b73e..cef3d63ec97 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -2765,54 +2765,6 @@ "node": ">=16" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", - "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", - "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", - "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-arm64": { "version": "0.17.8", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", @@ -2829,294 +2781,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", - "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", - "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", - "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", - "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", - "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", - "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", - "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", - "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", - "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", - "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", - "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", - "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", - "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", - "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", - "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", - "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz", - "integrity": "sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz", - "integrity": "sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -9347,7 +9011,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -12576,28 +12239,6 @@ "@angular/core": "^15.0.0" } }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -12632,18 +12273,6 @@ "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", diff --git a/ui/src/app/appupdateservice.ts b/ui/src/app/appupdateservice.ts index 981d2ad335c..7029043c8fa 100644 --- a/ui/src/app/appupdateservice.ts +++ b/ui/src/app/appupdateservice.ts @@ -13,11 +13,6 @@ export class CheckForUpdateService { ) { } init() { - let userId: string; - this.service.metadata.subscribe(entry => { - userId = entry?.user?.id ?? null; - }); - setInterval(async () => { const updateFound = await this.update.checkForUpdate(); console.log(updateFound ? 'A new version is available.' : 'Already on the latest version.'); diff --git a/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts b/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts index 0fec3b41f12..711bf37fb0c 100644 --- a/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts +++ b/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts @@ -20,10 +20,10 @@ export class TotalChartComponent extends AbstractHistoryChart { const controller: string[] = config?.getComponentIdsImplementingNature("io.openems.impl.controller.channelthreshold.ChannelThresholdController") .concat(config.getComponentIdsByFactory("Controller.ChannelThreshold")); - let components: { [controllerId: string]: string } = {}; - let input: HistoryUtils.InputChannel[] = []; + const components: { [controllerId: string]: string } = {}; + const input: HistoryUtils.InputChannel[] = []; - for (let controllerId of controller) { + for (const controllerId of controller) { const powerChannel = ChannelAddress.fromString(config.getComponentProperties(controllerId)['outputChannelAddress']); components[controllerId] = powerChannel.channelId; input.push({ name: controllerId, powerChannel: powerChannel, energyChannel: new ChannelAddress(controllerId, 'CumulatedActiveTime') }); @@ -33,7 +33,7 @@ export class TotalChartComponent extends AbstractHistoryChart { input: input, output: (data: HistoryUtils.ChannelData) => { - let output: HistoryUtils.DisplayValues[] = []; + const output: HistoryUtils.DisplayValues[] = []; const colors: string[] = ['rgb(0,0,139)', 'rgb(0,191,255)', 'rgb(0,0,56)', 'rgb(77,77,174)']; diff --git a/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts b/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts index 44b85462ce3..a6d91689197 100644 --- a/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts +++ b/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts @@ -21,10 +21,10 @@ export class FlatComponent extends AbstractFlatWidget { this.controllers = this.config.getComponentsByFactory('Controller.ChannelThreshold').concat(this.config.getComponentsImplementingNature('io.openems.impl.controller.channelthreshold.ChannelThresholdController')); - let channelAddresses: ChannelAddress[] = []; + const channelAddresses: ChannelAddress[] = []; - for (let controller of this.controllers) { - let output: ChannelAddress | null = ChannelAddress.fromString(controller.properties['outputChannelAddress']); + for (const controller of this.controllers) { + const output: ChannelAddress | null = ChannelAddress.fromString(controller.properties['outputChannelAddress']); this.displayName.set(controller.id, this.getDisplayName(controller, output)); channelAddresses.push(new ChannelAddress(controller.id, 'CumulatedActiveTime')); } diff --git a/ui/src/app/edge/history/abstracthistorychart.ts b/ui/src/app/edge/history/abstracthistorychart.ts index 6685b5d5b3a..d0b96867714 100644 --- a/ui/src/app/edge/history/abstracthistorychart.ts +++ b/ui/src/app/edge/history/abstracthistorychart.ts @@ -82,17 +82,17 @@ export abstract class AbstractHistoryChart { protected queryHistoricTimeseriesData(fromDate: Date, toDate: Date, res?: Resolution): Promise { // Take custom resolution if passed - let resolution = res ?? calculateResolution(this.service, fromDate, toDate).resolution; + const resolution = res ?? calculateResolution(this.service, fromDate, toDate).resolution; this.errorResponse = null; - let result: Promise = new Promise((resolve, reject) => { + const result: Promise = new Promise((resolve, reject) => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.setLabel(config); this.getChannelAddresses(edge, config).then(channelAddresses => { - let request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); + const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); edge.sendRequest(this.service.websocket, request).then(response => { resolve(response as QueryHistoricTimeseriesDataResponse); }).catch(error => { @@ -126,11 +126,11 @@ export abstract class AbstractHistoryChart { protected queryHistoricTimeseriesEnergyPerPeriod(fromDate: Date, toDate: Date, channelAddresses: ChannelAddress[]): Promise { // TODO should be removed, edge delivers too much data - let resolution = calculateResolution(this.service, fromDate, toDate).resolution; + const resolution = calculateResolution(this.service, fromDate, toDate).resolution; this.errorResponse = null; - let response: Promise = new Promise((resolve, reject) => { + const response: Promise = new Promise((resolve, reject) => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { edge.sendRequest(this.service.websocket, new QueryHistoricTimeseriesEnergyPerPeriodRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution)).then(response => { @@ -165,7 +165,7 @@ export abstract class AbstractHistoryChart { * @returns period for Tooltip Header */ protected static toTooltipTitle(fromDate: Date, toDate: Date, date: Date, service: Service): string { - let unit = calculateResolution(service, fromDate, toDate).resolution.unit; + const unit = calculateResolution(service, fromDate, toDate).resolution.unit; if (unit == ChronoUnit.Type.MONTHS) { return date.toLocaleDateString('default', { month: 'long' }); @@ -186,7 +186,7 @@ export abstract class AbstractHistoryChart { * @returns the ChartOptions */ protected createDefaultChartOptions(): Chart.ChartOptions { - let options = Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS); + const options = Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS); return options; } @@ -323,13 +323,13 @@ export abstract class AbstractHistoryChart { if (tooltipItems?.length === 0) { return null; } - let date = DateUtils.stringToDate(tooltipItems[0]?.label); + const date = DateUtils.stringToDate(tooltipItems[0]?.label); return AbstractHistoryChart.toTooltipTitle(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to, date, this.service); }; options.plugins.tooltip.callbacks.label = function (tooltipItem: Chart.TooltipItem) { - let label = tooltipItem.dataset.label; - let value = tooltipItem.dataset.data[tooltipItem.dataIndex]; + const label = tooltipItem.dataset.label; + const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; const customUnit = tooltipItem.dataset.unit ?? null; return label.split(":")[0] + ": " + NewAbstractHistoryChart.getToolTipsSuffix("", value, formatNumber, customUnit ?? unit, 'line', locale, translate, conf); @@ -349,7 +349,7 @@ export abstract class AbstractHistoryChart { }; options.plugins.legend.labels.generateLabels = function (chart: Chart.Chart) { - let chartLegendLabelItems: Chart.LegendItem[] = []; + const chartLegendLabelItems: Chart.LegendItem[] = []; chart.data.datasets.forEach((dataset, index) => { const color = colors[index]; @@ -378,9 +378,9 @@ export abstract class AbstractHistoryChart { // Remove duplicates from legend, if legendItem with two or more occurrences in legend, use one legendItem to trigger them both options.plugins.legend.onClick = function (event: Chart.ChartEvent, legendItem: Chart.LegendItem, legend) { - let chart: Chart.Chart = this.chart; + const chart: Chart.Chart = this.chart; - let legendItems = chart.data.datasets.reduce((arr, ds, i) => { + const legendItems = chart.data.datasets.reduce((arr, ds, i) => { if (ds.label == legendItem.text) { arr.push({ label: ds.label, index: i }); } @@ -390,7 +390,7 @@ export abstract class AbstractHistoryChart { legendItems.forEach(item => { // original.call(this, event, legendItem1); setLabelVisible(item.label, !chart.isDatasetVisible(legendItem.datasetIndex)); - var meta = chart.getDatasetMeta(item.index); + const meta = chart.getDatasetMeta(item.index); // See controller.isDatasetVisible comment meta.hidden = meta.hidden === null ? !chart.data.datasets[item.index].hidden : null; }); diff --git a/ui/src/app/edge/history/abstracthistorywidget.ts b/ui/src/app/edge/history/abstracthistorywidget.ts index 9bfcd0a7af9..84b241264cd 100644 --- a/ui/src/app/edge/history/abstracthistorywidget.ts +++ b/ui/src/app/edge/history/abstracthistorywidget.ts @@ -50,14 +50,14 @@ export abstract class AbstractHistoryWidget { */ protected queryHistoricTimeseriesData(fromDate: Date, toDate: Date): Promise { - let resolution = calculateResolution(this.service, fromDate, toDate).resolution; + const resolution = calculateResolution(this.service, fromDate, toDate).resolution; return new Promise((resolve, reject) => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.getChannelAddresses(edge, config).then(channelAddresses => { - let request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, edge?.firstSetupProtocol), toDate, channelAddresses, resolution); + const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, edge?.firstSetupProtocol), toDate, channelAddresses, resolution); edge.sendRequest(this.service.websocket, request).then(response => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; if (Object.keys(result.data).length != 0 && Object.keys(result.timestamps).length != 0) { resolve(response as QueryHistoricTimeseriesDataResponse); } else { diff --git a/ui/src/app/edge/history/chpsoc/chart.component.ts b/ui/src/app/edge/history/chpsoc/chart.component.ts index b82dd0114de..b825b5d31f0 100644 --- a/ui/src/app/edge/history/chpsoc/chart.component.ts +++ b/ui/src/app/edge/history/chpsoc/chart.component.ts @@ -18,7 +18,7 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -44,26 +44,26 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(() => { this.service.getConfig().then(config => { - let outputChannel = config.getComponentProperties(this.componentId)['outputChannelAddress']; - let inputChannel = config.getComponentProperties(this.componentId)['inputChannelAddress']; - let lowThreshold = this.componentId + '/_PropertyLowThreshold'; - let highThreshold = this.componentId + '/_PropertyHighThreshold'; - let result = response.result; + const outputChannel = config.getComponentProperties(this.componentId)['outputChannelAddress']; + const inputChannel = config.getComponentProperties(this.componentId)['inputChannelAddress']; + const lowThreshold = this.componentId + '/_PropertyLowThreshold'; + const highThreshold = this.componentId + '/_PropertyHighThreshold'; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; // convert datasets - for (let channel in result.data) { + for (const channel in result.data) { if (channel == outputChannel) { - let address = ChannelAddress.fromString(channel); - let data = result.data[channel].map(value => { + const address = ChannelAddress.fromString(channel); + const data = result.data[channel].map(value => { if (value == null) { return null; } else { @@ -79,7 +79,7 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit borderColor: 'rgba(0,191,255,1)', }); } else { - let data = result.data[channel].map(value => { + const data = result.data[channel].map(value => { if (value == null) { return null; } else if (value > 100 || value < 0) { @@ -142,14 +142,14 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit }).finally(() => { this.unit = YAxisTitle.PERCENTAGE; this.setOptions(this.options); - });; + }); } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); const inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['inputChannelAddress']); - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ outputChannel, inputChannel, new ChannelAddress(this.componentId, '_PropertyHighThreshold'), diff --git a/ui/src/app/edge/history/chpsoc/widget.component.ts b/ui/src/app/edge/history/chpsoc/widget.component.ts index 5ef997758be..45bdc7a995e 100644 --- a/ui/src/app/edge/history/chpsoc/widget.component.ts +++ b/ui/src/app/edge/history/chpsoc/widget.component.ts @@ -44,23 +44,23 @@ export class ChpSocWidgetComponent extends AbstractHistoryWidget implements OnIn ngOnChanges() { this.updateValues(); - }; + } // Gather result & timestamps to calculate effective active time in % protected updateValues() { this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).then(response => { this.service.getConfig().then(config => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; - let outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); + const result = (response as QueryHistoricTimeseriesDataResponse).result; + const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); this.activeSecondsOverPeriod = calculateActiveTimeOverPeriod(outputChannel, result); }); }); - }; + } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); - let channeladdresses = [outputChannel]; + const channeladdresses = [outputChannel]; resolve(channeladdresses); }); } diff --git a/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts b/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts index 014c7aff208..d29f93c738f 100644 --- a/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts +++ b/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts @@ -14,4 +14,4 @@ export function expectView(config: EdgeConfig, testContext: TestContext, chartTy DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.translate), chartType, channels, testContext, config))) .toEqual(removeFunctions(view)); -}; +} diff --git a/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts b/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts index 9828c860aca..cdbafd832f6 100644 --- a/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts +++ b/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts @@ -11,7 +11,7 @@ export function expectView(config: EdgeConfig, testContext: TestContext, chartTy .apply(ChartComponent .getChartData(DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), chartType, testContext.translate), chartType, channels, testContext, config))) .toEqual(removeFunctions(view)); -}; +} export const DATASET = (data: OeChartTester.Dataset.Data, labels: OeChartTester.Dataset.LegendLabel, options: OeChartTester.Dataset.Option) => ({ data: data, diff --git a/ui/src/app/edge/history/common/energy/chart/chart.ts b/ui/src/app/edge/history/common/energy/chart/chart.ts index 9348c1e964e..2e3a22cc496 100644 --- a/ui/src/app/edge/history/common/energy/chart/chart.ts +++ b/ui/src/app/edge/history/common/energy/chart/chart.ts @@ -16,9 +16,9 @@ export class ChartComponent extends AbstractHistoryChart { } public static getChartData(config: EdgeConfig | null, chartType: 'line' | 'bar', translate: TranslateService): HistoryUtils.ChartData { - let input: HistoryUtils.InputChannel[] = + const input: HistoryUtils.InputChannel[] = config?.widgets.classes.reduce((arr: HistoryUtils.InputChannel[], key) => { - let newObj = []; + const newObj = []; switch (key) { case 'Energymonitor': case 'Consumption': diff --git a/ui/src/app/edge/history/common/energy/flat/flat.ts b/ui/src/app/edge/history/common/energy/flat/flat.ts index 7a3305d9152..2ff36ee1489 100644 --- a/ui/src/app/edge/history/common/energy/flat/flat.ts +++ b/ui/src/app/edge/history/common/energy/flat/flat.ts @@ -41,12 +41,12 @@ export class FlatComponent extends AbstractFlatWidget { protected exportToXlxs() { this.service.getCurrentEdge().then(edge => { edge.sendRequest(this.websocket, new QueryHistoricTimeseriesExportXlxsRequest(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to)).then(response => { - let r = response as Base64PayloadResponse; - var binary = atob(r.result.payload.replace(/\s/g, '')); - var len = binary.length; - var buffer = new ArrayBuffer(len); - var view = new Uint8Array(buffer); - for (var i = 0; i < len; i++) { + const r = response as Base64PayloadResponse; + const binary = atob(r.result.payload.replace(/\s/g, '')); + const len = binary.length; + const buffer = new ArrayBuffer(len); + const view = new Uint8Array(buffer); + for (let i = 0; i < len; i++) { view[i] = binary.charCodeAt(i); } const data: Blob = new Blob([view], { @@ -54,8 +54,8 @@ export class FlatComponent extends AbstractFlatWidget { }); let fileName = "Export-" + edge.id + "-"; - let dateFrom = this.service.historyPeriod.value.from; - let dateTo = this.service.historyPeriod.value.to; + const dateFrom = this.service.historyPeriod.value.from; + const dateTo = this.service.historyPeriod.value.to; if (isSameDay(dateFrom, dateTo)) { fileName += format(dateFrom, "dd.MM.yyyy"); } else if (isSameMonth(dateFrom, dateTo)) { diff --git a/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts b/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts index d53747d4ab1..5c1700683cd 100644 --- a/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts +++ b/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts @@ -11,4 +11,4 @@ export function expectView(config: EdgeConfig, testContext: TestContext, chartTy .apply(ChartComponent .getChartData(DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), chartType, testContext.translate, showPhases), chartType, channels, testContext, config))) .toEqual(removeFunctions(view)); -}; +} diff --git a/ui/src/app/edge/history/common/grid/chart/chart.ts b/ui/src/app/edge/history/common/grid/chart/chart.ts index efd755b9b37..fd5507e76a7 100644 --- a/ui/src/app/edge/history/common/grid/chart/chart.ts +++ b/ui/src/app/edge/history/common/grid/chart/chart.ts @@ -18,7 +18,7 @@ export class ChartComponent extends AbstractHistoryChart { public static getChartData(config: EdgeConfig, chartType: 'line' | 'bar', translate: TranslateService, showPhases: boolean): HistoryUtils.ChartData { - let input: DefaultTypes.History.InputChannel[] = [ + const input: DefaultTypes.History.InputChannel[] = [ { name: 'GridSell', powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), @@ -46,7 +46,7 @@ export class ChartComponent extends AbstractHistoryChart { input: input, output: (data: DefaultTypes.History.ChannelData) => { - let datasets: DefaultTypes.History.DisplayValues[] = [ + const datasets: DefaultTypes.History.DisplayValues[] = [ { name: translate.instant('General.gridSellAdvanced'), nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { diff --git a/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts b/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts index 4df762e4474..798f886c6c4 100644 --- a/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts +++ b/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts @@ -13,7 +13,7 @@ import { ChannelAddress } from '../../../../../shared/shared'; export class ProductionMeterChartComponent extends AbstractHistoryChart { protected override getChartData(): HistoryUtils.ChartData { - let channels: HistoryUtils.InputChannel[] = [{ + const channels: HistoryUtils.InputChannel[] = [{ name: 'ActivePower', powerChannel: ChannelAddress.fromString(this.component.id + '/ActivePower'), energyChannel: ChannelAddress.fromString(this.component.id + '/ActiveProductionEnergy'), @@ -32,7 +32,7 @@ export class ProductionMeterChartComponent extends AbstractHistoryChart { return { input: channels, output: (data: HistoryUtils.ChannelData) => { - let datasets: HistoryUtils.DisplayValues[] = []; + const datasets: HistoryUtils.DisplayValues[] = []; datasets.push({ name: this.translate.instant('General.production'), nameSuffix: (energyPeriodResponse: QueryHistoricTimeseriesEnergyResponse) => { diff --git a/ui/src/app/edge/history/common/production/chart/totalAcChart.ts b/ui/src/app/edge/history/common/production/chart/totalAcChart.ts index c5edd549a4d..af06fd9527c 100644 --- a/ui/src/app/edge/history/common/production/chart/totalAcChart.ts +++ b/ui/src/app/edge/history/common/production/chart/totalAcChart.ts @@ -34,7 +34,7 @@ export class TotalAcChartComponent extends AbstractHistoryChart { }, ], output: (data: HistoryUtils.ChannelData) => { - let datasets: HistoryUtils.DisplayValues[] = []; + const datasets: HistoryUtils.DisplayValues[] = []; datasets.push({ name: this.translate.instant("General.TOTAL"), diff --git a/ui/src/app/edge/history/common/production/chart/totalChart.ts b/ui/src/app/edge/history/common/production/chart/totalChart.ts index 1bc5708a652..2cb1514eb6a 100644 --- a/ui/src/app/edge/history/common/production/chart/totalChart.ts +++ b/ui/src/app/edge/history/common/production/chart/totalChart.ts @@ -12,11 +12,11 @@ import { ChannelAddress } from '../../../../../shared/shared'; export class TotalChartComponent extends AbstractHistoryChart { protected override getChartData(): HistoryUtils.ChartData { - let productionMeterComponents = this.config?.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") + const productionMeterComponents = this.config?.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => this.config.isProducer(component)); - let chargerComponents = this.config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger"); + const chargerComponents = this.config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger"); - let channels: HistoryUtils.InputChannel[] = [{ + const channels: HistoryUtils.InputChannel[] = [{ name: 'ProductionActivePower', powerChannel: ChannelAddress.fromString('_sum/ProductionActivePower'), energyChannel: ChannelAddress.fromString('_sum/ProductionActiveEnergy'), @@ -48,7 +48,7 @@ export class TotalChartComponent extends AbstractHistoryChart { }); } - for (let component of productionMeterComponents) { + for (const component of productionMeterComponents) { channels.push({ name: component.id, powerChannel: ChannelAddress.fromString(component.id + '/ActivePower'), @@ -56,7 +56,7 @@ export class TotalChartComponent extends AbstractHistoryChart { }); } - for (let component of chargerComponents) { + for (const component of chargerComponents) { channels.push({ name: component.id, powerChannel: ChannelAddress.fromString(component.id + '/ActualPower'), @@ -64,10 +64,10 @@ export class TotalChartComponent extends AbstractHistoryChart { }); } - let chartObject: HistoryUtils.ChartData = { + const chartObject: HistoryUtils.ChartData = { input: channels, output: (data: HistoryUtils.ChannelData) => { - let datasets: HistoryUtils.DisplayValues[] = []; + const datasets: HistoryUtils.DisplayValues[] = []; datasets.push({ name: this.showTotal == false ? this.translate.instant('General.production') : this.translate.instant('General.TOTAL'), nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { @@ -113,9 +113,9 @@ export class TotalChartComponent extends AbstractHistoryChart { } // ProductionMeters - let productionMeterColors: string[] = ['rgb(253,197,7)', 'rgb(202, 158, 6', 'rgb(228, 177, 6)', 'rgb(177, 138, 5)', 'rgb(152, 118, 4)']; + const productionMeterColors: string[] = ['rgb(253,197,7)', 'rgb(202, 158, 6', 'rgb(228, 177, 6)', 'rgb(177, 138, 5)', 'rgb(152, 118, 4)']; for (let i = 0; i < productionMeterComponents.length; i++) { - let component = productionMeterComponents[i]; + const component = productionMeterComponents[i]; datasets.push({ name: component.alias ?? component.id, nameSuffix: (energyResponse: QueryHistoricTimeseriesEnergyResponse) => { @@ -129,10 +129,10 @@ export class TotalChartComponent extends AbstractHistoryChart { }); } - let chargerColors: string[] = ['rgb(0,223,0)', 'rgb(0,178,0)', 'rgb(0,201,0)', 'rgb(0,134,0)', 'rgb(0,156,0)']; + const chargerColors: string[] = ['rgb(0,223,0)', 'rgb(0,178,0)', 'rgb(0,201,0)', 'rgb(0,134,0)', 'rgb(0,156,0)']; // ChargerComponents for (let i = 0; i < chargerComponents.length; i++) { - let component = chargerComponents[i]; + const component = chargerComponents[i]; datasets.push({ name: component.alias ?? component.id, nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { diff --git a/ui/src/app/edge/history/delayedselltogrid/chart.component.ts b/ui/src/app/edge/history/delayedselltogrid/chart.component.ts index f0821e6b4b1..e6f40fe98a9 100644 --- a/ui/src/app/edge/history/delayedselltogrid/chart.component.ts +++ b/ui/src/app/edge/history/delayedselltogrid/chart.component.ts @@ -18,7 +18,7 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -44,22 +44,22 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getConfig().then(config => { - let meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; - let sellToGridPowerLimit = this.componentId + '/_PropertySellToGridPowerLimit'; - let continuousSellToGridPower = this.componentId + '/_PropertyContinuousSellToGridPower'; - let result = response.result; + const meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; + const sellToGridPowerLimit = this.componentId + '/_PropertySellToGridPowerLimit'; + const continuousSellToGridPower = this.componentId + '/_PropertyContinuousSellToGridPower'; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; if (meterIdActivePower in result.data) { - let data = result.data[meterIdActivePower].map(value => { + const data = result.data[meterIdActivePower].map(value => { if (value == null) { return null; } else if (value < 0) { @@ -79,7 +79,7 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem }); } if (sellToGridPowerLimit in result.data) { - let data = result.data[sellToGridPowerLimit].map(value => { + const data = result.data[sellToGridPowerLimit].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -100,7 +100,7 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem }); } if (continuousSellToGridPower in result.data) { - let data = result.data[continuousSellToGridPower].map(value => { + const data = result.data[continuousSellToGridPower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -132,7 +132,7 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem } else { effectivePower = result.data['_sum/EssActivePower']; } - let chargeData = effectivePower.map(value => { + const chargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value < 0) { @@ -153,7 +153,7 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem /* * Storage Discharge */ - let dischargeData = effectivePower.map(value => { + const dischargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value > 0) { @@ -194,7 +194,7 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress(this.componentId, '_PropertySellToGridPowerLimit'), new ChannelAddress(this.componentId, '_PropertyContinuousSellToGridPower'), new ChannelAddress(config.getComponent(this.componentId).properties['meter.id'], 'ActivePower'), diff --git a/ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts b/ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts index 2b18cf58c53..136004e5499 100644 --- a/ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts +++ b/ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts @@ -45,19 +45,19 @@ export class FixDigitalOutputSingleChartComponent extends AbstractHistoryChart i this.colors = []; this.loading = true; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets: Chart.ChartDataset[] = []; - for (let channel in result.data) { - let address = ChannelAddress.fromString(channel); - let data = result.data[channel].map(value => { + const datasets: Chart.ChartDataset[] = []; + for (const channel in result.data) { + const address = ChannelAddress.fromString(channel); + const data = result.data[channel].map(value => { if (value == null) { return null; } else { @@ -90,7 +90,7 @@ export class FixDigitalOutputSingleChartComponent extends AbstractHistoryChart i protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); - let channeladdresses = [outputChannel]; + const channeladdresses = [outputChannel]; resolve(channeladdresses); }); } diff --git a/ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts b/ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts index 190b6f82a01..3f678bf5ccc 100644 --- a/ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts +++ b/ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts @@ -18,7 +18,7 @@ export class FixDigitalOutputTotalChartComponent extends AbstractHistoryChart im ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -43,20 +43,20 @@ export class FixDigitalOutputTotalChartComponent extends AbstractHistoryChart im this.colors = []; this.loading = true; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; - let datasets = []; + const datasets = []; // convert datasets Object.keys(result.data).forEach((channel, index) => { - let address = ChannelAddress.fromString(channel); - let data = result.data[channel]?.map((value) => { + const address = ChannelAddress.fromString(channel); + const data = result.data[channel]?.map((value) => { if (value == null) { return null; } else { @@ -104,7 +104,7 @@ export class FixDigitalOutputTotalChartComponent extends AbstractHistoryChart im protected getChannelAddresses(): Promise { return new Promise((resolve, reject) => { this.service.getConfig().then(config => { - let channeladdresses = []; + const channeladdresses = []; // find all FixIoControllers config.getComponentsByFactory('Controller.Io.FixDigitalOutput').forEach(component => { const outputChannel = ChannelAddress.fromString(config.getComponentProperties(component.id)['outputChannelAddress']); diff --git a/ui/src/app/edge/history/fixdigitaloutput/widget.component.ts b/ui/src/app/edge/history/fixdigitaloutput/widget.component.ts index 305496310dc..8716004c0fb 100644 --- a/ui/src/app/edge/history/fixdigitaloutput/widget.component.ts +++ b/ui/src/app/edge/history/fixdigitaloutput/widget.component.ts @@ -46,23 +46,23 @@ export class FixDigitalOutputWidgetComponent extends AbstractHistoryWidget imple ngOnChanges() { this.updateValues(); - }; + } protected updateValues() { // Gather result & timestamps to calculate effective active time in % this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).then(response => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; this.service.getConfig().then(config => { - let outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); + const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); this.activeSecondsOverPeriod = calculateActiveTimeOverPeriod(outputChannel, result); }); }); - }; + } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); - let channeladdresses = [outputChannel]; + const channeladdresses = [outputChannel]; resolve(channeladdresses); }); } diff --git a/ui/src/app/edge/history/grid/chart.component.ts b/ui/src/app/edge/history/grid/chart.component.ts index 4f45266f9d0..43cc204ee76 100644 --- a/ui/src/app/edge/history/grid/chart.component.ts +++ b/ui/src/app/edge/history/grid/chart.component.ts @@ -19,7 +19,7 @@ export class GridChartComponent extends AbstractHistoryChart implements OnInit, ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -46,19 +46,19 @@ export class GridChartComponent extends AbstractHistoryChart implements OnInit, this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - let result = response.result; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; if ('_sum/GridActivePower' in result.data) { - let gridData = result.data['_sum/GridActivePower'].map(value => { + const gridData = result.data['_sum/GridActivePower'].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -83,7 +83,7 @@ export class GridChartComponent extends AbstractHistoryChart implements OnInit, /** * Buy From Grid */ - let gridData = result.data['_sum/GridActivePowerL1'].map(value => { + const gridData = result.data['_sum/GridActivePowerL1'].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -103,7 +103,7 @@ export class GridChartComponent extends AbstractHistoryChart implements OnInit, /** * Buy From Grid */ - let gridData = result.data['_sum/GridActivePowerL2'].map(value => { + const gridData = result.data['_sum/GridActivePowerL2'].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -123,7 +123,7 @@ export class GridChartComponent extends AbstractHistoryChart implements OnInit, /** * Buy From Grid */ - let gridData = result.data['_sum/GridActivePowerL3'].map(value => { + const gridData = result.data['_sum/GridActivePowerL3'].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -153,7 +153,7 @@ export class GridChartComponent extends AbstractHistoryChart implements OnInit, protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress('_sum', 'GridActivePower'), new ChannelAddress('_sum', 'GridActivePowerL1'), new ChannelAddress('_sum', 'GridActivePowerL2'), @@ -164,11 +164,11 @@ export class GridChartComponent extends AbstractHistoryChart implements OnInit, } protected setLabel() { - let translate = this.translate; // enables access to TranslateService - let options = this.createDefaultChartOptions(); + const translate = this.translate; // enables access to TranslateService + const options = this.createDefaultChartOptions(); options.plugins.tooltip.callbacks.label = function (tooltipItem: Chart.TooltipItem) { let label = tooltipItem.dataset.label; - let value = tooltipItem.dataset.data[tooltipItem.dataIndex]; + const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; // 0.005 to prevent showing Charge or Discharge if value is e.g. 0.00232138 if (value < -0.005) { if (label.includes(translate.instant('General.phase'))) { diff --git a/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts b/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts index b7b275ec69e..06743192d12 100644 --- a/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts +++ b/ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts @@ -48,22 +48,22 @@ export class GridOptimizedChargeChartComponent extends AbstractHistoryChart impl this.loading = true; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(() => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; // Delay Charge Limit data if (this.component.id + '/DelayChargeMaximumChargeLimit' in result.data) { - let delayChargeData = result.data[this.component.id + '/DelayChargeMaximumChargeLimit'].map(value => { + const delayChargeData = result.data[this.component.id + '/DelayChargeMaximumChargeLimit'].map(value => { if (value == null) { return null; } else if (value <= 0) { @@ -86,7 +86,7 @@ export class GridOptimizedChargeChartComponent extends AbstractHistoryChart impl // Sell to grid limit - Minimum charge limit data if (this.component.id + '/SellToGridLimitMinimumChargeLimit' in result.data) { - let sellToGridLimitData = result.data[this.component.id + '/SellToGridLimitMinimumChargeLimit'].map(value => { + const sellToGridLimitData = result.data[this.component.id + '/SellToGridLimitMinimumChargeLimit'].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -122,7 +122,7 @@ export class GridOptimizedChargeChartComponent extends AbstractHistoryChart impl effectivePower = result.data['_sum/EssActivePower']; } - let chargeData = effectivePower.map(value => { + const chargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value < 0) { @@ -146,7 +146,7 @@ export class GridOptimizedChargeChartComponent extends AbstractHistoryChart impl // State of charge data if ('_sum/EssSoc' in result.data) { - let socData = result.data['_sum/EssSoc'].map(value => { + const socData = result.data['_sum/EssSoc'].map(value => { if (value == null) { return null; } else if (value > 100 || value < 0) { @@ -220,7 +220,7 @@ export class GridOptimizedChargeChartComponent extends AbstractHistoryChart impl protected getChannelAddresses(): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress('_sum', 'EssActivePower'), new ChannelAddress('_sum', 'ProductionDcActualPower'), new ChannelAddress('_sum', 'EssSoc'), diff --git a/ui/src/app/edge/history/gridoptimizedcharge/sellToGridLimitChart.component.ts b/ui/src/app/edge/history/gridoptimizedcharge/sellToGridLimitChart.component.ts index d8b2c4ebaa8..fca488700f2 100644 --- a/ui/src/app/edge/history/gridoptimizedcharge/sellToGridLimitChart.component.ts +++ b/ui/src/app/edge/history/gridoptimizedcharge/sellToGridLimitChart.component.ts @@ -49,23 +49,23 @@ export class SellToGridLimitChartComponent extends AbstractHistoryChart implemen this.loading = true; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(() => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; /* * Sell To Grid */ if (this.gridMeter + '/ActivePower' in result.data) { - let sellToGridData = result.data[this.gridMeter + '/ActivePower'].map(value => { + const sellToGridData = result.data[this.gridMeter + '/ActivePower'].map(value => { if (value == null) { return null; } else if (value < 0) { @@ -90,7 +90,7 @@ export class SellToGridLimitChartComponent extends AbstractHistoryChart implemen */ if (this.component.id + '/_PropertyMaximumSellToGridPower' in result.data) { - let sellToGridLimitData = result.data[this.component.id + '/_PropertyMaximumSellToGridPower'].map(value => { + const sellToGridLimitData = result.data[this.component.id + '/_PropertyMaximumSellToGridPower'].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -111,7 +111,7 @@ export class SellToGridLimitChartComponent extends AbstractHistoryChart implemen borderColor: 'rgba(0,0,0,1)', }); - let batterySellToGridLimitData = result.data[this.component.id + '/_PropertyMaximumSellToGridPower'].map(value => { + const batterySellToGridLimitData = result.data[this.component.id + '/_PropertyMaximumSellToGridPower'].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -140,7 +140,7 @@ export class SellToGridLimitChartComponent extends AbstractHistoryChart implemen */ if ('_sum/ProductionActivePower' in result.data) { - let productionData = result.data['_sum/ProductionActivePower'].map(value => { + const productionData = result.data['_sum/ProductionActivePower'].map(value => { if (value == null) { return null; } else { @@ -179,7 +179,7 @@ export class SellToGridLimitChartComponent extends AbstractHistoryChart implemen protected getChannelAddresses(): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [new ChannelAddress('_sum', 'ProductionActivePower')]; + const result: ChannelAddress[] = [new ChannelAddress('_sum', 'ProductionActivePower')]; if (this.component != null && this.gridMeter != null) { result.push(new ChannelAddress(this.gridMeter, 'ActivePower')); } diff --git a/ui/src/app/edge/history/gridoptimizedcharge/widget.component.ts b/ui/src/app/edge/history/gridoptimizedcharge/widget.component.ts index 56b35633eee..122ef28ec7a 100644 --- a/ui/src/app/edge/history/gridoptimizedcharge/widget.component.ts +++ b/ui/src/app/edge/history/gridoptimizedcharge/widget.component.ts @@ -47,14 +47,14 @@ export class GridOptimizedChargeWidgetComponent extends AbstractHistoryWidget im ngOnChanges() { this.updateValues(); - }; + } protected updateValues() { this.service.getConfig().then(config => { this.getChannelAddresses(this.edge, config).then(channels => { this.service.queryEnergy(this.period.from, this.period.to, channels).then(response => { - let result = response.result; + const result = response.result; if (this.componentId + '/DelayChargeTime' in result.data) { this.activeTimeDelayCharge = result.data[this.componentId + '/DelayChargeTime']; } @@ -75,7 +75,7 @@ export class GridOptimizedChargeWidgetComponent extends AbstractHistoryWidget im protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let channeladdresses = [ + const channeladdresses = [ new ChannelAddress(this.componentId, 'DelayChargeTime'), new ChannelAddress(this.componentId, 'SellToGridLimitTime'), new ChannelAddress(this.componentId, 'AvoidLowChargingTime'), diff --git a/ui/src/app/edge/history/heatingelement/chart.component.ts b/ui/src/app/edge/history/heatingelement/chart.component.ts index 8c8483c6bca..3d933402698 100644 --- a/ui/src/app/edge/history/heatingelement/chart.component.ts +++ b/ui/src/app/edge/history/heatingelement/chart.component.ts @@ -48,20 +48,20 @@ export class HeatingelementChartComponent extends AbstractHistoryChart implement this.loading = true; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(() => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; - let level = this.component.id + '/Level'; + const datasets = []; + const level = this.component.id + '/Level'; if (level in result.data) { - let levelData = result.data[level].map(value => { + const levelData = result.data[level].map(value => { if (value == null) { return null; } else { @@ -96,19 +96,18 @@ export class HeatingelementChartComponent extends AbstractHistoryChart implement this.unit = YAxisTitle.NONE; await this.setOptions(this.options); this.applyControllerSpecificOptions(this.options); - });; + }); } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let levels = new ChannelAddress(this.component.id, 'Level'); - let channeladdresses = [levels]; + const levels = new ChannelAddress(this.component.id, 'Level'); + const channeladdresses = [levels]; resolve(channeladdresses); }); } protected applyControllerSpecificOptions(options: ChartOptions) { - const translate = this.translate; options.scales[ChartAxis.LEFT]['title'].text = 'Level'; options.scales[ChartAxis.LEFT]['beginAtZero'] = true; options.scales[ChartAxis.LEFT].max = 3; diff --git a/ui/src/app/edge/history/heatingelement/widget.component.ts b/ui/src/app/edge/history/heatingelement/widget.component.ts index 10a46bf5cc1..0f8c2a62e16 100644 --- a/ui/src/app/edge/history/heatingelement/widget.component.ts +++ b/ui/src/app/edge/history/heatingelement/widget.component.ts @@ -47,12 +47,12 @@ export class HeatingelementWidgetComponent extends AbstractHistoryWidget impleme ngOnChanges() { this.updateValues(); - }; + } public getCumulativeValue(channeladdress: string, response: QueryHistoricTimeseriesDataResponse) { - let array = response.result.data[channeladdress]; - let firstValue = array.find(el => el != null) ?? 0; - let lastValue = array.slice().reverse().find(el => el != null) ?? 0; + const array = response.result.data[channeladdress]; + const firstValue = array.find(el => el != null) ?? 0; + const lastValue = array.slice().reverse().find(el => el != null) ?? 0; return lastValue - firstValue; } @@ -62,11 +62,11 @@ export class HeatingelementWidgetComponent extends AbstractHistoryWidget impleme this.activeTimeOverPeriodLevel2 = this.getCumulativeValue(this.componentId + '/Level2CumulatedTime', response); this.activeTimeOverPeriodLevel3 = this.getCumulativeValue(this.componentId + '/Level3CumulatedTime', response); }); - }; + } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let channeladdresses = [ + const channeladdresses = [ new ChannelAddress(this.componentId, 'Level1CumulatedTime'), new ChannelAddress(this.componentId, 'Level2CumulatedTime'), new ChannelAddress(this.componentId, 'Level3CumulatedTime'), diff --git a/ui/src/app/edge/history/heatpump/chart.component.ts b/ui/src/app/edge/history/heatpump/chart.component.ts index d193aad1e96..5350e669af1 100644 --- a/ui/src/app/edge/history/heatpump/chart.component.ts +++ b/ui/src/app/edge/history/heatpump/chart.component.ts @@ -44,20 +44,20 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn this.loading = true; this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - let result = response.result; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; if (this.component.id + '/Status' in result.data) { - let stateTimeData = result.data[this.component.id + '/Status'].map(value => { + const stateTimeData = result.data[this.component.id + '/Status'].map(value => { if (value == null) { return null; } else { @@ -96,7 +96,7 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn } private applyControllerSpecificOptions(options: Chart.ChartOptions) { - let translate = this.translate; + const translate = this.translate; options.scales[ChartAxis.LEFT]['title'].text = this.translate.instant('General.state'); options.scales[ChartAxis.LEFT].ticks.callback = function (label, index, labels) { switch (label) { @@ -114,8 +114,8 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn }; options.plugins.tooltip.callbacks.label = function (tooltipItem: Chart.TooltipItem) { - let label = tooltipItem.dataset.label; - let value = tooltipItem.dataset.data[tooltipItem.dataIndex]; + const label = tooltipItem.dataset.label; + const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; let toolTipValue; switch (value) { case -1: diff --git a/ui/src/app/edge/history/heatpump/widget.component.ts b/ui/src/app/edge/history/heatpump/widget.component.ts index 55117953a8e..e8e42316c5b 100644 --- a/ui/src/app/edge/history/heatpump/widget.component.ts +++ b/ui/src/app/edge/history/heatpump/widget.component.ts @@ -49,13 +49,13 @@ export class HeatpumpWidgetComponent extends AbstractHistoryWidget implements On ngOnChanges() { this.updateValues(); - }; + } protected updateValues() { this.service.getConfig().then(config => { this.getChannelAddresses(this.edge, config).then(channels => { this.service.queryEnergy(this.period.from, this.period.to, channels).then(response => { - let result = response.result; + const result = response.result; if (this.componentId + '/ForceOnStateTime' in result.data) { this.activeTimeOverPeriodForceOn = result.data[this.componentId + '/ForceOnStateTime']; } @@ -75,7 +75,7 @@ export class HeatpumpWidgetComponent extends AbstractHistoryWidget implements On protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let channels: ChannelAddress[] = [ + const channels: ChannelAddress[] = [ new ChannelAddress(this.componentId, 'ForceOnStateTime'), new ChannelAddress(this.componentId, 'RegularStateTime'), new ChannelAddress(this.componentId, 'RecommendationStateTime'), diff --git a/ui/src/app/edge/history/history.component.ts b/ui/src/app/edge/history/history.component.ts index c03f40dc456..0441bc8823d 100644 --- a/ui/src/app/edge/history/history.component.ts +++ b/ui/src/app/edge/history/history.component.ts @@ -73,7 +73,7 @@ export class HistoryComponent implements OnInit { } updateOnWindowResize() { - let ref = /* fix proportions */ Math.min(window.innerHeight - 150, + const ref = /* fix proportions */ Math.min(window.innerHeight - 150, /* handle grid breakpoints */(window.innerWidth < 768 ? window.innerWidth - 150 : window.innerWidth - 400)); this.socChartHeight = /* minimum size */ Math.max(150, diff --git a/ui/src/app/edge/history/historydataservice.ts b/ui/src/app/edge/history/historydataservice.ts index 0de2e34ddca..60efc278739 100644 --- a/ui/src/app/edge/history/historydataservice.ts +++ b/ui/src/app/edge/history/historydataservice.ts @@ -24,7 +24,7 @@ export class HistoryDataService extends DataService { public getValues(channelAddresses: ChannelAddress[], edge: Edge, componentId: string) { - for (let channelAddress of channelAddresses) { + for (const channelAddress of channelAddresses) { this.channelAddresses[channelAddress.toString()] = channelAddress; } @@ -36,9 +36,9 @@ export class HistoryDataService extends DataService { this.service.historyPeriod.subscribe(date => { edge.sendRequest(this.websocket, new QueryHistoricTimeseriesEnergyRequest(DateUtils.maxDate(date.from, edge?.firstSetupProtocol), date.to, Object.values(this.channelAddresses))) .then((response) => { - let allComponents = {}; - let result = (response as QueryHistoricTimeseriesEnergyResponse).result; - for (let [key, value] of Object.entries(result.data)) { + const allComponents = {}; + const result = (response as QueryHistoricTimeseriesEnergyResponse).result; + for (const [key, value] of Object.entries(result.data)) { allComponents[key] = value; } this.currentValue.next({ allComponents: allComponents }); diff --git a/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts b/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts index 69f67dfa923..14c7fc670fa 100644 --- a/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts +++ b/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts @@ -43,24 +43,24 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im this.loading = true; this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - let meterIdActivePowerL1 = this.component.properties['meter.id'] + '/ActivePowerL1'; - let meterIdActivePowerL2 = this.component.properties['meter.id'] + '/ActivePowerL2'; - let meterIdActivePowerL3 = this.component.properties['meter.id'] + '/ActivePowerL3'; - let peakshavingPower = this.component.id + '/_PropertyPeakShavingPower'; - let rechargePower = this.component.id + '/_PropertyRechargePower'; - let result = response.result; + const meterIdActivePowerL1 = this.component.properties['meter.id'] + '/ActivePowerL1'; + const meterIdActivePowerL2 = this.component.properties['meter.id'] + '/ActivePowerL2'; + const meterIdActivePowerL3 = this.component.properties['meter.id'] + '/ActivePowerL3'; + const peakshavingPower = this.component.id + '/_PropertyPeakShavingPower'; + const rechargePower = this.component.id + '/_PropertyRechargePower'; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; if (meterIdActivePowerL1 in result.data) { - let data = result.data[meterIdActivePowerL1].map(value => { + const data = result.data[meterIdActivePowerL1].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -77,7 +77,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im this.colors.push(this.phase1Color); } if (meterIdActivePowerL2 in result.data) { - let data = result.data[meterIdActivePowerL2].map(value => { + const data = result.data[meterIdActivePowerL2].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -94,7 +94,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im this.colors.push(this.phase2Color); } if (meterIdActivePowerL3 in result.data) { - let data = result.data[meterIdActivePowerL3].map(value => { + const data = result.data[meterIdActivePowerL3].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -111,7 +111,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im this.colors.push(this.phase3Color); } if (rechargePower in result.data) { - let data = result.data[rechargePower].map(value => { + const data = result.data[rechargePower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -132,7 +132,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im }); } if (peakshavingPower in result.data) { - let data = result.data[peakshavingPower].map(value => { + const data = result.data[peakshavingPower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -164,7 +164,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } else { effectivePower = result.data['_sum/EssActivePower']; } - let chargeData = effectivePower.map(value => { + const chargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value < 0) { @@ -184,7 +184,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im /* * Storage Discharge */ - let dischargeData = effectivePower.map(value => { + const dischargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value > 0) { @@ -214,12 +214,12 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im this.unit = YAxisTitle.ENERGY; await this.setOptions(this.options); this.stopSpinner(); - });; + }); } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress(this.component.id, '_PropertyPeakShavingPower'), new ChannelAddress(this.component.id, '_PropertyRechargePower'), new ChannelAddress(this.component.properties['meter.id'], 'ActivePowerL1'), diff --git a/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts b/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts index c506f522217..11d986d8b25 100644 --- a/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts +++ b/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts @@ -43,22 +43,22 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getConfig().then(config => { - let meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; - let peakshavingPower = this.componentId + '/_PropertyPeakShavingPower'; - let rechargePower = this.componentId + '/_PropertyRechargePower'; - let result = response.result; + const meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; + const peakshavingPower = this.componentId + '/_PropertyPeakShavingPower'; + const rechargePower = this.componentId + '/_PropertyRechargePower'; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; if (meterIdActivePower in result.data) { - let data = result.data[meterIdActivePower].map(value => { + const data = result.data[meterIdActivePower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -78,7 +78,7 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp }); } if (rechargePower in result.data) { - let data = result.data[rechargePower].map(value => { + const data = result.data[rechargePower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -99,7 +99,7 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp }); } if (peakshavingPower in result.data) { - let data = result.data[peakshavingPower].map(value => { + const data = result.data[peakshavingPower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -131,7 +131,7 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp } else { effectivePower = result.data['_sum/EssActivePower']; } - let chargeData = effectivePower.map(value => { + const chargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value < 0) { @@ -152,7 +152,7 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp /* * Storage Discharge */ - let dischargeData = effectivePower.map(value => { + const dischargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value > 0) { @@ -192,7 +192,7 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress(this.componentId, '_PropertyRechargePower'), new ChannelAddress(this.componentId, '_PropertyPeakShavingPower'), new ChannelAddress(config.getComponent(this.componentId).properties['meter.id'], 'ActivePower'), @@ -204,7 +204,7 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp } protected setLabel() { - let options = this.createDefaultChartOptions(); + const options = this.createDefaultChartOptions(); this.options = options; } diff --git a/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts b/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts index 85f08d061c4..f933fec6d96 100644 --- a/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts +++ b/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts @@ -44,11 +44,11 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getConfig().then(config => { - let meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; - let peakshavingPower = this.componentId + '/_PropertyPeakShavingPower'; - let rechargePower = this.componentId + '/_PropertyRechargePower'; - let stateMachine = this.componentId + '/StateMachine'; - let result = response.result; + const meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; + const peakshavingPower = this.componentId + '/_PropertyPeakShavingPower'; + const rechargePower = this.componentId + '/_PropertyRechargePower'; + const stateMachine = this.componentId + '/StateMachine'; + const result = response.result; Object.keys(result.data).forEach(key => { @@ -62,17 +62,17 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl }); // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; if (meterIdActivePower in result.data) { - let data = result.data[meterIdActivePower].map(value => { + const data = result.data[meterIdActivePower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -92,7 +92,7 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl }); } if (rechargePower in result.data) { - let data = result.data[rechargePower].map(value => { + const data = result.data[rechargePower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -113,7 +113,7 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl }); } if (peakshavingPower in result.data) { - let data = result.data[peakshavingPower].map(value => { + const data = result.data[peakshavingPower].map(value => { if (value == null) { return null; } else if (value == 0) { @@ -145,7 +145,7 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl } else { effectivePower = result.data['_sum/EssActivePower']; } - let chargeData = effectivePower.map(value => { + const chargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value < 0) { @@ -166,7 +166,7 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl /* * Storage Discharge */ - let dischargeData = effectivePower.map(value => { + const dischargeData = effectivePower.map(value => { if (value == null) { return null; } else if (value > 0) { @@ -202,12 +202,12 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl }).finally(async () => { this.unit = YAxisTitle.ENERGY; await this.setOptions(this.options); - });; + }); } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress(this.componentId, '_PropertyRechargePower'), new ChannelAddress(this.componentId, '_PropertyPeakShavingPower'), new ChannelAddress(this.componentId, 'StateMachine'), diff --git a/ui/src/app/edge/history/shared.ts b/ui/src/app/edge/history/shared.ts index 1bae6f9e240..9c9cddc5bf8 100644 --- a/ui/src/app/edge/history/shared.ts +++ b/ui/src/app/edge/history/shared.ts @@ -285,7 +285,7 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions axis: 'x', callbacks: { title(tooltipItems: Chart.TooltipItem[], data: Data): string { - let date = DateUtils.stringToDate(tooltipItems[0]?.label); + const date = DateUtils.stringToDate(tooltipItems[0]?.label); return date.toLocaleDateString() + " " + date.toLocaleTimeString(); }, }, @@ -293,15 +293,15 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions }; export function calculateActiveTimeOverPeriod(channel: ChannelAddress, queryResult: QueryHistoricTimeseriesDataResponse['result']) { - let startDate = startOfDay(new Date(queryResult.timestamps[0])); - let endDate = new Date(queryResult.timestamps[queryResult.timestamps.length - 1]); + const startDate = startOfDay(new Date(queryResult.timestamps[0])); + const endDate = new Date(queryResult.timestamps[queryResult.timestamps.length - 1]); let activeSum = 0; queryResult.data[channel.toString()].forEach(value => { activeSum += value; }); - let activePercent = activeSum / queryResult.timestamps.length; + const activePercent = activeSum / queryResult.timestamps.length; return (differenceInMinutes(endDate, startDate) * activePercent) * 60; -}; +} /** * Calculates resolution from passed Dates for queryHistoricTime-SeriesData und -EnergyPerPeriod && @@ -313,7 +313,7 @@ export function calculateActiveTimeOverPeriod(channel: ChannelAddress, queryResu * @returns resolution and timeformat */ export function calculateResolution(service: Service, fromDate: Date, toDate: Date): { resolution: Resolution, timeFormat: 'day' | 'month' | 'hour' | 'year' } { - let days = Math.abs(differenceInDays(toDate, fromDate)); + const days = Math.abs(differenceInDays(toDate, fromDate)); let result: { resolution: Resolution, timeFormat: 'day' | 'month' | 'hour' | 'year' }; if (days <= 1) { @@ -382,8 +382,8 @@ export function calculateResolution(service: Service, fromDate: Date, toDate: Da * @returns true for visible labels; hidden otherwise */ export function isLabelVisible(label: string, orElse?: boolean): boolean { - let labelWithoutUnit = "LABEL_" + label.split(":")[0]; - let value = sessionStorage.getItem(labelWithoutUnit); + const labelWithoutUnit = "LABEL_" + label.split(":")[0]; + const value = sessionStorage.getItem(labelWithoutUnit); if (orElse != null && value == null) { return orElse; } else { @@ -401,7 +401,7 @@ export function setLabelVisible(label: string, visible: boolean | null): void { if (visible == null) { return; } - let labelWithoutUnit = "LABEL_" + label.split(":")[0]; + const labelWithoutUnit = "LABEL_" + label.split(":")[0]; sessionStorage.setItem(labelWithoutUnit, visible ? 'true' : 'false'); } diff --git a/ui/src/app/edge/history/singlethreshold/chart.component.ts b/ui/src/app/edge/history/singlethreshold/chart.component.ts index 8717442adfa..32be29b928f 100644 --- a/ui/src/app/edge/history/singlethreshold/chart.component.ts +++ b/ui/src/app/edge/history/singlethreshold/chart.component.ts @@ -21,7 +21,7 @@ export class SinglethresholdChartComponent extends AbstractHistoryChart implemen ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -48,9 +48,9 @@ export class SinglethresholdChartComponent extends AbstractHistoryChart implemen this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getConfig().then(config => { - let outputChannel: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; - let inputChannel = config.getComponentProperties(this.componentId)['inputChannelAddress']; - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const outputChannel: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; + const inputChannel = config.getComponentProperties(this.componentId)['inputChannelAddress']; + const result = (response as QueryHistoricTimeseriesDataResponse).result; let yAxisID; // set yAxis for % values (if there are no other % values: use left yAxis, if there are: use right yAxis - for percent values) @@ -61,19 +61,19 @@ export class SinglethresholdChartComponent extends AbstractHistoryChart implemen } // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; - let datasets = []; + const datasets = []; // convert datasets - for (let channel in result.data) { + for (const channel in result.data) { if ((typeof outputChannel === 'string' && channel == outputChannel) || (typeof outputChannel !== 'string' && outputChannel.includes(channel))) { - let address = ChannelAddress.fromString(channel); - let data = result.data[channel].map(value => { + const address = ChannelAddress.fromString(channel); + const data = result.data[channel].map(value => { if (value == null) { return null; } else { @@ -94,7 +94,7 @@ export class SinglethresholdChartComponent extends AbstractHistoryChart implemen } if (channel == inputChannel) { let inputLabel: string = null; - let address = ChannelAddress.fromString(channel); + const address = ChannelAddress.fromString(channel); switch (address.channelId) { case 'GridActivePower': inputLabel = this.translate.instant('General.grid'); @@ -190,8 +190,8 @@ export class SinglethresholdChartComponent extends AbstractHistoryChart implemen protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['inputChannelAddress']); - let result: ChannelAddress[] = [inputChannel]; - let outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; + const result: ChannelAddress[] = [inputChannel]; + const outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; if (typeof outputChannelAddress === 'string') { result.push(ChannelAddress.fromString(outputChannelAddress)); } else { @@ -209,8 +209,8 @@ export class SinglethresholdChartComponent extends AbstractHistoryChart implemen this.service.getConfig().then(config => { - let inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['inputChannelAddress']); - let outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; + const inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['inputChannelAddress']); + const outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; let outputChannel: ChannelAddress; if (typeof outputChannelAddress === 'string') { outputChannel = ChannelAddress.fromString(outputChannelAddress); @@ -249,10 +249,10 @@ export class SinglethresholdChartComponent extends AbstractHistoryChart implemen }; } - let translate = this.translate; + const translate = this.translate; options.plugins.tooltip.callbacks.label = function (item: Chart.TooltipItem) { - let label = item.dataset.label; - let value = item.dataset.data[item.dataIndex]; + const label = item.dataset.label; + const value = item.dataset.data[item.dataIndex]; if (label == outputChannel.channelId || label == translate.instant('General.soc')) { return label + ": " + formatNumber(value, 'de', '1.0-0') + " %"; } else if (label == translate.instant('General.grid') || label == translate.instant('General.production')) { diff --git a/ui/src/app/edge/history/singlethreshold/widget.component.ts b/ui/src/app/edge/history/singlethreshold/widget.component.ts index c5964b2a2f8..5a5b46ec2f1 100644 --- a/ui/src/app/edge/history/singlethreshold/widget.component.ts +++ b/ui/src/app/edge/history/singlethreshold/widget.component.ts @@ -44,13 +44,13 @@ export class SinglethresholdWidgetComponent extends AbstractHistoryWidget implem ngOnChanges() { this.updateValues(); - }; + } // Gather result & timestamps to calculate effective active time in % protected updateValues() { this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).then(response => { this.service.getConfig().then(config => { - let result = (response as QueryHistoricTimeseriesDataResponse).result; + const result = (response as QueryHistoricTimeseriesDataResponse).result; let outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; if (typeof outputChannelAddress !== 'string') { // Takes only the first output for simplicity reasons @@ -59,11 +59,11 @@ export class SinglethresholdWidgetComponent extends AbstractHistoryWidget implem this.activeSecondsOverPeriod = calculateActiveTimeOverPeriod(ChannelAddress.fromString(outputChannelAddress), result); }); }); - }; + } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; + const outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; if (typeof outputChannelAddress === 'string') { resolve([ChannelAddress.fromString(outputChannelAddress)]); } else { diff --git a/ui/src/app/edge/history/storage/chargerchart.component.ts b/ui/src/app/edge/history/storage/chargerchart.component.ts index 784c5a00eba..8b37ac0cb02 100644 --- a/ui/src/app/edge/history/storage/chargerchart.component.ts +++ b/ui/src/app/edge/history/storage/chargerchart.component.ts @@ -19,7 +19,7 @@ export class StorageChargerChartComponent extends AbstractHistoryChart implement ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -44,20 +44,20 @@ export class StorageChargerChartComponent extends AbstractHistoryChart implement this.colors = []; this.loading = true; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - let result = response.result; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; Object.keys(result.data).forEach((channel) => { - let address = ChannelAddress.fromString(channel); - let chargerData = result.data[channel].map(value => { + const address = ChannelAddress.fromString(channel); + const chargerData = result.data[channel].map(value => { if (value == null) { return null; } else { @@ -91,7 +91,7 @@ export class StorageChargerChartComponent extends AbstractHistoryChart implement protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress(this.componentId, 'ActualPower'), ]; resolve(result); diff --git a/ui/src/app/edge/history/storage/esschart.component.ts b/ui/src/app/edge/history/storage/esschart.component.ts index 7ee97b72963..0ad2c4f52b0 100644 --- a/ui/src/app/edge/history/storage/esschart.component.ts +++ b/ui/src/app/edge/history/storage/esschart.component.ts @@ -49,19 +49,19 @@ export class StorageESSChartComponent extends AbstractHistoryChart implements On this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { - let result = response.result; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; this.getChannelAddresses(edge, config).then(channelAddresses => { channelAddresses.forEach(channelAddress => { - let data = result.data[channelAddress.toString()]?.map(value => { + const data = result.data[channelAddress.toString()]?.map(value => { if (value == null) { return null; } else { @@ -133,11 +133,11 @@ export class StorageESSChartComponent extends AbstractHistoryChart implements On } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { - let component = config.getComponent(this.componentId); - let factoryID = component.factoryId; - let factory = config.factories[factoryID]; + const component = config.getComponent(this.componentId); + const factoryID = component.factoryId; + const factory = config.factories[factoryID]; return new Promise((resolve, reject) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress(this.componentId, 'ActivePower'), ]; if ((factory.natureIds.includes("io.openems.edge.ess.api.AsymmetricEss"))) { @@ -152,7 +152,7 @@ export class StorageESSChartComponent extends AbstractHistoryChart implements On } protected setLabel() { - let options = this.createDefaultChartOptions(); + const options = this.createDefaultChartOptions(); this.options = options; } diff --git a/ui/src/app/edge/history/storage/singlechart.component.ts b/ui/src/app/edge/history/storage/singlechart.component.ts index 2aa0fd4cede..e3ec04397ed 100644 --- a/ui/src/app/edge/history/storage/singlechart.component.ts +++ b/ui/src/app/edge/history/storage/singlechart.component.ts @@ -47,16 +47,16 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { - let result = response.result; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; + const datasets = []; // calculate total charge and discharge let effectivePower = []; @@ -80,7 +80,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements effectivePowerL3 = result.data['_sum/EssActivePowerL3']; } - let totalData = effectivePower.map(value => { + const totalData = effectivePower.map(value => { if (value == null) { return null; } else { @@ -88,7 +88,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements } }); - let totalDataL1 = effectivePowerL1.map(value => { + const totalDataL1 = effectivePowerL1.map(value => { if (value == null) { return null; } else { @@ -96,7 +96,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements } }); - let totalDataL2 = effectivePowerL2.map(value => { + const totalDataL2 = effectivePowerL2.map(value => { if (value == null) { return null; } else { @@ -104,7 +104,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements } }); - let totalDataL3 = effectivePowerL3.map(value => { + const totalDataL3 = effectivePowerL3.map(value => { if (value == null) { return null; } else { @@ -114,7 +114,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements this.getChannelAddresses(edge, config).then(async channelAddresses => { channelAddresses.forEach(channelAddress => { - let data = result.data[channelAddress.toString()]?.map(value => { + const data = result.data[channelAddress.toString()]?.map(value => { if (value == null) { return null; } else { @@ -181,7 +181,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements this.applyControllerSpecificChartOptions(this.options); this.loading = false; this.stopSpinner(); - });; + }); } @@ -191,7 +191,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements options.scales[ChartAxis.LEFT].min = null; options.plugins.tooltip.callbacks.label = function (tooltipItem: Chart.TooltipItem) { let label = tooltipItem.dataset.label; - let value = tooltipItem.dataset.data[tooltipItem.dataIndex]; + const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; // 0.005 to prevent showing Charge or Discharge if value is e.g. 0.00232138 if (value < -0.005) { if (label.includes(translate.instant('General.phase'))) { @@ -218,7 +218,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress('_sum', 'EssActivePower'), new ChannelAddress('_sum', 'ProductionDcActualPower'), new ChannelAddress('_sum', 'EssActivePowerL1'), diff --git a/ui/src/app/edge/history/storage/socchart.component.ts b/ui/src/app/edge/history/storage/socchart.component.ts index 908a9978918..55fac0feecb 100644 --- a/ui/src/app/edge/history/storage/socchart.component.ts +++ b/ui/src/app/edge/history/storage/socchart.component.ts @@ -45,22 +45,22 @@ export class SocStorageChartComponent extends AbstractHistoryChart implements On this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { - let result = response.result; + const result = response.result; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; // convert datasets - let datasets = []; - let moreThanOneESS = Object.keys(result.data).length > 1 ? true : false; + const datasets = []; + const moreThanOneESS = Object.keys(result.data).length > 1 ? true : false; this.getChannelAddresses(edge, config) .then(channelAddresses => { channelAddresses.forEach(channelAddress => { - let component = config.getComponent(channelAddress.componentId); - let data = result.data[channelAddress.toString()]?.map(value => { + const component = config.getComponent(channelAddress.componentId); + const data = result.data[channelAddress.toString()]?.map(value => { if (value == null) { return null; } else if (value > 100 || value < 0) { diff --git a/ui/src/app/edge/history/storage/totalchart.component.ts b/ui/src/app/edge/history/storage/totalchart.component.ts index 3a58ca7da52..0e7f761a8bc 100644 --- a/ui/src/app/edge/history/storage/totalchart.component.ts +++ b/ui/src/app/edge/history/storage/totalchart.component.ts @@ -19,7 +19,7 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -46,11 +46,11 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { - let result = response.result; + const result = response.result; this.colors = []; // convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; @@ -64,7 +64,7 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements } else { effectivePower = result.data['_sum/EssActivePower']; } - let totalData = effectivePower.map(value => { + const totalData = effectivePower.map(value => { if (value == null) { return null; } else { @@ -73,19 +73,19 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements }); // convert datasets - let datasets = []; + const datasets = []; this.getChannelAddresses(edge, config).then(channelAddresses => { channelAddresses.forEach(channelAddress => { - let component = config.getComponent(channelAddress.componentId); - let data = result.data[channelAddress.toString()]?.map(value => { + const component = config.getComponent(channelAddress.componentId); + const data = result.data[channelAddress.toString()]?.map(value => { if (value == null) { return null; } else { return value / 1000; // convert to kW } }); - let chargerData = result.data[channelAddress.toString()].map(value => { + const chargerData = result.data[channelAddress.toString()].map(value => { if (value == null) { return null; } else { @@ -202,7 +202,7 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress('_sum', 'EssActivePower'), new ChannelAddress('_sum', 'ProductionDcActualPower'), new ChannelAddress('_sum', 'EssActivePowerL1'), @@ -212,8 +212,8 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements config.getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss") .filter(component => !component.factoryId.includes("Ess.Cluster")) .forEach(component => { - let factoryID = component.factoryId; - let factory = config.factories[factoryID]; + const factoryID = component.factoryId; + const factory = config.factories[factoryID]; result.push(new ChannelAddress(component.id, 'ActivePower')); if ((factory.natureIds.includes("io.openems.edge.ess.api.AsymmetricEss"))) { result.push( @@ -223,7 +223,7 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements ); } }); - let charger = config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger"); + const charger = config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger"); if (config.getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss") .filter(component => !component.factoryId.includes("Ess.Cluster")).length != 1 && charger.length > 0) { charger.forEach(component => { @@ -244,7 +244,7 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements options.scales[ChartAxis.LEFT].min = null; options.plugins.tooltip.callbacks.label = function (tooltipItem: Chart.TooltipItem) { let label = tooltipItem.dataset.label; - let value = tooltipItem.dataset.data[tooltipItem.dataIndex]; + const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; // 0.005 to prevent showing Charge or Discharge if value is e.g. 0.00232138 if (value < -0.005) { label += ' ' + translate.instant('General.chargePower'); diff --git a/ui/src/app/edge/history/storage/widget.component.ts b/ui/src/app/edge/history/storage/widget.component.ts index b5f79ad4082..3dcdcdcfed7 100644 --- a/ui/src/app/edge/history/storage/widget.component.ts +++ b/ui/src/app/edge/history/storage/widget.component.ts @@ -42,7 +42,7 @@ export class StorageComponent extends AbstractHistoryWidget implements OnInit, O ngOnChanges() { this.updateValues(); - }; + } protected updateValues() { this.service.getConfig().then(config => { @@ -58,7 +58,7 @@ export class StorageComponent extends AbstractHistoryWidget implements OnInit, O protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - let channels: ChannelAddress[] = []; + const channels: ChannelAddress[] = []; channels.push( new ChannelAddress('_sum', 'EssDcChargeEnergy'), new ChannelAddress('_sum', 'EssDcDischargeEnergy'), diff --git a/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts b/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts index 20ceb907e44..10b64329b18 100644 --- a/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts +++ b/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts @@ -23,7 +23,7 @@ export class Controller_ChannelthresholdComponent extends AbstractFlatWidget { return [this.outputChannel]; } protected override onCurrentData(currentData: CurrentData) { - let channel = currentData.allComponents[this.outputChannel.toString()]; + const channel = currentData.allComponents[this.outputChannel.toString()]; if (channel != null) { if (channel == 1) { this.icon.name = "radio-button-on-outline"; diff --git a/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts b/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts index 78cbb72bd1d..b7fa89871de 100644 --- a/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts +++ b/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts @@ -57,7 +57,7 @@ export class Controller_ChpSocComponent extends AbstractFlatWidget { this.mode = this.translate.instant('General.automatic'); } - let outputChannelValue = currentData.allComponents[this.outputChannel.toString()]; + const outputChannelValue = currentData.allComponents[this.outputChannel.toString()]; switch (outputChannelValue) { case 0: diff --git a/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts b/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts index fad00a41e97..d84bc2e422d 100644 --- a/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts @@ -37,7 +37,7 @@ export class Controller_ChpSocModalComponent implements OnInit { ngOnInit() { this.thresholds['lower'] = this.component.properties['lowThreshold']; this.thresholds['upper'] = this.component.properties['highThreshold']; - }; + } /** * Updates the Charge-Mode of the EVCS-Controller. @@ -45,7 +45,7 @@ export class Controller_ChpSocModalComponent implements OnInit { * @param event */ updateMode(event: CustomEvent) { - let oldMode = this.component.properties.mode; + const oldMode = this.component.properties.mode; let newMode: mode; switch (event.detail.value) { @@ -80,11 +80,11 @@ export class Controller_ChpSocModalComponent implements OnInit { * @param event */ updateThresholds() { - let oldLowerThreshold = this.component.properties['lowThreshold']; - let oldUpperThreshold = this.component.properties['highThreshold']; + const oldLowerThreshold = this.component.properties['lowThreshold']; + const oldUpperThreshold = this.component.properties['highThreshold']; - let newLowerThreshold = this.thresholds['lower']; - let newUpperThreshold = this.thresholds['upper']; + const newLowerThreshold = this.thresholds['lower']; + const newUpperThreshold = this.thresholds['upper']; // prevents automatic update when no values have changed if (this.edge != null && (oldLowerThreshold != newLowerThreshold || oldUpperThreshold != newUpperThreshold)) { diff --git a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts index ace6d5feb60..0184f951da7 100644 --- a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts @@ -29,7 +29,7 @@ export class ModalComponent extends AbstractModal { protected override getChannelAddresses(): ChannelAddress[] { this.refreshChart = false; - let channels: ChannelAddress[] = []; + const channels: ChannelAddress[] = []; if (this.edge.roleIsAtLeast(Role.ADMIN)) { this.isAtLeastAdmin = true; if ('ess.id' in this.component.properties) { @@ -81,9 +81,7 @@ export class ModalComponent extends AbstractModal { break; case 4: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.noLimitPossible'); break; - case 5: - - // Case 6: 'DISABLED' hides 'state-line', so no Message needed + case 5: // Case 6: 'DISABLED' hides 'state-line', so no Message needed case 7: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.noLimitActive'); break; diff --git a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts index d639f765133..3c21c751a26 100644 --- a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts @@ -24,7 +24,7 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -51,13 +51,13 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On this.colors = []; this.queryHistoricTimeseriesData(PredictionChartComponent.DEFAULT_PERIOD.from, PredictionChartComponent.DEFAULT_PERIOD.to, { unit: ChronoUnit.Type.MINUTES, value: 5 }).then(async response => { - let result = response.result; - let datasets = []; + const result = response.result; + const datasets = []; // Get the 5 min index of the current time - let hours = new Date().getHours(); - let minutes = new Date().getMinutes(); - let currIndex = Math.trunc((hours * 60 + minutes) / 5); + const hours = new Date().getHours(); + const minutes = new Date().getMinutes(); + const currIndex = Math.trunc((hours * 60 + minutes) / 5); // Add one buffer hour at the beginning to see at least one hour of the past soc let startIndex = currIndex - 12; @@ -66,7 +66,7 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On // Calculate soc and predicted soc data if ('_sum/EssSoc' in result.data) { - let socData = result.data['_sum/EssSoc'].map(value => { + const socData = result.data['_sum/EssSoc'].map(value => { if (value == null) { return null; } else if (value > 100 || value < 0) { @@ -85,17 +85,17 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On } } - let targetTime = new Date(0); + const targetTime = new Date(0); targetTime.setUTCSeconds(this.targetEpochSeconds); // Predicted charge start only used, if a value is present. There's no Channel for it in older Openems Versions. - let isChargeStartPresent = this.chargeStartEpochSeconds != null; - let chargeStartTime = new Date(0); + const isChargeStartPresent = this.chargeStartEpochSeconds != null; + const chargeStartTime = new Date(0); let chargeStartIndex = 0; if (isChargeStartPresent) { chargeStartTime.setUTCSeconds(this.chargeStartEpochSeconds); - let chargeStartHours = chargeStartTime.getHours(); - let chargeStartMinutes = chargeStartTime.getMinutes(); + const chargeStartHours = chargeStartTime.getHours(); + const chargeStartMinutes = chargeStartTime.getMinutes(); // Calculate the index of the chargeStart chargeStartIndex = Math.trunc((chargeStartHours * 60 + chargeStartMinutes) / 5); @@ -103,19 +103,19 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On let dataSteps = 0; let targetIndex = 0; - let predictedSocData = Array(288).fill(null); + const predictedSocData = Array(288).fill(null); // Calculate the predicted soc data if (startSoc != null && targetTime != null) { - let targetHours = targetTime.getHours(); - let targetMinutes = targetTime.getMinutes(); + const targetHours = targetTime.getHours(); + const targetMinutes = targetTime.getMinutes(); // Calculate the index of the target minute targetIndex = Math.trunc((targetHours * 60 + targetMinutes) / 5); // Remaining capacity in % - let remainingCapacity = 100 - startSoc; + const remainingCapacity = 100 - startSoc; // Calculate how much time is left in 5 min steps let remainingSteps = 0; @@ -144,7 +144,7 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On } // Add one buffer hour at the end to get more clarity in the chart - let chartEndIndex = targetIndex + 12; + const chartEndIndex = targetIndex + 12; // Remove unimportant values that are after the end index if (chartEndIndex < result.data['_sum/EssSoc'].length - 1) { @@ -161,8 +161,8 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On } // Convert labels - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } this.labels = labels; @@ -209,7 +209,7 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On private applyControllerSpecificOptions() { this.options.scales[ChartAxis.LEFT]['position'] = 'right'; this.options.scales.x.ticks.callback = function (value, index, values) { - var date = new Date(value); + const date = new Date(value); // Display the label only if the minutes are zero (full hour) return date.getMinutes() === 0 ? date.getHours() + ':00' : ''; @@ -219,7 +219,7 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On protected getChannelAddresses(): Promise { return new Promise((resolve) => { - let result: ChannelAddress[] = [ + const result: ChannelAddress[] = [ new ChannelAddress('_sum', 'EssSoc'), ]; if (this.component != null && this.component.id) { diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts index 157f5e9d25a..15a99805cd5 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts @@ -31,8 +31,8 @@ export class FlatComponent extends AbstractFlatWidget implements OnInit { } protected override onCurrentData(currentData: CurrentData): void { - var quarterlyPrice = currentData.allComponents[this.component.id + '/QuarterlyPrices']; - var currencyLabel: string = Currency.getCurrencyLabelByEdgeId(this.edge.id); + const quarterlyPrice = currentData.allComponents[this.component.id + '/QuarterlyPrices']; + const currencyLabel: string = Currency.getCurrencyLabelByEdgeId(this.edge.id); this.priceWithCurrency = Utils.CONVERT_PRICE_TO_CENT_PER_KWH(2, currencyLabel)(quarterlyPrice); } } diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts index 6074caa5241..5c5ba73e90a 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts @@ -39,8 +39,8 @@ export class ModalComponent extends AbstractModal { } protected override onCurrentData(currentData: CurrentData): void { - var quarterlyPrice = currentData.allComponents[this.component.id + '/QuarterlyPrices']; - var currencyLabel: string = Currency.getCurrencyLabelByEdgeId(this.edge?.id); + const quarterlyPrice = currentData.allComponents[this.component.id + '/QuarterlyPrices']; + const currencyLabel: string = Currency.getCurrencyLabelByEdgeId(this.edge?.id); this.priceWithCurrency = this.Utils.CONVERT_PRICE_TO_CENT_PER_KWH(2, currencyLabel)(quarterlyPrice); } } diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts index bba1865508f..cf839777858 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts @@ -24,7 +24,7 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl public ngOnChanges() { this.updateChart(); - }; + } constructor( protected override service: Service, @@ -194,14 +194,14 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl this.options.scales.x['ticks'] = { source: 'auto', autoSkip: false }; this.options.scales.x.ticks.callback = function (value, index, values) { - var date = new Date(value); + const date = new Date(value); // Display the label only if the minutes are zero (full hour) return date.getMinutes() === 0 ? date.getHours() + ':00' : ''; }; this.options.scales[ChartAxis.RIGHT].grid.display = false; - }; + } protected setLabel() { this.options = this.createDefaultChartOptions(); diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts index bf900b61e4c..3edc5233d72 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts @@ -28,7 +28,7 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im public ngOnChanges() { this.currencyLabel = Currency.getCurrencyLabelByEdgeId(this.edge.id); this.updateChart(); - }; + } constructor( protected override service: Service, diff --git a/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts b/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts index 9bd6e121c86..e1ffd2103e3 100644 --- a/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts +++ b/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts @@ -36,7 +36,7 @@ export class AdministrationComponent implements OnInit { updateZoeMode(event: CustomEvent) { let newValue = this.evcsComponent.properties['minHwCurrent']; - let oldValue = this.evcsComponent.properties['minHwCurrent']; + const oldValue = this.evcsComponent.properties['minHwCurrent']; if (event.detail.checked == true) { newValue = 10000; diff --git a/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts b/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts index e135023969c..ff43a24e529 100644 --- a/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts @@ -56,9 +56,9 @@ export class FlatComponent extends AbstractFlatWidget { new ChannelAddress(this.component.id, 'SetChargePowerLimit'), ]; - let controllers = this.config.getComponentsByFactory("Controller.Evcs"); - for (let controller of controllers) { - let properties = controller.properties; + const controllers = this.config.getComponentsByFactory("Controller.Evcs"); + for (const controller of controllers) { + const properties = controller.properties; if ("evcs.id" in properties && properties["evcs.id"] === this.componentId) { this.controller = controller; result.push(new ChannelAddress(controller.id, '_PropertyEnabledCharging')); @@ -164,7 +164,7 @@ export class FlatComponent extends AbstractFlatWidget { } formatNumber(i: number) { - let round = Math.ceil(i / 100) * 100; + const round = Math.ceil(i / 100) * 100; return round; } diff --git a/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts b/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts index 0b15af8a774..2a394e903e1 100644 --- a/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts @@ -162,7 +162,7 @@ export class ModalComponent extends AbstractModal { */ protected updateForceMinPower(event: CustomEvent, currentController: EdgeConfig.Component, numberOfPhases: number) { - let newMinChargePower = event.detail.value / numberOfPhases; + const newMinChargePower = event.detail.value / numberOfPhases; this.formGroup.controls['forceChargeMinPower'].markAsDirty(); this.formGroup.controls['forceChargeMinPower'].setValue(newMinChargePower); } @@ -173,12 +173,12 @@ export class ModalComponent extends AbstractModal { protected updateRenaultZoeConfig() { if (this.controller && this.evcsComponent.properties['minHwCurrent'] == 10000) { - let oldMinChargePower = this.controller.properties.forceChargeMinPower; - let maxAllowedChargePower = 10 /* Ampere */ * 230; /* Volt */ + const oldMinChargePower = this.controller.properties.forceChargeMinPower; + const maxAllowedChargePower = 10 /* Ampere */ * 230; /* Volt */ if (oldMinChargePower < maxAllowedChargePower) { if (this.edge != null) { - let newMinChargePower = maxAllowedChargePower; + const newMinChargePower = maxAllowedChargePower; this.edge.updateComponentConfig(this.websocket, this.controller.id, [ { name: 'forceChargeMinPower', value: newMinChargePower }, ]).then(() => { @@ -234,7 +234,7 @@ export class ModalComponent extends AbstractModal { } protected formatNumber(i: number) { - let round = Math.ceil(i / 100) * 100; + const round = Math.ceil(i / 100) * 100; return round; } diff --git a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts index 19e0ca5d936..450cd89fc59 100644 --- a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts +++ b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts @@ -31,7 +31,7 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW public switchConverter = Utils.CONVERT_WATT_TO_KILOWATT; protected override getChannelAddresses() { - let outputChannelAddress: string | string[] = this.component.properties['outputChannelAddress']; + const outputChannelAddress: string | string[] = this.component.properties['outputChannelAddress']; if (typeof outputChannelAddress === 'string') { this.outputChannel = ChannelAddress.fromString(outputChannelAddress); } else { diff --git a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts index aea8230d957..05f2e79bb9c 100644 --- a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts @@ -91,7 +91,6 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni this.threshold.setValue(newThreshold); this.threshold.markAsDirty(); } else if (this.component.properties.threshold < 0) { - newThreshold = newThreshold; this.threshold.setValue(newThreshold); this.threshold.markAsDirty(); } @@ -124,7 +123,7 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni } public updateMode(event: CustomEvent) { - let oldMode = this.component.properties.mode; + const oldMode = this.component.properties.mode; let newMode: mode; switch (event.detail.value) { @@ -153,7 +152,7 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni } } - private convertToChannelAddress(inputMode: inputMode): String { + private convertToChannelAddress(inputMode: inputMode): string { switch (inputMode) { case 'SOC': return '_sum/EssSoc'; @@ -186,7 +185,7 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni if (this.edge.roleIsAtLeast('owner')) { if (this.minimumSwitchingTime.valid && this.threshold.valid && this.switchedLoadPower.valid) { if (this.threshold.value > this.switchedLoadPower.value) { - let updateComponentArray = []; + const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { // catch inputMode and convert it to inputChannelAddress diff --git a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts index 8a44bb877fd..fdaf6d1e271 100644 --- a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts +++ b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts @@ -19,7 +19,7 @@ export class Controller_Io_FixDigitalOutputComponent extends AbstractFlatWidget } protected override onCurrentData(currentData: CurrentData) { - let channel = currentData.allComponents[this.outputChannel]; + const channel = currentData.allComponents[this.outputChannel]; if (channel != null) { if (channel == 1) { this.state = this.translate.instant('General.on'); diff --git a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts index ed67c543f09..aa8c5ece5fd 100644 --- a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts @@ -27,12 +27,12 @@ export class Controller_Io_FixDigitalOutputModalComponent { * @param event */ updateMode(event: CustomEvent) { - let oldMode = this.component.properties.isOn; + const oldMode = this.component.properties.isOn; // ion-segment button only supports string as type // https://ionicframework.com/docs/v4/api/segment-button - let newMode = (event.detail.value.toLowerCase() === 'true'); + const newMode = (event.detail.value.toLowerCase() === 'true'); this.edge.updateComponentConfig(this.websocket, this.component.id, [ { name: 'isOn', value: newMode }, diff --git a/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts b/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts index 3fbb1cd80a2..afc1d046a05 100644 --- a/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts @@ -34,7 +34,7 @@ export class FlatComponent extends AbstractFlatWidget { this.component.properties['outputChannelPhaseL3']), ); - let channelAddresses: ChannelAddress[] = [ + const channelAddresses: ChannelAddress[] = [ new ChannelAddress(this.component.id, 'ForceStartAtSecondsOfDay'), ...this.outputChannelArray, new ChannelAddress(this.component.id, 'Status'), diff --git a/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts b/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts index ac03bb7e2cc..35a0e239d55 100644 --- a/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts @@ -21,15 +21,15 @@ export class ModalComponent extends AbstractModal implements OnInit { protected readonly WorkMode = WorkMode; protected override getChannelAddresses(): ChannelAddress[] { - let outputChannelPhaseOne = ChannelAddress.fromString( + const outputChannelPhaseOne = ChannelAddress.fromString( this.component.properties['outputChannelPhaseL1']); - let outputChannelPhaseTwo = ChannelAddress.fromString( + const outputChannelPhaseTwo = ChannelAddress.fromString( this.component.properties['outputChannelPhaseL2']); - let outputChannelPhaseThree = ChannelAddress.fromString( + const outputChannelPhaseThree = ChannelAddress.fromString( this.component.properties['outputChannelPhaseL3']); this.outputChannelArray = [outputChannelPhaseOne, outputChannelPhaseTwo, outputChannelPhaseThree]; - let channelAddresses: ChannelAddress[] = [ + const channelAddresses: ChannelAddress[] = [ new ChannelAddress(this.component.id, 'ForceStartAtSecondsOfDay'), outputChannelPhaseOne, outputChannelPhaseTwo, diff --git a/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts b/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts index 3c8f5d027eb..5d7e1874d9a 100644 --- a/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts @@ -42,11 +42,11 @@ export class Controller_Io_HeatpumpModalComponent implements OnInit { automaticRecommendationSurplusPower: new FormControl(this.component.properties.automaticRecommendationSurplusPower), minimumSwitchingTime: new FormControl(this.component.properties.minimumSwitchingTime), }); - }; + } public updateControllerMode(event: CustomEvent) { - let oldMode = this.component.properties['mode']; - let newMode = event.detail.value; + const oldMode = this.component.properties['mode']; + const newMode = event.detail.value; if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, this.component.id, [ @@ -77,7 +77,7 @@ export class Controller_Io_HeatpumpModalComponent implements OnInit { if (this.edge != null) { if (this.edge.roleIsAtLeast('owner')) { if (this.formGroup.controls['automaticRecommendationSurplusPower'].value < this.formGroup.controls['automaticForceOnSurplusPower'].value) { - let updateComponentArray = []; + const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { updateComponentArray.push({ name: Object.keys(this.formGroup.controls)[index], value: this.formGroup.controls[element].value }); diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts index a8f1df8096d..08c2f7cfc1c 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts @@ -29,13 +29,13 @@ export class Controller_Asymmetric_PeakShavingComponent extends AbstractFlatWidg protected override onCurrentData(currentData: CurrentData) { - let activePowerArray: number[] = [ + const activePowerArray: number[] = [ currentData.allComponents[this.meterId + '/ActivePowerL1'], currentData.allComponents[this.meterId + '/ActivePowerL2'], currentData.allComponents[this.meterId + '/ActivePowerL3'], ]; - let name: string[] = ['L1', 'L2', 'L3']; + const name: string[] = ['L1', 'L2', 'L3']; this.mostStressedPhase.next({ diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts index be3221fbcd6..68988b5cf20 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts @@ -44,7 +44,7 @@ export class Controller_Asymmetric_PeakShavingModalComponent implements OnInit { if (this.edge.roleIsAtLeast('owner')) { if (this.formGroup.controls['peakShavingPower'].valid && this.formGroup.controls['rechargePower'].valid) { if (this.formGroup.controls['peakShavingPower'].value >= this.formGroup.controls['rechargePower'].value) { - let updateComponentArray = []; + const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { updateComponentArray.push({ name: Object.keys(this.formGroup.controls)[index], value: this.formGroup.controls[element].value }); diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts index b2983aa49fa..e53c0cc60c5 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts @@ -41,11 +41,11 @@ export class Controller_Symmetric_PeakShavingModalComponent implements OnInit { applyChanges() { if (this.edge != null) { if (this.edge.roleIsAtLeast('owner')) { - let peakShavingPower = this.formGroup.controls['peakShavingPower']; - let rechargePower = this.formGroup.controls['rechargePower']; + const peakShavingPower = this.formGroup.controls['peakShavingPower']; + const rechargePower = this.formGroup.controls['rechargePower']; if (peakShavingPower.valid && rechargePower.valid) { if (peakShavingPower.value >= rechargePower.value) { - let updateComponentArray = []; + const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { updateComponentArray.push({ name: Object.keys(this.formGroup.controls)[index], value: this.formGroup.controls[element].value }); diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts index 60ca3ab2c31..ce717a33a0b 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts @@ -67,11 +67,11 @@ export class Controller_Symmetric_TimeSlot_PeakShavingModalComponent implements applyChanges() { if (this.edge != null) { if (this.edge.roleIsAtLeast('owner')) { - let peakShavingPower = this.formGroup.controls['peakShavingPower']; - let rechargePower = this.formGroup.controls['rechargePower']; + const peakShavingPower = this.formGroup.controls['peakShavingPower']; + const rechargePower = this.formGroup.controls['rechargePower']; if (peakShavingPower.valid && rechargePower.valid) { if (peakShavingPower.value >= rechargePower.value) { - let updateComponentArray = []; + const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { if (Object.keys(this.formGroup.controls)[index] == 'slowChargePower') { diff --git a/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts b/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts index 768627dfb99..c0980557c66 100644 --- a/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts +++ b/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts @@ -15,13 +15,13 @@ export class Io_Api_DigitalInputComponent extends AbstractFlatWidget { public ioComponentCount = 0; protected override getChannelAddresses() { - let channels: ChannelAddress[] = []; + const channels: ChannelAddress[] = []; this.service.getConfig().then(config => { this.ioComponents = config.getComponentsImplementingNature("io.openems.edge.io.api.DigitalInput").filter(component => component.isEnabled); - for (let component of this.ioComponents) { + for (const component of this.ioComponents) { - for (let channel in component.channels) { + for (const channel in component.channels) { channels.push( new ChannelAddress(component.id, channel), ); diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts index f8d286cbf31..4b4bfa0d57f 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts @@ -11,7 +11,7 @@ import { Evcs_Api_ClusterModalComponent } from './modal/evcsCluster-modal.page'; export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { public channelAddresses: ChannelAddress[] = []; - public evcsIdsInCluster: String[] = []; + public evcsIdsInCluster: string[] = []; public evcssInCluster: EdgeConfig.Component[] = []; public evcsComponent: EdgeConfig.Component = null; public evcsMap: { [sourceId: string]: EdgeConfig.Component } = {}; @@ -22,9 +22,9 @@ export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { protected override getChannelAddresses() { this.evcsIdsInCluster = this.config.components[this.componentId].properties["evcs.ids"]; - let nature = 'io.openems.edge.evcs.api.Evcs'; + const nature = 'io.openems.edge.evcs.api.Evcs'; - for (let component of this.config.getComponentsImplementingNature(nature)) { + for (const component of this.config.getComponentsImplementingNature(nature)) { if (this.evcsIdsInCluster.includes(component.id)) { this.evcssInCluster.push(component); this.fillChannelAddresses(component.id, this.channelAddresses); @@ -54,7 +54,7 @@ export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { this.evcsMap[evcs.id] = null; }); - let controllers = this.config.getComponentsByFactory("Controller.Evcs"); + const controllers = this.config.getComponentsByFactory("Controller.Evcs"); // Adds the controllers to the each charging stations controllers.forEach(controller => { diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts index 43997648b4b..ad1ce0727d7 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts @@ -54,10 +54,10 @@ export class EvcsChartComponent implements OnInit, OnChanges { } this.loading = true; let index = 0; - for (let evcsId in this.evcsMap) { - let chargePower = this.edge.currentData.value.channel[evcsId + '/ChargePower']; - let chargePowerKW = chargePower / 1000.0; - let alias = this.evcsConfigMap[evcsId].properties.alias; + for (const evcsId in this.evcsMap) { + const chargePower = this.edge.currentData.value.channel[evcsId + '/ChargePower']; + const chargePowerKW = chargePower / 1000.0; + const alias = this.evcsConfigMap[evcsId].properties.alias; if (this.datasets[index] == null) { this.datasets.push({ label: alias, @@ -70,19 +70,18 @@ export class EvcsChartComponent implements OnInit, OnChanges { this.datasets[index].data = [chargePowerKW != null ? chargePowerKW : 0]; } index++; - }; + } this.loading = false; } getMaxPower() { - let maxPower: number; - let minPower = 22; + const minPower = 22; let maxHW = this.currentData[this.componentId + '/MaximumHardwarePower']; let chargePower = this.currentData[this.componentId + '/ChargePower']; maxHW = maxHW == null ? minPower : maxHW / 1000; chargePower = chargePower == null ? 0 : chargePower / 1000; - maxPower = chargePower < minPower || maxPower < minPower ? minPower : maxHW; + const maxPower: number = chargePower < minPower || maxHW; return Math.round(maxPower); } } @@ -132,7 +131,7 @@ export const DEFAULT_BAR_CHART_OPTIONS: BarChartOptions = { label(tooltipItems: BarChartTooltipItem, data: Data): string { let value: number = tooltipItems.yLabel; //.toFixed(2); value = parseFloat(value.toFixed(2)); - let label = data.datasets[tooltipItems.datasetIndex].label; + const label = data.datasets[tooltipItems.datasetIndex].label; return label + ": " + value.toLocaleString('de-DE') + " kW"; }, }, diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts index 838ccc9e045..2ae12fc26fe 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts @@ -63,10 +63,10 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { } doReorder(ev: any) { - let oldListOrder = this.prioritizedEvcsList; + const oldListOrder = this.prioritizedEvcsList; this.prioritizedEvcsList = ev.detail.complete(this.prioritizedEvcsList); - let newListOrder = this.prioritizedEvcsList; + const newListOrder = this.prioritizedEvcsList; if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, this.config.id, [ @@ -92,7 +92,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { * @param event */ updateChargeMode(event: CustomEvent, currentController: EdgeConfig.Component) { - let oldChargeMode = currentController.properties.chargeMode; + const oldChargeMode = currentController.properties.chargeMode; let newChargeMode: ChargeMode; switch (event.detail.value) { @@ -121,7 +121,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { * Changed the Priority between the components of the charging session */ priorityChanged(event: CustomEvent, currentController: EdgeConfig.Component) { - let oldPriority = currentController.properties.priority; + const oldPriority = currentController.properties.priority; let newPriority: Priority; switch (event.detail.value) { @@ -153,7 +153,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { * @param event */ updateForceMinPower(event: CustomEvent, currentController: EdgeConfig.Component, numberOfPhases: number) { - let oldMinChargePower = currentController.properties.forceChargeMinPower; + const oldMinChargePower = currentController.properties.forceChargeMinPower; let newMinChargePower = event.detail.value; newMinChargePower /= numberOfPhases; @@ -177,8 +177,8 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { * @param event */ updateDefaultMinPower(event: CustomEvent, currentController: EdgeConfig.Component) { - let oldMinChargePower = currentController.properties.defaultChargeMinPower; - let newMinChargePower = event.detail.value; + const oldMinChargePower = currentController.properties.defaultChargeMinPower; + const newMinChargePower = event.detail.value; if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ @@ -194,7 +194,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { } } - currentLimitChanged(event: CustomEvent, property: String) { + currentLimitChanged(event: CustomEvent, property: string) { } @@ -206,7 +206,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { */ allowMinimumChargePower(event: CustomEvent, phases: number, currentController: EdgeConfig.Component) { - let oldMinChargePower = currentController.properties.defaultChargeMinPower; + const oldMinChargePower = currentController.properties.defaultChargeMinPower; let newMinChargePower = 0; if (oldMinChargePower == null || oldMinChargePower == 0) { @@ -233,8 +233,8 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { */ enableOrDisableCharging(event: CustomEvent, currentController: EdgeConfig.Component) { - let oldChargingState = currentController.properties.enabledCharging; - let newChargingState = !oldChargingState; + const oldChargingState = currentController.properties.enabledCharging; + const newChargingState = !oldChargingState; if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ { name: 'enabledCharging', value: newChargingState }, @@ -255,7 +255,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { * @param state * @param plug */ - getState(power: Number, state: number, plug: number, currentController: EdgeConfig.Component) { + getState(power: number, state: number, plug: number, currentController: EdgeConfig.Component) { if (currentController != null) { if (currentController.properties.enabledCharging != null && currentController.properties.enabledCharging == false) { return this.translate.instant('Edge.Index.Widgets.EVCS.chargingStationDeactivated'); @@ -302,7 +302,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { * @param i */ formatNumber(i: number) { - let round = Math.ceil(i / 100) * 100; + const round = Math.ceil(i / 100) * 100; return round; } @@ -324,9 +324,9 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { return this.sumOfChannel("ChargePower"); } - private sumOfChannel(channel: String): number { + private sumOfChannel(channel: string): number { - let sum = 0;/* + const sum = 0;/* this.evcsMap.forEach(station => { let channelValue = this.edge.currentData.value.channel[station.id + "/" + channel]; if (channelValue != null) { diff --git a/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts b/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts index 22049048563..f21a09ac974 100644 --- a/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts +++ b/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts @@ -10,7 +10,7 @@ export function expectView(testContext: TestContext, viewContext: OeFormlyViewTe const generatedView = OeFormlyViewTester.apply(ModalComponent.generateView(testContext.translate), viewContext); expect(generatedView).toEqual(view); -}; +} describe('Autarchy - Modal', () => { let TEST_CONTEXT: TestContext; diff --git a/ui/src/app/edge/live/common/consumption/flat/flat.ts b/ui/src/app/edge/live/common/consumption/flat/flat.ts index efe44a76668..8170a24be7d 100644 --- a/ui/src/app/edge/live/common/consumption/flat/flat.ts +++ b/ui/src/app/edge/live/common/consumption/flat/flat.ts @@ -18,7 +18,7 @@ export class FlatComponent extends AbstractFlatWidget { protected override getChannelAddresses() { - let channelAddresses: ChannelAddress[] = [ + const channelAddresses: ChannelAddress[] = [ new ChannelAddress('_sum', 'ConsumptionActivePower'), // TODO should be moved to Modal @@ -31,7 +31,7 @@ export class FlatComponent extends AbstractFlatWidget { this.consumptionMeters = this.config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && this.config.isTypeConsumptionMetered(component)); - for (let component of this.consumptionMeters) { + for (const component of this.consumptionMeters) { channelAddresses.push( new ChannelAddress(component.id, 'ActivePower'), new ChannelAddress(component.id, 'ActivePowerL1'), @@ -45,7 +45,7 @@ export class FlatComponent extends AbstractFlatWidget { .filter(component => !(component.factoryId == 'Evcs.Cluster.SelfConsumption') && !(component.factoryId == 'Evcs.Cluster.PeakShaving') && !component.isEnabled == false); - for (let component of this.evcss) { + for (const component of this.evcss) { channelAddresses.push( new ChannelAddress(component.id, 'ChargePower'), ); @@ -61,14 +61,14 @@ export class FlatComponent extends AbstractFlatWidget { // TODO move sums to Model // Iterate over evcsComponents to get ChargePower for every component - for (let component of this.evcss) { + for (const component of this.evcss) { if (currentData.allComponents[component.id + '/ChargePower']) { this.evcsSumOfChargePower += currentData.allComponents[component.id + '/ChargePower']; } } // Iterate over evcsComponents to get ChargePower for every component - for (let component of this.consumptionMeters) { + for (const component of this.consumptionMeters) { if (currentData.allComponents[component.id + '/ActivePower']) { consumptionMetersSumOfActivePower += currentData.allComponents[component.id + '/ActivePower']; } diff --git a/ui/src/app/edge/live/common/consumption/modal/modal.constants.spec.ts b/ui/src/app/edge/live/common/consumption/modal/modal.constants.spec.ts index 9909b58d850..dbb19594bed 100644 --- a/ui/src/app/edge/live/common/consumption/modal/modal.constants.spec.ts +++ b/ui/src/app/edge/live/common/consumption/modal/modal.constants.spec.ts @@ -10,4 +10,4 @@ export function expectView(config: EdgeConfig, viewContext: OeFormlyViewTester.C const generatedView = OeFormlyViewTester.apply(ModalComponent.generateView(DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.translate), viewContext); expect(generatedView).toEqual(view); -}; +} diff --git a/ui/src/app/edge/live/common/consumption/modal/modal.ts b/ui/src/app/edge/live/common/consumption/modal/modal.ts index 2ca55aba40e..164083897d6 100644 --- a/ui/src/app/edge/live/common/consumption/modal/modal.ts +++ b/ui/src/app/edge/live/common/consumption/modal/modal.ts @@ -26,7 +26,7 @@ export class ModalComponent extends AbstractFormlyComponent { const consumptionMeters: EdgeConfig.Component[] | null = config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && config.isTypeConsumptionMetered(component)); - let lines: OeFormlyField[] = []; + const lines: OeFormlyField[] = []; // Total lines.push({ @@ -98,7 +98,7 @@ export class ModalComponent extends AbstractFormlyComponent { lines.push({ type: 'horizontal-line' }); // OtherPower - let channelsToSubscribe: ChannelAddress[] = [new ChannelAddress('_sum', 'ConsumptionActivePower')]; + const channelsToSubscribe: ChannelAddress[] = [new ChannelAddress('_sum', 'ConsumptionActivePower')]; evcss.forEach(evcs => channelsToSubscribe.push(new ChannelAddress(evcs.id, 'ChargePower'))); consumptionMeters.forEach(meter => { diff --git a/ui/src/app/edge/live/common/grid/flat/flat.ts b/ui/src/app/edge/live/common/grid/flat/flat.ts index f899ec73630..c1a86e14098 100644 --- a/ui/src/app/edge/live/common/grid/flat/flat.ts +++ b/ui/src/app/edge/live/common/grid/flat/flat.ts @@ -20,7 +20,7 @@ export class FlatComponent extends AbstractFlatWidget { public gridMode: number; protected override getChannelAddresses(): ChannelAddress[] { - let channelAddresses: ChannelAddress[] = [ + const channelAddresses: ChannelAddress[] = [ FlatComponent.GRID_ACTIVE_POWER, FlatComponent.GRID_MODE, // TODO should be moved to Modal @@ -32,7 +32,7 @@ export class FlatComponent extends AbstractFlatWidget { } protected override onCurrentData(currentData: CurrentData) { this.gridMode = currentData.allComponents[FlatComponent.GRID_MODE.toString()]; - let gridActivePower = currentData.allComponents[FlatComponent.GRID_ACTIVE_POWER.toString()]; + const gridActivePower = currentData.allComponents[FlatComponent.GRID_ACTIVE_POWER.toString()]; this.gridBuyPower = gridActivePower; this.gridSellPower = Utils.multiplySafely(gridActivePower, -1); } diff --git a/ui/src/app/edge/live/common/grid/modal/constants.spec.ts b/ui/src/app/edge/live/common/grid/modal/constants.spec.ts index 8a1361deae9..b5f1150d352 100644 --- a/ui/src/app/edge/live/common/grid/modal/constants.spec.ts +++ b/ui/src/app/edge/live/common/grid/modal/constants.spec.ts @@ -7,4 +7,4 @@ import { ModalComponent } from "./modal"; export function expectView(config: EdgeConfig, role: Role, viewContext: OeFormlyViewTester.Context, testContext: TestContext, view: OeFormlyViewTester.View): void { expect(OeFormlyViewTester.apply(ModalComponent.generateView(config, role, testContext.translate), viewContext)) .toEqual(view); -}; +} diff --git a/ui/src/app/edge/live/common/grid/modal/modal.ts b/ui/src/app/edge/live/common/grid/modal/modal.ts index 7308d88c41e..22edf6859a7 100644 --- a/ui/src/app/edge/live/common/grid/modal/modal.ts +++ b/ui/src/app/edge/live/common/grid/modal/modal.ts @@ -20,7 +20,7 @@ export class ModalComponent extends AbstractFormlyComponent { public static generateView(config: EdgeConfig, role: Role, translate: TranslateService): OeFormlyView { // Grid-Mode - let lines: OeFormlyField[] = [{ + const lines: OeFormlyField[] = [{ type: 'channel-line', name: translate.instant("General.offGrid"), channel: '_sum/GridMode', @@ -28,7 +28,7 @@ export class ModalComponent extends AbstractFormlyComponent { converter: Converter.HIDE_VALUE, }]; - var gridMeters = Object.values(config.components).filter(component => config?.isTypeGrid(component)); + const gridMeters = Object.values(config.components).filter(component => config?.isTypeGrid(component)); // Sum Channels (if more than one meter) if (gridMeters.length > 1) { @@ -50,7 +50,7 @@ export class ModalComponent extends AbstractFormlyComponent { } // Individual Meters - for (var meter of gridMeters) { + for (const meter of gridMeters) { if (gridMeters.length == 1) { // Two lines if there is only one meter (= same visualization as with Sum Channels) lines.push( @@ -113,7 +113,7 @@ export class ModalComponent extends AbstractFormlyComponent { } private static generatePhasesLineItems(role: Role, phase: string, component: EdgeConfig.Component) { - let children: OeFormlyField[] = []; + const children: OeFormlyField[] = []; if (Role.isAtLeast(role, Role.INSTALLER)) { children.push({ type: 'item', diff --git a/ui/src/app/edge/live/common/production/modal/modal.ts b/ui/src/app/edge/live/common/production/modal/modal.ts index d1a62242091..9a3b7e10c01 100644 --- a/ui/src/app/edge/live/common/production/modal/modal.ts +++ b/ui/src/app/edge/live/common/production/modal/modal.ts @@ -16,7 +16,7 @@ export class ModalComponent extends AbstractModal { public isAsymmetric: boolean = false; protected override getChannelAddresses() { - let channelAddresses: ChannelAddress[] = []; + const channelAddresses: ChannelAddress[] = []; // Get Chargers this.chargerComponents = diff --git a/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts b/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts index fb9447c958c..a46a0608e57 100644 --- a/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts +++ b/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts @@ -11,7 +11,7 @@ export function expectView(testContext: TestContext, viewContext: OeFormlyViewTe const generatedView = OeFormlyViewTester.apply(ModalComponent.generateView(testContext.translate), viewContext); expect(generatedView).toEqual(view); -}; +} describe('SelfConsumption - Modal', () => { let TEST_CONTEXT: TestContext; diff --git a/ui/src/app/edge/live/common/storage/modal/modal.component.ts b/ui/src/app/edge/live/common/storage/modal/modal.component.ts index 49cce2ba416..035eb139a8d 100644 --- a/ui/src/app/edge/live/common/storage/modal/modal.component.ts +++ b/ui/src/app/edge/live/common/storage/modal/modal.component.ts @@ -42,10 +42,10 @@ export class StorageModalComponent implements OnInit, OnDestroy { this.controllerIsRequiredEdgeVersion = this.edge.isVersionAtLeast('2023.2.5'); this.isAtLeastInstaller = this.edge.roleIsAtLeast(Role.INSTALLER); - let emergencyReserveCtrl = this.config.getComponentsByFactory('Controller.Ess.EmergencyCapacityReserve'); - let prepareBatteryExtensionCtrl = this.config.getComponentsByFactory("Controller.Ess.PrepareBatteryExtension"); - let components = [...prepareBatteryExtensionCtrl, ...emergencyReserveCtrl].filter(component => component.isEnabled).reduce((result, component) => { - let essId = component.properties['ess.id']; + const emergencyReserveCtrl = this.config.getComponentsByFactory('Controller.Ess.EmergencyCapacityReserve'); + const prepareBatteryExtensionCtrl = this.config.getComponentsByFactory("Controller.Ess.PrepareBatteryExtension"); + const components = [...prepareBatteryExtensionCtrl, ...emergencyReserveCtrl].filter(component => component.isEnabled).reduce((result, component) => { + const essId = component.properties['ess.id']; if (result[essId] == null) { result[essId] = []; } @@ -53,9 +53,9 @@ export class StorageModalComponent implements OnInit, OnDestroy { return result; }, {}); - let channelAddresses: ChannelAddress[] = []; - for (let essId in prepareBatteryExtensionCtrl) { - let controller = prepareBatteryExtensionCtrl[essId]; + const channelAddresses: ChannelAddress[] = []; + for (const essId in prepareBatteryExtensionCtrl) { + const controller = prepareBatteryExtensionCtrl[essId]; channelAddresses.push( new ChannelAddress(controller.id, "_PropertyIsRunning"), new ChannelAddress(controller.id, "_PropertyTargetTime"), @@ -70,16 +70,16 @@ export class StorageModalComponent implements OnInit, OnDestroy { this.edge.currentData .subscribe(currentData => { - let controls: FormGroup = new FormGroup({}); - for (let essId of Object.keys(components)) { - let controllers = components[essId]; + const controls: FormGroup = new FormGroup({}); + for (const essId of Object.keys(components)) { + const controllers = components[essId]; - let controllerFrmGrp: FormGroup = new FormGroup({}); - for (let controller of (controllers as EdgeConfig.Component[])) { + const controllerFrmGrp: FormGroup = new FormGroup({}); + for (const controller of (controllers as EdgeConfig.Component[])) { if (controller.factoryId == 'Controller.Ess.EmergencyCapacityReserve') { - let reserveSoc = currentData.channel[controller.id + "/_PropertyReserveSoc"] ?? 20 /* default Reserve-Soc */; - let isReserveSocEnabled = currentData.channel[controller.id + "/_PropertyIsReserveSocEnabled"] == 1; + const reserveSoc = currentData.channel[controller.id + "/_PropertyReserveSoc"] ?? 20 /* default Reserve-Soc */; + const isReserveSocEnabled = currentData.channel[controller.id + "/_PropertyIsReserveSocEnabled"] == 1; controllerFrmGrp.addControl('emergencyReserveController', this.formBuilder.group({ @@ -90,16 +90,16 @@ export class StorageModalComponent implements OnInit, OnDestroy { ); } else if (controller.factoryId == 'Controller.Ess.PrepareBatteryExtension') { - let isRunning = currentData.channel[controller.id + "/_PropertyIsRunning"] == 1; + const isRunning = currentData.channel[controller.id + "/_PropertyIsRunning"] == 1; // Because of ionic segment buttons only accepting a string value, i needed to convert it - let targetTimeSpecified = (currentData.channel[controller.id + "/_PropertyTargetTimeSpecified"] == 1).toString();; + const targetTimeSpecified = (currentData.channel[controller.id + "/_PropertyTargetTimeSpecified"] == 1).toString(); let targetTime = currentData.channel[controller.id + "/_PropertyTargetTime"]; - let targetSoc = currentData.channel[controller.id + "/_PropertyTargetSoc"]; - let targetTimeBuffer = currentData.channel[controller.id + "/_PropertyTargetTimeBuffer"]; - let epochSeconds = currentData.channel[controller.id + "/ExpectedStartEpochSeconds"]; + const targetSoc = currentData.channel[controller.id + "/_PropertyTargetSoc"]; + const targetTimeBuffer = currentData.channel[controller.id + "/_PropertyTargetTimeBuffer"]; + const epochSeconds = currentData.channel[controller.id + "/ExpectedStartEpochSeconds"]; - let expectedStartOfPreparation = new Date(0); + const expectedStartOfPreparation = new Date(0); expectedStartOfPreparation.setUTCSeconds(epochSeconds ?? 0); // If targetTime not set, not equals 0 or targetTime is no valid time, @@ -150,12 +150,12 @@ export class StorageModalComponent implements OnInit, OnDestroy { return; } - let updateArray: Map>> = new Map(); - for (let essId in this.formGroup.controls) { - let essGroups = this.formGroup.controls[essId]; + const updateArray: Map>> = new Map(); + for (const essId in this.formGroup.controls) { + const essGroups = this.formGroup.controls[essId]; - let emergencyReserveController = (essGroups.get('emergencyReserveController') as FormGroup)?.controls ?? {}; - for (let essGroup of Object.keys(emergencyReserveController)) { + const emergencyReserveController = (essGroups.get('emergencyReserveController') as FormGroup)?.controls ?? {}; + for (const essGroup of Object.keys(emergencyReserveController)) { if (emergencyReserveController[essGroup].dirty) { if (updateArray.get(emergencyReserveController['controllerId'].value)) { updateArray.get(emergencyReserveController['controllerId'].value).push(new Map().set(essGroup, emergencyReserveController[essGroup].value)); @@ -165,8 +165,8 @@ export class StorageModalComponent implements OnInit, OnDestroy { } } - let prepareBatteryExtensionController = (essGroups.get('prepareBatteryExtensionController') as FormGroup)?.controls ?? {}; - for (let essGroup of Object.keys(prepareBatteryExtensionController)) { + const prepareBatteryExtensionController = (essGroups.get('prepareBatteryExtensionController') as FormGroup)?.controls ?? {}; + for (const essGroup of Object.keys(prepareBatteryExtensionController)) { if (prepareBatteryExtensionController[essGroup].dirty) { // For simplicity, split targetTimeSpecified in 2 for template formControlName @@ -179,12 +179,12 @@ export class StorageModalComponent implements OnInit, OnDestroy { } } - for (let controllerId of updateArray.keys()) { - let controllers = updateArray.get(controllerId); - let properties: { name: string, value: any }[] = []; + for (const controllerId of updateArray.keys()) { + const controllers = updateArray.get(controllerId); + const properties: { name: string, value: any }[] = []; controllers.forEach((element) => { - let name = element.keys().next().value; - let value = element.values().next().value; + const name = element.keys().next().value; + const value = element.values().next().value; properties.push({ name: name, value: value, diff --git a/ui/src/app/edge/live/common/storage/storage.component.ts b/ui/src/app/edge/live/common/storage/storage.component.ts index a6041ff980e..f0ee2852496 100644 --- a/ui/src/app/edge/live/common/storage/storage.component.ts +++ b/ui/src/app/edge/live/common/storage/storage.component.ts @@ -25,7 +25,7 @@ export class StorageComponent extends AbstractFlatWidget { protected override getChannelAddresses() { - let channelAddresses: ChannelAddress[] = [ + const channelAddresses: ChannelAddress[] = [ new ChannelAddress('_sum', 'EssSoc'), // TODO should be moved to Modal @@ -44,8 +44,8 @@ export class StorageComponent extends AbstractFlatWidget { }, {}); - for (let essId in this.prepareBatteryExtensionCtrl) { - let controller = this.prepareBatteryExtensionCtrl[essId]; + for (const essId in this.prepareBatteryExtensionCtrl) { + const controller = this.prepareBatteryExtensionCtrl[essId]; channelAddresses.push( new ChannelAddress(controller.id, "CtrlIsBlockingEss"), new ChannelAddress(controller.id, "CtrlIsChargingEss"), @@ -66,7 +66,7 @@ export class StorageComponent extends AbstractFlatWidget { [component.properties['ess.id']]: component, }; }, {}); - for (let component of Object.values(this.emergencyReserveComponents)) { + for (const component of Object.values(this.emergencyReserveComponents)) { channelAddresses.push( new ChannelAddress(component.id, '_PropertyReserveSoc'), @@ -78,7 +78,7 @@ export class StorageComponent extends AbstractFlatWidget { this.chargerComponents = this.config .getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger") .filter(component => component.isEnabled); - for (let component of this.chargerComponents) { + for (const component of this.chargerComponents) { channelAddresses.push( new ChannelAddress(component.id, 'ActualPower'), ); @@ -91,7 +91,7 @@ export class StorageComponent extends AbstractFlatWidget { .getNatureIdsByFactoryId(component.factoryId) .includes("io.openems.edge.ess.api.MetaEss")); - for (let component of this.config + for (const component of this.config .getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss") .filter(component => component.isEnabled && !this.config .getNatureIdsByFactoryId(component.factoryId) @@ -149,8 +149,8 @@ export class StorageComponent extends AbstractFlatWidget { protected override onCurrentData(currentData: CurrentData) { - for (let essId in this.prepareBatteryExtensionCtrl) { - let controller = this.prepareBatteryExtensionCtrl[essId]; + for (const essId in this.prepareBatteryExtensionCtrl) { + const controller = this.prepareBatteryExtensionCtrl[essId]; this.possibleBatteryExtensionMessage.set( essId, @@ -165,11 +165,11 @@ export class StorageComponent extends AbstractFlatWidget { } // Check total State_of_Charge for dynamical icon in widget-header - let soc = currentData.allComponents['_sum/EssSoc']; + const soc = currentData.allComponents['_sum/EssSoc']; this.storageIconStyle = 'storage-' + Utils.getStorageSocSegment(soc); - for (let essId in this.emergencyReserveComponents) { - let controller = this.emergencyReserveComponents[essId]; + for (const essId in this.emergencyReserveComponents) { + const controller = this.emergencyReserveComponents[essId]; controller['currentReserveSoc'] = currentData.allComponents[controller.id + '/_PropertyReserveSoc']; this.isEmergencyReserveEnabled[essId] = currentData.allComponents[controller.id + "/_PropertyIsReserveSocEnabled"] == 1 ? true : false; } @@ -206,7 +206,7 @@ export class StorageComponent extends AbstractFlatWidget { return '-'; } - let thisValue: number = (value / 1000); + const thisValue: number = (value / 1000); // Round thisValue to Integer when decimal place equals 0 if (thisValue > 0) { diff --git a/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts b/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts index 68b35025d85..b03668fc30c 100644 --- a/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts +++ b/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts @@ -42,11 +42,11 @@ export class DelayedSellToGridModalComponent implements OnInit { applyChanges() { if (this.edge != null) { if (this.edge.roleIsAtLeast('owner')) { - let continuousSellToGridPower = this.formGroup.controls['continuousSellToGridPower']; - let sellToGridPowerLimit = this.formGroup.controls['sellToGridPowerLimit']; + const continuousSellToGridPower = this.formGroup.controls['continuousSellToGridPower']; + const sellToGridPowerLimit = this.formGroup.controls['sellToGridPowerLimit']; if (continuousSellToGridPower.valid && sellToGridPowerLimit.valid) { if (sellToGridPowerLimit.value > continuousSellToGridPower.value) { - let updateComponentArray = []; + const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { updateComponentArray.push({ name: Object.keys(this.formGroup.controls)[index], value: this.formGroup.controls[element].value }); diff --git a/ui/src/app/edge/live/energymonitor/chart/chart.component.ts b/ui/src/app/edge/live/energymonitor/chart/chart.component.ts index a7ba8f8b8e8..25ad7177fab 100644 --- a/ui/src/app/edge/live/energymonitor/chart/chart.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/chart.component.ts @@ -70,7 +70,7 @@ export class EnergymonitorChartComponent implements OnInit, OnDestroy { /* * Set values for energy monitor */ - let summary = currentData.summary; + const summary = currentData.summary; [this.consumptionSection, this.gridSection, this.productionSection, this.storageSection] .filter(section => section != null) .forEach(section => { @@ -91,8 +91,8 @@ export class EnergymonitorChartComponent implements OnInit, OnDestroy { } this.height = this.width = size; this.translation = `translate(${this.width / 2}, ${this.height / 2})`; - var outerRadius = Math.min(this.width, this.height) / 2; - var innerRadius = outerRadius - (outerRadius * 0.1378); + const outerRadius = Math.min(this.width, this.height) / 2; + const innerRadius = outerRadius - (outerRadius * 0.1378); // All sections from update() in section [this.consumptionSection, this.gridSection, this.productionSection, this.storageSection] .filter(section => section != null) diff --git a/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts index 85db3d1d101..3625b51d42b 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts @@ -73,7 +73,7 @@ export class EnergyFlow { if (energyFlow == null) { this.points = "0,0 0,0"; } else { - let p = energyFlow; + const p = energyFlow; this.points = p.topLeft.x + "," + p.topLeft.y + (p.middleTop ? " " + p.middleTop.x + "," + p.middleTop.y : "") + " " + p.topRight.x + "," + p.topRight.y @@ -86,7 +86,7 @@ export class EnergyFlow { if (animationEnergyFlow == null) { this.animationPoints = "0,0 0,0"; } else { - let p = animationEnergyFlow; + const p = animationEnergyFlow; this.animationPoints = p.topLeft.x + "," + p.topLeft.y + (p.middleTop ? " " + p.middleTop.x + "," + p.middleTop.y : "") + " " + p.topRight.x + "," + p.topRight.y @@ -253,8 +253,8 @@ export abstract class AbstractSection { valueRatio = Math.min(1, Math.max(-1, valueRatio)); break; } - let valueEndAngle = (this.getEndAngle() - startAngle) * valueRatio + startAngle; - let valueArc = this.getArc() + const valueEndAngle = (this.getEndAngle() - startAngle) * valueRatio + startAngle; + const valueArc = this.getArc() .startAngle(this.deg2rad(startAngle)) .endAngle(this.deg2rad(valueEndAngle)); this.valuePath = valueArc(); @@ -272,8 +272,8 @@ export abstract class AbstractSection { sumRatio *= 10; //radius * 1.2 for longer arrows - let svgEnergyFlow = this.getSvgEnergyFlow(sumRatio, this.energyFlow.radius * 1.2); - let svgAnimationEnergyFlow = this.getSvgAnimationEnergyFlow(sumRatio, this.energyFlow.radius * 1.2); + const svgEnergyFlow = this.getSvgEnergyFlow(sumRatio, this.energyFlow.radius * 1.2); + const svgAnimationEnergyFlow = this.getSvgAnimationEnergyFlow(sumRatio, this.energyFlow.radius * 1.2); this.energyFlow.update(svgEnergyFlow, svgAnimationEnergyFlow); } @@ -285,7 +285,7 @@ export abstract class AbstractSection { this.innerRadius = innerRadius; this.height = height; this.width = width; - let outlineArc = this.getArc() + const outlineArc = this.getArc() .startAngle(this.deg2rad(this.getStartAngle())) .endAngle(this.deg2rad(this.getEndAngle())); this.outlinePath = outlineArc(); @@ -298,7 +298,7 @@ export abstract class AbstractSection { /** * energy flow rectangle */ - let availableInnerRadius = innerRadius - this.square.image.y - this.square.image.length - 10; + const availableInnerRadius = innerRadius - this.square.image.y - this.square.image.length - 10; this.energyFlow = this.initEnergyFlow(availableInnerRadius); // now update also the value specific elements @@ -317,20 +317,20 @@ export abstract class AbstractSection { * ...fontsize of text; */ private getSquare(innerRadius: any): SvgSquare { - let width = innerRadius / 2.5; + const width = innerRadius / 2.5; - let textSize = width / 4; - let yText = textSize; + const textSize = width / 4; + const yText = textSize; - let numberSize = textSize - 3; - let yNumber = yText + 5 + numberSize; + const numberSize = textSize - 3; + const yNumber = yText + 5 + numberSize; - let imageSize = width; - let yImage = yNumber + 5; + const imageSize = width; + const yImage = yNumber + 5; - let length = yImage + imageSize; + const length = yImage + imageSize; - let xText = length / 2; + const xText = length / 2; return new SvgSquare( length, diff --git a/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts index ed4be8d24c4..f437f59fb88 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts @@ -86,8 +86,8 @@ export class ConsumptionSectionComponent extends AbstractSection implements OnIn } protected getSquarePosition(square: SvgSquare, innerRadius: number): SvgSquarePosition { - let x = innerRadius - 5 - square.length; - let y = (square.length / 2) * (-1); + const x = innerRadius - 5 - square.length; + const y = (square.length / 2) * (-1); return new SvgSquarePosition(x, y); } protected getImagePath(): string { @@ -111,9 +111,9 @@ export class ConsumptionSectionComponent extends AbstractSection implements OnIn } protected getSvgEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let p = { + const v = Math.abs(ratio); + const r = radius; + const p = { topLeft: { x: v, y: v * -1 }, middleLeft: { x: 0, y: 0 }, bottomLeft: { x: v, y: v }, @@ -132,9 +132,9 @@ export class ConsumptionSectionComponent extends AbstractSection implements OnIn } protected getSvgAnimationEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let animationWidth = (r * -1) - v; + const v = Math.abs(ratio); + const r = radius; + const animationWidth = (r * -1) - v; let p = { topLeft: { x: v, y: v * -1 }, middleLeft: { x: 0, y: 0 }, diff --git a/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts index bd135d15682..f02cef40162 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts @@ -142,8 +142,8 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD } protected getSquarePosition(square: SvgSquare, innerRadius: number): SvgSquarePosition { - let x = (innerRadius - 5) * (-1); - let y = (square.length / 2) * (-1); + const x = (innerRadius - 5) * (-1); + const y = (square.length / 2) * (-1); return new SvgSquarePosition(x, y); } @@ -172,9 +172,9 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD } protected getSvgEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let p = { + const v = Math.abs(ratio); + const r = radius; + const p = { bottomRight: { x: v * -1, y: v }, bottomLeft: { x: r * -1, y: v }, topRight: { x: v * -1, y: v * -1 }, @@ -193,9 +193,9 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD } protected getSvgAnimationEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let animationWidth = r * -1 + v; + const v = Math.abs(ratio); + const r = radius; + const animationWidth = r * -1 + v; let p = { bottomRight: { x: v * -1, y: v }, bottomLeft: { x: r * -1, y: v }, diff --git a/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts index 8711e0466f0..becd9c8b94a 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts @@ -86,8 +86,8 @@ export class ProductionSectionComponent extends AbstractSection implements OnIni } protected getSquarePosition(square: SvgSquare, innerRadius: number): SvgSquarePosition { - let x = (square.length / 2) * (-1); - let y = (innerRadius - 10) * (-1); + const x = (square.length / 2) * (-1); + const y = (innerRadius - 10) * (-1); return new SvgSquarePosition(x, y); } @@ -113,9 +113,9 @@ export class ProductionSectionComponent extends AbstractSection implements OnIni } protected getSvgEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let p = { + const v = Math.abs(ratio); + const r = radius; + const p = { topLeft: { x: v * -1, y: r * -1 }, bottomLeft: { x: v * -1, y: v * -1 }, topRight: { x: v, y: r * -1 }, @@ -133,9 +133,9 @@ export class ProductionSectionComponent extends AbstractSection implements OnIni } protected getSvgAnimationEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let animationWidth = r * -1 + v; + const v = Math.abs(ratio); + const r = radius; + const animationWidth = r * -1 + v; let p = { topLeft: { x: v * -1, y: r * -1 }, bottomLeft: { x: v * -1, y: v * -1 }, diff --git a/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts index 669c55f4657..12e8f547495 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts @@ -144,8 +144,8 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, } protected getSquarePosition(square: SvgSquare, innerRadius: number): SvgSquarePosition { - let x = (square.length / 2) * (-1); - let y = innerRadius - 5 - square.length; + const x = (square.length / 2) * (-1); + const y = innerRadius - 5 - square.length; return new SvgSquarePosition(x, y); } @@ -168,9 +168,9 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, protected setElementHeight() { } protected getSvgEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let p = { + const v = Math.abs(ratio); + const r = radius; + const p = { topLeft: { x: v * -1, y: v }, bottomLeft: { x: v * -1, y: r }, topRight: { x: v, y: v }, @@ -189,9 +189,9 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, } protected getSvgAnimationEnergyFlow(ratio: number, radius: number): SvgEnergyFlow { - let v = Math.abs(ratio); - let r = radius; - let animationWidth = r - v; + const v = Math.abs(ratio); + const r = radius; + const animationWidth = r - v; let p = { topLeft: { x: v * -1, y: v }, bottomLeft: { x: v * -1, y: r }, diff --git a/ui/src/app/edge/live/livedataservice.ts b/ui/src/app/edge/live/livedataservice.ts index a861e9a59fe..82f9578245b 100644 --- a/ui/src/app/edge/live/livedataservice.ts +++ b/ui/src/app/edge/live/livedataservice.ts @@ -20,7 +20,7 @@ export class LiveDataService extends DataService implements OnDestroy { public getValues(channelAddresses: ChannelAddress[], edge: Edge, componentId: string) { - for (let channelAddress of channelAddresses) { + for (const channelAddress of channelAddresses) { this.subscribedChannelAddresses.push(channelAddress); } @@ -32,9 +32,9 @@ export class LiveDataService extends DataService implements OnDestroy { // call onCurrentData() with latest data edge.currentData.pipe(takeUntil(this.stopOnDestroy)).subscribe(currentData => { - let allComponents = this.currentValue.value.allComponents; - for (let channelAddress of channelAddresses) { - let ca = channelAddress.toString(); + const allComponents = this.currentValue.value.allComponents; + for (const channelAddress of channelAddresses) { + const ca = channelAddress.toString(); allComponents[ca] = currentData.channel[ca]; } diff --git a/ui/src/app/edge/settings/alerting/alerting.component.ts b/ui/src/app/edge/settings/alerting/alerting.component.ts index e95c2b35109..62b1a96f77c 100644 --- a/ui/src/app/edge/settings/alerting/alerting.component.ts +++ b/ui/src/app/edge/settings/alerting/alerting.component.ts @@ -12,7 +12,7 @@ export enum AlertingType { offline = 0, fault = 1, warning = 2 -}; +} type DefaultValues = { [K in AlertingType]: Delay[]; }; type Delay = { value: number, label: string }; @@ -64,7 +64,7 @@ export class AlertingComponent implements OnInit { this.user = metadata.user; }); - let request = new GetUserAlertingConfigsRequest({ edgeId: this.edge.id }); + const request = new GetUserAlertingConfigsRequest({ edgeId: this.edge.id }); this.sendRequest(request).then(response => { const result = response.result; @@ -97,10 +97,10 @@ export class AlertingComponent implements OnInit { this.otherUserInformation = []; this.otherUserForm = new FormGroup({}); - var sorted = this.sortedAlphabetically(response); + const sorted = this.sortedAlphabetically(response); sorted.forEach((r) => { - var setting: AlertingSetting = { + const setting: AlertingSetting = { userLogin: r.userLogin, offlineEdgeDelay: r.offlineEdgeDelay, faultEdgeDelay: r.faultEdgeDelay, @@ -132,7 +132,7 @@ export class AlertingComponent implements OnInit { } private getValueOrDefault(setting: AlertingSetting, type: AlertingType) { - var val = this.getValue(setting, type); + const val = this.getValue(setting, type); return val <= 0 ? this.defaultValues[type][0].value : val; } @@ -205,20 +205,20 @@ export class AlertingComponent implements OnInit { } protected setUsersAlertingConfig() { - let edgeId: string = this.edge.id; + const edgeId: string = this.edge.id; - let dirtyformGroups: FormGroup[] = []; - let changedUserSettings: UserSettingRequest[] = []; + const dirtyformGroups: FormGroup[] = []; + const changedUserSettings: UserSettingRequest[] = []; if (this.currentUserForm.dirty) { - var formGroup = this.currentUserForm; + const formGroup = this.currentUserForm; dirtyformGroups.push(formGroup); - let offlineEdgeDelay = this.currentUserInformation.isOfflineActive ? + const offlineEdgeDelay = this.currentUserInformation.isOfflineActive ? this.currentUserForm.controls["offlineEdgeDelay"].value : 0; - let faultEdgeDelay = this.currentUserInformation.isFaultActive ? + const faultEdgeDelay = this.currentUserInformation.isFaultActive ? this.currentUserForm.controls["faultEdgeDelay"].value : 0; - let warningEdgeDelay = this.currentUserInformation.isWarningActive ? + const warningEdgeDelay = this.currentUserInformation.isWarningActive ? this.currentUserForm.controls["warningEdgeDelay"].value : 0; changedUserSettings.push({ @@ -229,17 +229,17 @@ export class AlertingComponent implements OnInit { }); } - let userOptions: AlertingSetting[] = []; + const userOptions: AlertingSetting[] = []; if (this.otherUserInformation) { if (this.otherUserForm.dirty) { dirtyformGroups.push(this.otherUserForm); - for (let user of this.otherUserInformation) { - let control = this.otherUserForm.controls[user.userLogin]; + for (const user of this.otherUserInformation) { + const control = this.otherUserForm.controls[user.userLogin]; if (control.dirty) { - let offlineEdgeDelay = control.value['offlineEdgeDelay']; - let faultEdgeDelay = control.value['faultEdgeDelay']; - let warningEdgeDelay = control.value['warningEdgeDelay']; + const offlineEdgeDelay = control.value['offlineEdgeDelay']; + const faultEdgeDelay = control.value['faultEdgeDelay']; + const warningEdgeDelay = control.value['warningEdgeDelay']; //let isActivated = control.value['isActivated']; changedUserSettings.push({ userLogin: user.userLogin, @@ -255,7 +255,7 @@ export class AlertingComponent implements OnInit { console.log(changedUserSettings); - let request = new SetUserAlertingConfigsRequest({ edgeId: edgeId, userSettings: changedUserSettings }); + const request = new SetUserAlertingConfigsRequest({ edgeId: edgeId, userSettings: changedUserSettings }); this.sendRequestAndUpdate(request, dirtyformGroups); } @@ -269,12 +269,12 @@ export class AlertingComponent implements OnInit { this.sendRequest(request) .then(() => { this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); - for (let group of formGroup.values()) { + for (const group of formGroup.values()) { group.markAsPristine(); } }) .catch((response) => { - let error = response.error; + const error = response.error; this.errorToast(this.translate.instant('General.changeFailed'), error.message); }); } @@ -290,7 +290,7 @@ export class AlertingComponent implements OnInit { this.websocket.sendRequest(request).then(response => { resolve(response as GetUserAlertingConfigsResponse); }).catch(reason => { - let error = reason.error; + const error = reason.error; console.error(error); this.errorToast(this.translate.instant('Edge.Config.ALERTING.TOAST.ERROR'), error.message); reject(reason); diff --git a/ui/src/app/edge/settings/app/index.component.ts b/ui/src/app/edge/settings/app/index.component.ts index e5b4ac9e39b..e66a84813d1 100644 --- a/ui/src/app/edge/settings/app/index.component.ts +++ b/ui/src/app/edge/settings/app/index.component.ts @@ -184,7 +184,7 @@ export class IndexComponent implements OnInit, OnDestroy { this.installedApps.appCategories = []; this.availableApps.appCategories = []; - var sortedApps = []; + const sortedApps = []; this.apps.forEach(app => { app.categorys.forEach(category => { if (this.selectedBundle >= 0 && this.key) { @@ -198,7 +198,7 @@ export class IndexComponent implements OnInit, OnDestroy { return false; } } - var cat = this.categories.find(c => c.val.name === category.name); + const cat = this.categories.find(c => c.val.name === category.name); if (!cat.isChecked) { return false; } @@ -225,7 +225,7 @@ export class IndexComponent implements OnInit, OnDestroy { private pushIntoCategory(app: GetApps.App, list: AppList): void { app.categorys.forEach(category => { - var catList = list.appCategories.find(l => l.category.name === category.name); + let catList = list.appCategories.find(l => l.category.name === category.name); if (catList === undefined) { catList = { category: category, apps: [] }; list.appCategories.push(catList); diff --git a/ui/src/app/edge/settings/app/install.component.ts b/ui/src/app/edge/settings/app/install.component.ts index 2672d9235ab..6734b5ead43 100644 --- a/ui/src/app/edge/settings/app/install.component.ts +++ b/ui/src/app/edge/settings/app/install.component.ts @@ -64,8 +64,8 @@ export class InstallAppComponent implements OnInit, OnDestroy { this.useMasterKey = state['useMasterKey']; } } - let appId = this.route.snapshot.params['appId']; - let appName = this.route.snapshot.queryParams['name']; + const appId = this.route.snapshot.params['appId']; + const appName = this.route.snapshot.queryParams['name']; this.appId = appId; this.service.setCurrentComponent(appName, this.route).then(edge => { this.edge = edge; @@ -93,7 +93,7 @@ export class InstallAppComponent implements OnInit, OnDestroy { componentId: '_appManager', payload: new GetAppAssistant.Request({ appId: appId }), })).then(response => { - let appAssistant = GetAppAssistant.postprocess((response as GetAppAssistant.Response).result); + const appAssistant = GetAppAssistant.postprocess((response as GetAppAssistant.Response).result); this.fields = GetAppAssistant.setInitialModel(appAssistant.fields, {}); this.appName = appAssistant.name; @@ -120,9 +120,9 @@ export class InstallAppComponent implements OnInit, OnDestroy { this.obtainKey().then(key => { this.service.startSpinnerTransparentBackground(this.appId); // remove alias field from properties - let alias = this.form.value['ALIAS']; + const alias = this.form.value['ALIAS']; const clonedFields = {}; - for (let item in this.form.value) { + for (const item in this.form.value) { if (item !== 'ALIAS') { clonedFields[item] = this.form.value[item]; } @@ -148,7 +148,7 @@ export class InstallAppComponent implements OnInit, OnDestroy { this.isInstalling = true; this.edge.sendRequest(this.websocket, request).then(response => { - let result = (response as AddAppInstance.Response).result; + const result = (response as AddAppInstance.Response).result; if (result.instance) { result.instanceId = result.instance.instanceId; diff --git a/ui/src/app/edge/settings/app/jsonrpc/addAppInstance.ts b/ui/src/app/edge/settings/app/jsonrpc/addAppInstance.ts index 6ed8717ca8b..6f681049dfc 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/addAppInstance.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/addAppInstance.ts @@ -58,7 +58,7 @@ export namespace AddAppInstance { public override readonly result: { instanceId: string, instance: GetAppInstances.AppInstance, - warnings: String[] + warnings: string[] }, ) { super(id, result); diff --git a/ui/src/app/edge/settings/app/jsonrpc/flag/flagType.ts b/ui/src/app/edge/settings/app/jsonrpc/flag/flagType.ts index f01cf50dda1..a844f98c811 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/flag/flagType.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/flag/flagType.ts @@ -1,5 +1,3 @@ -import { Flag } from "./flag"; - -export interface FlagType { +export interface FlagType { name: string, } diff --git a/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts b/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts index a7bc5a667fd..e3041790b9e 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts @@ -3,7 +3,7 @@ import { FlagType } from "./flagType"; export namespace Flags { - export const SHOW_AFTER_KEY_REDEEM: FlagType = { name: 'showAfterKeyRedeem' }; + export const SHOW_AFTER_KEY_REDEEM: FlagType = { name: 'showAfterKeyRedeem' }; /** * Gets a flag by its type from an array of flags. @@ -14,7 +14,7 @@ export namespace Flags { * * @see Flag */ - export function getByType(flags: Flag[], type: FlagType): Type | undefined { + export function getByType(flags: Flag[], type: FlagType): Type | undefined { if (!flags) { return undefined; } diff --git a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts index 6ccb7fc12ac..d3c6e1777ff 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts @@ -64,17 +64,17 @@ export namespace GetAppAssistant { } export function postprocess(appAssistant: AppAssistant): AppAssistant { - let fields = appAssistant.fields; + const fields = appAssistant.fields; let hasAliasField = false; - for (let field of fields) { + for (const field of fields) { if (eachFieldRecursive(fields, field)) { hasAliasField = true; } } if (!hasAliasField) { // insert alias field into appAssistent fields - let aliasField = { key: 'ALIAS', type: 'input', templateOptions: { label: 'Alias' }, defaultValue: appAssistant.alias }; + const aliasField = { key: 'ALIAS', type: 'input', templateOptions: { label: 'Alias' }, defaultValue: appAssistant.alias }; appAssistant.fields.splice(0, 0, aliasField); } return appAssistant; @@ -91,7 +91,7 @@ export namespace GetAppAssistant { if (!fieldGroup) { return; } - for (let f of fieldGroup) { + for (const f of fieldGroup) { recursivIterate(f); } }); @@ -101,149 +101,6 @@ export namespace GetAppAssistant { }); } - /** - * Iterates over the given field an all child fields. - * - * @param field the current field to iterate thrue - * @returns true if any field has 'ALIAS' as their key - */ - function eachFieldRecursive(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { - // 'defaultValue' false for checkboxes - if (field.type === 'checkbox' && !('defaultValue' in field)) { - field['defaultValue'] = false; - } - // this is needed to still show the input as the default style defined by us - if (field.wrappers?.includes('formly-wrapper-default-of-cases') - || field.wrappers?.includes('formly-safe-input-wrapper') - || field.wrappers?.includes('input-with-unit')) { - field.wrappers?.push('form-field'); - } - - if (field.validators) { - for (const [key, value] of Object.entries(field.validators)) { - let expressionString: string = value["expressionString"]; - if (expressionString) { - expressionString = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${expressionString};`); - field.validators[key]["expression"] = (control: AbstractControl, f: FormlyFieldConfigWithInitialModel) => { - return func(f.model, f.options.formState, f, control, f.initialModel); - }; - } - let messageExpressionString: string = value['messageString']; - if (messageExpressionString) { - messageExpressionString = GetAppAssistant.convertStringExpressions(rootFields, field, messageExpressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${messageExpressionString};`); - field.validators[key]["message"] = (error: any, f: FormlyFieldConfigWithInitialModel) => { - return func(f.model, f.options.formState, f, f.formControl, f.initialModel); - }; - } - } - } - - convertFormlyOptionGroupPicker(rootFields, field); - convertFormlyReorderArray(rootFields, field); - - let childHasAlias = false; - [field.fieldGroup, field.templateOptions?.fields ?? field.props?.fields].forEach(fieldGroup => { - if (!fieldGroup) { - return; - } - for (let f of fieldGroup) { - if (eachFieldRecursive(rootFields, f)) { - childHasAlias = true; - } - } - }); - if (field.key == 'ALIAS') { - return true; - } - return childHasAlias; - } - - /** - * Converts expression strings of a 'formly-option-group-picker' to functions. - * - * e. g. - * { - * group: 'exampleGroup', - * options: [ - * { - * value: 'io0/Relay1', - * expressions: { - * disabledString: "model.OUPUT_CHANNLE_1 !== 'io0/Relay1'" - * } - * } - * ] - * } - * gets converted to: - * { - * group: 'exampleGroup', - * options: [ - * { - * value: 'io0/Relay1', - * expressions: { - * disabled: (field: FormlyFieldConfigWithInitialModel) => f.model.OUPUT_CHANNLE_1 !== 'io0/Relay1' - * } - * } - * ] - * } - * - * @param rootFields the root fields - * @param field the current field - */ - function convertFormlyOptionGroupPicker(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { - if (field.type !== 'formly-option-group-picker') { - return; - } - (field.templateOptions ?? field.props).options?.forEach((optionGroup) => { - if (!optionGroup) { - return; - } - (optionGroup['options'] as any[]).forEach((option) => { - for (const [key, value] of Object.entries(option?.expressions ?? {})) { - if (!key.endsWith("String")) { - continue; - } - - const expressionString: string = value as string; - if (expressionString) { - const convertedExpression = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${convertedExpression};`); - option['expressions'][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { - return func(f.model, f.options.formState, f, f.formControl, f.initialModel); - }; - } - } - }); - }); - } - - function convertFormlyReorderArray(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { - if (field.type !== 'reorder-array') { - return; - } - (field.templateOptions ?? field.props).selectOptions?.forEach((selectOption) => { - if (!selectOption) { - return; - } - - for (const [key, value] of Object.entries(selectOption?.expressions ?? {})) { - if (!key.endsWith("String")) { - continue; - } - - const expressionString: string = value as string; - if (expressionString) { - const convertedExpression = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${convertedExpression};`); - selectOption['expressions'][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { - return func(f.model, f.options.formState, f, f.formControl, f.initialModel); - }; - } - } - }); - } - export function convertStringExpressions(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig, expression: string): string { return ['model.', 'initialModel.', 'control.value.'].reduce((p, c) => convertStringExpression(rootFields, field, p, c), expression); } @@ -270,7 +127,7 @@ export namespace GetAppAssistant { } const smallestIndex = [' ', ')'].reduce((previous, current) => { - let index = part.indexOf(current); + const index = part.indexOf(current); if (index === -1) { return previous; } @@ -341,4 +198,148 @@ export namespace GetAppAssistant { } +/** + * Iterates over the given field an all child fields. + * + * @param field the current field to iterate thrue + * @returns true if any field has 'ALIAS' as their key + */ +function eachFieldRecursive(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { + // 'defaultValue' false for checkboxes + if (field.type === 'checkbox' && !('defaultValue' in field)) { + field['defaultValue'] = false; + } + // this is needed to still show the input as the default style defined by us + if (field.wrappers?.includes('formly-wrapper-default-of-cases') + || field.wrappers?.includes('formly-safe-input-wrapper') + || field.wrappers?.includes('input-with-unit')) { + field.wrappers?.push('form-field'); + } + + if (field.validators) { + for (const [key, value] of Object.entries(field.validators)) { + let expressionString: string = value["expressionString"]; + if (expressionString) { + expressionString = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); + const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${expressionString};`); + field.validators[key]["expression"] = (control: AbstractControl, f: FormlyFieldConfigWithInitialModel) => { + return func(f.model, f.options.formState, f, control, f.initialModel); + }; + } + let messageExpressionString: string = value['messageString']; + if (messageExpressionString) { + messageExpressionString = GetAppAssistant.convertStringExpressions(rootFields, field, messageExpressionString); + const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${messageExpressionString};`); + field.validators[key]["message"] = (error: any, f: FormlyFieldConfigWithInitialModel) => { + return func(f.model, f.options.formState, f, f.formControl, f.initialModel); + }; + } + } + } + + convertFormlyOptionGroupPicker(rootFields, field); + convertFormlyReorderArray(rootFields, field); + + let childHasAlias = false; + [field.fieldGroup, field.templateOptions?.fields ?? field.props?.fields].forEach(fieldGroup => { + if (!fieldGroup) { + return; + } + for (const f of fieldGroup) { + if (eachFieldRecursive(rootFields, f)) { + childHasAlias = true; + } + } + }); + if (field.key == 'ALIAS') { + return true; + } + return childHasAlias; +} + +/** + * Converts expression strings of a 'formly-option-group-picker' to functions. + * + * e. g. + * { + * group: 'exampleGroup', + * options: [ + * { + * value: 'io0/Relay1', + * expressions: { + * disabledString: "model.OUPUT_CHANNLE_1 !== 'io0/Relay1'" + * } + * } + * ] + * } + * gets converted to: + * { + * group: 'exampleGroup', + * options: [ + * { + * value: 'io0/Relay1', + * expressions: { + * disabled: (field: FormlyFieldConfigWithInitialModel) => f.model.OUPUT_CHANNLE_1 !== 'io0/Relay1' + * } + * } + * ] + * } + * + * @param rootFields the root fields + * @param field the current field + */ +function convertFormlyOptionGroupPicker(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { + if (field.type !== 'formly-option-group-picker') { + return; + } + (field.templateOptions ?? field.props).options?.forEach((optionGroup) => { + if (!optionGroup) { + return; + } + (optionGroup['options'] as any[]).forEach((option) => { + for (const [key, value] of Object.entries(option?.expressions ?? {})) { + if (!key.endsWith("String")) { + continue; + } + + const expressionString: string = value as string; + if (expressionString) { + const convertedExpression = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); + const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${convertedExpression};`); + option['expressions'][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { + return func(f.model, f.options.formState, f, f.formControl, f.initialModel); + }; + } + } + }); + }); +} + +function convertFormlyReorderArray(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { + if (field.type !== 'reorder-array') { + return; + } + (field.templateOptions ?? field.props).selectOptions?.forEach((selectOption) => { + if (!selectOption) { + return; + } + + for (const [key, value] of Object.entries(selectOption?.expressions ?? {})) { + if (!key.endsWith("String")) { + continue; + } + + const expressionString: string = value as string; + if (expressionString) { + const convertedExpression = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); + const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${convertedExpression};`); + selectOption['expressions'][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { + return func(f.model, f.options.formState, f, f.formControl, f.initialModel); + }; + } + } + }); +} + + type FormlyFieldConfigWithInitialModel = FormlyFieldConfig & { initialModel: {} } diff --git a/ui/src/app/edge/settings/app/jsonrpc/updateAppInstance.ts b/ui/src/app/edge/settings/app/jsonrpc/updateAppInstance.ts index d57970e4787..fad2d31ab79 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/updateAppInstance.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/updateAppInstance.ts @@ -55,7 +55,7 @@ export namespace UpdateAppInstance { public override readonly id: string, public override readonly result: { instance: GetAppInstances.AppInstance, - warnings: String[] + warnings: string[] }, ) { super(id, result); diff --git a/ui/src/app/edge/settings/app/keypopup/modal.component.ts b/ui/src/app/edge/settings/app/keypopup/modal.component.ts index 47e78e3786d..e79bed2646d 100644 --- a/ui/src/app/edge/settings/app/keypopup/modal.component.ts +++ b/ui/src/app/edge/settings/app/keypopup/modal.component.ts @@ -279,10 +279,10 @@ export class KeyModalComponent implements OnInit { } // remove last dash - let hasDashAsLastChar = trimmed.substring(trimmed.length - 1, trimmed.length) == "-"; + const hasDashAsLastChar = trimmed.substring(trimmed.length - 1, trimmed.length) == "-"; trimmed = trimmed.replace(/-/g, ''); - let numbers = []; + const numbers = []; // push single parts into array numbers.push(trimmed.substring(0, 4)); @@ -469,7 +469,7 @@ export class KeyModalComponent implements OnInit { return true; } return this.lastValidKey !== null && this.getRawAppKey() === this.lastValidKey.result.additionalInfo.keyId; - }; + } } diff --git a/ui/src/app/edge/settings/app/single.component.ts b/ui/src/app/edge/settings/app/single.component.ts index f9204f32ab1..0f6ffb92983 100644 --- a/ui/src/app/edge/settings/app/single.component.ts +++ b/ui/src/app/edge/settings/app/single.component.ts @@ -72,7 +72,7 @@ export class SingleAppComponent implements OnInit, OnDestroy { this.appId = this.route.snapshot.params['appId']; this.appName = this.route.snapshot.queryParams['name']; - let appId = this.appId; + const appId = this.appId; this.service.setCurrentComponent(this.appName, this.route).then(edge => { this.edge = edge; @@ -95,8 +95,8 @@ export class SingleAppComponent implements OnInit, OnDestroy { filter(config => config !== null), takeUntil(this.stopOnDestroy), ).subscribe(next => { - let appManager = next.getComponent("_appManager"); - let newKeyForFreeApps = appManager.properties["keyForFreeApps"]; + const appManager = next.getComponent("_appManager"); + const newKeyForFreeApps = appManager.properties["keyForFreeApps"]; if (!newKeyForFreeApps) { // no key in config this.increaseReceivedResponse(); @@ -151,7 +151,7 @@ export class SingleAppComponent implements OnInit, OnDestroy { componentId: '_appManager', payload: new GetApp.Request({ appId: appId }), })).then(response => { - let app = (response as GetApp.Response).result.app; + const app = (response as GetApp.Response).result.app; app.imageUrl = environment.links.APP_CENTER.APP_IMAGE(this.translate.currentLang, app.appId); this.setApp(app); }).catch(reason => { @@ -165,7 +165,7 @@ export class SingleAppComponent implements OnInit, OnDestroy { componentId: '_appManager', payload: new GetAppDescriptor.Request({ appId: appId }), })).then(response => { - let descriptor = (response as GetAppDescriptor.Response).result; + const descriptor = (response as GetAppDescriptor.Response).result; this.descriptor = GetAppDescriptor.postprocess(descriptor, this.sanitizer); }) .catch(InstallAppComponent.errorToast(this.service, error => 'Error while receiving AppDescriptor for App[' + appId + ']: ' + error)) @@ -190,7 +190,7 @@ export class SingleAppComponent implements OnInit, OnDestroy { } protected iFrameStyle() { - let styles = { + const styles = { 'height': (this.isXL) ? '100%' : window.innerHeight + 'px', }; return styles; diff --git a/ui/src/app/edge/settings/app/update.component.ts b/ui/src/app/edge/settings/app/update.component.ts index 5893b29706c..82c1817b320 100644 --- a/ui/src/app/edge/settings/app/update.component.ts +++ b/ui/src/app/edge/settings/app/update.component.ts @@ -47,8 +47,8 @@ export class UpdateAppComponent implements OnInit { public ngOnInit() { this.service.startSpinner(this.spinnerId); - let appId = this.route.snapshot.params["appId"]; - let appName = this.route.snapshot.queryParams['name']; + const appId = this.route.snapshot.params["appId"]; + const appName = this.route.snapshot.queryParams['name']; this.service.setCurrentComponent(appName, this.route).then(edge => { this.edge = edge; edge.sendRequest(this.websocket, @@ -56,17 +56,17 @@ export class UpdateAppComponent implements OnInit { componentId: '_appManager', payload: new GetAppInstances.Request({ appId: appId }), })).then(getInstancesResponse => { - let recInstances = (getInstancesResponse as GetAppInstances.Response).result.instances; + const recInstances = (getInstancesResponse as GetAppInstances.Response).result.instances; edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ componentId: '_appManager', payload: new GetAppAssistant.Request({ appId: appId }), })).then(getAppAssistantResponse => { - let appAssistant = (getAppAssistantResponse as GetAppAssistant.Response).result; + const appAssistant = (getAppAssistantResponse as GetAppAssistant.Response).result; this.appName = appAssistant.name; this.instances = []; - for (let instance of recInstances) { + for (const instance of recInstances) { const form = new FormGroup({}); const model = { 'ALIAS': instance.alias, @@ -92,9 +92,9 @@ export class UpdateAppComponent implements OnInit { this.service.startSpinnerTransparentBackground(instance.instanceId); instance.isUpdating = true; // remove alias field from properties - let alias = instance.form.value['ALIAS']; + const alias = instance.form.value['ALIAS']; const clonedFields = {}; - for (let item in instance.form.value) { + for (const item in instance.form.value) { if (item != 'ALIAS') { clonedFields[item] = instance.form.value[item]; } diff --git a/ui/src/app/edge/settings/channels/channels.component.ts b/ui/src/app/edge/settings/channels/channels.component.ts index a0c297d6691..436173cd76a 100644 --- a/ui/src/app/edge/settings/channels/channels.component.ts +++ b/ui/src/app/edge/settings/channels/channels.component.ts @@ -26,7 +26,7 @@ export class ChannelsComponent { protected channelsToBeSubscribed: ChannelAddress[] = []; private channels: ChannelAddress[] = []; protected componentChannels: ComponentChannels[] = []; - protected componentChannelConfig: Map = new Map(); + protected componentChannelConfig: Map = new Map(); constructor( private service: Service, @@ -58,7 +58,7 @@ export class ChannelsComponent { * @param channelId the channelId */ protected subscribeChannel(componentId: string, channelId: string): void { - let address = new ChannelAddress(componentId, channelId); + const address = new ChannelAddress(componentId, channelId); if (this.componentChannels[componentId]?.filter(element => element.channelId == address.channelId)?.length === 0) { this.componentChannels[componentId].push(address); } else { @@ -70,7 +70,7 @@ export class ChannelsComponent { if (this.config) { const globalPersistencePriority = this.config.getComponentsByFactory("Controller.Api.Backend")?.[0]?.properties['persistencePriority'] ?? PersistencePriority.DEFAULT_GLOBAL_PRIORITY; - let channelConfig = this.config.getChannel(address); + const channelConfig = this.config.getChannel(address); if (channelConfig) { if (channelConfig.accessMode == "WO") { // do not subscribe Write-Only Channels @@ -130,7 +130,7 @@ export class ChannelsComponent { * and navigates to the new route */ private saveChannels(): void { - let data = Object.entries(this.channelsToBeSubscribed).map(([componentId, channels]) => { + const data = Object.entries(this.channelsToBeSubscribed).map(([componentId, channels]) => { return channels.toString(); }).toString(); this.router.navigate(['device/' + (this.edge.id) + '/settings/channels/'], { queryParams: { save: data } }); @@ -140,20 +140,20 @@ export class ChannelsComponent { * Saves channels for the current edge in localstorage */ protected localSave() { - let dataStr = JSON.stringify(this.channelsToBeSubscribed); + const dataStr = JSON.stringify(this.channelsToBeSubscribed); localStorage.setItem(ChannelsComponent.URL_PREFIX + "-" + this.edge.id, dataStr); this.service.toast("Successfully saved subscribed channels", "success"); } protected loadSavedChannels() { this.service.startSpinner(ChannelsComponent.SELECTOR); - let address = this.route.snapshot.queryParamMap.get('save'); - let storedValue = localStorage.getItem(ChannelsComponent.URL_PREFIX + "-" + this.edge.id); + const address = this.route.snapshot.queryParamMap.get('save'); + const storedValue = localStorage.getItem(ChannelsComponent.URL_PREFIX + "-" + this.edge.id); if (address) { this.channels = address.split(',')?.map(element => ChannelAddress.fromString(element)); this.channels.map(el => this.subscribeChannel(el.componentId, el.channelId)); } else if (storedValue) { - let savedData = JSON.parse(storedValue); + const savedData = JSON.parse(storedValue); savedData.map(el => this.subscribeChannel(el.componentId, el.channelId)); this.service.toast("Successfully loaded saved channels", "success"); } diff --git a/ui/src/app/edge/settings/component/install/index.component.ts b/ui/src/app/edge/settings/component/install/index.component.ts index 0cb8df51673..e15b516c35a 100644 --- a/ui/src/app/edge/settings/component/install/index.component.ts +++ b/ui/src/app/edge/settings/component/install/index.component.ts @@ -32,7 +32,7 @@ export class IndexComponent implements OnInit { this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.addComponents' }, this.route); this.service.getConfig().then(config => { this.list = config.listAvailableFactories(); - for (let entry of this.list) { + for (const entry of this.list) { entry.isClicked = false; entry.filteredFactories = entry.factories; } @@ -42,9 +42,9 @@ export class IndexComponent implements OnInit { updateFilter(completeFilter: string) { // take each space-separated string as an individual and-combined filter - let filters = completeFilter.toLowerCase().split(' '); + const filters = completeFilter.toLowerCase().split(' '); let countFilteredEntries = 0; - for (let entry of this.list) { + for (const entry of this.list) { entry.filteredFactories = entry.factories.filter(entry => // Search for filter strings in Factory-ID, -Name and Description Utils.matchAll(filters, [ diff --git a/ui/src/app/edge/settings/component/install/install.component.ts b/ui/src/app/edge/settings/component/install/install.component.ts index a22917a3c77..40ede1a058a 100644 --- a/ui/src/app/edge/settings/component/install/install.component.ts +++ b/ui/src/app/edge/settings/component/install/install.component.ts @@ -34,20 +34,20 @@ export class ComponentInstallComponent implements OnInit { this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.addComponents' }, this.route).then(edge => { this.edge = edge; }); - let factoryId = this.route.snapshot.params["factoryId"]; + const factoryId = this.route.snapshot.params["factoryId"]; this.service.getConfig().then(config => { this.factoryId = factoryId; this.factory = config.factories[factoryId]; - let fields: FormlyFieldConfig[] = []; - let model = {}; - for (let property of this.factory.properties) { - let property_id = property.id.replace('.', '_'); + const fields: FormlyFieldConfig[] = []; + const model = {}; + for (const property of this.factory.properties) { + const property_id = property.id.replace('.', '_'); let defaultValue = property.defaultValue; // if the type is an array and there is no defaultValue then set the defaultValue to an empty array if (property.schema["type"] === 'repeat' && defaultValue === null) { defaultValue = []; } - let field: FormlyFieldConfig = { + const field: FormlyFieldConfig = { key: property_id, type: 'input', templateOptions: { @@ -64,16 +64,16 @@ export class ComponentInstallComponent implements OnInit { // Set the next free Component-ID as defaultValue if (property_id == 'id' && property.schema["type"] !== 'repeat') { - let thisMatch = defaultValue.match(/^(.*)(\d+)$/); + const thisMatch = defaultValue.match(/^(.*)(\d+)$/); if (thisMatch) { - let thisPrefix = thisMatch[1]; + const thisPrefix = thisMatch[1]; let highestSuffix = Number.parseInt(thisMatch[2]); - for (let componentId of Object.keys(config.components)) { - let componentMatch = componentId.match(/^(.*)(\d+)$/); + for (const componentId of Object.keys(config.components)) { + const componentMatch = componentId.match(/^(.*)(\d+)$/); if (componentMatch) { - let componentPrefix = componentMatch[1]; + const componentPrefix = componentMatch[1]; if (componentPrefix === thisPrefix) { - let componentSuffix = Number.parseInt(componentMatch[2]); + const componentSuffix = Number.parseInt(componentMatch[2]); highestSuffix = Math.max(highestSuffix, componentSuffix + 1); } } @@ -94,14 +94,14 @@ export class ComponentInstallComponent implements OnInit { this.service.toast("Please fill mandatory fields!", "danger"); return; } - let properties: { name: string, value: any }[] = []; - for (let controlKey in this.form.controls) { - let control = this.form.controls[controlKey]; + const properties: { name: string, value: any }[] = []; + for (const controlKey in this.form.controls) { + const control = this.form.controls[controlKey]; if (control.value === null) { // ignore 'null' values continue; } - let property_id = controlKey.replace('_', '.'); + const property_id = controlKey.replace('_', '.'); properties.push({ name: property_id, value: control.value }); } diff --git a/ui/src/app/edge/settings/component/update/index.component.ts b/ui/src/app/edge/settings/component/update/index.component.ts index a0793dd77a4..c8eb4efa668 100644 --- a/ui/src/app/edge/settings/component/update/index.component.ts +++ b/ui/src/app/edge/settings/component/update/index.component.ts @@ -4,7 +4,7 @@ import { CategorizedComponents } from 'src/app/shared/edge/edgeconfig'; import { EdgeConfig, Service, Utils } from '../../../../shared/shared'; interface MyCategorizedComponents extends CategorizedComponents { - isNatureClicked?: Boolean, + isNatureClicked?: boolean, filteredComponents?: EdgeConfig.Component[] } @@ -31,9 +31,9 @@ export class IndexComponent implements OnInit { this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.adjustComponents' }, this.route); this.service.getConfig().then(config => { this.config = config; - let categorizedComponentIds: string[] = []; + const categorizedComponentIds: string[] = []; this.list = config.listActiveComponents(categorizedComponentIds); - for (let entry of this.list) { + for (const entry of this.list) { entry.isNatureClicked = false; entry.filteredComponents = entry.components; } @@ -43,9 +43,9 @@ export class IndexComponent implements OnInit { updateFilter(completeFilter: string) { // take each space-separated string as an individual and-combined filter - let filters = completeFilter.toLowerCase().split(' '); + const filters = completeFilter.toLowerCase().split(' '); let countFilteredEntries = 0; - for (let entry of this.list) { + for (const entry of this.list) { entry.filteredComponents = entry.components.filter(entry => // Search for filter strings in Component-ID, -Alias and Factory-ID Utils.matchAll(filters, [ diff --git a/ui/src/app/edge/settings/component/update/update.component.ts b/ui/src/app/edge/settings/component/update/update.component.ts index d710984743f..4e7cb09fc02 100644 --- a/ui/src/app/edge/settings/component/update/update.component.ts +++ b/ui/src/app/edge/settings/component/update/update.component.ts @@ -35,20 +35,20 @@ export class ComponentUpdateComponent implements OnInit { this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.adjustComponents' }, this.route).then(edge => { this.edge = edge; }); - let componentId = this.route.snapshot.params["componentId"]; + const componentId = this.route.snapshot.params["componentId"]; this.service.getConfig().then(config => { this.componentId = componentId; - let component = config.components[componentId]; + const component = config.components[componentId]; this.factory = config.factories[component.factoryId]; this.componentIcon = config.getFactoryIcon(this.factory); - let fields: FormlyFieldConfig[] = []; - let model = {}; - for (let property of this.factory.properties) { + const fields: FormlyFieldConfig[] = []; + const model = {}; + for (const property of this.factory.properties) { if (property.id === 'id') { continue; // ignore Component-ID } - let property_id = property.id.replace('.', '_'); - let field: FormlyFieldConfig = { + const property_id = property.id.replace('.', '_'); + const field: FormlyFieldConfig = { key: property_id, type: 'input', templateOptions: { @@ -79,11 +79,11 @@ export class ComponentUpdateComponent implements OnInit { } public submit() { - let properties: { name: string, value: any }[] = []; - for (let controlKey in this.form.controls) { - let control = this.form.controls[controlKey]; + const properties: { name: string, value: any }[] = []; + for (const controlKey in this.form.controls) { + const control = this.form.controls[controlKey]; if (control.dirty) { - let property_id = controlKey.replace('_', '.'); + const property_id = controlKey.replace('_', '.'); properties.push({ name: property_id, value: control.value }); } } diff --git a/ui/src/app/edge/settings/network/network.component.ts b/ui/src/app/edge/settings/network/network.component.ts index d5ec98c0961..3be20a409e9 100644 --- a/ui/src/app/edge/settings/network/network.component.ts +++ b/ui/src/app/edge/settings/network/network.component.ts @@ -46,7 +46,7 @@ export class NetworkComponent implements OnInit { new ComponentJsonApiRequest({ componentId: '_host', payload: new GetNetworkConfigRequest() })).then(response => { const result = (response as GetNetworkConfigResponse).result; - for (let name of Object.keys(result.interfaces)) { + for (const name of Object.keys(result.interfaces)) { const iface = result.interfaces[name]; if (this.edge.roleIsAtLeast(Role.ADMIN)) { @@ -77,13 +77,12 @@ export class NetworkComponent implements OnInit { // Converts ["192.168.1.50/24"] -> {label: " ''/'static' ", ip: "192.168.1.50", subnetmask: "255.255.255.0" } // Any ip address entered in the array("Statische IP-Adressen hinzufügen") will be labeled with emty string. for (const addr of iface.model.addressesList) { - if (this.ipRegex.test(addr)) { - var ip = addr.split('/'); - var subnetmask = this.getSubnetmaskAsString(ip[1]); - } else { + if (!this.ipRegex.test(addr)) { this.service.toast(this.translate.instant('Edge.Network.validAddressWarning'), 'danger'); return; } + const ip = addr.split('/'); + const subnetmask = this.getSubnetmaskAsString(ip[1]); addressJson.push({ label: '', //TODO with specific labels with specific systems. @@ -110,7 +109,7 @@ export class NetworkComponent implements OnInit { // updates the addresses array with latest values. iface.model.addresses = addressJson; - let request = { + const request = { interfaces: {}, }; request.interfaces[iface.name] = iface.model; @@ -153,9 +152,9 @@ export class NetworkComponent implements OnInit { * @returns the subnetmask as a string */ protected getSubnetmaskAsString(subnetmask: number): string { - var result = []; - for (var i = 0; i < 4; i++) { - var n = Math.min(subnetmask, 8); + const result = []; + for (let i = 0; i < 4; i++) { + const n = Math.min(subnetmask, 8); result.push(256 - Math.pow(2, 8 - n)); subnetmask -= n; } @@ -169,7 +168,7 @@ export class NetworkComponent implements OnInit { * @param source contains values for individual network. */ private generateInterface(name: string, source: any): void { - let addressArray: string[] = []; + const addressArray: string[] = []; // extracts the addresses json values to form values. if (source.addresses) { @@ -200,7 +199,7 @@ export class NetworkComponent implements OnInit { * * @returns FormlyFieldConfig[]. */ - private fillFields(addressArray: String[]): FormlyFieldConfig[] { + private fillFields(addressArray: string[]): FormlyFieldConfig[] { const fields: FormlyFieldConfig[] = [ { key: 'dhcp', diff --git a/ui/src/app/edge/settings/profile/aliasupdate.component.ts b/ui/src/app/edge/settings/profile/aliasupdate.component.ts index 7d36354c0c5..d916b716704 100644 --- a/ui/src/app/edge/settings/profile/aliasupdate.component.ts +++ b/ui/src/app/edge/settings/profile/aliasupdate.component.ts @@ -30,7 +30,7 @@ export class AliasUpdateComponent implements OnInit { this.edge = edge; }); this.service.getConfig().then(config => { - let componentId = this.route.snapshot.params["componentId"]; + const componentId = this.route.snapshot.params["componentId"]; this.component = config.components[componentId]; this.factory = config.factories[this.component.factoryId]; this.componentIcon = config.getFactoryIcon(this.factory); @@ -41,7 +41,7 @@ export class AliasUpdateComponent implements OnInit { } updateAlias(alias) { - let newAlias = alias; + const newAlias = alias; if (this.edge != null) { if (this.component.id == newAlias) { this.service.toast(this.translate.instant('General.inputNotValid'), 'danger'); diff --git a/ui/src/app/edge/settings/profile/profile.component.ts b/ui/src/app/edge/settings/profile/profile.component.ts index c2870efa671..baba0377806 100644 --- a/ui/src/app/edge/settings/profile/profile.component.ts +++ b/ui/src/app/edge/settings/profile/profile.component.ts @@ -39,7 +39,7 @@ export class ProfileComponent implements OnInit { this.edge = edge; this.service.getConfig().then(config => { this.config = config; - let categorizedComponentIds: string[] = ["_appManager", "_componentManager", "_cycle", "_meta", "_power", "_sum", "_predictorManager", "_host", "_evcsSlowPowerIncreaseFilter"]; + const categorizedComponentIds: string[] = ["_appManager", "_componentManager", "_cycle", "_meta", "_power", "_sum", "_predictorManager", "_host", "_evcsSlowPowerIncreaseFilter"]; this.components = config.listActiveComponents(categorizedComponentIds); }); }); @@ -47,7 +47,7 @@ export class ProfileComponent implements OnInit { public getModbusProtocol(componentId: string) { this.service.getCurrentEdge().then(edge => { - let request = new ComponentJsonApiRequest({ componentId: componentId, payload: new GetModbusProtocolExportXlsxRequest() }); + const request = new ComponentJsonApiRequest({ componentId: componentId, payload: new GetModbusProtocolExportXlsxRequest() }); edge.sendRequest(this.service.websocket, request).then(response => { Utils.downloadXlsx(response as Base64PayloadResponse, "Modbus-TCP-" + edge.id); }).catch(reason => { @@ -58,13 +58,13 @@ export class ProfileComponent implements OnInit { public getChannelExport(componentId: string) { this.service.getCurrentEdge().then(edge => { - let request = new ComponentJsonApiRequest({ componentId: '_componentManager', payload: new ChannelExportXlsxRequest({ componentId: componentId }) }); + const request = new ComponentJsonApiRequest({ componentId: '_componentManager', payload: new ChannelExportXlsxRequest({ componentId: componentId }) }); edge.sendRequest(this.service.websocket, request).then(response => { Utils.downloadXlsx(response as Base64PayloadResponse, "ChannelExport-" + edge.id + "-" + componentId); }).catch(reason => { console.warn(reason); }); }); - }; + } } diff --git a/ui/src/app/edge/settings/system/executeSystemUpdate.ts b/ui/src/app/edge/settings/system/executeSystemUpdate.ts index 25b679e5ebc..b237ec5149b 100644 --- a/ui/src/app/edge/settings/system/executeSystemUpdate.ts +++ b/ui/src/app/edge/settings/system/executeSystemUpdate.ts @@ -53,7 +53,7 @@ export class ExecuteSystemUpdate { // if the version is a SNAPSHOT always set the udpate state // to updated with the current SNAPSHOT version if (this.edge.isSnapshot() && !this.edge.roleIsAtLeast(Role.ADMIN)) { - let updateState = { updated: { version: this.edge.version } }; + const updateState = { updated: { version: this.edge.version } }; this.setSystemUpdateState(updateState); this.stopRefreshSystemUpdateState(); resolve(updateState); @@ -63,7 +63,7 @@ export class ExecuteSystemUpdate { componentId: "_host", payload: new GetSystemUpdateStateRequest(), })).then(response => { - let result = (response as GetSystemUpdateStateResponse).result; + const result = (response as GetSystemUpdateStateResponse).result; this.setSystemUpdateState(result); // Stop regular check if there is no Update available @@ -96,7 +96,7 @@ export class ExecuteSystemUpdate { payload: new ExecuteSystemUpdateRequest({ isDebug: environment.debugMode }), })).then(response => { // Finished System Update (without restart of OpenEMS Edge) - let systemUpdateState = (response as GetSystemUpdateStateResponse).result; + const systemUpdateState = (response as GetSystemUpdateStateResponse).result; this.setSystemUpdateState(systemUpdateState); }).catch(reason => { reject(reason); @@ -135,7 +135,7 @@ export class ExecuteSystemUpdate { if (!error["error"]) { return; } - let errorMessage = error["error"]["message"] as string; + const errorMessage = error["error"]["message"] as string; if (!errorMessage) { return; } diff --git a/ui/src/app/edge/settings/system/maintenance/maintenance.ts b/ui/src/app/edge/settings/system/maintenance/maintenance.ts index 08ab7952400..9f74a0846b0 100644 --- a/ui/src/app/edge/settings/system/maintenance/maintenance.ts +++ b/ui/src/app/edge/settings/system/maintenance/maintenance.ts @@ -172,7 +172,7 @@ export class MaintenanceComponent implements OnInit { async presentAlert(type: Type) { const translate = this.translate; const system = type === Type.HARD ? environment.edgeShortName : 'OpenEMS'; - let alert = this.alertCtrl.create({ + const alert = this.alertCtrl.create({ subHeader: translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_CONFIRMATION', { system: system }), message: translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: system }), buttons: [{ diff --git a/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts b/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts index decf7d206b0..abbf8083096 100644 --- a/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts +++ b/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts @@ -87,8 +87,8 @@ export class SystemExecuteComponent implements OnInit { if (!this.form.valid) { command = ""; } else { - let m = this.model; - let cmd = COMMANDS[m.predefined]; + const m = this.model; + const cmd = COMMANDS[m.predefined]; switch (m.predefined) { case "ping": command = cmd(m.ping.ip); @@ -102,17 +102,17 @@ export class SystemExecuteComponent implements OnInit { } public submit() { - let username = this.form.controls['username']; - let password = this.form.controls['password']; - let timeoutSeconds = this.form.controls['timeoutSeconds']; - let runInBackground = this.form.controls['runInBackground']; - let command = this.form.controls['command']; + const username = this.form.controls['username']; + const password = this.form.controls['password']; + const timeoutSeconds = this.form.controls['timeoutSeconds']; + const runInBackground = this.form.controls['runInBackground']; + const command = this.form.controls['command']; this.service.getCurrentEdge().then(edge => { this.loading = true; this.stdout = []; this.stderr = []; - let executeSystemCommandRequest = new ExecuteSystemCommandRequest({ + const executeSystemCommandRequest = new ExecuteSystemCommandRequest({ username: username.value, password: password.value, timeoutSeconds: timeoutSeconds.value, @@ -125,7 +125,7 @@ export class SystemExecuteComponent implements OnInit { componentId: "_host", payload: executeSystemCommandRequest, })).then(response => { - let result = (response as ExecuteSystemCommandResponse).result; + const result = (response as ExecuteSystemCommandResponse).result; this.loading = false; if (result.stdout.length == 0) { this.stdout = [""]; diff --git a/ui/src/app/edge/settings/systemlog/systemlog.component.ts b/ui/src/app/edge/settings/systemlog/systemlog.component.ts index afb388aa901..1eac0d407fc 100644 --- a/ui/src/app/edge/settings/systemlog/systemlog.component.ts +++ b/ui/src/app/edge/settings/systemlog/systemlog.component.ts @@ -92,7 +92,7 @@ export class SystemLogComponent implements OnInit, OnDestroy { }); }); this.isSubscribed = true; - }; + } private getColor(level): string { switch (level) { @@ -104,7 +104,7 @@ export class SystemLogComponent implements OnInit, OnDestroy { return 'gray'; case 'ERROR': return 'red'; - }; + } return 'black'; } @@ -115,5 +115,5 @@ export class SystemLogComponent implements OnInit, OnDestroy { this.ngUnsubscribe.next(); this.ngUnsubscribe.complete(); this.ngUnsubscribe = new Subject(); - }; + } } diff --git a/ui/src/app/index/filter/filter.component.ts b/ui/src/app/index/filter/filter.component.ts index aaf4c3f32d9..9015a779216 100644 --- a/ui/src/app/index/filter/filter.component.ts +++ b/ui/src/app/index/filter/filter.component.ts @@ -25,7 +25,7 @@ export class FilterComponent { */ public searchOnChange(event, filter: Filter): void { - let value = event.target.value; + const value = event.target.value; // If no value provided if (!value) { diff --git a/ui/src/app/index/login.component.ts b/ui/src/app/index/login.component.ts index 8ac3373a0e5..b6f489c6562 100644 --- a/ui/src/app/index/login.component.ts +++ b/ui/src/app/index/login.component.ts @@ -54,7 +54,7 @@ export class LoginComponent implements OnInit, AfterContentChecked, OnDestroy { // Wait for Websocket if (this.websocket.status == 'waiting for credentials') { this.service.startSpinner('loginspinner'); - let lang = this.route.snapshot.queryParamMap.get('lang') ?? null; + const lang = this.route.snapshot.queryParamMap.get('lang') ?? null; if (lang) { localStorage.DEMO_LANGUAGE = lang; } diff --git a/ui/src/app/index/overview/overview.component.ts b/ui/src/app/index/overview/overview.component.ts index f61751a9901..5e8139ce097 100644 --- a/ui/src/app/index/overview/overview.component.ts +++ b/ui/src/app/index/overview/overview.component.ts @@ -95,7 +95,7 @@ export class OverViewComponent implements OnInit, OnDestroy { ) .subscribe(metadata => { - let edgeIds = Object.keys(metadata.edges); + const edgeIds = Object.keys(metadata.edges); this.noEdges = edgeIds.length === 0; this.loggedInUserCanInstall = Role.isAtLeast(metadata.user.globalRole, "installer"); @@ -103,7 +103,7 @@ export class OverViewComponent implements OnInit, OnDestroy { // - Direct local access to Edge // - No installer (i.e. guest or owner) and access to only one Edge if (environment.backend == 'OpenEMS Edge' || (!this.loggedInUserCanInstall && edgeIds.length == 1)) { - let edge = metadata.edges[edgeIds[0]]; + const edge = metadata.edges[edgeIds[0]]; setTimeout(() => { this.router.navigate(['/device', edge.id]); }, 100); @@ -145,7 +145,7 @@ export class OverViewComponent implements OnInit, OnDestroy { return; } - let searchParamsObj = {}; + const searchParamsObj = {}; if (this.searchParams && this.searchParams.size > 0) { for (const [key, value] of this.searchParams) { searchParamsObj[key] = value; diff --git a/ui/src/app/index/shared/sumState.ts b/ui/src/app/index/shared/sumState.ts index c5ecd512fdd..e26f3d72f01 100644 --- a/ui/src/app/index/shared/sumState.ts +++ b/ui/src/app/index/shared/sumState.ts @@ -52,7 +52,7 @@ export class SumStateComponent implements OnInit { constructor(private service: Service) { } ngOnInit() { - let user = this.service.metadata?.value?.user ?? null; + const user = this.service.metadata?.value?.user ?? null; if (user) { this.isAtLeastInstaller = Role.isAtLeast(user.globalRole, Role.INSTALLER); diff --git a/ui/src/app/registration/modal/modal.component.ts b/ui/src/app/registration/modal/modal.component.ts index 26d848cb277..4589f3f6d5a 100644 --- a/ui/src/app/registration/modal/modal.component.ts +++ b/ui/src/app/registration/modal/modal.component.ts @@ -47,23 +47,23 @@ export class RegistrationModalComponent implements OnInit { return; } - let password = this.formGroup.value.password; - let confirmPassword = this.formGroup.value.confirmPassword; + const password = this.formGroup.value.password; + const confirmPassword = this.formGroup.value.confirmPassword; if (password != confirmPassword) { this.service.toast(this.translate.instant("Register.errors.passwordNotEqual"), 'danger'); return; } - let email = this.formGroup.value.email; - let confirmEmail = this.formGroup.value.confirmEmail; + const email = this.formGroup.value.email; + const confirmEmail = this.formGroup.value.confirmEmail; if (email != confirmEmail) { this.service.toast(this.translate.instant("Register.errors.emailNotEqual"), 'danger'); return; } - let request = new RegisterUserRequest({ + const request = new RegisterUserRequest({ user: { firstname: this.formGroup.value.firstname, lastname: this.formGroup.value.lastname, @@ -82,7 +82,7 @@ export class RegistrationModalComponent implements OnInit { oem: environment.theme, }); - let companyName = this.formGroup.value.companyName; + const companyName = this.formGroup.value.companyName; if (companyName) { request.params.user.company = { name: companyName, diff --git a/ui/src/app/shared/chartoptions/chartoptions.component.ts b/ui/src/app/shared/chartoptions/chartoptions.component.ts index 4570bc09e54..713a05edf1f 100644 --- a/ui/src/app/shared/chartoptions/chartoptions.component.ts +++ b/ui/src/app/shared/chartoptions/chartoptions.component.ts @@ -22,7 +22,7 @@ export class ChartOptionsComponent { ) { } async presentPopover(ev: any) { - let componentProps = {}; + const componentProps = {}; if (this.showPhases !== null) { componentProps['showPhases'] = this.showPhases; } diff --git a/ui/src/app/shared/edge/currentdata.ts b/ui/src/app/shared/edge/currentdata.ts index 1a193a12282..fb71949ab7b 100644 --- a/ui/src/app/shared/edge/currentdata.ts +++ b/ui/src/app/shared/edge/currentdata.ts @@ -15,7 +15,7 @@ export class CurrentData { } private getSummary(c: { [channelAddress: string]: any }): DefaultTypes.Summary { - let result: DefaultTypes.Summary = { + const result: DefaultTypes.Summary = { system: { totalPower: null, autarchy: null, diff --git a/ui/src/app/shared/edge/edge.ts b/ui/src/app/shared/edge/edge.ts index ac05c50c7cd..3d4640e5419 100644 --- a/ui/src/app/shared/edge/edge.ts +++ b/ui/src/app/shared/edge/edge.ts @@ -86,9 +86,9 @@ export class Edge { this.isRefreshConfigBlocked = false; }, 1000); - let request = new GetEdgeConfigRequest(); + const request = new GetEdgeConfigRequest(); this.sendRequest(websocket, request).then(response => { - let edgeConfigResponse = response as GetEdgeConfigResponse; + const edgeConfigResponse = response as GetEdgeConfigResponse; this.config.next(new EdgeConfig(this, edgeConfigResponse.result)); }).catch(reason => { console.warn("Unable to refresh config", reason); @@ -198,11 +198,11 @@ export class Edge { this.subscribeChannelsTimeout = null; // merge channels from currentDataSubscribes - let channels: ChannelAddress[] = []; - for (let componentId in this.subscribedChannels) { - channels.push.apply(channels, this.subscribedChannels[componentId]); + const channels: ChannelAddress[] = []; + for (const componentId in this.subscribedChannels) { + channels.push(...this.subscribedChannels[componentId]); } - let request = new SubscribeChannelsRequest(channels); + const request = new SubscribeChannelsRequest(channels); this.sendRequest(websocket, request).then(() => { this.subscribeChannelsSuccessful = true; }).catch(reason => { @@ -243,7 +243,7 @@ export class Edge { * @param properties the properties to be updated. */ public createComponentConfig(ws: Websocket, factoryPid: string, properties: { name: string, value: any }[]): Promise { - let request = new CreateComponentConfigRequest({ factoryPid: factoryPid, properties: properties }); + const request = new CreateComponentConfigRequest({ factoryPid: factoryPid, properties: properties }); return this.sendRequest(ws, request); } @@ -255,7 +255,7 @@ export class Edge { * @param properties the properties to be updated. */ public updateComponentConfig(ws: Websocket, componentId: string, properties: { name: string, value: any }[]): Promise { - let request = new UpdateComponentConfigRequest({ componentId: componentId, properties: properties }); + const request = new UpdateComponentConfigRequest({ componentId: componentId, properties: properties }); return this.sendRequest(ws, request); } @@ -266,7 +266,7 @@ export class Edge { * @param componentId the OpenEMS Edge Component-ID */ public deleteComponentConfig(ws: Websocket, componentId: string): Promise { - let request = new DeleteComponentConfigRequest({ componentId: componentId }); + const request = new DeleteComponentConfigRequest({ componentId: componentId }); return this.sendRequest(ws, request); } @@ -278,7 +278,7 @@ export class Edge { * @param responseCallback the JSON-RPC Response callback */ public sendRequest(ws: Websocket, request: JsonrpcRequest): Promise { - let wrap = new EdgeRpcRequest({ edgeId: this.id, payload: request }); + const wrap = new EdgeRpcRequest({ edgeId: this.id, payload: request }); return new Promise((resolve, reject) => { ws.sendRequest(wrap).then(response => { resolve(response['result']['payload']); diff --git a/ui/src/app/shared/edge/edgeconfig.spec.ts b/ui/src/app/shared/edge/edgeconfig.spec.ts index b918850761d..38233fe962b 100644 --- a/ui/src/app/shared/edge/edgeconfig.spec.ts +++ b/ui/src/app/shared/edge/edgeconfig.spec.ts @@ -16,12 +16,12 @@ export namespace DummyConfig { components: components?.reduce((acc, c) => ({ ...acc, [c.id]: c }), {}), factories: components?.map(c => c.factory), }); - }; + } export function convertDummyEdgeConfigToRealEdgeConfig(edgeConfig: EdgeConfig): EdgeConfig { - let components = Object.values(edgeConfig?.components) ?? null; + const components = Object.values(edgeConfig?.components) ?? null; - let factories = {}; + const factories = {}; components.forEach(obj => { const component = obj as unknown; if (factories[component['factoryId']]) { @@ -206,6 +206,8 @@ export namespace DummyConfig { /** * Factories. */ +// identifier `Factory` is also used in namespace +// eslint-disable-next-line @typescript-eslint/no-unused-vars type Factory = { id: string }; @@ -213,6 +215,8 @@ type Factory = { /** * Components */ +// identifier `Component` is also used in namespace +// eslint-disable-next-line @typescript-eslint/no-unused-vars type Component = { id: string, alias: string, // defaults to id diff --git a/ui/src/app/shared/edge/edgeconfig.ts b/ui/src/app/shared/edge/edgeconfig.ts index 1a8a14a68e9..67084f8d382 100644 --- a/ui/src/app/shared/edge/edgeconfig.ts +++ b/ui/src/app/shared/edge/edgeconfig.ts @@ -8,7 +8,7 @@ export interface CategorizedComponents { icon: string }, components: EdgeConfig.Component[] -}; +} export interface CategorizedFactories { category: { @@ -16,7 +16,7 @@ export interface CategorizedFactories { icon: string }, factories: EdgeConfig.Factory[] -}; +} export class EdgeConfig { @@ -27,8 +27,8 @@ export class EdgeConfig { } // initialize Components - for (let componentId in this.components) { - let component = this.components[componentId]; + for (const componentId in this.components) { + const component = this.components[componentId]; component.id = componentId; if ('enabled' in component.properties) { component.isEnabled = component.properties['enabled']; @@ -38,16 +38,16 @@ export class EdgeConfig { } // initialize Factorys - for (let factoryId in this.factories) { - let factory = this.factories[factoryId]; + for (const factoryId in this.factories) { + const factory = this.factories[factoryId]; factory.id = factoryId; factory.componentIds = []; // Fill 'natures' map - for (let natureId of factory.natureIds) { + for (const natureId of factory.natureIds) { if (!(natureId in this.natures)) { - let parts = natureId.split("."); - let name = parts[parts.length - 1]; + const parts = natureId.split("."); + const name = parts[parts.length - 1]; this.natures[natureId] = { id: natureId, name: name, @@ -61,12 +61,12 @@ export class EdgeConfig { if (Object.keys(this.components).length != 0 && Object.keys(this.factories).length == 0) { console.warn("Factory definitions are missing."); } else { - for (let componentId in this.components) { - let component = this.components[componentId]; + for (const componentId in this.components) { + const component = this.components[componentId]; if (component.factoryId === "") { continue; // Singleton components have no factory-PID } - let factory = this.factories[component.factoryId]; + const factory = this.factories[component.factoryId]; if (!factory) { console.warn("Factory definition [" + component.factoryId + "] for [" + componentId + "] is missing."); continue; @@ -111,7 +111,7 @@ export class EdgeConfig { * @param factoryId the Factory PID. */ public getComponentIdsByFactory(factoryId: string): string[] { - let factory = this.factories[factoryId]; + const factory = this.factories[factoryId]; if (factory) { return factory.componentIds; } else { @@ -125,10 +125,10 @@ export class EdgeConfig { * @param natureId the given Nature. */ public getFactoriesByNature(natureId: string): EdgeConfig.Factory[] { - let result = []; - let nature = this.natures[natureId]; + const result = []; + const nature = this.natures[natureId]; if (nature) { - for (let factoryId of nature.factoryIds) { + for (const factoryId of nature.factoryIds) { if (factoryId in this.factories) { result.push(this.factories[factoryId]); } @@ -143,8 +143,8 @@ export class EdgeConfig { * @param ids the given Factory-IDs. */ public getFactoriesByIds(factoryIds: string[]): EdgeConfig.Factory[] { - let result = []; - for (let factoryId of factoryIds) { + const result = []; + for (const factoryId of factoryIds) { if (factoryId in this.factories) { result.push(this.factories[factoryId]); } @@ -158,9 +158,9 @@ export class EdgeConfig { * @param ids the given Factory-IDs pattern. */ public getFactoriesByIdsPattern(patterns: RegExp[]): EdgeConfig.Factory[] { - let result = []; - for (let pattern of patterns) { - for (let factoryId in this.factories) { + const result = []; + for (const pattern of patterns) { + for (const factoryId in this.factories) { if (pattern.test(factoryId)) { result.push(this.factories[factoryId]); } @@ -175,9 +175,9 @@ export class EdgeConfig { * @param factoryId the Factory PID. */ public getComponentsByFactory(factoryId: string): EdgeConfig.Component[] { - let componentIds = this.getComponentIdsByFactory(factoryId); - let result: EdgeConfig.Component[] = []; - for (let componentId of componentIds) { + const componentIds = this.getComponentIdsByFactory(factoryId); + const result: EdgeConfig.Component[] = []; + for (const componentId of componentIds) { result.push(this.components[componentId]); } return result; @@ -189,11 +189,11 @@ export class EdgeConfig { * @param nature the given Nature. */ public getComponentIdsImplementingNature(natureId: string): string[] { - let result: string[] = []; - let nature = this.natures[natureId]; + const result: string[] = []; + const nature = this.natures[natureId]; if (nature) { - for (let factoryId of nature.factoryIds) { - result.push.apply(result, this.getComponentIdsByFactory(factoryId)); + for (const factoryId of nature.factoryIds) { + result.push(...this.getComponentIdsByFactory(factoryId)); } } @@ -214,11 +214,11 @@ export class EdgeConfig { * @param nature the given Nature. */ public getComponentsImplementingNature(natureId: string): EdgeConfig.Component[] { - let result: EdgeConfig.Component[] = []; - let nature = this.natures[natureId]; + const result: EdgeConfig.Component[] = []; + const nature = this.natures[natureId]; if (nature) { - for (let factoryId of nature.factoryIds) { - result.push.apply(result, this.getComponentsByFactory(factoryId)); + for (const factoryId of nature.factoryIds) { + result.push(...this.getComponentsByFactory(factoryId)); } } @@ -239,7 +239,7 @@ export class EdgeConfig { * @param factoryId the Factory-ID */ public getNatureIdsByFactoryId(factoryId: string): string[] { - let factory = this.factories[factoryId]; + const factory = this.factories[factoryId]; if (factory) { return factory.natureIds; } else { @@ -278,7 +278,7 @@ export class EdgeConfig { return true; } // Do we have a Meter with type PRODUCTION? - for (let component of this.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter")) { + for (const component of this.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter")) { if (component.isEnabled && this.isProducer(component)) { return true; } @@ -365,7 +365,7 @@ export class EdgeConfig { * Lists all available Factories, grouped by category. */ public listAvailableFactories(): CategorizedFactories[] { - let allFactories = [ + const allFactories = [ { category: { title: 'Simulatoren', icon: 'flask-outline' }, factories: Object.values(this.factories).filter(factory => factory.id.startsWith('Simulator.')), @@ -495,10 +495,10 @@ export class EdgeConfig { }, ]; - let ignoreFactoryIds: string[] = []; - let result: CategorizedFactories[] = []; + const ignoreFactoryIds: string[] = []; + const result: CategorizedFactories[] = []; allFactories.forEach(item => { - let factories = + const factories = // create one flat array [].concat(...item.factories) // remove Factories from list that have already been listed before @@ -535,11 +535,11 @@ export class EdgeConfig { * Lists all active Components, grouped by category. */ public listActiveComponents(ignoreComponentIds: string[]): CategorizedComponents[] { - let allComponents = []; - let factories = this.listAvailableFactories(); - for (let entry of factories) { - let components = []; - for (let factory of entry.factories) { + const allComponents = []; + const factories = this.listAvailableFactories(); + for (const entry of factories) { + const components = []; + for (const factory of entry.factories) { components.push(this.getComponentsByFactory(factory.id)); // components.concat(...this.getComponentsByFactory(factory.id)); } @@ -548,9 +548,9 @@ export class EdgeConfig { components: components, }); } - let result: CategorizedComponents[] = []; + const result: CategorizedComponents[] = []; allComponents.forEach(item => { - let components = + const components = // create one flat array [].concat(...item.components) // remove Components from list that have already been listed before @@ -576,11 +576,11 @@ export class EdgeConfig { * @param componentId the Component-ID */ public getNatureIdsByComponentId(componentId: string): string[] { - let component = this.components[componentId]; + const component = this.components[componentId]; if (!component) { return []; } - let factoryId = component.factoryId; + const factoryId = component.factoryId; return this.getNatureIdsByFactoryId(factoryId); } @@ -599,7 +599,7 @@ export class EdgeConfig { * @param componentId the Component-ID */ public getComponentProperties(componentId: string): { [key: string]: any } { - let component = this.components[componentId]; + const component = this.components[componentId]; if (component) { return component.properties; } else { @@ -613,7 +613,7 @@ export class EdgeConfig { * @param address the ChannelAddress */ public getChannel(address: ChannelAddress): EdgeConfig.ComponentChannel { - let component = this.components[address.componentId]; + const component = this.components[address.componentId]; if (component) { return component.channels[address.channelId]; } else { @@ -691,7 +691,7 @@ export module EdgeConfig { * @param propertyId the Property-ID */ static getPropertyForId(factory: Factory, propertyId: string): FactoryProperty { - for (let property of factory.properties) { + for (const property of factory.properties) { if (property.id === propertyId) { return property; } diff --git a/ui/src/app/shared/edge/meter/electricity/modal.component.ts b/ui/src/app/shared/edge/meter/electricity/modal.component.ts index 0d625321fc9..167cb484b17 100644 --- a/ui/src/app/shared/edge/meter/electricity/modal.component.ts +++ b/ui/src/app/shared/edge/meter/electricity/modal.component.ts @@ -21,8 +21,8 @@ export class ElectricityMeterComponent extends AbstractModalLine implements OnIn ]; protected override getChannelAddresses(): ChannelAddress[] { - let channelAddresses: ChannelAddress[] = []; - for (let phase of [1, 2, 3]) { + const channelAddresses: ChannelAddress[] = []; + for (const phase of [1, 2, 3]) { channelAddresses.push( new ChannelAddress(this.component.id, 'CurrentL' + phase), new ChannelAddress(this.component.id, 'VoltageL' + phase), @@ -34,7 +34,7 @@ export class ElectricityMeterComponent extends AbstractModalLine implements OnIn protected override onCurrentData(currentData: CurrentData): void { this.phases.forEach((phase) => { - var power = currentData.allComponents[this.component.id + '/ActivePower' + phase.key]; + const power = currentData.allComponents[this.component.id + '/ActivePower' + phase.key]; phase.name = "Phase " + phase.key; phase.power = Utils.absSafely(power); phase.current = currentData.allComponents[this.component.id + '/Current' + phase.key]; diff --git a/ui/src/app/shared/formly/form-field-default-cases.wrapper.ts b/ui/src/app/shared/formly/form-field-default-cases.wrapper.ts index 4b94304007e..e99cb765b1e 100644 --- a/ui/src/app/shared/formly/form-field-default-cases.wrapper.ts +++ b/ui/src/app/shared/formly/form-field-default-cases.wrapper.ts @@ -42,7 +42,7 @@ export class FormlyWrapperDefaultValueWithCasesComponent extends FieldWrapper im if (this.formControl.value) { return; } - let value = this.model[item.field]; + const value = this.model[item.field]; if (!value) { return; } diff --git a/ui/src/app/shared/genericComponents/abstracthistorywidget.ts b/ui/src/app/shared/genericComponents/abstracthistorywidget.ts index bd52d012d96..fef3a8d65a0 100644 --- a/ui/src/app/shared/genericComponents/abstracthistorywidget.ts +++ b/ui/src/app/shared/genericComponents/abstracthistorywidget.ts @@ -52,16 +52,16 @@ export abstract class AbstractHistoryWidget implements OnInit, OnChanges, OnDest this.updateValues(); }); }); - }; + } public updateValues() { - let channelAddresses = this.getChannelAddresses(); + const channelAddresses = this.getChannelAddresses(); this.onCurrentData({ allComponents: {} }); this.service.queryEnergy(this.period.from, this.period.to, channelAddresses).then(response => { - let result = response.result; - let allComponents = {}; - for (let channelAddress of channelAddresses) { - let ca = channelAddress.toString(); + const result = response.result; + const allComponents = {}; + for (const channelAddress of channelAddresses) { + const ca = channelAddress.toString(); allComponents[ca] = result.data[ca]; } this.onCurrentData({ allComponents: allComponents }); diff --git a/ui/src/app/shared/genericComponents/chart/abstractHistoryChartOverview.ts b/ui/src/app/shared/genericComponents/chart/abstractHistoryChartOverview.ts index 3917cd93be4..420d25601c5 100644 --- a/ui/src/app/shared/genericComponents/chart/abstractHistoryChartOverview.ts +++ b/ui/src/app/shared/genericComponents/chart/abstractHistoryChartOverview.ts @@ -46,15 +46,15 @@ export abstract class AbstractHistoryChartOverview implements OnInit, OnChanges, this.updateValues(); }); }); - }; + } public updateValues() { - let channelAddresses = this.getChannelAddresses(); + const channelAddresses = this.getChannelAddresses(); this.service.queryEnergy(this.period.from, this.period.to, channelAddresses).then(response => { - let result = response.result; - let allComponents = {}; - for (let channelAddress of channelAddresses) { - let ca = channelAddress.toString(); + const result = response.result; + const allComponents = {}; + for (const channelAddress of channelAddresses) { + const ca = channelAddress.toString(); allComponents[ca] = result.data[ca]; } this.onCurrentData({ allComponents: allComponents }); diff --git a/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts b/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts index 3734575550f..811ccaa256b 100644 --- a/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts +++ b/ui/src/app/shared/genericComponents/chart/abstracthistorychart.ts @@ -111,11 +111,11 @@ export abstract class AbstractHistoryChart implements OnInit { return; } - let channelData: { data: { [name: string]: number[] } } = { data: {} }; + const channelData: { data: { [name: string]: number[] } } = { data: {} }; - let result = energyPeriodResponse.result; - let labels: Date[] = []; - for (let timestamp of result.timestamps) { + const result = energyPeriodResponse.result; + const labels: Date[] = []; + for (const timestamp of result.timestamps) { labels.push(new Date(timestamp)); } @@ -146,9 +146,9 @@ export abstract class AbstractHistoryChart implements OnInit { }); // Fill datasets, labels and colors - let datasets: Chart.ChartDataset[] = []; - let displayValues: HistoryUtils.DisplayValues[] = chartObject.output(channelData.data); - let legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean }[] = []; + const datasets: Chart.ChartDataset[] = []; + const displayValues: HistoryUtils.DisplayValues[] = chartObject.output(channelData.data); + const legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean }[] = []; displayValues.forEach((element, index) => { let nameSuffix = null; @@ -157,18 +157,18 @@ export abstract class AbstractHistoryChart implements OnInit { nameSuffix = element.nameSuffix(energyResponse); } - let yAxis = chartObject.yAxes.find(yaxis => yaxis?.yAxisId == (element?.yAxisId ?? chartObject.yAxes[0]?.yAxisId)); + const yAxis = chartObject.yAxes.find(yaxis => yaxis?.yAxisId == (element?.yAxisId ?? chartObject.yAxes[0]?.yAxisId)); // Filter existing values if (element) { - let label = AbstractHistoryChart.getTooltipsLabelName(element.name, yAxis?.unit, nameSuffix); - let data: number[] | null = element.converter(); + const label = AbstractHistoryChart.getTooltipsLabelName(element.name, yAxis?.unit, nameSuffix); + const data: number[] | null = element.converter(); if (data === null || data === undefined) { return; } - let configuration = AbstractHistoryChart.fillData(element, label, chartObject, chartType, data); + const configuration = AbstractHistoryChart.fillData(element, label, chartObject, chartType, data); datasets.push(...configuration.datasets); legendOptions.push(...configuration.legendOptions); } @@ -183,12 +183,12 @@ export abstract class AbstractHistoryChart implements OnInit { public static fillData(element: HistoryUtils.DisplayValues, label: string, chartObject: HistoryUtils.ChartData, chartType: 'line' | 'bar', data: number[] | null): { datasets: Chart.ChartDataset[], legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean }[] } { - let legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean }[] = []; - let datasets: Chart.ChartDataset[] = []; + const legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean }[] = []; + const datasets: Chart.ChartDataset[] = []; // Enable one dataset to be displayed in multiple stacks if (Array.isArray(element.stack)) { - for (let stack of element.stack) { + for (const stack of element.stack) { datasets.push(AbstractHistoryChart.getDataSet(element, label, data, stack, chartObject, element.custom?.type ?? chartType)); legendOptions.push(AbstractHistoryChart.getLegendOptions(label, element)); } @@ -242,8 +242,7 @@ export abstract class AbstractHistoryChart implements OnInit { * @returns a dataset */ public static getDataSet(element: HistoryUtils.DisplayValues, label: string, data: number[], stack: number, chartObject: HistoryUtils.ChartData, chartType: 'line' | 'bar'): Chart.ChartDataset { - let dataset: Chart.ChartDataset; - dataset = { + const dataset: Chart.ChartDataset = { label: label, data: data, hidden: !isLabelVisible(element.name, !(element.hiddenOnInit)), @@ -266,7 +265,7 @@ export abstract class AbstractHistoryChart implements OnInit { protected loadChart() { this.labels = []; this.errorResponse = null; - let unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).resolution.unit; + const unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).resolution.unit; // Show Barchart if resolution is days or months if (ChronoUnit.isAtLeast(unit, ChronoUnit.Type.DAYS)) { @@ -280,7 +279,7 @@ export abstract class AbstractHistoryChart implements OnInit { // TODO after chartjs migration, look for config energyPeriodResponse = DateTimeUtils.normalizeTimestamps(unit, energyPeriodResponse); - let displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, energyPeriodResponse, energyResponse); + const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, energyPeriodResponse, energyResponse); this.datasets = displayValues.datasets; this.legendOptions = displayValues.legendOptions; this.labels = displayValues.labels; @@ -298,7 +297,7 @@ export abstract class AbstractHistoryChart implements OnInit { dataResponse = DateTimeUtils.normalizeTimestamps(unit, dataResponse); this.chartType = 'line'; this.chartObject = this.getChartData(); - let displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse, energyResponse); + const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse, energyResponse); this.datasets = displayValues.datasets; this.legendOptions = displayValues.legendOptions; this.labels = displayValues.labels; @@ -315,34 +314,31 @@ export abstract class AbstractHistoryChart implements OnInit { */ public static applyChartTypeSpecificOptionsChanges(chartType: string, options: Chart.ChartOptions, service: Service, chartObject: HistoryUtils.ChartData | null): Chart.ChartOptions { switch (chartType) { - case 'bar': + case 'bar': { options.plugins.tooltip.mode = 'x'; options.scales.x['offset'] = true; options.scales.x.ticks['source'] = 'data'; let barPercentage = 1; - let categoryPercentage = 0; switch (service.periodString) { case DefaultTypes.PeriodString.CUSTOM: { barPercentage = 0.7; - categoryPercentage = 0.4; + break; } case DefaultTypes.PeriodString.MONTH: { if (service.isSmartphoneResolution == true) { barPercentage = 1; - categoryPercentage = 0.6; } else { barPercentage = 0.9; - categoryPercentage = 0.8; } + break; } case DefaultTypes.PeriodString.YEAR: { if (service.isSmartphoneResolution == true) { barPercentage = 1; - categoryPercentage = 0.6; } else { barPercentage = 0.8; - categoryPercentage = 0.8; } + break; } } @@ -350,6 +346,7 @@ export abstract class AbstractHistoryChart implements OnInit { barPercentage: barPercentage, }; break; + } case 'line': options.scales.x['offset'] = false; @@ -357,7 +354,7 @@ export abstract class AbstractHistoryChart implements OnInit { options.plugins.tooltip.mode = 'index'; if (chartObject) { - for (let yAxis of chartObject.yAxes) { + for (const yAxis of chartObject.yAxes) { options.scales[yAxis.yAxisId]['stacked'] = false; } } @@ -378,15 +375,15 @@ export abstract class AbstractHistoryChart implements OnInit { protected queryHistoricTimeseriesData(fromDate: Date, toDate: Date, res?: Resolution): Promise { this.isDataExisting = true; - let resolution = res ?? calculateResolution(this.service, fromDate, toDate).resolution; + const resolution = res ?? calculateResolution(this.service, fromDate, toDate).resolution; - let result: Promise = new Promise((resolve, reject) => { + const result: Promise = new Promise((resolve, reject) => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(async () => { - let channelAddresses = (await this.getChannelAddresses()).powerChannels; - let request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); + const channelAddresses = (await this.getChannelAddresses()).powerChannels; + const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); edge.sendRequest(this.service.websocket, request).then(response => { - let result = (response as QueryHistoricTimeseriesDataResponse)?.result; + const result = (response as QueryHistoricTimeseriesDataResponse)?.result; if (Object.keys(result).length != 0) { resolve(response as QueryHistoricTimeseriesDataResponse); } else { @@ -425,18 +422,18 @@ export abstract class AbstractHistoryChart implements OnInit { protected queryHistoricTimeseriesEnergyPerPeriod(fromDate: Date, toDate: Date): Promise { this.isDataExisting = true; - let resolution = calculateResolution(this.service, fromDate, toDate).resolution; + const resolution = calculateResolution(this.service, fromDate, toDate).resolution; - let result: Promise = new Promise((resolve, reject) => { + const result: Promise = new Promise((resolve, reject) => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(async () => { - let channelAddresses = (await this.getChannelAddresses()).energyChannels.filter(element => element != null); - let request = new QueryHistoricTimeseriesEnergyPerPeriodRequest(DateUtils.maxDate(fromDate, edge?.firstSetupProtocol), toDate, channelAddresses, resolution); + const channelAddresses = (await this.getChannelAddresses()).energyChannels.filter(element => element != null); + const request = new QueryHistoricTimeseriesEnergyPerPeriodRequest(DateUtils.maxDate(fromDate, edge?.firstSetupProtocol), toDate, channelAddresses, resolution); if (channelAddresses.length > 0) { edge.sendRequest(this.service.websocket, request).then(response => { - let result = (response as QueryHistoricTimeseriesEnergyPerPeriodResponse)?.result; + const result = (response as QueryHistoricTimeseriesEnergyPerPeriodResponse)?.result; if (Object.keys(result).length != 0) { resolve(response as QueryHistoricTimeseriesEnergyPerPeriodResponse); } else { @@ -481,14 +478,14 @@ export abstract class AbstractHistoryChart implements OnInit { this.isDataExisting = true; - let result: Promise = new Promise((resolve, reject) => { + const result: Promise = new Promise((resolve, reject) => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(async () => { - let channelAddresses = (await this.getChannelAddresses()).energyChannels?.filter(element => element != null) ?? []; - let request = new QueryHistoricTimeseriesEnergyRequest(DateUtils.maxDate(fromDate, edge?.firstSetupProtocol), toDate, channelAddresses); + const channelAddresses = (await this.getChannelAddresses()).energyChannels?.filter(element => element != null) ?? []; + const request = new QueryHistoricTimeseriesEnergyRequest(DateUtils.maxDate(fromDate, edge?.firstSetupProtocol), toDate, channelAddresses); if (channelAddresses.length > 0) { edge.sendRequest(this.service.websocket, request).then(response => { - let result = (response as QueryHistoricTimeseriesEnergyResponse)?.result; + const result = (response as QueryHistoricTimeseriesEnergyResponse)?.result; if (Object.keys(result).length != 0) { resolve(response as QueryHistoricTimeseriesEnergyResponse); } else { @@ -520,7 +517,7 @@ export abstract class AbstractHistoryChart implements OnInit { * @returns period for Tooltip Header */ protected static toTooltipTitle(fromDate: Date, toDate: Date, date: Date, service: Service): string { - let unit = calculateResolution(service, fromDate, toDate).resolution.unit; + const unit = calculateResolution(service, fromDate, toDate).resolution.unit; switch (unit) { case ChronoUnit.Type.YEARS: @@ -551,7 +548,7 @@ export abstract class AbstractHistoryChart implements OnInit { let tooltipsLabel: string | null = null; let options: Chart.ChartOptions = Utils.deepCopy(Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS)); - let displayValues: HistoryUtils.DisplayValues[] = chartObject.output(channelData.data); + const displayValues: HistoryUtils.DisplayValues[] = chartObject.output(channelData.data); const showYAxisTitle: boolean = chartObject.yAxes.length > 1; chartObject.yAxes.forEach((element) => { @@ -563,7 +560,7 @@ export abstract class AbstractHistoryChart implements OnInit { if (tooltipItems?.length === 0) { return null; } - let date = DateUtils.stringToDate(tooltipItems[0]?.label); + const date = DateUtils.stringToDate(tooltipItems[0]?.label); return AbstractHistoryChart.toTooltipTitle(service.historyPeriod.value.from, service.historyPeriod.value.to, date, service); }; @@ -572,11 +569,11 @@ export abstract class AbstractHistoryChart implements OnInit { options.scales.x['time'].unit = calculateResolution(service, service.historyPeriod.value.from, service.historyPeriod.value.to).timeFormat; options.plugins.tooltip.callbacks.label = (item: Chart.TooltipItem) => { - let label = item.dataset.label; - let value = item.dataset.data[item.dataIndex]; + const label = item.dataset.label; + const value = item.dataset.data[item.dataIndex]; - let displayValue = displayValues.find(element => element.name === label.split(":")[0]); - let unit = displayValue?.custom?.unit + const displayValue = displayValues.find(element => element.name === label.split(":")[0]); + const unit = displayValue?.custom?.unit ?? chartObject.yAxes[0]?.unit; if (value === null) { @@ -601,17 +598,17 @@ export abstract class AbstractHistoryChart implements OnInit { options.plugins.legend.labels.generateLabels = function (chart: Chart.Chart) { - let chartLegendLabelItems: Chart.LegendItem[] = []; + const chartLegendLabelItems: Chart.LegendItem[] = []; chart.data.datasets.forEach((dataset: Chart.ChartDataset, index) => { - let legendItem = legendOptions?.find(element => element.label == dataset.label); + const legendItem = legendOptions?.find(element => element.label == dataset.label); //Remove duplicates like 'directConsumption' from legend if (chartLegendLabelItems.filter(element => element['text'] == dataset.label).length > 0) { return; } - let isHidden = legendItem?.strokeThroughHidingStyle ?? null; + const isHidden = legendItem?.strokeThroughHidingStyle ?? null; displayValues.filter(element => element.name == dataset.label?.split(":")[0]).forEach(() => { chartLegendLabelItems.push({ @@ -637,22 +634,22 @@ export abstract class AbstractHistoryChart implements OnInit { } // only way to figure out, which stack is active - var tooltipItem = items[0]; // Assuming only one tooltip item is displayed - var datasetIndex = tooltipItem.dataIndex; + const tooltipItem = items[0]; // Assuming only one tooltip item is displayed + const datasetIndex = tooltipItem.dataIndex; // Get the dataset object - var datasets = items.map(element => element.dataset); + const datasets = items.map(element => element.dataset); // Assuming the dataset is a bar chart using the 'stacked' option - var stack = items[0].dataset.stack || datasetIndex; + const stack = items[0].dataset.stack || datasetIndex; // If only one item in stack do not show sum of values if (items.length <= 1) { return null; } - let afterTitle = typeof chartObject.tooltip?.afterTitle == 'function' ? chartObject.tooltip?.afterTitle(stack) : null; + const afterTitle = typeof chartObject.tooltip?.afterTitle == 'function' ? chartObject.tooltip?.afterTitle(stack) : null; - let totalValue = datasets.filter(el => el.stack == stack).reduce((_total, dataset) => Utils.addSafely(_total, Math.abs(dataset.data[datasetIndex])), 0); + const totalValue = datasets.filter(el => el.stack == stack).reduce((_total, dataset) => Utils.addSafely(_total, Math.abs(dataset.data[datasetIndex])), 0); if (afterTitle) { return afterTitle + ": " + formatNumber(totalValue, 'de', chartObject.tooltip.formatNumber) + ' ' + tooltipsLabel; } @@ -662,9 +659,9 @@ export abstract class AbstractHistoryChart implements OnInit { // Remove duplicates from legend, if legendItem with two or more occurrences in legend, use one legendItem to trigger them both options.plugins.legend.onClick = function (event: Chart.ChartEvent, legendItem: Chart.LegendItem, legend) { - let chart: Chart.Chart = this.chart; + const chart: Chart.Chart = this.chart; - let legendItems = chart.data.datasets.reduce((arr, ds, i) => { + const legendItems = chart.data.datasets.reduce((arr, ds, i) => { if (ds.label == legendItem.text) { arr.push({ label: ds.label, index: i }); } @@ -674,7 +671,7 @@ export abstract class AbstractHistoryChart implements OnInit { legendItems.forEach(item => { // original.call(this, event, legendItem1); setLabelVisible(item.label, !chart.isDatasetVisible(legendItem.datasetIndex)); - var meta = chart.getDatasetMeta(item.index); + const meta = chart.getDatasetMeta(item.index); // See controller.isDatasetVisible comment meta.hidden = meta.hidden === null ? !chart.data.datasets[item.index].hidden : null; }); @@ -853,7 +850,7 @@ export abstract class AbstractHistoryChart implements OnInit { }); } }); - }; + } public static getYAxisTitle(title: YAxisTitle, translate: TranslateService, chartType: 'bar' | 'line', customTitle?: string): string { @@ -924,20 +921,23 @@ export abstract class AbstractHistoryChart implements OnInit { let tooltipsLabel: string | null = null; switch (title) { - case YAxisTitle.RELAY: + case YAxisTitle.RELAY: { if (chartType === 'line') { return Converter.ON_OFF(translate)(value); } const activeTimeOverPeriodPipe = new FormatSecondsToDurationPipe(new DecimalPipe(language)); return activeTimeOverPeriodPipe.transform(value); + } - case YAxisTitle.TIME: + case YAxisTitle.TIME: { const pipe = new FormatSecondsToDurationPipe(new DecimalPipe(language)); return pipe.transform(value); - case YAxisTitle.CURRENCY: + } + case YAxisTitle.CURRENCY: { const currency = config.components['_meta'].properties.currency; tooltipsLabel = Currency.getCurrencyLabelByCurrency(currency); break; + } case YAxisTitle.PERCENTAGE: tooltipsLabel = AbstractHistoryChart.getToolTipsAfterTitleLabel(title, chartType, value, translate); break; @@ -981,10 +981,10 @@ export abstract class AbstractHistoryChart implements OnInit { case YAxisTitle.PERCENTAGE: return baseName + ": " + formatNumber(suffix, 'de', "1.0-1") + " %"; case YAxisTitle.RELAY: - case YAxisTitle.TIME: + case YAxisTitle.TIME: { const pipe = new FormatSecondsToDurationPipe(new DecimalPipe(Language.DE.key)); return baseName + ": " + pipe.transform(suffix); - + } } } } @@ -999,16 +999,16 @@ export abstract class AbstractHistoryChart implements OnInit { */ private showZeroPlugin = { beforeRender: function (chartInstance) { - let datasets = chartInstance.config.data.datasets; + const datasets = chartInstance.config.data.datasets; for (let i = 0; i < datasets.length; i++) { - let meta = datasets[i]._meta; + const meta = datasets[i]._meta; // It counts up every time you change something on the chart so // this is a way to get the info on whichever index it's at - let metaData = meta[Object.keys(meta)[0]]; - let bars = metaData.data; + const metaData = meta[Object.keys(meta)[0]]; + const bars = metaData.data; for (let j = 0; j < bars.length; j++) { - let model = bars[j]._model; + const model = bars[j]._model; if (metaData.type === "horizontalBar" && model.base === model.x) { model.x = model.base + 2; } diff --git a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts index 7cf848aa4f0..e3929bd9860 100644 --- a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts +++ b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget-line.ts @@ -64,7 +64,7 @@ export abstract class AbstractFlatWidgetLine implements OnChanges, OnDestroy { public ngOnChanges() { this.setValue(this.value); - }; + } protected setValue(value: any) { this.displayValue = this.converter(value); diff --git a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts index f2b30f795ac..c4b1adcc878 100644 --- a/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts +++ b/ui/src/app/shared/genericComponents/flat/abstract-flat-widget.ts @@ -54,9 +54,9 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { this.isInitialized = true; this.afterIsInitialized(); // get the channel addresses that should be subscribed - let channelAddresses: Set = new Set(this.getChannelAddresses()); - let channelIds = this.getChannelIds(); - for (let channelId of channelIds) { + const channelAddresses: Set = new Set(this.getChannelAddresses()); + const channelIds = this.getChannelIds(); + for (const channelId of channelIds) { channelAddresses.add(new ChannelAddress(this.componentId, channelId)); } this.dataService.getValues(Array.from(channelAddresses), this.edge, this.componentId); @@ -66,7 +66,7 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { }); }); }); - }; + } public ngOnDestroy() { this.dataService.unsubscribeFromChannels(this.getChannelAddresses()); @@ -105,5 +105,5 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { /** * Gets called after {@link onCurrentData}, every time the currentValue changes */ - protected afterOnCurrentData() { }; + protected afterOnCurrentData() { } } diff --git a/ui/src/app/shared/genericComponents/modal/abstract-modal-line.ts b/ui/src/app/shared/genericComponents/modal/abstract-modal-line.ts index 34ab2d1a6fb..11437da9071 100644 --- a/ui/src/app/shared/genericComponents/modal/abstract-modal-line.ts +++ b/ui/src/app/shared/genericComponents/modal/abstract-modal-line.ts @@ -50,7 +50,7 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges } else { this._name = value; } - }; + } @Input() public value: number | string; @Input() public roleIsAtLeast?: Role = Role.GUEST; @@ -113,14 +113,14 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges this.config = config; // get the channel addresses that should be subscribed - let channelAddresses: ChannelAddress[] = [...this.getChannelAddresses()]; + const channelAddresses: ChannelAddress[] = [...this.getChannelAddresses()]; if (typeof this.name == 'object') { channelAddresses.push(this.name.channel); } - let channelIds = this.getChannelIds(); - for (let channelId of channelIds) { + const channelIds = this.getChannelIds(); + for (const channelId of channelIds) { channelAddresses.push(new ChannelAddress(this.component.id, channelId)); } if (channelAddresses.length != 0) { @@ -129,9 +129,9 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges // call onCurrentData() with latest data edge.currentData.pipe(takeUntil(this.stopOnDestroy)).subscribe(currentData => { - let allComponents = {}; - for (let channelAddress of channelAddresses) { - let ca = channelAddress.toString(); + const allComponents = {}; + for (const channelAddress of channelAddresses) { + const ca = channelAddress.toString(); allComponents[ca] = currentData.channel[ca]; } this.onCurrentData({ allComponents: allComponents }); diff --git a/ui/src/app/shared/genericComponents/modal/abstractModal.ts b/ui/src/app/shared/genericComponents/modal/abstractModal.ts index 51774138ddc..e1540757482 100644 --- a/ui/src/app/shared/genericComponents/modal/abstractModal.ts +++ b/ui/src/app/shared/genericComponents/modal/abstractModal.ts @@ -68,8 +68,8 @@ export abstract class AbstractModal implements OnInit, OnDestroy { if (this.component != null) { this.component = config.components[this.component.id]; - let channelIds = this.getChannelIds(); - for (let channelId of channelIds) { + const channelIds = this.getChannelIds(); + for (const channelId of channelIds) { channelAddresses.push(new ChannelAddress(this.component.id, channelId)); } } @@ -79,9 +79,9 @@ export abstract class AbstractModal implements OnInit, OnDestroy { // call onCurrentData() with latest data edge.currentData.pipe(takeUntil(this.stopOnDestroy)).subscribe(currentData => { - let allComponents = {}; - for (let channelAddress of channelAddresses) { - let ca = channelAddress.toString(); + const allComponents = {}; + for (const channelAddress of channelAddresses) { + const ca = channelAddress.toString(); allComponents[ca] = currentData.channel[ca]; } this.onCurrentData({ allComponents: allComponents }); @@ -95,7 +95,7 @@ export abstract class AbstractModal implements OnInit, OnDestroy { }); }); } - protected onIsInitialized() { }; + protected onIsInitialized() { } public ngOnDestroy() { // Unsubscribe from OpenEMS diff --git a/ui/src/app/shared/genericComponents/modal/help-button/help-button.ts b/ui/src/app/shared/genericComponents/modal/help-button/help-button.ts index f318a46f708..fe1fd90e48c 100644 --- a/ui/src/app/shared/genericComponents/modal/help-button/help-button.ts +++ b/ui/src/app/shared/genericComponents/modal/help-button/help-button.ts @@ -19,7 +19,7 @@ export class HelpButtonComponent { return; } - let link = environment.links[key];; + const link = environment.links[key]; if (link === null || link === "") { this.link = null; diff --git a/ui/src/app/shared/genericComponents/modal/modal-phases/modal-phases.ts b/ui/src/app/shared/genericComponents/modal/modal-phases/modal-phases.ts index 8e67e98fd7f..fff720300d9 100644 --- a/ui/src/app/shared/genericComponents/modal/modal-phases/modal-phases.ts +++ b/ui/src/app/shared/genericComponents/modal/modal-phases/modal-phases.ts @@ -22,9 +22,9 @@ export class ModalPhasesComponent extends AbstractModalLine { protected readonly TextIndentation = TextIndentation; protected override getChannelAddresses(): ChannelAddress[] { - let channelAddresses: ChannelAddress[] = []; + const channelAddresses: ChannelAddress[] = []; - for (let phase of this.phases) { + for (const phase of this.phases) { channelAddresses.push( ChannelAddress.fromString(this.component.id + '/ActivePower' + phase.key), ); @@ -33,8 +33,8 @@ export class ModalPhasesComponent extends AbstractModalLine { } protected override onCurrentData(currentData: CurrentData): void { - for (let phase of this.phases) { - let powerPerPhase = currentData.allComponents[this.component.id + '/ActivePower' + phase.key]; + for (const phase of this.phases) { + const powerPerPhase = currentData.allComponents[this.component.id + '/ActivePower' + phase.key]; phase.name = this.translate.instant('General.phase') + " " + phase.key + this.setTranslatedName(powerPerPhase); } } diff --git a/ui/src/app/shared/genericComponents/modal/modal.ts b/ui/src/app/shared/genericComponents/modal/modal.ts index 1eeaa030ded..c4f9d5f4ab7 100644 --- a/ui/src/app/shared/genericComponents/modal/modal.ts +++ b/ui/src/app/shared/genericComponents/modal/modal.ts @@ -51,10 +51,10 @@ export class ModalComponent { // Changes applied together public applyChanges() { - let updateComponentArray: { name: string, value: any }[] = []; + const updateComponentArray: { name: string, value: any }[] = []; this.service.startSpinner('spinner'); - for (let key in this.formGroup.controls) { - let control = this.formGroup.controls[key]; + for (const key in this.formGroup.controls) { + const control = this.formGroup.controls[key]; this.formGroup.controls[key]; // Check if formControl-value didn't change diff --git a/ui/src/app/shared/genericComponents/shared/converter.ts b/ui/src/app/shared/genericComponents/shared/converter.ts index 93447afc438..d6aa1d8fe99 100644 --- a/ui/src/app/shared/genericComponents/shared/converter.ts +++ b/ui/src/app/shared/genericComponents/shared/converter.ts @@ -1,4 +1,3 @@ -import { formatNumber } from "@angular/common"; import { TranslateService } from "@ngx-translate/core"; import { CurrentData, EdgeConfig, Utils } from "../../shared"; @@ -22,26 +21,6 @@ export namespace Converter { return "" + value; }; - - const FORMAT_WATT = (value: number) => { - // TODO apply correct locale - return formatNumber(value, 'de', '1.0-0') + " W"; - }; - - const FORMAT_MILLI_VOLT = (value: number) => { - return formatNumber(value, 'de', '1.0-0') + " mV"; - }; - - const FORMAT_VOLT = (value: number) => { - // TODO apply correct locale - return formatNumber(value, 'de', '1.0-0') + " V"; - }; - - const FORMAT_AMPERE = (value: number) => { - // TODO apply correct locale - return formatNumber(value, 'de', '1.1-1') + " A"; - }; - export const IF_NUMBER = (value: number | string | null, callback: (number: number) => string) => { if (typeof value === 'number') { return callback(value); @@ -126,7 +105,7 @@ export namespace Converter { export const VOLTAGE_TO_VOLT: Converter = (raw) => { return IF_NUMBER(raw, value => - FORMAT_VOLT(value)); + Formatter.FORMAT_VOLT(value)); }; /** @@ -140,7 +119,7 @@ export namespace Converter { */ export const CURRENT_IN_MILLIAMPERE_TO_AMPERE: Converter = (raw) => { return IF_NUMBER(raw, value => - FORMAT_AMPERE(value / 1000)); + Formatter.FORMAT_AMPERE(value / 1000)); }; export const ONLY_POSITIVE_POWER_AND_NEGATIVE_AS_ZERO: Converter = (raw) => { @@ -152,7 +131,7 @@ export namespace Converter { export const CURRENT_TO_AMPERE: Converter = (raw) => { return IF_NUMBER(raw, value => - FORMAT_AMPERE(value)); + Formatter.FORMAT_AMPERE(value)); }; export const CONVERT_TO_EXTERNAL_RECEIVER_LIMITATION: Converter = (raw) => { diff --git a/ui/src/app/shared/genericComponents/shared/oe-formly-component.ts b/ui/src/app/shared/genericComponents/shared/oe-formly-component.ts index 49d049c03c6..54f74ccc739 100644 --- a/ui/src/app/shared/genericComponents/shared/oe-formly-component.ts +++ b/ui/src/app/shared/genericComponents/shared/oe-formly-component.ts @@ -25,7 +25,7 @@ export abstract class AbstractFormlyComponent { edge.getConfig(service.websocket) .pipe(filter(config => !!config)) .subscribe((config) => { - var view = this.generateView(config, edge.role, this.translate); + const view = this.generateView(config, edge.role, this.translate); this.fields = [{ type: "input", diff --git a/ui/src/app/shared/genericComponents/shared/testing/tester.ts b/ui/src/app/shared/genericComponents/shared/testing/tester.ts index 3e6d3bcc9dd..ad4bd140916 100644 --- a/ui/src/app/shared/genericComponents/shared/testing/tester.ts +++ b/ui/src/app/shared/genericComponents/shared/testing/tester.ts @@ -21,18 +21,18 @@ export class OeFormlyViewTester { .map(line => OeFormlyViewTester.applyField(line, context)) .filter(line => line), }; - }; + } private static applyField(field: OeFormlyField, context: OeFormlyViewTester.Context): OeFormlyViewTester.Field { switch (field.type) { /** * OeFormlyField.Line */ - case 'children-line': - let tmp = OeFormlyViewTester.applyLineWithChildren(field, context); + case 'children-line': { + const tmp = OeFormlyViewTester.applyLineWithChildren(field, context); // Prepare result - let result: OeFormlyViewTester.Field.ChildrenLine = { + const result: OeFormlyViewTester.Field.ChildrenLine = { type: field.type, name: tmp.value, }; @@ -49,10 +49,10 @@ export class OeFormlyViewTester { } return result; - + } case "channel-line": { - let tmp = OeFormlyViewTester.applyLineOrItem(field, context); + const tmp = OeFormlyViewTester.applyLineOrItem(field, context); if (tmp == null) { return null; // filter did not pass } @@ -66,7 +66,7 @@ export class OeFormlyViewTester { } // Prepare result - let result: OeFormlyViewTester.Field.ChannelLine = { + const result: OeFormlyViewTester.Field.ChannelLine = { type: field.type, name: name, }; @@ -98,7 +98,7 @@ export class OeFormlyViewTester { const name: string = field.name; // Prepare result - let result: OeFormlyViewTester.Field.ValueLine = { + const result: OeFormlyViewTester.Field.ValueLine = { type: field.type, name: name, }; @@ -118,7 +118,7 @@ export class OeFormlyViewTester { * OeFormlyField.Item */ case "item": { - let tmp = OeFormlyViewTester.applyLineOrItem(field, context); + const tmp = OeFormlyViewTester.applyLineOrItem(field, context); if (tmp == null) { return null; // filter did not pass } @@ -162,7 +162,7 @@ export class OeFormlyViewTester { /* filter did not pass */ | null { // Read value from channels - let rawValue = field.channel && field.channel in context ? context[field.channel] : null; + const rawValue = field.channel && field.channel in context ? context[field.channel] : null; // Apply filter if (field.filter && field.filter(rawValue) === false) { @@ -170,7 +170,7 @@ export class OeFormlyViewTester { } // Apply converter - let value: string = field.converter + const value: string = field.converter ? field.converter(rawValue) : rawValue === null ? null : "" + rawValue; @@ -224,7 +224,7 @@ export class OeChartTester { public static apply(chartData: HistoryUtils.ChartData, chartType: 'line' | 'bar', channels: OeTester.Types.Channels, testContext: TestContext, config: EdgeConfig): OeChartTester.View { - let channelData = OeChartTester.getChannelDataByCharttype(chartType, channels); + const channelData = OeChartTester.getChannelDataByCharttype(chartType, channels); // Set historyPeriod manually with passed timestamps testContext.service.historyPeriod.next({ @@ -234,10 +234,10 @@ export class OeChartTester { }); // Fill Data - let configuration = AbstractHistoryChart.fillChart(chartType, chartData, channelData, channels.energyChannelWithValues); - let data: OeChartTester.Dataset.Data[] = OeChartTester.convertChartDatasetsToDatasets(configuration.datasets); - let labels: OeChartTester.Dataset.LegendLabel = OeChartTester.convertChartLabelsToLegendLabels(configuration.labels); - let options: OeChartTester.Dataset.Option = OeChartTester.convertChartDataToOptions(chartData, chartType, testContext, channels, testContext.translate.currentLang, config, configuration.datasets); + const configuration = AbstractHistoryChart.fillChart(chartType, chartData, channelData, channels.energyChannelWithValues); + const data: OeChartTester.Dataset.Data[] = OeChartTester.convertChartDatasetsToDatasets(configuration.datasets); + const labels: OeChartTester.Dataset.LegendLabel = OeChartTester.convertChartLabelsToLegendLabels(configuration.labels); + const options: OeChartTester.Dataset.Option = OeChartTester.convertChartDataToOptions(chartData, chartType, testContext, channels, testContext.translate.currentLang, config, configuration.datasets); return { datasets: { @@ -246,7 +246,7 @@ export class OeChartTester { options: options, }, }; - }; + } /** * Converts chartLabels to legendLabels @@ -268,9 +268,9 @@ export class OeChartTester { * @returns data from a chartData dataset */ public static convertChartDatasetsToDatasets(datasets: ChartDataset[]): OeChartTester.Dataset.Data[] { - let fields: OeChartTester.Dataset.Data[] = []; + const fields: OeChartTester.Dataset.Data[] = []; - for (let dataset of datasets) { + for (const dataset of datasets) { fields.push( { type: 'data', @@ -293,13 +293,13 @@ export class OeChartTester { */ public static convertChartDataToOptions(chartData: HistoryUtils.ChartData, chartType: 'line' | 'bar', testContext: TestContext, channels: OeTester.Types.Channels, locale: string, config: EdgeConfig, datasets: Chart.ChartDataset[]): OeChartTester.Dataset.Option { - let channelData: QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse = OeChartTester.getChannelDataByCharttype(chartType, channels); - let displayValues = chartData.output(channelData.result.data); - let legendOptions: any[] = []; + const channelData: QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse = OeChartTester.getChannelDataByCharttype(chartType, channels); + const displayValues = chartData.output(channelData.result.data); + const legendOptions: any[] = []; displayValues.forEach(displayValue => { - let yAxis = chartData.yAxes.find(yaxis => yaxis?.yAxisId == (displayValue?.yAxisId ?? chartData.yAxes[0].yAxisId)); - let label = AbstractHistoryChart.getTooltipsLabelName(displayValue.name, yAxis?.unit, typeof displayValue.nameSuffix == 'function' ? displayValue.nameSuffix(channels.energyChannelWithValues) : null); + const yAxis = chartData.yAxes.find(yaxis => yaxis?.yAxisId == (displayValue?.yAxisId ?? chartData.yAxes[0].yAxisId)); + const label = AbstractHistoryChart.getTooltipsLabelName(displayValue.name, yAxis?.unit, typeof displayValue.nameSuffix == 'function' ? displayValue.nameSuffix(channels.energyChannelWithValues) : null); legendOptions.push(AbstractHistoryChart.getLegendOptions(label, displayValue)); }); diff --git a/ui/src/app/shared/header/header.component.ts b/ui/src/app/shared/header/header.component.ts index c58cd17f05c..efd940d50a0 100644 --- a/ui/src/app/shared/header/header.component.ts +++ b/ui/src/app/shared/header/header.component.ts @@ -59,8 +59,8 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { } updateEnableSideMenu(url: string) { - let urlArray = url.split('/'); - let file = urlArray.pop(); + const urlArray = url.split('/'); + const file = urlArray.pop(); if (file == 'user' || file == 'settings' || file == 'changelog' || urlArray.length > 3) { // disable side-menu; show back-button instead @@ -81,7 +81,7 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { // set backUrl for user when an Edge had been selected before - let currentEdge: Edge = this.service.currentEdge.value; + const currentEdge: Edge = this.service.currentEdge.value; if (url === '/user' && currentEdge != null) { this.backUrl = '/device/' + currentEdge.id + "/live"; return; @@ -99,15 +99,14 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { return; } - let urlArray = url.split('/'); + const urlArray = url.split('/'); let backUrl: string | boolean = '/'; - let file = urlArray.pop(); + const file = urlArray.pop(); // disable backUrl for History & EdgeIndex Component ++ Enable Segment Navigation if ((file == 'history' || file == 'live') && urlArray.length == 3) { this.backUrl = false; return; - } else { } // disable backUrl to first 'index' page from Edge index if there is only one Edge in the system @@ -137,7 +136,7 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { } updateCurrentPage(url: string) { - let urlArray = url.split('/'); + const urlArray = url.split('/'); let file = urlArray.pop(); if (urlArray.length >= 4) { file = urlArray[3]; diff --git a/ui/src/app/shared/history-data-error.component.ts b/ui/src/app/shared/history-data-error.component.ts index 8b9b1de94cc..d3874ce0576 100644 --- a/ui/src/app/shared/history-data-error.component.ts +++ b/ui/src/app/shared/history-data-error.component.ts @@ -27,7 +27,7 @@ export class HistoryDataErrorComponent { type ErrorType = 'TEMPORARY' | 'TOO_LONG' | null; function toType(response: JsonrpcResponseError | null): ErrorType { - let message = response?.error?.message; + const message = response?.error?.message; if (message === undefined) { return null; } diff --git a/ui/src/app/shared/interface/interface.ts b/ui/src/app/shared/interface/interface.ts index 8050addee20..21bd8395301 100644 --- a/ui/src/app/shared/interface/interface.ts +++ b/ui/src/app/shared/interface/interface.ts @@ -3,4 +3,4 @@ import { NetworkInterface } from "src/app/edge/settings/network/shared"; export interface Interface { name: string, model: NetworkInterface, -}; +} diff --git a/ui/src/app/shared/jsonrpc/jsonrpcutils.ts b/ui/src/app/shared/jsonrpc/jsonrpcutils.ts index 3d9ff561229..642ffee60c6 100644 --- a/ui/src/app/shared/jsonrpc/jsonrpcutils.ts +++ b/ui/src/app/shared/jsonrpc/jsonrpcutils.ts @@ -6,8 +6,8 @@ export class JsonRpcUtils { * Converts an array of ChannelAddresses to a string array with unique values. */ public static channelsToStringArray(channels: ChannelAddress[]): string[] { - let result = []; - for (let channel of channels) { + const result = []; + for (const channel of channels) { result.push(channel.toString()); } return Array.from(new Set(result)); diff --git a/ui/src/app/shared/pickdate/pickdate.component.spec.ts b/ui/src/app/shared/pickdate/pickdate.component.spec.ts index 9bbeefd21b3..006848d21ba 100644 --- a/ui/src/app/shared/pickdate/pickdate.component.spec.ts +++ b/ui/src/app/shared/pickdate/pickdate.component.spec.ts @@ -6,11 +6,11 @@ import { PickDateComponent } from "./pickdate.component"; export function expectPreviousPeriod(testContext: TestContext, firstSetupProtocol: Date, expectToBe: boolean): void { expect(PickDateComponent.isPreviousPeriodAllowed(testContext.service, firstSetupProtocol)).toBe(expectToBe); -}; +} export function expectNextPeriod(testContext: TestContext, expectToBe: boolean): void { expect(PickDateComponent.isNextPeriodAllowed(testContext.service)).toBe(expectToBe); -}; +} describe('Pickdate', () => { diff --git a/ui/src/app/shared/pickdate/pickdate.component.ts b/ui/src/app/shared/pickdate/pickdate.component.ts index 0819dd7a7b2..5445b50b0eb 100644 --- a/ui/src/app/shared/pickdate/pickdate.component.ts +++ b/ui/src/app/shared/pickdate/pickdate.component.ts @@ -109,6 +109,7 @@ export class PickDateComponent implements OnInit, OnDestroy { } this.disableArrow = false; } + break; } case DefaultTypes.PeriodString.TOTAL: { this.disableArrow = true; @@ -117,7 +118,9 @@ export class PickDateComponent implements OnInit, OnDestroy { case DefaultTypes.PeriodString.CUSTOM: { let dateDistance = Math.floor(Math.abs(this.service.historyPeriod.value.from - this.service.historyPeriod.value.to) / (1000 * 60 * 60 * 24)); - dateDistance == 0 ? dateDistance = 1 : dateDistance = dateDistance; + if (dateDistance == 0) { + dateDistance = 1; + } if (isFuture(addDays(this.service.historyPeriod.value.from, dateDistance * 2))) { this.disableArrow = true; } else { @@ -210,7 +213,9 @@ export class PickDateComponent implements OnInit, OnDestroy { } case DefaultTypes.PeriodString.CUSTOM: { let dateDistance = Math.floor(Math.abs(this.service.historyPeriod.value.from - this.service.historyPeriod.value.to) / (1000 * 60 * 60 * 24)); - dateDistance == 0 ? dateDistance = 1 : dateDistance = dateDistance; + if (dateDistance == 0) { + dateDistance = 1; + } if (isFuture(addDays(this.service.historyPeriod.value.to, dateDistance * 2))) { this.disableArrow = true; } @@ -259,7 +264,9 @@ export class PickDateComponent implements OnInit, OnDestroy { } case DefaultTypes.PeriodString.CUSTOM: { let dateDistance = Math.floor(Math.abs(this.service.historyPeriod.value.from - this.service.historyPeriod.value.to) / (1000 * 60 * 60 * 24)); - dateDistance == 0 ? dateDistance = 1 : dateDistance = dateDistance; + if (dateDistance == 0) { + dateDistance = 1; + } this.setDateRange(new DefaultTypes.HistoryPeriod(subDays(this.service.historyPeriod.value.from, dateDistance), subDays(this.service.historyPeriod.value.to, dateDistance))); break; } @@ -319,23 +326,23 @@ export class PickDateComponent implements OnInit, OnDestroy { // + 1000 to reach the next day switch (this.service.periodString) { case DefaultTypes.PeriodString.DAY: { - let currentDayTime = new Date(); - let endOfDayTime = endOfDay(currentDayTime); + const currentDayTime = new Date(); + const endOfDayTime = endOfDay(currentDayTime); return differenceInMilliseconds(endOfDayTime, currentDayTime) + 1000; } case DefaultTypes.PeriodString.WEEK: { - let currentDayTime = new Date(); - let endOfWeekTime = endOfWeek(currentDayTime, { weekStartsOn: 1 }); + const currentDayTime = new Date(); + const endOfWeekTime = endOfWeek(currentDayTime, { weekStartsOn: 1 }); return differenceInMilliseconds(endOfWeekTime, currentDayTime) + 1000; } case DefaultTypes.PeriodString.MONTH: { - let currentDayTime = new Date(); - let endOfMonthTime = endOfMonth(currentDayTime); + const currentDayTime = new Date(); + const endOfMonthTime = endOfMonth(currentDayTime); return differenceInMilliseconds(endOfMonthTime, currentDayTime) + 1000; } case DefaultTypes.PeriodString.YEAR: { - let currentDayTime = new Date(); - let endOfYearTime = endOfYear(currentDayTime); + const currentDayTime = new Date(); + const endOfYearTime = endOfYear(currentDayTime); return differenceInMilliseconds(endOfYearTime, currentDayTime) + 1000; } } @@ -383,9 +390,10 @@ export class PickDateComponent implements OnInit, OnDestroy { return isBefore(firstSetupProtocol, endOfYear(subWeeks(service.historyPeriod.value.from, 1))); case DefaultTypes.PeriodString.TOTAL: return false; - case DefaultTypes.PeriodString.CUSTOM: - var timeRange: number = differenceInDays(service.historyPeriod.value.to, service.historyPeriod.value.from); + case DefaultTypes.PeriodString.CUSTOM: { + const timeRange: number = differenceInDays(service.historyPeriod.value.to, service.historyPeriod.value.from); return isBefore(startOfDay(firstSetupProtocol), startOfDay(subDays(service.historyPeriod.value.from, timeRange))); + } } } @@ -408,9 +416,10 @@ export class PickDateComponent implements OnInit, OnDestroy { return isAfter(new Date(), startOfYear(addYears(service.historyPeriod.value.to, 1))); case DefaultTypes.PeriodString.TOTAL: return false; - case DefaultTypes.PeriodString.CUSTOM: - var timeRange: number = differenceInDays(service.historyPeriod.value.to, service.historyPeriod.value.from); + case DefaultTypes.PeriodString.CUSTOM: { + const timeRange: number = differenceInDays(service.historyPeriod.value.to, service.historyPeriod.value.from); return isAfter(startOfDay(new Date()), addDays(service.historyPeriod.value.to, timeRange)); + } } } } diff --git a/ui/src/app/shared/pipe/classname/classname.pipe.ts b/ui/src/app/shared/pipe/classname/classname.pipe.ts index 5d761f58ad2..386c9241826 100644 --- a/ui/src/app/shared/pipe/classname/classname.pipe.ts +++ b/ui/src/app/shared/pipe/classname/classname.pipe.ts @@ -5,7 +5,7 @@ import { Pipe, PipeTransform } from '@angular/core'; }) export class ClassnamePipe implements PipeTransform { transform(value, args: string[]): any { - let parts = value.split("."); + const parts = value.split("."); return parts[parts.length - 1]; } } diff --git a/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts b/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts index acc42e39c2c..63651148d51 100644 --- a/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts +++ b/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts @@ -14,7 +14,7 @@ export class FormatSecondsToDurationPipe implements PipeTransform { return Converter.IF_NUMBER(value, (val) => { let minutes = val / 60; - let hours = Math.floor(minutes / 60); + const hours = Math.floor(minutes / 60); minutes -= hours * 60; if (hours <= 23) { return this.decimalPipe.transform(hours, '1.0-0') + 'h' + " " + this.decimalPipe.transform(minutes, '1.0-0') + 'm'; diff --git a/ui/src/app/shared/pipe/keys/keys.pipe.ts b/ui/src/app/shared/pipe/keys/keys.pipe.ts index 456d615a364..7098244b582 100644 --- a/ui/src/app/shared/pipe/keys/keys.pipe.ts +++ b/ui/src/app/shared/pipe/keys/keys.pipe.ts @@ -9,8 +9,8 @@ export class KeysPipe implements PipeTransform { return value; } - let keys = []; - for (let key in value) { + const keys = []; + for (const key in value) { keys.push({ key: key, value: value[key] }); } return keys; diff --git a/ui/src/app/shared/pipe/sign/sign.pipe.ts b/ui/src/app/shared/pipe/sign/sign.pipe.ts index d7cfffe115e..dafe66279b7 100644 --- a/ui/src/app/shared/pipe/sign/sign.pipe.ts +++ b/ui/src/app/shared/pipe/sign/sign.pipe.ts @@ -5,7 +5,7 @@ import { Pipe, PipeTransform } from '@angular/core'; }) export class SignPipe implements PipeTransform { transform(value, args: string[]): any { - let positive = value * -1; + const positive = value * -1; return positive; } } diff --git a/ui/src/app/shared/service/defaulttypes.ts b/ui/src/app/shared/service/defaulttypes.ts index a2d2a28b946..e9762bda4f4 100644 --- a/ui/src/app/shared/service/defaulttypes.ts +++ b/ui/src/app/shared/service/defaulttypes.ts @@ -92,7 +92,7 @@ export module DefaultTypes { params?: string[] } - export enum PeriodString { DAY = 'day', WEEK = 'week', MONTH = 'month', YEAR = 'year', TOTAL = 'total', CUSTOM = 'custom' }; + export enum PeriodString { DAY = 'day', WEEK = 'week', MONTH = 'month', YEAR = 'year', TOTAL = 'total', CUSTOM = 'custom' } /** Values of {@link DefaultTypes.PeriodString} */ export type PeriodStringValues = Exclude<`${DefaultTypes.PeriodString}`, "custom">; diff --git a/ui/src/app/shared/service/myerrorhandler.ts b/ui/src/app/shared/service/myerrorhandler.ts index b6a0bc7a7ed..a4ebbfee278 100644 --- a/ui/src/app/shared/service/myerrorhandler.ts +++ b/ui/src/app/shared/service/myerrorhandler.ts @@ -9,10 +9,10 @@ export class MyErrorHandler implements ErrorHandler { ) { } handleError(error: any) { - let logger = this.injector.get(Logger); + const logger = this.injector.get(Logger); console.error(error); if (error.message) { - let json = { + const json = { error: { message: error.message, }, diff --git a/ui/src/app/shared/service/service.ts b/ui/src/app/shared/service/service.ts index fc01ff93497..5a724cb6fe8 100644 --- a/ui/src/app/shared/service/service.ts +++ b/ui/src/app/shared/service/service.ts @@ -189,14 +189,14 @@ export class Service extends AbstractService { return new Promise((resolve) => { resolve(channels); }); - }; + } public queryEnergy(fromDate: Date, toDate: Date, channels: ChannelAddress[]): Promise { // keep only the date, without time fromDate.setHours(0, 0, 0, 0); toDate.setHours(0, 0, 0, 0); - let promise = { resolve: null, reject: null }; - let response = new Promise((resolve, reject) => { + const promise = { resolve: null, reject: null }; + const response = new Promise((resolve, reject) => { promise.resolve = resolve; promise.reject = reject; }); @@ -210,23 +210,23 @@ export class Service extends AbstractService { this.queryEnergyTimeout = null; // merge requests - let mergedRequests: { + const mergedRequests: { fromDate: Date, toDate: Date, channels: ChannelAddress[], promises: { resolve, reject }[]; }[] = []; let request; - while (request = this.queryEnergyQueue.pop()) { + while ((request = this.queryEnergyQueue.pop())) { if (mergedRequests.length == 0) { mergedRequests.push(request); } else { let merged = false; - for (let mergedRequest of mergedRequests) { + for (const mergedRequest of mergedRequests) { if (mergedRequest.fromDate.valueOf() === request.fromDate.valueOf() && mergedRequest.toDate.valueOf() === request.toDate.valueOf()) { // same date -> merge mergedRequest.promises = mergedRequest.promises.concat(request.promises); - for (let newChannel of request.channels) { + for (const newChannel of request.channels) { let isAlreadyThere = false; - for (let existingChannel of mergedRequest.channels) { + for (const existingChannel of mergedRequest.channels) { if (existingChannel.channelId == newChannel.channelId && existingChannel.componentId == newChannel.componentId) { isAlreadyThere = true; break; @@ -247,27 +247,27 @@ export class Service extends AbstractService { // send merged requests this.getCurrentEdge().then(edge => { - for (let source of mergedRequests) { + for (const source of mergedRequests) { // Jump to next request for empty channelAddresses if (source.channels.length == 0) { continue; } - let request = new QueryHistoricTimeseriesEnergyRequest(DateUtils.maxDate(source.fromDate, edge?.firstSetupProtocol), source.toDate, source.channels); + const request = new QueryHistoricTimeseriesEnergyRequest(DateUtils.maxDate(source.fromDate, edge?.firstSetupProtocol), source.toDate, source.channels); edge.sendRequest(this.websocket, request).then(response => { - let result = (response as QueryHistoricTimeseriesEnergyResponse).result; + const result = (response as QueryHistoricTimeseriesEnergyResponse).result; if (Object.keys(result.data).length != 0) { - for (let promise of source.promises) { + for (const promise of source.promises) { promise.resolve(response as QueryHistoricTimeseriesEnergyResponse); } } else { - for (let promise of source.promises) { + for (const promise of source.promises) { promise.reject(new JsonrpcResponseError(response.id, { code: 0, message: "Result was empty" })); } } }).catch(reason => { - for (let promise of source.promises) { + for (const promise of source.promises) { promise.reject(reason); } }); @@ -299,10 +299,10 @@ export class Service extends AbstractService { const result = (response as GetEdgesResponse).result; // TODO change edges-map to array or other way around - let value = this.metadata.value; - let mappedResult = []; - for (let edge of result.edges) { - let mappedEdge = new Edge( + const value = this.metadata.value; + const mappedResult = []; + for (const edge of result.edges) { + const mappedEdge = new Edge( edge.id, edge.comment, edge.producttype, @@ -340,8 +340,8 @@ export class Service extends AbstractService { return; } this.websocket.sendSafeRequest(new GetEdgeRequest({ edgeId: edgeId })).then((response) => { - let edgeData = (response as GetEdgeResponse).result.edge; - let value = this.metadata.value; + const edgeData = (response as GetEdgeResponse).result.edge; + const value = this.metadata.value; const currentEdge = new Edge( edgeData.id, edgeData.comment, diff --git a/ui/src/app/shared/service/utils.ts b/ui/src/app/shared/service/utils.ts index baea7523ea2..9d1792028c5 100644 --- a/ui/src/app/shared/service/utils.ts +++ b/ui/src/app/shared/service/utils.ts @@ -64,8 +64,8 @@ export class Utils { } else { copy = {}; } - for (let attr in obj) { - if (obj.hasOwnProperty(attr)) { + for (const attr in obj) { + if (Object.prototype.hasOwnProperty.call(obj, attr)) { copy[attr] = this.deepCopy(obj[attr], copy[attr]); } } @@ -214,10 +214,10 @@ export class Utils { * @param bases array of base-strings * @returns true if all filter strings exist in any base-strings */ - public static matchAll(filters: string[], bases: string[]): Boolean { - for (let filter of filters) { + public static matchAll(filters: string[], bases: string[]): boolean { + for (const filter of filters) { let filterMatched = false; - for (let base of bases) { + for (const base of bases) { if (base.includes(filter)) { filterMatched = true; } @@ -255,7 +255,7 @@ export class Utils { if (value == null) { return '-'; } - let thisValue: number = (value / 1000); + const thisValue: number = (value / 1000); if (thisValue >= 0) { return formatNumber(thisValue, 'de', '1.0-1') + ' kW'; @@ -335,7 +335,7 @@ export class Utils { } else { return { name: translate.instant('General.chargePower'), value: power * -1 }; } - }; + } /** @@ -365,7 +365,7 @@ export class Utils { */ public static CONVERT_MINUTE_TO_TIME_OF_DAY = (translate: TranslateService) => { return (value: number): string => { - var date: Date = new Date(); + const date: Date = new Date(); date.setHours(0, 0, 0, 0); date.setMinutes(value); return date.toLocaleTimeString(translate.getBrowserCultureLang(), { hour: '2-digit', minute: '2-digit' }); @@ -434,11 +434,11 @@ export class Utils { public static downloadXlsx(response: Base64PayloadResponse, filename: string) { // decode base64 string, remove space for IE compatibility // source: https://stackoverflow.com/questions/36036280/base64-representing-pdf-to-blob-javascript/45872086 - var binary = atob(response.result.payload.replace(/\s/g, '')); - var len = binary.length; - var buffer = new ArrayBuffer(len); - var view = new Uint8Array(buffer); - for (var i = 0; i < len; i++) { + const binary = atob(response.result.payload.replace(/\s/g, '')); + const len = binary.length; + const buffer = new ArrayBuffer(len); + const view = new Uint8Array(buffer); + for (let i = 0; i < len; i++) { view[i] = binary.charCodeAt(i); } const data: Blob = new Blob([view], { @@ -580,8 +580,8 @@ export class Utils { */ public static calculateOtherConsumption(channelData: HistoryUtils.ChannelData, evcsComponents: EdgeConfig.Component[], consumptionMeterComponents: EdgeConfig.Component[]): number[] { - let totalEvcsConsumption: number[] = []; - let totalMeteredConsumption: number[] = []; + const totalEvcsConsumption: number[] = []; + const totalMeteredConsumption: number[] = []; evcsComponents.forEach(component => { channelData[component.id + '/ChargePower']?.forEach((value, index) => { diff --git a/ui/src/app/shared/service/websocket.ts b/ui/src/app/shared/service/websocket.ts index 7aeceec46e7..65c6e196d99 100644 --- a/ui/src/app/shared/service/websocket.ts +++ b/ui/src/app/shared/service/websocket.ts @@ -79,7 +79,7 @@ export class Websocket implements WebsocketInterface { if (environment.debugMode) { console.info("Websocket connection opened"); } - let token = this.cookieService.get('token'); + const token = this.cookieService.get('token'); if (token) { // Login with Session Token this.login(new AuthenticateWithTokenRequest({ token: token })); @@ -113,7 +113,7 @@ export class Websocket implements WebsocketInterface { ).subscribe(originalMessage => { // Receive message from server - let message: JsonrpcRequest | JsonrpcNotification | JsonrpcResponseSuccess | JsonrpcResponseError = + const message: JsonrpcRequest | JsonrpcNotification | JsonrpcResponseSuccess | JsonrpcResponseError = JsonrpcMessage.from(originalMessage); if (message instanceof JsonrpcRequest) { @@ -159,9 +159,9 @@ export class Websocket implements WebsocketInterface { public login(request: AuthenticateWithPasswordRequest | AuthenticateWithTokenRequest): Promise { return new Promise((resolve) => { this.sendRequest(request).then(r => { - let authenticateResponse = (r as AuthenticateResponse).result; + const authenticateResponse = (r as AuthenticateResponse).result; - let language = Language.getByKey(localStorage.DEMO_LANGUAGE ?? authenticateResponse.user.language.toLocaleLowerCase()); + const language = Language.getByKey(localStorage.DEMO_LANGUAGE ?? authenticateResponse.user.language.toLocaleLowerCase()); localStorage.LANGUAGE = language.key; this.service.setLang(language); this.status = 'online'; @@ -261,7 +261,7 @@ export class Websocket implements WebsocketInterface { console.warn("Request failed [" + request.method + "]", reason.error); if (request instanceof EdgeRpcRequest && reason.error?.code == 3000 /* Edge is not connected */) { - let edges = this.service.metadata.value?.edges ?? {}; + const edges = this.service.metadata.value?.edges ?? {}; if (request.params.edgeId in edges) { edges[request.params.edgeId].isOnline = false; } @@ -288,7 +288,7 @@ export class Websocket implements WebsocketInterface { */ public sendSafeRequest(request: JsonrpcRequest): Promise { return new Promise((resolve, reject) => { - let interval = setInterval(() => { + const interval = setInterval(() => { // TODO: Status should be Observable, furthermore status should be like state-machine if (this.status == 'online') { @@ -359,12 +359,12 @@ export class Websocket implements WebsocketInterface { * @param message the EdgeRpcNotification */ private handleEdgeRpcNotification(edgeRpcNotification: EdgeRpcNotification): void { - let edgeId = edgeRpcNotification.params.edgeId; - let message = edgeRpcNotification.params.payload; + const edgeId = edgeRpcNotification.params.edgeId; + const message = edgeRpcNotification.params.payload; - let edges = this.service.metadata.value?.edges ?? {}; + const edges = this.service.metadata.value?.edges ?? {}; if (edgeId in edges) { - let edge = edges[edgeId]; + const edge = edges[edgeId]; switch (message.method) { case EdgeConfigNotification.METHOD: diff --git a/ui/src/app/shared/service/wsdata.ts b/ui/src/app/shared/service/wsdata.ts index 48585d7686a..a0f8511fa45 100644 --- a/ui/src/app/shared/service/wsdata.ts +++ b/ui/src/app/shared/service/wsdata.ts @@ -34,7 +34,7 @@ export class WsData { // create Promise let promiseResolve: (value?: JsonrpcResponseSuccess | PromiseLike) => void; let promiseReject: (reason?: any) => void; - let promise = new Promise((resolve, reject) => { + const promise = new Promise((resolve, reject) => { promiseResolve = resolve; promiseReject = reject; }); @@ -67,7 +67,7 @@ export class WsData { * @param response */ public handleJsonrpcResponse(response: JsonrpcResponse) { - let promise = this.requestPromises[response.id]; + const promise = this.requestPromises[response.id]; if (promise) { // this was a response on a request if (response instanceof JsonrpcResponseSuccess) { diff --git a/ui/src/app/shared/status/single/status.component.spec.ts b/ui/src/app/shared/status/single/status.component.spec.ts index dcafd1a9ee9..cee24623420 100644 --- a/ui/src/app/shared/status/single/status.component.spec.ts +++ b/ui/src/app/shared/status/single/status.component.spec.ts @@ -43,8 +43,3 @@ describe('StatusComponent', () => { }); }); }); - -// TODO dummy classes for needed services -class Dummy { - -} diff --git a/ui/src/app/shared/status/single/status.component.ts b/ui/src/app/shared/status/single/status.component.ts index f3fae8a36b6..4355d6dba50 100644 --- a/ui/src/app/shared/status/single/status.component.ts +++ b/ui/src/app/shared/status/single/status.component.ts @@ -30,7 +30,7 @@ export class StatusSingleComponent implements OnInit, OnDestroy { ngOnInit() { this.service.getConfig().then(config => { this.config = config; - let categorizedComponentIds: string[] = []; + const categorizedComponentIds: string[] = []; this.components = config.listActiveComponents(categorizedComponentIds); this.components.forEach(categorizedComponent => { categorizedComponent.components.forEach(component => { diff --git a/ui/src/app/shared/test/utils.spec.ts b/ui/src/app/shared/test/utils.spec.ts index a94f83dbc00..22138e70405 100644 --- a/ui/src/app/shared/test/utils.spec.ts +++ b/ui/src/app/shared/test/utils.spec.ts @@ -34,7 +34,7 @@ export async function sharedSetup(): Promise { translate: TestBed.inject(TranslateService), service: TestBed.inject(Service), }; -}; +} export function removeFunctions(obj: any): any { if (typeof obj !== 'object' || obj === null) { diff --git a/ui/src/app/shared/type/channeladdress.ts b/ui/src/app/shared/type/channeladdress.ts index 7539bdccb9c..a29f08cd0ab 100644 --- a/ui/src/app/shared/type/channeladdress.ts +++ b/ui/src/app/shared/type/channeladdress.ts @@ -6,7 +6,7 @@ export class ChannelAddress { * @param address in the form 'Component-ID/Channel-ID' */ public static fromString(address: string): ChannelAddress { - let array = address.split('/', 2); + const array = address.split('/', 2); return new ChannelAddress(array[0], array[1]); } diff --git a/ui/src/app/shared/type/language.ts b/ui/src/app/shared/type/language.ts index beb03815b9e..27eb8d133e9 100644 --- a/ui/src/app/shared/type/language.ts +++ b/ui/src/app/shared/type/language.ts @@ -17,7 +17,7 @@ import ja from 'src/assets/i18n/ja.json'; export class MyTranslateLoader implements TranslateLoader { public getTranslation(key: string): Observable { - var language = Language.getByKey(key); + const language = Language.getByKey(key); if (language) { return of(language.json); } @@ -39,7 +39,7 @@ export class Language { public static readonly DEFAULT = Language.DE; public static getByKey(key: string): Language | null { - for (let language of Language.ALL) { + for (const language of Language.ALL) { if (language.key == key) { return language; diff --git a/ui/src/app/shared/type/widget.ts b/ui/src/app/shared/type/widget.ts index 5e94da10de1..474955e1efe 100644 --- a/ui/src/app/shared/type/widget.ts +++ b/ui/src/app/shared/type/widget.ts @@ -44,7 +44,7 @@ export type Icon = { } export class Widget { - public name: WidgetNature | WidgetFactory | String; + public name: WidgetNature | WidgetFactory | string; public componentId: string; } @@ -52,7 +52,7 @@ export class Widgets { public static parseWidgets(edge: Edge, config: EdgeConfig): Widgets { - let classes: String[] = Object.values(WidgetClass) // + const classes: string[] = Object.values(WidgetClass) // .filter(v => typeof v === 'string') .filter(clazz => { if (!edge.isVersionAtLeast('2018.8')) { @@ -78,13 +78,13 @@ export class Widgets { return config.hasProducer(); case 'Controller_ChannelThreshold': return config.getComponentIdsByFactory('Controller.ChannelThreshold')?.length > 0; - }; + } return false; }).map(clazz => clazz.toString()); - let list: Widget[] = []; + const list: Widget[] = []; - for (let nature of Object.values(WidgetNature).filter(v => typeof v === 'string')) { - for (let componentId of config.getComponentIdsImplementingNature(nature.toString())) { + for (const nature of Object.values(WidgetNature).filter(v => typeof v === 'string')) { + for (const componentId of config.getComponentIdsImplementingNature(nature.toString())) { if (nature === 'io.openems.edge.io.api.DigitalInput' && list.some(e => e.name === 'io.openems.edge.io.api.DigitalInput')) { continue; } @@ -93,8 +93,8 @@ export class Widgets { } } } - for (let factory of Object.values(WidgetFactory).filter(v => typeof v === 'string')) { - for (let componentId of config.getComponentIdsByFactory(factory.toString())) { + for (const factory of Object.values(WidgetFactory).filter(v => typeof v === 'string')) { + for (const componentId of config.getComponentIdsByFactory(factory.toString())) { if (config.getComponent(componentId).isEnabled) { list.push({ name: factory, componentId: componentId }); } @@ -137,11 +137,11 @@ export class Widgets { /** * List of Widget-Classes. */ - public readonly classes: String[], + public readonly classes: string[], ) { // fill names - for (let widget of list) { - let name: string = widget.name.toString(); + for (const widget of list) { + const name: string = widget.name.toString(); if (!this.names.includes(name)) { this.names.push(name); } diff --git a/ui/src/app/shared/utils/color/color.utils.ts b/ui/src/app/shared/utils/color/color.utils.ts index cd424a03897..c2041facddf 100644 --- a/ui/src/app/shared/utils/color/color.utils.ts +++ b/ui/src/app/shared/utils/color/color.utils.ts @@ -29,8 +29,8 @@ export namespace ColorUtils { return null; } - var rgba = color.split('(').pop().split(')')[0]; - var rgb = rgba.split(',').slice(0, -1).join(','); + const rgba = color.split('(').pop().split(')')[0]; + const rgb = rgba.split(',').slice(0, -1).join(','); return 'rgba(' + rgb + ',' + (opacity ?? 0) + ')'; } diff --git a/ui/src/app/shared/utils/date/dateutils.ts b/ui/src/app/shared/utils/date/dateutils.ts index 8c4925b181f..9ec1355b01f 100644 --- a/ui/src/app/shared/utils/date/dateutils.ts +++ b/ui/src/app/shared/utils/date/dateutils.ts @@ -9,7 +9,7 @@ export namespace DateUtils { */ export function maxDate(...dates: Date[]) { - if (dates.length === 0 || dates.every(element => typeof element === null)) { + if (dates.length === 0 || dates.every(element => element === null)) { return null; } @@ -26,7 +26,7 @@ export namespace DateUtils { */ export function minDate(...dates: Date[]) { - if (dates.length === 0 || dates.every(element => typeof element === null)) { + if (dates.length === 0 || dates.every(element => element === null)) { return null; } diff --git a/ui/src/app/shared/utils/datetime/datetime-utils.ts b/ui/src/app/shared/utils/datetime/datetime-utils.ts index a3848e93731..76af3902b26 100644 --- a/ui/src/app/shared/utils/datetime/datetime-utils.ts +++ b/ui/src/app/shared/utils/datetime/datetime-utils.ts @@ -18,21 +18,21 @@ export class DateTimeUtils { public static normalizeTimestamps(unit: ChronoUnit.Type, energyPerPeriodResponse: QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse): QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse { switch (unit) { - case ChronoUnit.Type.MONTHS: + case ChronoUnit.Type.MONTHS: { // Change first timestamp to start of month const formattedDate = startOfMonth(DateUtils.stringToDate(energyPerPeriodResponse.result.timestamps[0])); energyPerPeriodResponse.result.timestamps[0] = format(formattedDate, 'yyyy-MM-dd HH:mm:ss', { locale: de })?.toString() ?? energyPerPeriodResponse.result.timestamps[0]; // show 12 stacks, even if no data and timestamps - let newTimestamps: string[] = []; + const newTimestamps: string[] = []; const firstTimestamp = DateUtils.stringToDate(energyPerPeriodResponse.result.timestamps[0]); if (firstTimestamp.getMonth() !== 0) { for (let i = 0; i <= (firstTimestamp.getMonth() - 1); i++) { newTimestamps.push(new Date(firstTimestamp.getFullYear(), i).toString()); - for (let channel of Object.keys(energyPerPeriodResponse.result.data)) { + for (const channel of Object.keys(energyPerPeriodResponse.result.data)) { energyPerPeriodResponse.result.data[channel.toString()]?.unshift(null); } } @@ -40,14 +40,16 @@ export class DateTimeUtils { energyPerPeriodResponse.result.timestamps = newTimestamps.concat(energyPerPeriodResponse.result.timestamps); break; + } - case ChronoUnit.Type.YEARS: + case ChronoUnit.Type.YEARS: { // Change dates to be first day of year const formattedDates = energyPerPeriodResponse.result.timestamps.map((timestamp) => startOfYear(DateUtils.stringToDate(timestamp))); energyPerPeriodResponse.result.timestamps = formattedDates.map(date => format(date, 'yyyy-MM-dd HH:mm:ss', { locale: de })?.toString()); break; + } } return energyPerPeriodResponse; diff --git a/ui/src/app/shared/utils/time/timeutils.ts b/ui/src/app/shared/utils/time/timeutils.ts index b0db593142e..d53491fbc34 100644 --- a/ui/src/app/shared/utils/time/timeutils.ts +++ b/ui/src/app/shared/utils/time/timeutils.ts @@ -18,7 +18,7 @@ export class TimeUtils { const decimalPipe: DecimalPipe = new DecimalPipe(locale ?? Language.DEFAULT.key); let minutes = value / 60; - let hours = Math.floor(minutes / 60); + const hours = Math.floor(minutes / 60); minutes -= hours * 60; if (hours <= 23 && minutes > 0) { diff --git a/ui/src/app/user/user.component.ts b/ui/src/app/user/user.component.ts index 66723bb1178..35d71138e2e 100644 --- a/ui/src/app/user/user.component.ts +++ b/ui/src/app/user/user.component.ts @@ -60,7 +60,7 @@ export class UserComponent implements OnInit { } public applyChanges() { - let user = { + const user = { user: { lastname: this.form.model.lastname, firstname: this.form.model.firstname, @@ -208,10 +208,10 @@ export class UserComponent implements OnInit { public getUserInformation(): Promise { return new Promise(resolve => { - var interval = setInterval(() => { + const interval = setInterval(() => { if (this.websocket.status == 'online') { this.service.websocket.sendRequest(new GetUserInformationRequest()).then((response: GetUserInformationResponse) => { - let user = response.result.user; + const user = response.result.user; resolve({ lastname: user.lastname, From 679c81a624984d8184d90fc0747dfcdc6a7be241 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Sun, 31 Mar 2024 17:12:30 +0200 Subject: [PATCH 28/28] Push version to 2024.4.0 --- io.openems.common/src/io/openems/common/OpenemsConstants.java | 2 +- ui/package-lock.json | 3 ++- ui/package.json | 2 +- ui/src/app/changelog/view/component/changelog.constants.ts | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index d0b6d35e4f5..0a1448b2574 100644 --- a/io.openems.common/src/io/openems/common/OpenemsConstants.java +++ b/io.openems.common/src/io/openems/common/OpenemsConstants.java @@ -36,7 +36,7 @@ public class OpenemsConstants { /** * The additional version string. */ - public static final String VERSION_STRING = "SNAPSHOT"; + public static final String VERSION_STRING = ""; /** * The complete version as a SemanticVersion. diff --git a/ui/package-lock.json b/ui/package-lock.json index cef3d63ec97..ffd2d30c97d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2024.4.0-SNAPSHOT", + "version": "2024.4.0", "lockfileVersion": 3, "requires": true, "packages": { @@ -9011,6 +9011,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ diff --git a/ui/package.json b/ui/package.json index 556b5739013..9b6c856ed55 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2024.4.0-SNAPSHOT", + "version": "2024.4.0", "license": "AGPL-3.0", "private": true, "dependencies": { diff --git a/ui/src/app/changelog/view/component/changelog.constants.ts b/ui/src/app/changelog/view/component/changelog.constants.ts index 4a1a9146df5..0e63559e85b 100644 --- a/ui/src/app/changelog/view/component/changelog.constants.ts +++ b/ui/src/app/changelog/view/component/changelog.constants.ts @@ -2,7 +2,7 @@ import { Role } from "src/app/shared/type/role"; export class Changelog { - public static readonly UI_VERSION = "2024.4.0-SNAPSHOT"; + public static readonly UI_VERSION = "2024.4.0"; public static product(...products: Product[]) { return products.map(product => Changelog.link(product.name, product.url)).join(", ") + '. ';