From df2a6a0a644a62099c8595a29c97518405dc5df6 Mon Sep 17 00:00:00 2001 From: Justin Barno Date: Wed, 15 Jul 2020 15:55:52 -0700 Subject: [PATCH] New support for having validation events in addition to reference events. * Do not alter the calibration or measurements and are intended to serve as a way to compare asssessments. * Appear as black squares in the Mw related plots and as a blue dashed line in the spectra plots. * Can be created from reference events by selecting the reference event in the table and right-clicking->"Toggle Validation". * Two new related columns for validation Mw and validation stress in the Mw tables; hidden by default in the expanded column list ("+"). * The map now includes a scalebar and distance measurement tool. * Site/Measurement now share a common set of diagnostic plots for easier validation during routine measurement. * Added event depth field to the headers on the envelope tool output, a column for depth on the data tab, and to the JSON in/output for calibration. * Support for cancelling in progress calibrations. * Corrected an issue when plotting waveforms with synthetic models producing exactly one point at the given time-scale for the plots. * Corrected a pagination bug with the multiple-waveform plot when plotting waveforms >= page-size but < 2 * page-size. --- README.md | 6 +- calibration-gui/pom.xml | 18 +- .../calibration/gui/CodaGuiController.java | 2 + .../AbstractMeasurementController.java | 1050 ++++++++++++++++ .../CodaParamLoadingController.java | 203 +-- .../gui/controllers/DataController.java | 12 + .../controllers/MeasuredMwsController.java | 740 ++--------- .../gui/controllers/PathController.java | 2 +- .../ReferenceEventLoadingController.java | 6 +- .../gui/controllers/SiteController.java | 1072 ++-------------- .../controllers/SpectraPlotController.java | 64 + .../converters/param/CodaJsonParamLoader.java | 21 +- .../gui/data/client/CalibrationWebClient.java | 13 + ...ventWebClient.java => EventWebClient.java} | 51 +- .../gui/data/client/SpectraWebClient.java | 12 + .../data/client/api/CalibrationClient.java | 2 + .../client/api/CalibrationJsonConstants.java | 3 +- ...renceEventClient.java => EventClient.java} | 23 +- .../gui/data/client/api/SpectraClient.java | 5 +- .../data/exporters/JsonTempFileWriter.java | 42 +- .../gui/data/exporters/ParamExporter.java | 20 +- .../api/ValidationMwTempFileWriter.java | 26 + .../gui/plotting/CodaWaveformPlot.java | 43 +- .../gui/plotting/CodaWaveformPlotManager.java | 11 +- .../gui/plotting/SpectralPlot.java | 3 + .../apps/coda/calibration/gui/util/Axis.java | 18 + .../src/main/resources/fxml/Data.fxml | 1 + .../src/main/resources/fxml/MeasuredMws.fxml | 157 ++- .../src/main/resources/fxml/Site.fxml | 78 +- .../param/CodaJsonParamLoaderTest.java | 11 + .../resources/calibration-params-test.json | 1087 +++++++++-------- .../calibration-application/pom.xml | 16 +- .../web/CalibrationJsonController.java | 27 +- .../web/SpectraMeasurementJsonController.java | 8 + .../web/ValidationEventsJsonController.java | 78 ++ .../calibration-integration/pom.xml | 6 +- calibration-service/calibration-model/pom.xml | 16 +- .../model/domain/MeasuredMwDetails.java | 130 +- .../model/domain/ValidationMwParameters.java | 149 +++ .../ReferenceMwParametersFileMixin.java | 3 - .../ValidationMwParametersFileMixin.java | 20 +- .../calibration-repository/pom.xml | 16 +- ...ationShapeFitterConstraintsRepository.java | 2 +- .../MdacParametersFiRepository.java | 2 +- .../MdacParametersPsRepository.java | 2 +- .../repository/MeasuredMwsRepository.java | 2 +- .../PathCalibrationMeasurementRepository.java | 2 +- .../PeakVelocityMeasurementRepository.java | 2 +- .../ReferenceMwParametersRepository.java | 2 +- .../ShapeMeasurementRepository.java | 2 +- ...aredFrequencyBandParametersRepository.java | 2 +- ...SiteFrequencyBandParametersRepository.java | 2 +- .../SpectraMeasurementRepository.java | 2 +- .../repository/SyntheticRepository.java | 2 +- .../ValidationMwParametersRepository.java | 34 + .../VelocityConfigurationRepository.java | 2 +- .../calibration-service-api/pom.xml | 10 +- .../service/api/CalibrationService.java | 6 +- .../service/api/PathCalibrationService.java | 2 +- .../api/ReferenceMwParametersService.java | 4 +- .../service/api/ShapeCalibrationService.java | 2 +- .../api/SpectraMeasurementService.java | 2 + .../api/ValidationMwParametersService.java | 31 + .../calibration-service-impl/pom.xml | 8 +- .../service/impl/CalibrationServiceImpl.java | 151 ++- .../service/impl/ConcurrencyUtils.java | 23 + .../service/impl/Joint1DPathCorrection.java | 15 +- .../service/impl/MeasuredMwsServiceImpl.java | 30 +- .../ReferenceMwParametersServiceImpl.java | 5 + .../impl/ShapeCalibrationServiceImpl.java | 11 +- .../impl/SpectraMeasurementServiceImpl.java | 17 +- .../ValidationMwParametersServiceImpl.java | 134 ++ .../processing/MaxVelocityCalculator.java | 5 +- .../impl/processing/ShapeCalculator.java | 25 +- calibration-service/pom.xml | 6 +- calibration-standalone/pom.xml | 16 +- .../data/client/CalibrationLocalClient.java | 5 + ...LocalClient.java => EventLocalClient.java} | 48 +- .../data/client/SpectraLocalClient.java | 7 + common-gui/pom.xml | 12 +- .../common/gui/controllers/ProgressGui.java | 7 + .../gui/converters/sac/SacExporter.java | 116 +- .../common/gui/converters/sac/SacLoader.java | 11 +- .../gui/data/client/CodaWebClientBuilder.java | 1 - .../coda/common/gui/util/ProgressMonitor.java | 37 + .../main/resources/fxml/ProgressDisplay.fxml | 4 +- .../main/resources/fxml/ProgressMonitor.fxml | 7 +- .../gui/converters/sac/SacExporterTest.java | 43 +- .../gui/converters/sac/SacLoaderTest.java | 37 +- common-service/common-application/pom.xml | 16 +- common-service/common-model/pom.xml | 12 +- .../apps/coda/common/model/domain/Event.java | 28 +- .../coda/common/model/util/SPECTRA_TYPES.java | 2 +- common-service/common-repository/pom.xml | 14 +- .../repository/DetachableJpaRepoImpl.java | 14 +- .../repository/DetachableJpaRepository.java | 33 + .../repository/WaveformPickRepository.java | 2 +- .../common/repository/WaveformRepository.java | 2 +- common-service/common-service-api/pom.xml | 10 +- common-service/common-service-impl/pom.xml | 8 +- common-service/pom.xml | 6 +- envelope-gui/pom.xml | 14 +- envelope-service/envelope-application/pom.xml | 16 +- envelope-service/envelope-model/pom.xml | 10 +- envelope-service/envelope-repository/pom.xml | 14 +- envelope-service/envelope-service-api/pom.xml | 10 +- .../envelope-service-impl/pom.xml | 8 +- envelope-service/pom.xml | 6 +- envelope-standalone/pom.xml | 8 +- externals/pom.xml | 14 +- .../llnl/gnem/core/io/SAC/SACFileReader.java | 27 - .../java/llnl/gnem/core/util/Passband.java | 53 +- mapping/pom.xml | 12 +- .../main/resources/leaflet/images/cancel.png | Bin 0 -> 397 bytes .../main/resources/leaflet/images/cancel.svg | 6 + .../resources/leaflet/images/cancel_@2X.png | Bin 0 -> 762 bytes .../main/resources/leaflet/images/check.png | Bin 0 -> 387 bytes .../main/resources/leaflet/images/check.svg | 5 + .../resources/leaflet/images/check_@2X.png | Bin 0 -> 692 bytes .../main/resources/leaflet/images/focus.png | Bin 0 -> 326 bytes .../main/resources/leaflet/images/focus.svg | 5 + .../resources/leaflet/images/focus_@2X.png | Bin 0 -> 462 bytes .../leaflet/images/leaflet-measure.png | Bin 0 -> 609197 bytes .../main/resources/leaflet/images/rulers.png | Bin 0 -> 192 bytes .../main/resources/leaflet/images/rulers.svg | 6 + .../resources/leaflet/images/rulers_@2X.png | Bin 0 -> 277 bytes .../main/resources/leaflet/images/start.png | Bin 0 -> 491 bytes .../main/resources/leaflet/images/start.svg | 6 + .../resources/leaflet/images/start_@2X.png | Bin 0 -> 1003 bytes .../main/resources/leaflet/images/trash.png | Bin 0 -> 279 bytes .../main/resources/leaflet/images/trash.svg | 5 + .../resources/leaflet/images/trash_@2X.png | Bin 0 -> 460 bytes .../leaflet/leaflet-measure-license.txt | 21 + .../resources/leaflet/leaflet-measure.css | 1 + .../main/resources/leaflet/leaflet-measure.js | 1 + .../src/main/resources/leaflet/leaflet.html | 19 +- pom.xml | 53 +- schema/calibration-input-params.json.example | 175 +-- schema/calibration-input-params.jsonschema | 44 + 139 files changed, 3752 insertions(+), 3103 deletions(-) create mode 100644 calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/AbstractMeasurementController.java create mode 100644 calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SpectraPlotController.java rename calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/{ReferenceEventWebClient.java => EventWebClient.java} (66%) rename calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/{ReferenceEventClient.java => EventClient.java} (77%) create mode 100644 calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/api/ValidationMwTempFileWriter.java create mode 100644 calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/util/Axis.java create mode 100644 calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/ValidationEventsJsonController.java create mode 100644 calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/ValidationMwParameters.java rename common-service/common-application/src/main/java/gov/llnl/gnem/apps/coda/common/application/config/WebMvcConfiguration.java => calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ValidationMwParametersFileMixin.java (57%) create mode 100644 calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ValidationMwParametersRepository.java create mode 100644 calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ValidationMwParametersService.java create mode 100644 calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ConcurrencyUtils.java create mode 100644 calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ValidationMwParametersServiceImpl.java rename calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/{ReferenceEventLocalClient.java => EventLocalClient.java} (69%) create mode 100644 common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepository.java create mode 100755 mapping/src/main/resources/leaflet/images/cancel.png create mode 100755 mapping/src/main/resources/leaflet/images/cancel.svg create mode 100755 mapping/src/main/resources/leaflet/images/cancel_@2X.png create mode 100755 mapping/src/main/resources/leaflet/images/check.png create mode 100755 mapping/src/main/resources/leaflet/images/check.svg create mode 100755 mapping/src/main/resources/leaflet/images/check_@2X.png create mode 100755 mapping/src/main/resources/leaflet/images/focus.png create mode 100755 mapping/src/main/resources/leaflet/images/focus.svg create mode 100755 mapping/src/main/resources/leaflet/images/focus_@2X.png create mode 100644 mapping/src/main/resources/leaflet/images/leaflet-measure.png create mode 100755 mapping/src/main/resources/leaflet/images/rulers.png create mode 100755 mapping/src/main/resources/leaflet/images/rulers.svg create mode 100644 mapping/src/main/resources/leaflet/images/rulers_@2X.png create mode 100755 mapping/src/main/resources/leaflet/images/start.png create mode 100755 mapping/src/main/resources/leaflet/images/start.svg create mode 100755 mapping/src/main/resources/leaflet/images/start_@2X.png create mode 100755 mapping/src/main/resources/leaflet/images/trash.png create mode 100644 mapping/src/main/resources/leaflet/images/trash.svg create mode 100755 mapping/src/main/resources/leaflet/images/trash_@2X.png create mode 100644 mapping/src/main/resources/leaflet/leaflet-measure-license.txt create mode 100644 mapping/src/main/resources/leaflet/leaflet-measure.css create mode 100644 mapping/src/main/resources/leaflet/leaflet-measure.js diff --git a/README.md b/README.md index 8b8773d5..5ced1505 100644 --- a/README.md +++ b/README.md @@ -42,18 +42,18 @@ We don't presently deploy versioned artifacts into a public repository like the #### **As a single runnable JAR** ```shell -java -jar coda-calibration/calibration-standalone/target/calibration-standalone-1.0.8-runnable.jar +java -jar coda-calibration/calibration-standalone/target/calibration-standalone-1.0.9-runnable.jar ``` #### **GUI alone** ```shell -java -jar coda-calibration/calibration-gui/target/calibration-gui-1.0.8-runnable.jar +java -jar coda-calibration/calibration-gui/target/calibration-gui-1.0.9-runnable.jar ``` #### **Calibration REST service alone** ```shell -java -jar coda-calibration/calibration-service/application/target/application-1.0.8-runnable.jar +java -jar coda-calibration/calibration-service/application/target/application-1.0.9-runnable.jar ``` #### A note about HTTPS diff --git a/calibration-gui/pom.xml b/calibration-gui/pom.xml index 931a1847..374102ca 100644 --- a/calibration-gui/pom.xml +++ b/calibration-gui/pom.xml @@ -1,23 +1,23 @@ - + 4.0.0 gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 calibration-gui jar calibration-gui - http://www.llnl.gov + https://www.llnl.gov Lawrence Livermore National Laboratory (LLNL) - http://www.llnl.gov + https://www.llnl.gov @@ -37,7 +37,7 @@ spring-milestones - http://repo.spring.io/milestone + https://repo.spring.io/milestone @@ -62,10 +62,6 @@ org.eclipse.persistence javax.persistence - - io.springlets - springlets-context - org.aspectj aspectjweaver diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/CodaGuiController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/CodaGuiController.java index 689ac5ec..1151ed41 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/CodaGuiController.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/CodaGuiController.java @@ -456,6 +456,7 @@ private void listener(CalibrationStatusEvent event) { if (!monitors.containsKey(event.getId()) && event.getStatus() == Status.STARTING) { CalibrationProgressListener eventMonitor = new CalibrationProgressListener(bus, event); ProgressMonitor monitor = new ProgressMonitor("Calibration Progress " + event.getId(), eventMonitor); + monitor.addCancelCallback(() -> calibrationClient.cancelCalibration(event.getId()).subscribe()); monitors.put(event.getId(), monitor); loadingGui.addProgressMonitor(monitor); loadingGui.show(); @@ -465,6 +466,7 @@ private void listener(CalibrationStatusEvent event) { final ProgressMonitor monitor = monitors.remove(event.getId()); if (monitor != null) { monitor.setProgressStage("Finished"); + monitor.clearCancelCallbacks(); service.schedule(() -> loadingGui.removeProgressMonitor(monitor), 15, TimeUnit.MINUTES); } } else { diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/AbstractMeasurementController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/AbstractMeasurementController.java new file mode 100644 index 00000000..2f10a390 --- /dev/null +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/AbstractMeasurementController.java @@ -0,0 +1,1050 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.gui.controllers; + +import java.awt.Color; +import java.awt.event.MouseEvent; +import java.awt.geom.Point2D; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.text.NumberFormat; +import java.time.Duration; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.DoubleSummaryStatistics; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Observable; +import java.util.Observer; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import javax.swing.SwingUtilities; + +import org.apache.batik.svggen.SVGGraphics2DIOException; +import org.apache.commons.math3.stat.descriptive.SummaryStatistics; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; + +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ParameterClient; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.SpectraClient; +import gov.llnl.gnem.apps.coda.calibration.gui.plotting.MapPlottingUtilities; +import gov.llnl.gnem.apps.coda.calibration.gui.plotting.SpectralPlot; +import gov.llnl.gnem.apps.coda.calibration.gui.util.Axis; +import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; +import gov.llnl.gnem.apps.coda.calibration.model.domain.Spectra; +import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurement; +import gov.llnl.gnem.apps.coda.common.gui.data.client.api.WaveformClient; +import gov.llnl.gnem.apps.coda.common.gui.events.WaveformSelectionEvent; +import gov.llnl.gnem.apps.coda.common.gui.plotting.LabeledPlotPoint; +import gov.llnl.gnem.apps.coda.common.gui.plotting.PlotPoint; +import gov.llnl.gnem.apps.coda.common.gui.plotting.SymbolStyleMapFactory; +import gov.llnl.gnem.apps.coda.common.gui.util.CellBindingUtils; +import gov.llnl.gnem.apps.coda.common.gui.util.MaybeNumericStringComparator; +import gov.llnl.gnem.apps.coda.common.gui.util.NumberFormatFactory; +import gov.llnl.gnem.apps.coda.common.gui.util.SnapshotUtils; +import gov.llnl.gnem.apps.coda.common.mapping.api.GeoMap; +import gov.llnl.gnem.apps.coda.common.model.domain.Event; +import gov.llnl.gnem.apps.coda.common.model.domain.Pair; +import gov.llnl.gnem.apps.coda.common.model.domain.Waveform; +import gov.llnl.gnem.apps.coda.common.model.messaging.WaveformChangeEvent; +import javafx.application.Platform; +import javafx.beans.binding.Bindings; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.embed.swing.SwingFXUtils; +import javafx.embed.swing.SwingNode; +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.geometry.Insets; +import javafx.scene.control.Button; +import javafx.scene.control.ComboBox; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.Label; +import javafx.scene.control.MenuItem; +import javafx.scene.control.Tab; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableColumn.CellDataFeatures; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.scene.image.ImageView; +import javafx.scene.input.MouseButton; +import javafx.scene.layout.StackPane; +import llnl.gnem.core.gui.plotting.HorizPinEdge; +import llnl.gnem.core.gui.plotting.PaintMode; +import llnl.gnem.core.gui.plotting.PenStyle; +import llnl.gnem.core.gui.plotting.PlotObjectClicked; +import llnl.gnem.core.gui.plotting.SymbolLegend; +import llnl.gnem.core.gui.plotting.SymbolLegend.SymbolTextPair; +import llnl.gnem.core.gui.plotting.VertPinEdge; +import llnl.gnem.core.gui.plotting.color.ColorMap; +import llnl.gnem.core.gui.plotting.color.ViridisColorMap; +import llnl.gnem.core.gui.plotting.jmultiaxisplot.JMultiAxisPlot; +import llnl.gnem.core.gui.plotting.jmultiaxisplot.JSubplot; +import llnl.gnem.core.gui.plotting.plotobject.Circle; +import llnl.gnem.core.gui.plotting.plotobject.Line; +import llnl.gnem.core.gui.plotting.plotobject.PlotObject; +import llnl.gnem.core.gui.plotting.plotobject.Square; +import llnl.gnem.core.gui.plotting.plotobject.Symbol; +import llnl.gnem.core.gui.plotting.plotobject.SymbolDef; +import llnl.gnem.core.gui.plotting.plotobject.SymbolFactory; +import llnl.gnem.core.gui.plotting.plotobject.SymbolStyle; + +public abstract class AbstractMeasurementController implements MapListeningController, RefreshableController, ScreenshotEnabledController { + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + private static final int MAX_LEGEND_COLORS = 8; + private static final Boolean SHOW_LEGEND = Boolean.TRUE; + private static final Boolean HIDE_LEGEND = Boolean.FALSE; + + @FXML + protected Tab resultsTab; + + @FXML + protected SwingNode mwPlotSwingNode; + private JMultiAxisPlot mwPlot; + private JSubplot mwPlotFigure; + private Line mwZeroLine; + + @FXML + protected SwingNode stressPlotSwingNode; + private JMultiAxisPlot stressPlot; + private JSubplot stressPlotFigure; + private Line stressZeroLine; + + @FXML + protected SwingNode sdPlotSwingNode; + private JMultiAxisPlot sdPlot; + private JSubplot sdPlotFigure; + + protected StackPane spectraPlotPanel; + + @FXML + protected ComboBox evidCombo; + + @FXML + protected TableView eventTable; + + @FXML + protected TableView iconTable; + + @FXML + protected TableColumn evidCol; + + @FXML + protected TableColumn mwCol; + + @FXML + protected TableColumn stressCol; + + @FXML + protected TableColumn measuredMwCol; + + @FXML + protected TableColumn measuredStressCol; + + @FXML + protected TableColumn valMwCol; + + @FXML + protected TableColumn valStressCol; + + @FXML + protected TableColumn mistfitCol; + + @FXML + protected TableColumn measuredCornerFreqCol; + + @FXML + protected TableColumn measuredMwUq1LowCol; + + @FXML + protected TableColumn measuredMwUq1HighCol; + + @FXML + protected TableColumn measuredMwUq2LowCol; + + @FXML + protected TableColumn measuredMwUq2HighCol; + + @FXML + protected TableColumn iterationsCol; + + @FXML + protected TableColumn dataCountCol; + + @FXML + protected TableColumn iconCol; + + @FXML + protected TableColumn stationCol; + + @FXML + protected TextField eventTime; + + @FXML + protected TextField eventLoc; + + protected List spectralMeasurements = new ArrayList<>(); + private ObservableList evids = FXCollections.observableArrayList(); + + protected SpectraClient spectraClient; + private ParameterClient paramClient; + protected EventClient referenceEventClient; + protected WaveformClient waveformClient; + + protected ObservableList mwParameters = FXCollections.observableArrayList(); + + private ObservableList stationSymbols = FXCollections.observableArrayList(); + private BiConsumer eventSelectionCallback; + private BiConsumer stationSelectionCallback; + + private Map> plotPointMap = new HashMap<>(); + private final List selectedPoints = new ArrayList<>(); + + private SymbolStyleMapFactory symbolStyleMapFactory; + private Map symbolStyleMap; + + private GeoMap mapImpl; + + private MapPlottingUtilities iconFactory; + + private MenuItem exclude; + private MenuItem include; + protected ContextMenu menu; + + private final NumberFormat dfmt4 = NumberFormatFactory.fourDecimalOneLeadingZero(); + + private ColorMap colorMap = new ViridisColorMap(); + private final AtomicReference minFreq = new AtomicReference<>(1.0); + private final AtomicReference maxFreq = new AtomicReference<>(-0.0); + + private final AtomicReference minY = new AtomicReference<>(1.0); + private final AtomicReference maxY = new AtomicReference<>(-0.0); + + @FXML + protected Button xAxisShrink; + private boolean shouldXAxisShrink = false; + + @FXML + protected Button yAxisShrink; + private boolean shouldYAxisShrink = false; + + private boolean isVisible = false; + + protected List spectraControllers = new ArrayList<>(1); + private EventBus bus; + + protected EventHandler menuHideHandler = (evt) -> { + if (MouseButton.SECONDARY != evt.getButton()) { + menu.hide(); + } + }; + + //TODO: Break this up into components so this isn't so incredibly huge. + public AbstractMeasurementController(SpectraClient spectraClient, ParameterClient paramClient, EventClient referenceEventClient, WaveformClient waveformClient, SymbolStyleMapFactory styleFactory, + GeoMap map, MapPlottingUtilities iconFactory, EventBus bus) { + this.spectraClient = spectraClient; + this.paramClient = paramClient; + this.referenceEventClient = referenceEventClient; + this.waveformClient = waveformClient; + this.symbolStyleMapFactory = styleFactory; + this.mapImpl = map; + this.bus = bus; + this.iconFactory = iconFactory; + + eventSelectionCallback = (selected, eventId) -> { + selectDataByCriteria(selected, eventId); + }; + + stationSelectionCallback = (selected, stationId) -> { + selectDataByCriteria(selected, stationId); + }; + + this.bus.register(this); + } + + protected abstract String getDisplayName(); + + protected abstract List getFitSpectra(); + + protected abstract void setActive(List waveforms, List plotObjects, boolean active, BiConsumer, Boolean> activationFunc); + + protected abstract List getSpectraData(); + + protected abstract void runGuiUpdate(Runnable runnable) throws InvocationTargetException, InterruptedException; + + protected abstract List getEvents(); + + public void initialize() { + evidCombo.setItems(evids); + + configureAxisShrink(xAxisShrink, () -> { + shouldXAxisShrink = !shouldXAxisShrink; + return shouldXAxisShrink; + }, Axis.X); + + configureAxisShrink(yAxisShrink, () -> { + shouldYAxisShrink = !shouldYAxisShrink; + return shouldYAxisShrink; + }, Axis.Y); + + SwingUtilities.invokeLater(() -> { + mwPlot = new JMultiAxisPlot(); + mwPlotFigure = mwPlot.addSubplot(); + + mwPlot.getTitle().setText("Mw comparison"); + mwPlot.getXaxis().setLabelText("Measured"); + mwPlot.setYaxisVisibility(true); + mwPlotSwingNode.setContent(mwPlot); + + mwPlotFigure.getYaxis().setLabelOffset(2.5d * mwPlot.getXaxis().getLabelOffset()); + mwPlotFigure.setAxisLimits(0.0, 10.0, 0.0, 10.0); + mwPlotFigure.getYaxis().setLabelText("Reference (red), Validation (black)"); + + stressPlot = new JMultiAxisPlot(); + stressPlotFigure = stressPlot.addSubplot(); + + stressPlot.getTitle().setText("Stress comparison"); + stressPlot.getXaxis().setLabelText("Measured"); + stressPlot.setYaxisVisibility(true); + stressPlotSwingNode.setContent(stressPlot); + + stressPlotFigure.getYaxis().setLabelOffset(2.5d * stressPlot.getXaxis().getLabelOffset()); + stressPlotFigure.setAxisLimits(0.0, 10.0, 0.0, 10.0); + stressPlotFigure.getYaxis().setLabelText("Reference (red), Validation (black)"); + + sdPlot = new JMultiAxisPlot(); + sdPlotFigure = sdPlot.addSubplot(); + + sdPlot.getTitle().setText("Site correction overview"); + sdPlot.getXaxis().setLabelText("Frequency"); + sdPlot.setYaxisVisibility(true); + sdPlotSwingNode.setContent(sdPlot); + + sdPlotFigure.getYaxis().setLabelOffset(2.5d * sdPlot.getXaxis().getLabelOffset()); + sdPlotFigure.setAxisLimits(0.0, 10.0, 0.0, 2.0); + sdPlotFigure.getYaxis().setLabelText("Standard Deviation"); + + int points = 50; + double dx = 20.0 / (points - 1); + float[] xy = new float[points]; + for (int i = 0; i < points; i++) { + xy[i] = (float) (-5.0 + (dx * i)); + } + mwZeroLine = new Line(xy, xy, Color.LIGHT_GRAY, PaintMode.COPY, PenStyle.DASH, 2); + stressZeroLine = new Line(xy, xy, Color.LIGHT_GRAY, PaintMode.COPY, PenStyle.DASH, 2); + mwPlotFigure.AddPlotObject(mwZeroLine); + stressPlotFigure.AddPlotObject(stressZeroLine); + }); + + evidCombo.valueProperty().addListener((observable, oldValue, newValue) -> { + if (newValue != null && !newValue.equals(oldValue)) { + refreshView(); + } + }); + + CellBindingUtils.attachTextCellFactoriesString(evidCol, MeasuredMwDetails::getEventId); + evidCol.comparatorProperty().set(new MaybeNumericStringComparator()); + + CellBindingUtils.attachTextCellFactories(mwCol, MeasuredMwDetails::getRefMw, dfmt4); + CellBindingUtils.attachTextCellFactories(stressCol, MeasuredMwDetails::getRefApparentStressInMpa, dfmt4); + + CellBindingUtils.attachTextCellFactories(valMwCol, MeasuredMwDetails::getValMw, dfmt4); + CellBindingUtils.attachTextCellFactories(valStressCol, MeasuredMwDetails::getValApparentStressInMpa, dfmt4); + + CellBindingUtils.attachTextCellFactories(measuredMwCol, MeasuredMwDetails::getMw, dfmt4); + CellBindingUtils.attachTextCellFactories(measuredStressCol, MeasuredMwDetails::getApparentStressInMpa, dfmt4); + CellBindingUtils.attachTextCellFactories(measuredCornerFreqCol, MeasuredMwDetails::getCornerFreq, dfmt4); + + CellBindingUtils.attachTextCellFactories(mistfitCol, MeasuredMwDetails::getMisfit, dfmt4); + CellBindingUtils.attachTextCellFactories(measuredMwUq1LowCol, MeasuredMwDetails::getMw1Min, dfmt4); + CellBindingUtils.attachTextCellFactories(measuredMwUq1HighCol, MeasuredMwDetails::getMw1Max, dfmt4); + CellBindingUtils.attachTextCellFactories(measuredMwUq2LowCol, MeasuredMwDetails::getMw2Min, dfmt4); + CellBindingUtils.attachTextCellFactories(measuredMwUq2HighCol, MeasuredMwDetails::getMw2Max, dfmt4); + + iterationsCol.setCellValueFactory(x -> Bindings.createIntegerBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(MeasuredMwDetails::getIterations).orElseGet(() -> 0)) + .asObject()); + + dataCountCol.setCellValueFactory(x -> Bindings.createIntegerBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(MeasuredMwDetails::getDataCount).orElseGet(() -> 0)) + .asObject()); + + iconCol.setCellValueFactory(x -> Bindings.createObjectBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(pp -> { + ImageView imView = new ImageView(SwingFXUtils.toFXImage(SymbolFactory.createSymbol(pp.getStyle(), 0, 0, 2, pp.getColor(), pp.getColor(), pp.getColor(), "", true, false, 10.0) + .getBufferedImage(256), + null)); + imView.setFitHeight(12); + imView.setFitWidth(12); + return imView; + }).orElseGet(() -> new ImageView()))); + + stationCol.setCellValueFactory(x -> Bindings.createStringBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(LabeledPlotPoint::getLabel).orElseGet(String::new))); + + eventTable.setItems(mwParameters); + iconTable.setItems(stationSymbols); + + iconCol.prefWidthProperty().bind(iconTable.widthProperty().multiply(0.3)); + stationCol.prefWidthProperty().bind(iconTable.widthProperty().multiply(0.7)); + + menu = new ContextMenu(); + include = new MenuItem("Include Selected"); + menu.getItems().add(include); + exclude = new MenuItem("Exclude Selected"); + menu.getItems().add(exclude); + } + + protected Object getPoint2D(Symbol sym) { + return new Point2D.Double(sym.getXcenter(), sym.getYcenter()); + } + + private void showWaveformPopup(Waveform waveform) { + bus.post(new WaveformSelectionEvent(waveform.getId())); + } + + private void plotSpectra() { + clearSpectraPlots(); + spectraControllers.forEach(spc -> spc.getSymbolMap().clear()); + plotPointMap.clear(); + List filteredMeasurements; + + spectraControllers.forEach(spc -> { + SpectralPlot plot = spc.getSpectralPlot(); + plot.setAutoCalculateXaxisRange(shouldXAxisShrink); + if (!shouldXAxisShrink) { + plot.setAllXlimits(minFreq.get(), maxFreq.get()); + } + }); + + final List fittingSpectra; + if (evidCombo != null && evidCombo.getSelectionModel().getSelectedIndex() > 0) { + filteredMeasurements = filterToEvent(evidCombo.getSelectionModel().getSelectedItem(), spectralMeasurements); + fittingSpectra = getFitSpectra(); + Spectra referenceSpectra = spectraClient.getReferenceSpectra(evidCombo.getSelectionModel().getSelectedItem()).block(Duration.ofSeconds(2)); + fittingSpectra.add(referenceSpectra); + Spectra validationSpectra = spectraClient.getValidationSpectra(evidCombo.getSelectionModel().getSelectedItem()).block(Duration.ofSeconds(2)); + fittingSpectra.add(validationSpectra); + if (filteredMeasurements != null && filteredMeasurements.size() > 0 && filteredMeasurements.get(0).getWaveform() != null) { + Event event = filteredMeasurements.get(0).getWaveform().getEvent(); + eventTime.setText("Date: " + DateTimeFormatter.ISO_INSTANT.format(event.getOriginTime().toInstant())); + eventLoc.setText("Lat: " + dfmt4.format(event.getLatitude()) + " Lon: " + dfmt4.format(event.getLongitude())); + eventTime.setVisible(true); + eventLoc.setVisible(true); + } + } else { + eventTime.setVisible(false); + eventLoc.setVisible(false); + filteredMeasurements = spectralMeasurements; + fittingSpectra = null; + } + + spectraControllers.forEach(spc -> { + if (fittingSpectra != null) { + spc.getSpectralPlot().plotXYdata(toPlotPoints(filteredMeasurements, spc.getDataFunc()), SHOW_LEGEND, fittingSpectra); + } else { + spc.getSpectralPlot().plotXYdata(toPlotPoints(filteredMeasurements, spc.getDataFunc()), HIDE_LEGEND); + } + spc.getSymbolMap().putAll(mapSpectraToPoint(filteredMeasurements, spc.getDataFunc())); + }); + mapMeasurements(filteredMeasurements); + + minY.set(100.0); + maxY.set(0.0); + DoubleSummaryStatistics stats = filteredMeasurements.stream() + .filter(Objects::nonNull) + .map(spec -> spec.getPathAndSiteCorrected()) + .filter(v -> v != 0.0) + .collect(Collectors.summarizingDouble(Double::doubleValue)); + maxY.set(stats.getMax() + .1); + minY.set(stats.getMin() - .1); + + spectraControllers.forEach(spc -> spc.setYAxisResize(shouldYAxisShrink, minY.get(), maxY.get())); + } + + private void mapMeasurements(List measurements) { + if (measurements != null) { + mapImpl.addIcons(iconFactory.genIconsFromWaveforms(eventSelectionCallback, + stationSelectionCallback, + measurements.stream().map(m -> m.getWaveform()).filter(Objects::nonNull).collect(Collectors.toList()))); + } + } + + protected void clearSpectraPlots() { + spectraControllers.forEach(spc -> spc.getSpectralPlot().clearPlot()); + } + + private List filterToEvent(String selectedItem, List spectralMeasurements) { + return spectralMeasurements.stream().filter(spec -> selectedItem.equalsIgnoreCase(spec.getWaveform().getEvent().getEventId())).collect(Collectors.toList()); + } + + private Map mapSpectraToPoint(List spectralMeasurements, Function func) { + return spectralMeasurements.stream() + .filter(spectra -> !func.apply(spectra).equals(0.0)) + .collect(Collectors.toMap(spectra -> new Point2D.Double(Math.log10(centerFreq(spectra.getWaveform().getLowFrequency(), spectra.getWaveform().getHighFrequency())), + func.apply(spectra)), + Function.identity(), + (a, b) -> b, + HashMap::new)); + } + + private List toPlotPoints(List spectralMeasurements, Function func) { + List list = spectralMeasurements.stream() + .filter(spectra -> !func.apply(spectra).equals(0.0)) + .filter(spectra -> spectra != null && spectra.getWaveform() != null && spectra.getWaveform().getStream() != null + && spectra.getWaveform().getStream().getStation() != null) + .map(spectra -> { + String key = spectra.getWaveform().getStream().getStation().getStationName(); + PlotPoint pp = getPlotPoint(key, spectra.getWaveform().isActive()); + PlotPoint point = new LabeledPlotPoint(key, + new PlotPoint(Math.log10(centerFreq(spectra.getWaveform().getLowFrequency(), + spectra.getWaveform().getHighFrequency())), + func.apply(spectra), + pp.getStyle(), + pp.getColor())); + if (hasEventAndStation(spectra)) { + plotPointMap.computeIfAbsent(spectra.getWaveform().getEvent().getEventId(), k -> new ArrayList<>()).add(point); + plotPointMap.computeIfAbsent(spectra.getWaveform().getStream().getStation().getStationName(), k -> new ArrayList<>()).add(point); + } + return point; + }) + .collect(Collectors.toList()); + return list; + } + + private PlotPoint getPlotPoint(String key, boolean active) { + PlotPoint pp = new PlotPoint(symbolStyleMap.get(key)); + if (!active) { + pp.setColor(Color.GRAY); + } + return pp; + } + + private boolean hasEventAndStation(SpectraMeasurement spectra) { + return spectra != null && spectra.getWaveform() != null && spectra.getWaveform().getEvent() != null && spectra.getWaveform().getEvent().getEventId() != null + && spectra.getWaveform().getStream() != null && spectra.getWaveform().getStream().getStation() != null && spectra.getWaveform().getStream().getStation().getStationName() != null; + } + + private double centerFreq(Double lowFrequency, Double highFrequency) { + return lowFrequency + (highFrequency - lowFrequency) / 2.; + } + + protected void reloadData() { + try { + runGuiUpdate(() -> clearSpectraPlots()); + maxFreq.set(-0.0); + minFreq.set(1.0); + + DoubleSummaryStatistics stats = paramClient.getSharedFrequencyBandParameters() + .filter(Objects::nonNull) + .collectList() + .block(Duration.of(10l, ChronoUnit.SECONDS)) + .stream() + .map(sfb -> Math.log10(centerFreq(sfb.getLowFrequency(), sfb.getHighFrequency()))) + .collect(Collectors.summarizingDouble(Double::doubleValue)); + maxFreq.set(stats.getMax()); + minFreq.set(stats.getMin()); + + preloadData(); + spectralMeasurements.clear(); + spectralMeasurements.addAll(getSpectraData()); + + runGuiUpdate(() -> { + mwParameters.clear(); + mwPlotFigure.Clear(); + stressPlotFigure.Clear(); + sdPlotFigure.Clear(); + mwPlotFigure.AddPlotObject(mwZeroLine); + stressPlotFigure.AddPlotObject(stressZeroLine); + List evs = getEvents(); + + double minMw = 10.0; + double maxMw = 0.0; + double minStress = 1.0; + double maxStress = 0.0; + for (MeasuredMwDetails ev : evs) { + mwParameters.add(ev); + + if (ev.getMw() != null && ev.getMw() != 0.0) { + Double mw = ev.getMw(); + if (mw < minMw) { + minMw = mw; + } + if (mw > maxMw) { + maxMw = mw; + } + + Double valMw = ev.getValMw(); + if (valMw != null && valMw != 0.0) { + if (valMw < minMw) { + minMw = valMw; + } + if (valMw > maxMw) { + maxMw = valMw; + } + + Square valSym = new Square(mw, valMw, 2.2, Color.BLACK, Color.BLACK, Color.BLACK, ev.getEventId(), true, false, 6.0); + mwPlotFigure.AddPlotObject(valSym); + } + + if (ev.getRefMw() != null && ev.getRefMw() != 0.0) { + Double ref = ev.getRefMw(); + if (ref < minMw) { + minMw = ref; + } + if (ref > maxMw) { + maxMw = ref; + } + + Circle mwSym = new Circle(mw, ref, 2.0, Color.RED, Color.RED, Color.RED, ev.getEventId(), true, false, 6.0); + mwPlotFigure.AddPlotObject(mwSym); + } + + Double stress = ev.getApparentStressInMpa(); + Double refStress = ev.getRefApparentStressInMpa(); + + if (stress != null) { + if (stress < minStress) { + minStress = stress; + } + if (stress > maxStress) { + maxStress = stress; + } + + if (refStress == null) { + refStress = 0.0; + } + + Double valStress = ev.getValApparentStressInMpa(); + if (valStress != null && valStress != 0.0) { + if (valStress < minStress) { + minStress = valStress; + } + if (valStress > maxStress) { + maxStress = valStress; + } + + Square valSym = new Square(stress, valStress, 2.2, Color.BLACK, Color.BLACK, Color.BLACK, ev.getEventId(), true, false, 6.0); + stressPlotFigure.AddPlotObject(valSym); + } + + if (refStress != null && refStress != 0.0) { + if (refStress < minStress) { + minStress = refStress; + } + if (refStress > maxStress) { + maxStress = refStress; + } + + Circle stressSym = new Circle(stress, refStress, 2.0, Color.RED, Color.RED, Color.RED, ev.getEventId(), true, false, 6.0); + stressPlotFigure.AddPlotObject(stressSym); + } + } + } + } + + maxMw = maxMw + .1; + minMw = minMw > maxMw ? minMw = maxMw - .1 : minMw - .1; + + mwPlotFigure.setAxisLimits(minMw, maxMw, minMw, maxMw); + + maxStress = maxStress + .1; + minStress = minStress > maxStress ? minStress = maxStress - .1 : minStress - .1; + + stressPlotFigure.setAxisLimits(minStress, maxStress, minStress, maxStress); + }); + + symbolStyleMap = symbolStyleMapFactory.build(spectralMeasurements, new Function() { + @Override + public String apply(SpectraMeasurement t) { + return t.getWaveform().getStream().getStation().getStationName(); + } + }); + + runGuiUpdate(() -> { + stationSymbols.clear(); + stationSymbols.addAll(symbolStyleMap.entrySet().stream().map(e -> new LabeledPlotPoint(e.getKey(), e.getValue())).collect(Collectors.toList())); + + Platform.runLater(() -> { + evids.clear(); + evids.add("All"); + evids.addAll(spectralMeasurements.stream() + .map(spec -> spec.getWaveform().getEvent().getEventId()) + .distinct() + .sorted(new MaybeNumericStringComparator()) + .collect(Collectors.toList())); + eventTable.sort(); + }); + + Map> evidStats = new HashMap<>(); + + double minSite = 1E2; + double maxSite = -1E2; + double minFreq = 1E2; + double maxFreq = -1E2; + int minStations = 2; + int maxStations = 3; + + for (SpectraMeasurement meas : spectralMeasurements) { + String evid = meas.getWaveform().getEvent().getEventId(); + Double freq = centerFreq(meas.getWaveform()); + evidStats.computeIfAbsent(evid, key -> new HashMap<>()).computeIfAbsent(freq, (key) -> new SummaryStatistics()).addValue(meas.getPathAndSiteCorrected()); + } + + for (Map freqStats : evidStats.values()) { + for (Entry entry : freqStats.entrySet()) { + double site = entry.getValue().getStandardDeviation(); + if (entry.getValue() != null && entry.getValue().getN() > 1) { + if (maxStations < entry.getValue().getN()) { + maxStations = (int) entry.getValue().getN(); + } + if (site < minSite) { + minSite = site; + } + if (site > maxSite) { + maxSite = site; + } + if (entry.getKey() < minFreq) { + minFreq = entry.getKey(); + } + if (entry.getKey() > maxFreq) { + maxFreq = entry.getKey(); + } + } + } + } + + colorMap.setRange(minStations, maxStations); + + for (Map freqStats : evidStats.values()) { + for (Entry entry : freqStats.entrySet()) { + double site = entry.getValue().getStandardDeviation(); + if (entry.getValue() != null && entry.getValue().getN() > 1) { + Color color = colorMap.getColor(entry.getValue().getN()); + Circle sdSym = new Circle(entry.getKey(), site, 2.0, color, color, color, "", true, false, 6.0); + sdPlotFigure.AddPlotObject(sdSym); + } + } + } + + maxSite = maxSite + .1; + minSite = minSite > maxSite ? minSite = maxSite - .1 : minSite - .1; + + maxFreq = maxFreq + 5.0; + minFreq = minFreq > maxFreq ? minFreq = maxFreq - .1 : minFreq - 1.0; + + sdPlotFigure.setAxisLimits(minFreq, maxFreq, minSite, maxSite); + sdPlotFigure.AddPlotObject(createColorLegend(minStations, maxStations)); + }); + + runGuiUpdate(() -> { + mwPlot.repaint(); + stressPlot.repaint(); + sdPlot.repaint(); + }); + } catch (InvocationTargetException ex) { + //nop + } catch (InterruptedException ex) { + log.warn("Swing interrupt during re-plotting of controller", ex); + Thread.currentThread().interrupt(); + } + } + + protected void preloadData() { + // Placeholder to allow children to overload any pre-fetching needed before data calls + } + + private PlotObject createColorLegend(int minVal, int maxVal) { + int range = maxVal - minVal; + int legendEntries = range; + if (legendEntries > MAX_LEGEND_COLORS) { + legendEntries = MAX_LEGEND_COLORS; + } + List legendSymbols = new ArrayList<>(range); + + Color color = colorMap.getColor(minVal); + legendSymbols.add(new SymbolTextPair(Integer.toString(minVal), new SymbolDef(SymbolStyle.CIRCLE, 1.0, color, color))); + if (legendEntries > 2) { + int i = minVal + 1; + while (i < legendEntries + minVal) { + color = colorMap.getColor(i); + legendSymbols.add(new SymbolTextPair(Integer.toString(i), new SymbolDef(SymbolStyle.CIRCLE, 1.0, color, color))); + i = i + (range / (legendEntries - 1)); + } + } + color = colorMap.getColor(maxVal); + legendSymbols.add(new SymbolTextPair(maxVal + "+", new SymbolDef(SymbolStyle.CIRCLE, 1.0, color, color))); + return new SymbolLegend(legendSymbols, sdPlot.getTitle().getFontName(), 8.0, HorizPinEdge.RIGHT, VertPinEdge.TOP, 1, 1); + } + + private Double centerFreq(Waveform waveform) { + return ((waveform.getHighFrequency() - waveform.getLowFrequency()) / 2.0) + waveform.getLowFrequency(); + } + + @Override + public void refreshView() { + if (isVisible) { + mapImpl.clearIcons(); + plotSpectra(); + Platform.runLater(() -> { + spectraControllers.forEach(spc -> spc.getSpectralPlot().repaint()); + }); + } + } + + @Override + public Runnable getRefreshFunction() { + return () -> reloadData(); + } + + @Override + public Consumer getScreenshotFunction() { + return (folder) -> { + String timestamp = SnapshotUtils.getTimestampWithLeadingSeparator(); + try { + if (resultsTab.isSelected() && evidCombo.getValue() != null) { + SnapshotUtils.writePng(folder, new Pair<>(getDisplayName(), resultsTab.getContent()), timestamp); + spectraControllers.forEach(spc -> { + SpectralPlot plot = spc.getSpectralPlot(); + try { + plot.exportSVG(folder + File.separator + getDisplayName() + "_" + plot.getTitle() + "_" + evidCombo.getValue() + timestamp + ".svg"); + } catch (UnsupportedEncodingException | FileNotFoundException | SVGGraphics2DIOException e) { + log.error("Error attempting to write plots for controller : {}", e.getLocalizedMessage(), e); + } + }); + } else { + mwPlot.exportSVG(folder + File.separator + getDisplayName() + "_Mw" + timestamp + ".svg"); + stressPlot.exportSVG(folder + File.separator + getDisplayName() + "Site_Stress" + timestamp + ".svg"); + sdPlot.exportSVG(folder + File.separator + getDisplayName() + "_Station_Event_SD" + timestamp + ".svg"); + } + } catch (UnsupportedEncodingException | FileNotFoundException | SVGGraphics2DIOException e) { + log.error("Error attempting to write plots for controller : {}", e.getLocalizedMessage(), e); + } + }; + } + + private void selectDataByCriteria(Boolean selected, String key) { + List points = plotPointMap.get(key); + if (selected) { + selectPoints(points); + } else { + deselectPoints(points); + } + } + + private void selectPoints(List points) { + if (points != null && !points.isEmpty()) { + if (!selectedPoints.isEmpty()) { + deselectPoints(selectedPoints); + } + selectedPoints.addAll(points); + SwingUtilities.invokeLater(() -> { + points.forEach(point -> { + selectPoint(point); + }); + }); + } + } + + private void deselectPoints(List selected) { + if (selected != null && !selected.isEmpty()) { + List points = new ArrayList<>(selected.size()); + points.addAll(selected); + selectedPoints.clear(); + SwingUtilities.invokeLater(() -> { + points.forEach(point -> { + deselectPoint(point); + }); + }); + } + } + + private void selectPoint(PlotPoint point) { + runIfSymbolExists(point, (plot, xy) -> plot.selectPoint(xy)); + } + + private void deselectPoint(PlotPoint point) { + runIfSymbolExists(point, (plot, xy) -> plot.deselectPoint(xy)); + } + + private void runIfSymbolExists(PlotPoint point, BiConsumer xyPointFunction) { + Point2D.Double xyPoint = new Point2D.Double(point.getX(), point.getY()); + spectraControllers.forEach(spc -> { + Map symbolMap = spc.getSymbolMap(); + SpectralPlot plot = spc.getSpectralPlot(); + boolean existsInPlot = symbolMap.containsKey(xyPoint); + if (existsInPlot) { + xyPointFunction.accept(plot, xyPoint); + } + }); + } + + protected void setSymbolsActive(List objs, Boolean active) { + SwingUtilities.invokeLater(() -> { + objs.forEach(sym -> { + if (active) { + sym.setFillColor(sym.getEdgeColor()); + sym.setEdgeColor(Color.BLACK); + } else { + sym.setEdgeColor(sym.getFillColor()); + sym.setFillColor(Color.GRAY); + } + }); + Platform.runLater(() -> { + spectraControllers.forEach(spc -> spc.getSpectralPlot().repaint()); + }); + }); + } + + private void showContextMenu(List waveforms, List plotObjects, MouseEvent t, BiConsumer, Boolean> activationFunc) { + Platform.runLater(() -> { + include.setOnAction(evt -> setActive(waveforms, plotObjects, true, activationFunc)); + exclude.setOnAction(evt -> setActive(waveforms, plotObjects, false, activationFunc)); + menu.show(spectraPlotPanel, t.getXOnScreen(), t.getYOnScreen()); + }); + } + + @Subscribe + private void listener(WaveformChangeEvent wce) { + List nonNull = wce.getIds().stream().filter(Objects::nonNull).collect(Collectors.toList()); + synchronized (spectralMeasurements) { + Map activeMeasurements = spectralMeasurements.stream().collect(Collectors.toMap(x -> x.getWaveform().getId(), Function.identity())); + if (wce.isAddOrUpdate()) { + waveformClient.getWaveformMetadataFromIds(nonNull).collect(Collectors.toList()).block(Duration.ofSeconds(10l)).forEach(md -> { + SpectraMeasurement measurement = activeMeasurements.get(md.getId()); + if (measurement != null) { + measurement.getWaveform().setActive(md.isActive()); + } + }); + } else if (wce.isDelete()) { + nonNull.forEach(id -> { + SpectraMeasurement measurement = activeMeasurements.remove(id); + if (measurement != null) { + spectralMeasurements.remove(measurement); + } + }); + } + } + refreshView(); + } + + protected void handlePlotObjectClicked(Object obj, Function measurementFunc) { + if (obj instanceof PlotObjectClicked && ((PlotObjectClicked) obj).getMouseEvent().getID() == MouseEvent.MOUSE_RELEASED) { + PlotObjectClicked poc = (PlotObjectClicked) obj; + PlotObject po = poc.getPlotObject(); + if (po instanceof Symbol) { + SpectraMeasurement spectra = measurementFunc.apply((Symbol) po); + if (spectra != null && spectra.getWaveform() != null) { + if (SwingUtilities.isLeftMouseButton(poc.getMouseEvent())) { + selectPoints(plotPointMap.get(((Symbol) po).getText())); + if (spectra != null) { + showWaveformPopup(spectra.getWaveform()); + } + Platform.runLater(() -> menu.hide()); + } else if (SwingUtilities.isRightMouseButton(poc.getMouseEvent())) { + showContextMenu(Collections.singletonList(spectra.getWaveform()), Collections.singletonList((Symbol) po), poc.getMouseEvent(), (objs, active) -> { + setSymbolsActive(objs, active); + }); + } + } + } + } + } + + @Override + public void setVisible(boolean visible) { + isVisible = visible; + } + + private void configureAxisShrink(Button axisShrinkButton, Supplier toggleAxisShrink, Axis axis) { + Label axisShrinkOn = new Label("><"); + axisShrinkOn.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); + axisShrinkOn.setPadding(Insets.EMPTY); + Label axisShrinkOff = new Label("<>"); + axisShrinkOff.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); + axisShrinkOff.setPadding(Insets.EMPTY); + + if (Axis.Y == axis) { + axisShrinkOn.setRotate(90.0); + axisShrinkOff.setRotate(90.0); + } + + axisShrinkButton.setGraphic(axisShrinkOn); + axisShrinkButton.prefHeightProperty().bind(evidCombo.heightProperty()); + axisShrinkButton.setPadding(new Insets(axisShrinkButton.getPadding().getTop(), 0, axisShrinkButton.getPadding().getBottom(), 0)); + + axisShrinkButton.setOnAction(e -> { + if (toggleAxisShrink.get()) { + axisShrinkButton.setGraphic(axisShrinkOff); + } else { + axisShrinkButton.setGraphic(axisShrinkOn); + } + refreshView(); + }); + } + + protected Observer getPlotpointObserver(Supplier> symbolMapSupplier) { + return new Observer() { + @Override + public void update(Observable observable, Object obj) { + handlePlotObjectClicked(obj, sym -> symbolMapSupplier.get().get(getPoint2D(sym))); + } + }; + } + + @FXML + private void clearRefEvents() { + removeRefEvents(mwParameters); + } + + @FXML + private void removeRefEvents() { + List evs = new ArrayList<>(eventTable.getSelectionModel().getSelectedIndices().size()); + eventTable.getSelectionModel().getSelectedIndices().forEach(i -> evs.add(mwParameters.get(i))); + removeRefEvents(evs); + } + + @FXML + private void toggleValidationEvent() { + List evs = new ArrayList<>(eventTable.getSelectionModel().getSelectedIndices().size()); + eventTable.getSelectionModel().getSelectedIndices().forEach(i -> evs.add(mwParameters.get(i))); + if (evs != null && !evs.isEmpty()) { + referenceEventClient.toggleValidationEventsByEventId(evs.stream().map(mwd -> mwd.getEventId()).distinct().collect(Collectors.toList())) + .doOnComplete(() -> Platform.runLater(() -> reloadData())) + .subscribe(); + } + } + + private void removeRefEvents(List evs) { + if (evs != null && !evs.isEmpty()) { + referenceEventClient.removeReferenceEventsByEventId(evs.stream().map(mwd -> mwd.getEventId()).distinct().collect(Collectors.toList())) + .doOnSuccess((v) -> Platform.runLater(() -> reloadData())) + .subscribe(); + } + } +} diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/CodaParamLoadingController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/CodaParamLoadingController.java index ae814b06..a3d3c093 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/CodaParamLoadingController.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/CodaParamLoadingController.java @@ -33,13 +33,14 @@ import gov.llnl.gnem.apps.coda.calibration.gui.converters.api.FileToParameterConverter; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ParameterClient; -import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ReferenceEventClient; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; import gov.llnl.gnem.apps.coda.calibration.gui.events.ParametersLoadedEvent; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersFI; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersPS; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeFitterConstraints; import gov.llnl.gnem.apps.coda.calibration.model.domain.SiteCorrections; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.VelocityConfiguration; import gov.llnl.gnem.apps.coda.common.model.domain.SharedFrequencyBandParameters; import reactor.core.publisher.Mono; @@ -51,7 +52,7 @@ public class CodaParamLoadingController { private ParameterClient paramsClient; - private ReferenceEventClient refMwClient; + private EventClient eventClient; private int maxBatching = 100; @@ -60,17 +61,17 @@ public class CodaParamLoadingController { private EventBus bus; @Autowired - public CodaParamLoadingController(List> fileConverters, ParameterClient paramsClient, ReferenceEventClient refMwClient, EventBus bus) { + public CodaParamLoadingController(List> fileConverters, ParameterClient paramsClient, EventClient eventClient, EventBus bus) { super(); this.fileConverters = fileConverters; this.paramsClient = paramsClient; - this.refMwClient = refMwClient; + this.eventClient = eventClient; this.bus = bus; if (paramsClient == null) { throw new IllegalStateException("Unable to find implementation of Coda Param loding client"); } - if (refMwClient == null) { + if (eventClient == null) { throw new IllegalStateException("Unable to find implementation of Reference Event loding client"); } } @@ -87,100 +88,104 @@ public void loadFiles(List files) { protected void convertFiles(List validFiles) { fileConverters.stream() - .forEach( - fileConverter -> fileConverter.convertFiles(validFiles) - .subscribe( - result -> { - // TODO: Feedback to the user about failure causes! - if (result.isSuccess()) { - Optional res = result.getResultPayload(); - if (res.isPresent()) { - if (res.get() instanceof SharedFrequencyBandParameters) { - SharedFrequencyBandParameters sfb = (SharedFrequencyBandParameters) res.get(); - try { - Mono request = paramsClient.setSharedFrequencyBandParameter(sfb); - if (request != null) { - request.retry(3).subscribe(); - } else { - log.error( - "Returned a null request from the parameter client while posting SharedFrequencyBandParameters {}", - sfb); - } - } catch (JsonProcessingException ex) { - log.trace(ex.getMessage(), ex); - } - } else if (res.get() instanceof SiteCorrections) { - try { - Mono request = paramsClient.setSiteSpecificFrequencyBandParameter( - new ArrayList<>(((SiteCorrections) res.get()).getSiteCorrections())); - if (request != null) { - request.retry(3).subscribe(); - } else { - log.error( - "Returned a null request from the parameter client while posting SiteFrequencyBandParameters {}", - (res.get())); - } - } catch (JsonProcessingException ex) { - log.trace(ex.getMessage(), ex); - } - } else if (res.get() instanceof MdacParametersPS) { - MdacParametersPS entry = (MdacParametersPS) res.get(); - try { - Mono request = paramsClient.setPsParameter(entry); - if (request != null) { - request.retry(3).subscribe(); - } else { - log.error("Returned a null request from the parameter client while posting MdacParametersPS {}", entry); - } - } catch (JsonProcessingException ex) { - log.trace(ex.getMessage(), ex); - } - } else if (res.get() instanceof MdacParametersFI) { - MdacParametersFI entry = (MdacParametersFI) res.get(); - try { - Mono request = paramsClient.setFiParameter(entry); - if (request != null) { - request.retry(3).subscribe(); - } else { - log.error("Returned a null request from the parameter client while posting MdacParametersFI {}", entry); - } - } catch (JsonProcessingException ex) { - log.trace(ex.getMessage(), ex); - } - } else if (res.get() instanceof ReferenceMwParameters) { - ReferenceMwParameters entry = (ReferenceMwParameters) res.get(); - try { - Mono request = refMwClient.postReferenceEvents(Collections.singletonList(entry)); - if (request != null) { - request.retry(3).subscribe(); - } else { - log.error( - "Returned a null request from the parameter client while posting ReferenceMwParameters {}", - entry); - } - } catch (JsonProcessingException ex) { - log.trace(ex.getMessage(), ex); - } - } else if (res.get() instanceof VelocityConfiguration) { - VelocityConfiguration entry = (VelocityConfiguration) res.get(); - Mono request = paramsClient.updateVelocityConfiguration(entry); - if (request != null) { - request.retry(3).subscribe(); - } else { - log.error("Returned a null request from the parameter client while posting VelocityConfiguration {}", entry); - } - } else if (res.get() instanceof ShapeFitterConstraints) { - ShapeFitterConstraints entry = (ShapeFitterConstraints) res.get(); - Mono request = paramsClient.updateShapeFitterConstraints(entry); - if (request != null) { - request.retry(3).subscribe(); - } else { - log.error("Returned a null request from the parameter client while posting ShapeFitterConstraints {}", entry); - } - } - } - } - })); + .forEach(fileConverter -> fileConverter.convertFiles(validFiles) + .subscribe(result -> { + // TODO: Feedback to the user about failure causes! + if (result.isSuccess()) { + Optional res = result.getResultPayload(); + if (res.isPresent()) { + if (res.get() instanceof SharedFrequencyBandParameters) { + SharedFrequencyBandParameters sfb = (SharedFrequencyBandParameters) res.get(); + try { + Mono request = paramsClient.setSharedFrequencyBandParameter(sfb); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting SharedFrequencyBandParameters {}", sfb); + } + } catch (JsonProcessingException ex) { + log.trace(ex.getMessage(), ex); + } + } else if (res.get() instanceof SiteCorrections) { + try { + Mono request = paramsClient.setSiteSpecificFrequencyBandParameter(new ArrayList<>(((SiteCorrections) res.get()).getSiteCorrections())); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting SiteFrequencyBandParameters {}", + (res.get())); + } + } catch (JsonProcessingException ex) { + log.trace(ex.getMessage(), ex); + } + } else if (res.get() instanceof MdacParametersPS) { + MdacParametersPS entry = (MdacParametersPS) res.get(); + try { + Mono request = paramsClient.setPsParameter(entry); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting MdacParametersPS {}", entry); + } + } catch (JsonProcessingException ex) { + log.trace(ex.getMessage(), ex); + } + } else if (res.get() instanceof MdacParametersFI) { + MdacParametersFI entry = (MdacParametersFI) res.get(); + try { + Mono request = paramsClient.setFiParameter(entry); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting MdacParametersFI {}", entry); + } + } catch (JsonProcessingException ex) { + log.trace(ex.getMessage(), ex); + } + } else if (res.get() instanceof ValidationMwParameters) { + ValidationMwParameters entry = (ValidationMwParameters) res.get(); + try { + Mono request = eventClient.postValidationEvents(Collections.singletonList(entry)); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting ReferenceMwParameters {}", entry); + } + } catch (JsonProcessingException ex) { + log.trace(ex.getMessage(), ex); + } + } else if (res.get() instanceof ReferenceMwParameters) { + ReferenceMwParameters entry = (ReferenceMwParameters) res.get(); + try { + Mono request = eventClient.postReferenceEvents(Collections.singletonList(entry)); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting ReferenceMwParameters {}", entry); + } + } catch (JsonProcessingException ex) { + log.trace(ex.getMessage(), ex); + } + } else if (res.get() instanceof VelocityConfiguration) { + VelocityConfiguration entry = (VelocityConfiguration) res.get(); + Mono request = paramsClient.updateVelocityConfiguration(entry); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting VelocityConfiguration {}", entry); + } + } else if (res.get() instanceof ShapeFitterConstraints) { + ShapeFitterConstraints entry = (ShapeFitterConstraints) res.get(); + Mono request = paramsClient.updateShapeFitterConstraints(entry); + if (request != null) { + request.retry(3).subscribe(); + } else { + log.error("Returned a null request from the parameter client while posting ShapeFitterConstraints {}", entry); + } + } + } + } + })); } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/DataController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/DataController.java index 1fea323d..21cfd01b 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/DataController.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/DataController.java @@ -101,6 +101,9 @@ public class DataController implements MapListeningController, RefreshableContro @FXML private TableColumn highFreqCol; + + @FXML + private TableColumn depthCol; private ObservableList listData = FXCollections.synchronizedObservableList(FXCollections.observableArrayList()); @@ -213,6 +216,15 @@ public void initialize() { CellBindingUtils.attachTextCellFactories(lowFreqCol, Waveform::getLowFrequency, dfmt2); CellBindingUtils.attachTextCellFactories(highFreqCol, Waveform::getHighFrequency, dfmt2); + + depthCol.setCellValueFactory( + x -> Bindings.createStringBinding( + () -> + dfmt2.format( + Optional.ofNullable(x).map(CellDataFeatures::getValue) + .map(Waveform::getEvent) + .map(ev->Double.toString(ev.getDepth())).orElseGet(String::new)))); + depthCol.comparatorProperty().set(new MaybeNumericStringComparator()); usedCol.setCellValueFactory(x -> Bindings.createObjectBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(waveform -> { CheckBox box = new CheckBox(); diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/MeasuredMwsController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/MeasuredMwsController.java index 5acc1f6c..ceb4dd9e 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/MeasuredMwsController.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/MeasuredMwsController.java @@ -14,42 +14,26 @@ */ package gov.llnl.gnem.apps.coda.calibration.gui.controllers; -import java.awt.Color; -import java.awt.event.MouseEvent; -import java.awt.geom.Point2D; import java.io.File; -import java.io.FileNotFoundException; -import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; import java.nio.file.Paths; -import java.text.NumberFormat; import java.time.Duration; -import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.DoubleSummaryStatistics; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Observable; -import java.util.Observer; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; import java.util.stream.Collectors; import javax.swing.SwingUtilities; -import org.apache.batik.svggen.SVGGraphics2DIOException; import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,10 +41,10 @@ import org.springframework.stereotype.Component; import com.google.common.eventbus.EventBus; -import com.google.common.eventbus.Subscribe; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.CalibrationClient; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ParameterClient; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.SpectraClient; import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.ParamExporter; import gov.llnl.gnem.apps.coda.calibration.gui.plotting.MapPlottingUtilities; @@ -72,180 +56,34 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurement; import gov.llnl.gnem.apps.coda.common.gui.controllers.ProgressGui; import gov.llnl.gnem.apps.coda.common.gui.data.client.api.WaveformClient; -import gov.llnl.gnem.apps.coda.common.gui.events.WaveformSelectionEvent; -import gov.llnl.gnem.apps.coda.common.gui.plotting.LabeledPlotPoint; -import gov.llnl.gnem.apps.coda.common.gui.plotting.PlotPoint; import gov.llnl.gnem.apps.coda.common.gui.plotting.SymbolStyleMapFactory; -import gov.llnl.gnem.apps.coda.common.gui.util.CellBindingUtils; -import gov.llnl.gnem.apps.coda.common.gui.util.MaybeNumericStringComparator; -import gov.llnl.gnem.apps.coda.common.gui.util.NumberFormatFactory; import gov.llnl.gnem.apps.coda.common.gui.util.ProgressListener; import gov.llnl.gnem.apps.coda.common.gui.util.ProgressMonitor; -import gov.llnl.gnem.apps.coda.common.gui.util.SnapshotUtils; import gov.llnl.gnem.apps.coda.common.mapping.api.GeoMap; -import gov.llnl.gnem.apps.coda.common.model.domain.Event; -import gov.llnl.gnem.apps.coda.common.model.domain.Pair; import gov.llnl.gnem.apps.coda.common.model.domain.Waveform; -import gov.llnl.gnem.apps.coda.common.model.messaging.WaveformChangeEvent; import javafx.application.Platform; -import javafx.beans.binding.Bindings; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.embed.swing.SwingFXUtils; import javafx.embed.swing.SwingNode; -import javafx.event.EventHandler; import javafx.fxml.FXML; -import javafx.geometry.Insets; -import javafx.scene.control.Button; -import javafx.scene.control.ComboBox; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.Label; -import javafx.scene.control.MenuItem; -import javafx.scene.control.Tab; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableColumn.CellDataFeatures; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField; -import javafx.scene.image.ImageView; -import javafx.scene.input.MouseButton; import javafx.scene.layout.StackPane; import javafx.stage.Modality; -import llnl.gnem.core.gui.plotting.PlotObjectClicked; -import llnl.gnem.core.gui.plotting.plotobject.PlotObject; import llnl.gnem.core.gui.plotting.plotobject.Symbol; -import llnl.gnem.core.gui.plotting.plotobject.SymbolFactory; +import reactor.core.scheduler.Schedulers; -//TODO: This is effectively a subset of SiteController. Revisit and see if we can factor out common functions into a third shared class at some point. @Component -public class MeasuredMwsController implements MapListeningController, RefreshableController, ScreenshotEnabledController { +public class MeasuredMwsController extends AbstractMeasurementController { private static final Logger log = LoggerFactory.getLogger(MeasuredMwsController.class); private static final String X_AXIS_LABEL = "center freq"; - @FXML - private Tab plotsTab; - - @FXML - private StackPane measuredMws; - - @FXML - private SwingNode fitPlotSwingNode; - private SpectralPlot fitPlot; - - @FXML - private ComboBox evidCombo; - - @FXML - private TableView eventTable; - - @FXML - private TableView iconTable; - - @FXML - private TableColumn evidCol; - - @FXML - private TableColumn measuredMwCol; - - // @FXML - // private TableColumn measuredMwSdCol; - - @FXML - private TableColumn measuredStressCol; - - @FXML - private TableColumn measuredCornerFreqCol; - - @FXML - private TableColumn mistfitCol; - - // @FXML - // private TableColumn measuredCornerFreqSdCol; - - @FXML - private TableColumn measuredMwUq1LowCol; - - @FXML - private TableColumn measuredMwUq1HighCol; - - @FXML - private TableColumn measuredMwUq2LowCol; - - @FXML - private TableColumn measuredMwUq2HighCol; - - @FXML - private TableColumn iterationsCol; - - @FXML - private TableColumn dataCountCol; - - @FXML - private TableColumn iconCol; - - @FXML - private TableColumn stationCol; - - @FXML - private TextField eventTime; - - @FXML - private TextField eventLoc; + private static final String displayName = "Measured_Mws"; - private SpectraClient spectraClient; - private ParameterClient paramClient; private CalibrationClient calibrationClient; private ParamExporter paramExporter; - private WaveformClient waveformClient; - private GeoMap mapImpl; - private EventBus bus; - private MapPlottingUtilities iconFactory; - private List spectralMeasurements = new ArrayList<>(); private Map> fitSpectra = new HashMap<>(); - private ObservableList evids = FXCollections.observableArrayList(); - private ObservableList mwParameters = FXCollections.observableArrayList(); - private ObservableList stationSymbols = FXCollections.observableArrayList(); - - private final BiConsumer eventSelectionCallback; - private final BiConsumer stationSelectionCallback; - - protected Map fitSymbolMap = new ConcurrentHashMap<>(); - - private Map> plotPointMap = new HashMap<>(); - private final List selectedPoints = new ArrayList<>(); - - private SymbolStyleMapFactory symbolStyleMapFactory; - - private Map symbolStyleMap; - - private MenuItem exclude; - private MenuItem include; - private ContextMenu menu; - - private final NumberFormat dfmt4 = NumberFormatFactory.fourDecimalOneLeadingZero(); - private ProgressGui progressGui; - private final AtomicReference minFreq = new AtomicReference<>(1.0); - private final AtomicReference maxFreq = new AtomicReference<>(-0.0); - - private final AtomicReference minY = new AtomicReference<>(1.0); - private final AtomicReference maxY = new AtomicReference<>(-0.0); - - @FXML - private Button xAxisShrink; - private boolean shouldXAxisShrink = false; - private Label xAxisShrinkOn; - private Label xAxisShrinkOff; - - @FXML - private Button yAxisShrink; - private boolean shouldYAxisShrink = false; - private Label yAxisShrinkOn; - private Label yAxisShrinkOff; - private ThreadPoolExecutor exec = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new SynchronousQueue<>(), r -> { Thread thread = new Thread(r); thread.setName("MeasureMwController"); @@ -253,34 +91,30 @@ public class MeasuredMwsController implements MapListeningController, Refreshabl return thread; }, new ThreadPoolExecutor.DiscardPolicy()); - private boolean isVisible = false; + @FXML + private StackPane measuredMws; + + @FXML + private SwingNode spectraPlotSwingNode; + + private List mwDetails = new ArrayList<>(); + + private MeasuredMwReportByEvent mfs = new MeasuredMwReportByEvent(); @Autowired private MeasuredMwsController(SpectraClient spectraClient, ParameterClient paramClient, WaveformClient waveformClient, SymbolStyleMapFactory styleFactory, GeoMap map, - MapPlottingUtilities iconFactory, EventBus bus, ParamExporter paramExporter, CalibrationClient calibrationClient) { - this.spectraClient = spectraClient; - this.paramClient = paramClient; - this.waveformClient = waveformClient; - this.symbolStyleMapFactory = styleFactory; - this.mapImpl = map; - this.bus = bus; - this.iconFactory = iconFactory; + MapPlottingUtilities iconFactory, EventBus bus, ParamExporter paramExporter, CalibrationClient calibrationClient, EventClient referenceEventClient) { + super(spectraClient, paramClient, referenceEventClient, waveformClient, styleFactory, map, iconFactory, bus); this.calibrationClient = calibrationClient; this.paramExporter = paramExporter; - - eventSelectionCallback = (selected, eventId) -> { - selectDataByCriteria(selected, eventId); - }; - - stationSelectionCallback = (selected, stationId) -> { - selectDataByCriteria(selected, stationId); - }; - - this.bus.register(this); } + @Override @FXML public void initialize() { + spectraPlotPanel = measuredMws; + super.initialize(); + ProgressMonitor pm = new ProgressMonitor("Measuring Mws", new ProgressListener() { @Override public double getProgress() { @@ -293,333 +127,97 @@ public double getProgress() { progressGui.initModality(Modality.NONE); progressGui.setAlwaysOnTop(true); - evidCombo.setItems(evids); - - xAxisShrinkOn = new Label("><"); - xAxisShrinkOn.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - xAxisShrinkOn.setPadding(Insets.EMPTY); - xAxisShrinkOff = new Label("<>"); - xAxisShrinkOff.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - xAxisShrinkOff.setPadding(Insets.EMPTY); - xAxisShrink.setGraphic(xAxisShrinkOn); - double topPad = xAxisShrink.getPadding().getTop(); - double bottomPad = xAxisShrink.getPadding().getBottom(); - xAxisShrink.setPadding(new Insets(topPad, 0, bottomPad, 0)); - xAxisShrink.prefHeightProperty().bind(evidCombo.heightProperty()); - xAxisShrink.setOnAction(e -> { - shouldXAxisShrink = !shouldXAxisShrink; - if (shouldXAxisShrink) { - xAxisShrink.setGraphic(xAxisShrinkOff); - } else { - xAxisShrink.setGraphic(xAxisShrinkOn); - } - refreshView(); - }); - - yAxisShrinkOn = new Label("><"); - yAxisShrinkOn.setRotate(90.0); - yAxisShrinkOn.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - yAxisShrinkOn.setPadding(Insets.EMPTY); - yAxisShrinkOff = new Label("<>"); - yAxisShrinkOff.setRotate(90.0); - yAxisShrinkOff.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - yAxisShrinkOff.setPadding(Insets.EMPTY); - yAxisShrink.setGraphic(yAxisShrinkOn); - yAxisShrink.setPadding(new Insets(yAxisShrink.getPadding().getTop(), 0, yAxisShrink.getPadding().getBottom(), 0)); - yAxisShrink.prefHeightProperty().bind(evidCombo.heightProperty()); - yAxisShrink.setOnAction(e -> { - shouldYAxisShrink = !shouldYAxisShrink; - if (shouldYAxisShrink) { - yAxisShrink.setGraphic(yAxisShrinkOff); - } else { - yAxisShrink.setGraphic(yAxisShrinkOn); - } - refreshView(); - }); - SwingUtilities.invokeLater(() -> { - fitPlot = new SpectralPlot(); - fitPlot.addPlotObjectObserver(new Observer() { - @Override - public void update(Observable observable, Object obj) { - handlePlotObjectClicked(obj, sym -> fitSymbolMap.get(getPoint2D(sym))); - } - }); - fitPlotSwingNode.setContent(fitPlot); - - fitPlot.setLabels("Moment Rate Spectra", X_AXIS_LABEL, "log10(dyne-cm)"); - fitPlot.setYaxisVisibility(true); + final SpectraPlotController spectra = new SpectraPlotController(SpectraMeasurement::getPathAndSiteCorrected); + SpectralPlot plot = spectra.getSpectralPlot(); + plot.addPlotObjectObserver(getPlotpointObserver(() -> spectra.getSymbolMap())); + plot.setLabels("Moment Rate Spectra", X_AXIS_LABEL, "log10(dyne-cm)"); + plot.setYaxisVisibility(true); + spectra.setYAxisResizable(true); + spectraPlotSwingNode.setContent(plot); + + spectraPlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); + spectraControllers.add(spectra); }); - - evidCombo.valueProperty().addListener((observable, oldValue, newValue) -> { - if (newValue != null && !newValue.equals(oldValue)) { - refreshView(); - } - }); - - CellBindingUtils.attachTextCellFactoriesString(evidCol, MeasuredMwDetails::getEventId); - evidCol.comparatorProperty().set(new MaybeNumericStringComparator()); - - CellBindingUtils.attachTextCellFactories(measuredMwCol, MeasuredMwDetails::getMw, dfmt4); - // CellBindingUtils.attachTextCellFactories(measuredMwSdCol, MeasuredMwDetails::getMwSd, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredStressCol, MeasuredMwDetails::getApparentStressInMpa, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredCornerFreqCol, MeasuredMwDetails::getCornerFreq, dfmt4); - CellBindingUtils.attachTextCellFactories(mistfitCol, MeasuredMwDetails::getMisfit, dfmt4); - // CellBindingUtils.attachTextCellFactories(measuredCornerFreqSdCol, MeasuredMwDetails::getCornerFreqSd, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq1LowCol, MeasuredMwDetails::getMw1Min, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq1HighCol, MeasuredMwDetails::getMw1Max, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq2LowCol, MeasuredMwDetails::getMw2Min, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq2HighCol, MeasuredMwDetails::getMw2Max, dfmt4); - - iterationsCol.setCellValueFactory( - x -> Bindings.createIntegerBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(MeasuredMwDetails::getIterations).orElseGet(() -> 0)).asObject()); - - dataCountCol.setCellValueFactory( - x -> Bindings.createIntegerBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(MeasuredMwDetails::getDataCount).orElseGet(() -> 0)).asObject()); - - iconCol.setCellValueFactory(x -> Bindings.createObjectBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(pp -> { - ImageView imView = new ImageView(SwingFXUtils.toFXImage( - SymbolFactory.createSymbol(pp.getStyle(), 0, 0, 2, pp.getColor(), pp.getColor(), pp.getColor(), "", true, false, 10.0).getBufferedImage(256), - null)); - imView.setFitHeight(12); - imView.setFitWidth(12); - return imView; - }).orElseGet(() -> new ImageView()))); - - stationCol.setCellValueFactory(x -> Bindings.createStringBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(LabeledPlotPoint::getLabel).orElseGet(String::new))); - - eventTable.setItems(mwParameters); - iconTable.setItems(stationSymbols); - - iconCol.prefWidthProperty().bind(iconTable.widthProperty().multiply(0.3)); - stationCol.prefWidthProperty().bind(iconTable.widthProperty().multiply(0.7)); - - menu = new ContextMenu(); - include = new MenuItem("Include Selected"); - menu.getItems().add(include); - exclude = new MenuItem("Exclude Selected"); - menu.getItems().add(exclude); - - EventHandler menuHideHandler = (evt) -> { - if (MouseButton.SECONDARY != evt.getButton()) { - menu.hide(); - } - }; - fitPlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); - - bus.register(this); - } - - protected Object getPoint2D(Symbol sym) { - return new Point2D.Double(sym.getXcenter(), sym.getYcenter()); } - private void showWaveformPopup(Waveform waveform) { - bus.post(new WaveformSelectionEvent(waveform.getId())); - } - - private void plotSpectra() { - clearSpectraPlots(); - fitSymbolMap.clear(); - plotPointMap.clear(); - List filteredMeasurements; - - fitPlot.setAutoCalculateXaxisRange(shouldXAxisShrink); - if (!shouldXAxisShrink) { - fitPlot.setAllXlimits(minFreq.get(), maxFreq.get()); - } - - if (evidCombo != null && evidCombo.getSelectionModel().getSelectedIndex() > 0) { - filteredMeasurements = filterToEvent(evidCombo.getSelectionModel().getSelectedItem(), spectralMeasurements); - Spectra referenceSpectra = spectraClient.getReferenceSpectra(evidCombo.getSelectionModel().getSelectedItem()).block(Duration.ofSeconds(2)); - List fittingSpectra = new ArrayList<>(fitSpectra.get(evidCombo.getSelectionModel().getSelectedItem())); - fittingSpectra.add(referenceSpectra); - fitPlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getPathAndSiteCorrected), Boolean.TRUE, fittingSpectra); - if (filteredMeasurements != null && filteredMeasurements.size() > 0 && filteredMeasurements.get(0).getWaveform() != null) { - Event event = filteredMeasurements.get(0).getWaveform().getEvent(); - eventTime.setText("Date: " + DateTimeFormatter.ISO_INSTANT.format(event.getOriginTime().toInstant())); - eventLoc.setText("Lat: " + dfmt4.format(event.getLatitude()) + " Lon: " + dfmt4.format(event.getLongitude())); - eventTime.setVisible(true); - eventLoc.setVisible(true); - } - } else { - eventTime.setVisible(false); - eventLoc.setVisible(false); - filteredMeasurements = spectralMeasurements; - fitPlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getPathAndSiteCorrected), Boolean.FALSE); - } - fitSymbolMap.putAll(mapSpectraToPoint(filteredMeasurements, SpectraMeasurement::getPathAndSiteCorrected)); - mapMeasurements(filteredMeasurements); - - minY.set(100.0); - maxY.set(0.0); - DoubleSummaryStatistics stats = filteredMeasurements.stream() - .filter(Objects::nonNull) - .map(spec -> spec.getPathAndSiteCorrected()) - .filter(v -> v != 0.0) - .collect(Collectors.summarizingDouble(Double::doubleValue)); - maxY.set(stats.getMax() + .1); - minY.set(stats.getMin() - .1); - - fitPlot.setAutoCalculateYaxisRange(shouldYAxisShrink); - if (shouldYAxisShrink) { - fitPlot.setAllYlimits(minY.get(), maxY.get()); - } else { - fitPlot.setAllYlimits(); - } - } - - private void mapMeasurements(List measurements) { - if (measurements != null) { - mapImpl.addIcons( - iconFactory.genIconsFromWaveforms( - eventSelectionCallback, - stationSelectionCallback, - measurements.stream().map(m -> m.getWaveform()).filter(Objects::nonNull).collect(Collectors.toList()))); - } - } - - private void clearSpectraPlots() { - fitPlot.clearPlot(); - } - - private List filterToEvent(String selectedItem, List spectralMeasurements) { - return spectralMeasurements.stream().filter(spec -> selectedItem.equalsIgnoreCase(spec.getWaveform().getEvent().getEventId())).collect(Collectors.toList()); + @Override + protected String getDisplayName() { + return displayName; } - private Map mapSpectraToPoint(List spectralMeasurements, Function func) { - return spectralMeasurements.stream() - .filter(spectra -> !func.apply(spectra).equals(0.0)) - .collect( - Collectors.toMap( - spectra -> new Point2D.Double(Math.log10(centerFreq(spectra.getWaveform().getLowFrequency(), spectra.getWaveform().getHighFrequency())), - func.apply(spectra)), - Function.identity(), - (a, b) -> b, - HashMap::new)); + @Override + protected List getFitSpectra() { + List spectra = new ArrayList<>(fitSpectra.get(evidCombo.getSelectionModel().getSelectedItem())); + return spectra; } - private List toPlotPoints(List spectralMeasurements, Function func) { - List list = spectralMeasurements.stream() - .filter(spectra -> !func.apply(spectra).equals(0.0)) - .filter( - spectra -> spectra != null - && spectra.getWaveform() != null - && spectra.getWaveform().getStream() != null - && spectra.getWaveform().getStream().getStation() != null) - .map(spectra -> { - String key = spectra.getWaveform().getStream().getStation().getStationName(); - PlotPoint pp = getPlotPoint(key, spectra.getWaveform().isActive()); - PlotPoint point = new LabeledPlotPoint(key, - new PlotPoint(Math.log10( - centerFreq(spectra.getWaveform().getLowFrequency(), spectra.getWaveform().getHighFrequency())), - func.apply(spectra), - pp.getStyle(), - pp.getColor())); - if (hasEventAndStation(spectra)) { - plotPointMap.computeIfAbsent(spectra.getWaveform().getEvent().getEventId(), k -> new ArrayList<>()).add(point); - plotPointMap.computeIfAbsent(spectra.getWaveform().getStream().getStation().getStationName(), k -> new ArrayList<>()).add(point); - } - return point; - }) - .collect(Collectors.toList()); - return list; + @Override + protected void setActive(List waveforms, List plotObjects, boolean active, BiConsumer, Boolean> activationFunc) { + waveformClient.setWaveformsActiveByIds(waveforms.stream().peek(w -> w.setActive(active)).map(w -> w.getId()).collect(Collectors.toList()), active) + .subscribe(s -> activationFunc.accept(plotObjects, active)); } - private PlotPoint getPlotPoint(String key, boolean active) { - PlotPoint pp = new PlotPoint(symbolStyleMap.get(key)); - if (!active) { - pp.setColor(Color.GRAY); + @Override + protected void preloadData() { + spectralMeasurements.clear(); + fitSpectra.clear(); + mwDetails.clear(); + mfs = calibrationClient.makeMwMeasurements(Boolean.TRUE) + .doOnError(err -> log.trace(err.getMessage(), err)) + .doFinally((s) -> Platform.runLater(() -> progressGui.hide())) + .block(Duration.of(1000l, ChronoUnit.SECONDS)); + fitSpectra.putAll(mfs.getFitSpectra()); + + List refEvs = referenceEventClient.getMeasuredEventDetails() + .filter(ev -> ev.getEventId() != null) + .collect(Collectors.toList()) + .subscribeOn(Schedulers.elastic()) + .block(Duration.ofSeconds(10l)); + Collection measMws = mfs.getMeasuredMwDetails().values(); + + //Not terribly efficient but this list should never be huge so eh... + for (MeasuredMwDetails ref : refEvs) { + for (MeasuredMwDetails meas : measMws) { + if (meas.getEventId().equals(ref.getEventId())) { + meas.setRefMw(ref.getRefMw()); + meas.setRefApparentStressInMpa(ref.getRefApparentStressInMpa()); + meas.setValMw(ref.getValMw()); + meas.setValApparentStressInMpa(ref.getValApparentStressInMpa()); + break; + } + } } - return pp; - } - - private boolean hasEventAndStation(SpectraMeasurement spectra) { - return spectra != null - && spectra.getWaveform() != null - && spectra.getWaveform().getEvent() != null - && spectra.getWaveform().getEvent().getEventId() != null - && spectra.getWaveform().getStream() != null - && spectra.getWaveform().getStream().getStation() != null - && spectra.getWaveform().getStream().getStation().getStationName() != null; - } - private double centerFreq(Double lowFrequency, Double highFrequency) { - return lowFrequency + (highFrequency - lowFrequency) / 2.; + mwDetails.addAll(measMws); } - private void reloadData() { + @Override + protected void reloadData() { try { progressGui.show(); progressGui.toFront(); - - Platform.runLater(() -> { - evids.clear(); - evids.add("All"); - }); - - exec.submit(() -> { - maxFreq.set(-0.0); - minFreq.set(1.0); - - DoubleSummaryStatistics stats = paramClient.getSharedFrequencyBandParameters() - .filter(Objects::nonNull) - .collectList() - .block(Duration.of(10l, ChronoUnit.SECONDS)) - .stream() - .map(sfb -> Math.log10(centerFreq(sfb.getLowFrequency(), sfb.getHighFrequency()))) - .collect(Collectors.summarizingDouble(Double::doubleValue)); - maxFreq.set(stats.getMax()); - minFreq.set(stats.getMin()); - - MeasuredMwReportByEvent mfs = calibrationClient.makeMwMeasurements(Boolean.TRUE) - .doOnError(err -> log.trace(err.getMessage(), err)) - .doFinally((s) -> Platform.runLater(() -> progressGui.hide())) - .block(Duration.of(1000l, ChronoUnit.SECONDS)); - - fitSpectra.putAll(mfs.getFitSpectra()); - spectralMeasurements.addAll( - mfs.getSpectraMeasurements() - .values() - .stream() - .flatMap(x -> x.stream()) - .filter(Objects::nonNull) - .filter(spectra -> spectra.getWaveform() != null && spectra.getWaveform().getEvent() != null && spectra.getWaveform().getStream() != null) - .map(md -> new SpectraMeasurement(md)) - .collect(Collectors.toList())); - - symbolStyleMap = symbolStyleMapFactory.build(spectralMeasurements, new Function() { - @Override - public String apply(SpectraMeasurement t) { - return t.getWaveform().getStream().getStation().getStationName(); - } - }); - - List symbols = symbolStyleMap.entrySet().stream().map(e -> new LabeledPlotPoint(e.getKey(), e.getValue())).collect(Collectors.toList()); - List uniqueEvids = mfs.getSpectraMeasurements().keySet().stream().distinct().sorted(new MaybeNumericStringComparator()).collect(Collectors.toList()); - Collection mwDetails = mfs.getMeasuredMwDetails().values(); - - Platform.runLater(() -> { - mwParameters.clear(); - stationSymbols.clear(); - stationSymbols.addAll(symbols); - evids.addAll(uniqueEvids); - mwParameters.addAll(mwDetails); - eventTable.sort(); - }); - }); - - clearSpectraPlots(); - spectralMeasurements.clear(); - fitSpectra.clear(); + exec.submit(() -> super.reloadData()); } catch (RejectedExecutionException e) { progressGui.hide(); } } + @Override + protected List getSpectraData() { + return mfs.getSpectraMeasurements() + .values() + .stream() + .flatMap(x -> x.stream()) + .filter(Objects::nonNull) + .filter(spectra -> spectra.getWaveform() != null && spectra.getWaveform().getEvent() != null && spectra.getWaveform().getStream() != null) + .map(md -> new SpectraMeasurement(md)) + .collect(Collectors.toList()); + } + public void exportMws() { Platform.runLater(() -> { - File file = FileDialogs.openFileSaveDialog("Measured_Mws", ".json", measuredMws.getScene().getWindow()); + File file = FileDialogs.openFileSaveDialog(getDisplayName(), ".json", spectraPlotPanel.getScene().getWindow()); if (file != null && FileDialogs.ensureFileIsWritable(file)) { String filePath = file.getAbsolutePath(); paramExporter.writeMeasuredMws(Paths.get(FilenameUtils.getFullPath(filePath)), FilenameUtils.getName(filePath), mwParameters); @@ -628,168 +226,12 @@ public void exportMws() { } @Override - public void refreshView() { - if (isVisible) { - mapImpl.clearIcons(); - plotSpectra(); - Platform.runLater(() -> { - fitPlot.repaint(); - }); - } - } - - @Override - public Runnable getRefreshFunction() { - return () -> reloadData(); - } - - @Override - public Consumer getScreenshotFunction() { - return (folder) -> { - String timestamp = SnapshotUtils.getTimestampWithLeadingSeparator(); - SnapshotUtils.writePng(folder, new Pair<>("Measured_Mws", plotsTab.getContent()), timestamp); - try { - if (evidCombo.getValue() != null) { - fitPlot.exportSVG(folder + File.separator + "Measured_Mws_" + evidCombo.getValue() + timestamp + ".svg"); - } - } catch (UnsupportedEncodingException | FileNotFoundException | SVGGraphics2DIOException e) { - log.error("Error attempting to write plots for path controller : {}", e.getLocalizedMessage(), e); - } - }; - } - - private void selectDataByCriteria(Boolean selected, String key) { - List points = plotPointMap.get(key); - if (selected) { - selectPoints(points); - } else { - deselectPoints(points); - } - } - - private void selectPoints(List points) { - if (points != null && !points.isEmpty()) { - if (!selectedPoints.isEmpty()) { - deselectPoints(selectedPoints); - } - selectedPoints.addAll(points); - SwingUtilities.invokeLater(() -> { - points.forEach(point -> { - selectPoint(point); - }); - }); - } - } - - private void deselectPoints(List selected) { - if (selected != null && !selected.isEmpty()) { - List points = new ArrayList<>(selected.size()); - points.addAll(selected); - selectedPoints.clear(); - SwingUtilities.invokeLater(() -> { - points.forEach(point -> { - deselectPoint(point); - }); - }); - } - } - - private void selectPoint(PlotPoint point) { - Point2D.Double xyPoint = new Point2D.Double(point.getX(), point.getY()); - boolean existsInPlot = fitSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - fitPlot.selectPoint(xyPoint); - } - } - - private void deselectPoint(PlotPoint point) { - Point2D.Double xyPoint = new Point2D.Double(point.getX(), point.getY()); - boolean existsInPlot = fitSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - fitPlot.deselectPoint(xyPoint); - } - } - - protected void setSymbolsActive(List objs, Boolean active) { - SwingUtilities.invokeLater(() -> { - objs.forEach(sym -> { - if (active) { - sym.setFillColor(sym.getEdgeColor()); - sym.setEdgeColor(Color.BLACK); - } else { - sym.setEdgeColor(sym.getFillColor()); - sym.setFillColor(Color.GRAY); - } - }); - Platform.runLater(() -> { - fitPlot.repaint(); - }); - }); - } - - private void showContextMenu(List waveforms, List plotObjects, MouseEvent t, BiConsumer, Boolean> activationFunc) { - Platform.runLater(() -> { - include.setOnAction(evt -> setActive(waveforms, plotObjects, true, activationFunc)); - exclude.setOnAction(evt -> setActive(waveforms, plotObjects, false, activationFunc)); - menu.show(fitPlotSwingNode, t.getXOnScreen(), t.getYOnScreen()); - }); - } - - private void setActive(List waveforms, List plotObjects, boolean active, BiConsumer, Boolean> activationFunc) { - waveformClient.setWaveformsActiveByIds(waveforms.stream().peek(w -> w.setActive(active)).map(w -> w.getId()).collect(Collectors.toList()), active) - .subscribe(s -> activationFunc.accept(plotObjects, active)); - } - - @Subscribe - private void listener(WaveformChangeEvent wce) { - List nonNull = wce.getIds().stream().filter(Objects::nonNull).collect(Collectors.toList()); - synchronized (spectralMeasurements) { - Map activeMeasurements = spectralMeasurements.stream().collect(Collectors.toMap(x -> x.getWaveform().getId(), Function.identity())); - if (wce.isAddOrUpdate()) { - waveformClient.getWaveformMetadataFromIds(nonNull).collect(Collectors.toList()).block(Duration.ofSeconds(10l)).forEach(md -> { - SpectraMeasurement measurement = activeMeasurements.get(md.getId()); - if (measurement != null) { - measurement.getWaveform().setActive(md.isActive()); - } - }); - } else if (wce.isDelete()) { - nonNull.forEach(id -> { - SpectraMeasurement measurement = activeMeasurements.remove(id); - if (measurement != null) { - spectralMeasurements.remove(measurement); - } - }); - } - } - refreshView(); - } - - private void handlePlotObjectClicked(Object obj, Function measurementFunc) { - if (obj instanceof PlotObjectClicked && ((PlotObjectClicked) obj).getMouseEvent().getID() == MouseEvent.MOUSE_RELEASED) { - PlotObjectClicked poc = (PlotObjectClicked) obj; - PlotObject po = poc.getPlotObject(); - if (po instanceof Symbol) { - SpectraMeasurement spectra = measurementFunc.apply((Symbol) po); - String symbolId = ((Symbol) po).getText(); - if (spectra != null && spectra.getWaveform() != null) { - if (SwingUtilities.isLeftMouseButton(poc.getMouseEvent()) && symbolId != null) { - selectPoints(plotPointMap.get(symbolId)); - if (spectra != null) { - showWaveformPopup(spectra.getWaveform()); - } - Platform.runLater(() -> menu.hide()); - } else if (SwingUtilities.isRightMouseButton(poc.getMouseEvent())) { - showContextMenu(Collections.singletonList(spectra.getWaveform()), Collections.singletonList((Symbol) po), poc.getMouseEvent(), (objs, active) -> { - setSymbolsActive(objs, active); - }); - } - } - } - } + protected void runGuiUpdate(Runnable runnable) throws InvocationTargetException, InterruptedException { + Platform.runLater(runnable); } @Override - public void setVisible(boolean visible) { - isVisible = visible; + protected List getEvents() { + return mwDetails; } } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/PathController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/PathController.java index 297ef9cb..19dd84c6 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/PathController.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/PathController.java @@ -301,7 +301,7 @@ public void update(Observable observable, Object obj) { } } }); - sdPlot.getXaxis().setLabelText("Distance (km)"); + sdPlot.getXaxis().setLabelText("Inter-Station Distance (km)"); sdPlot.setYaxisVisibility(true); sdPlot.setShowPickTooltips(true); diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/ReferenceEventLoadingController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/ReferenceEventLoadingController.java index 6f6d74f9..99a7a862 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/ReferenceEventLoadingController.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/ReferenceEventLoadingController.java @@ -30,7 +30,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import gov.llnl.gnem.apps.coda.calibration.gui.converters.api.FileToReferenceEventConverter; -import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ReferenceEventClient; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; import gov.llnl.gnem.apps.coda.common.model.messaging.Result; //TODO: This class needs a GUI to display a list of files it's attempting to load and process + pass/fail indicators @@ -39,14 +39,14 @@ public class ReferenceEventLoadingController { private static final Logger log = LoggerFactory.getLogger(ReferenceEventLoadingController.class); - private ReferenceEventClient client; + private EventClient client; private int maxBatching = 1000; private List fileConverters; @Autowired - public ReferenceEventLoadingController(List fileConverters, ReferenceEventClient client) throws IOException { + public ReferenceEventLoadingController(List fileConverters, EventClient client) throws IOException { super(); this.fileConverters = fileConverters; this.client = client; diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SiteController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SiteController.java index ce9caa09..b60d597b 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SiteController.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SiteController.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2019, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -14,49 +14,25 @@ */ package gov.llnl.gnem.apps.coda.calibration.gui.controllers; -import java.awt.Color; -import java.awt.event.MouseEvent; -import java.awt.geom.Point2D; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; -import java.text.NumberFormat; import java.time.Duration; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; import java.util.ArrayList; -import java.util.Collections; -import java.util.DoubleSummaryStatistics; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Objects; -import java.util.Observable; -import java.util.Observer; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; import java.util.stream.Collectors; import javax.swing.SwingUtilities; -import org.apache.batik.svggen.SVGGraphics2DIOException; -import org.apache.commons.math3.stat.descriptive.SummaryStatistics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.google.common.eventbus.EventBus; -import com.google.common.eventbus.Subscribe; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ParameterClient; -import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ReferenceEventClient; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.SpectraClient; import gov.llnl.gnem.apps.coda.calibration.gui.plotting.MapPlottingUtilities; import gov.llnl.gnem.apps.coda.calibration.gui.plotting.SpectralPlot; @@ -64,1030 +40,122 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.Spectra; import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurement; import gov.llnl.gnem.apps.coda.common.gui.data.client.api.WaveformClient; -import gov.llnl.gnem.apps.coda.common.gui.events.WaveformSelectionEvent; -import gov.llnl.gnem.apps.coda.common.gui.plotting.LabeledPlotPoint; -import gov.llnl.gnem.apps.coda.common.gui.plotting.PlotPoint; import gov.llnl.gnem.apps.coda.common.gui.plotting.SymbolStyleMapFactory; -import gov.llnl.gnem.apps.coda.common.gui.util.CellBindingUtils; -import gov.llnl.gnem.apps.coda.common.gui.util.MaybeNumericStringComparator; -import gov.llnl.gnem.apps.coda.common.gui.util.NumberFormatFactory; -import gov.llnl.gnem.apps.coda.common.gui.util.SnapshotUtils; import gov.llnl.gnem.apps.coda.common.mapping.api.GeoMap; -import gov.llnl.gnem.apps.coda.common.model.domain.Event; -import gov.llnl.gnem.apps.coda.common.model.domain.Pair; import gov.llnl.gnem.apps.coda.common.model.domain.Waveform; -import gov.llnl.gnem.apps.coda.common.model.messaging.WaveformChangeEvent; -import javafx.application.Platform; -import javafx.beans.binding.Bindings; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.embed.swing.SwingFXUtils; import javafx.embed.swing.SwingNode; -import javafx.event.EventHandler; import javafx.fxml.FXML; -import javafx.geometry.Insets; -import javafx.scene.control.Button; -import javafx.scene.control.ComboBox; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.Label; -import javafx.scene.control.MenuItem; -import javafx.scene.control.Tab; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableColumn.CellDataFeatures; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField; -import javafx.scene.image.ImageView; -import javafx.scene.input.MouseButton; -import llnl.gnem.core.gui.plotting.HorizPinEdge; -import llnl.gnem.core.gui.plotting.PaintMode; -import llnl.gnem.core.gui.plotting.PenStyle; -import llnl.gnem.core.gui.plotting.PlotObjectClicked; -import llnl.gnem.core.gui.plotting.SymbolLegend; -import llnl.gnem.core.gui.plotting.SymbolLegend.SymbolTextPair; -import llnl.gnem.core.gui.plotting.VertPinEdge; -import llnl.gnem.core.gui.plotting.color.ColorMap; -import llnl.gnem.core.gui.plotting.color.ViridisColorMap; -import llnl.gnem.core.gui.plotting.jmultiaxisplot.JMultiAxisPlot; -import llnl.gnem.core.gui.plotting.jmultiaxisplot.JSubplot; -import llnl.gnem.core.gui.plotting.plotobject.Circle; -import llnl.gnem.core.gui.plotting.plotobject.Line; -import llnl.gnem.core.gui.plotting.plotobject.PlotObject; +import javafx.scene.layout.StackPane; import llnl.gnem.core.gui.plotting.plotobject.Symbol; -import llnl.gnem.core.gui.plotting.plotobject.SymbolDef; -import llnl.gnem.core.gui.plotting.plotobject.SymbolFactory; -import llnl.gnem.core.gui.plotting.plotobject.SymbolStyle; import reactor.core.scheduler.Schedulers; @Component -public class SiteController implements MapListeningController, RefreshableController, ScreenshotEnabledController { +public class SiteController extends AbstractMeasurementController { private static final Logger log = LoggerFactory.getLogger(SiteController.class); private static final String X_AXIS_LABEL = "center freq"; - private static final int MAX_LEGEND_COLORS = 8; - - @FXML - private Tab resultsTab; - - @FXML - private SwingNode mwPlotSwingNode; - private JMultiAxisPlot mwPlot; - private JSubplot mwPlotFigure; - private Line mwZeroLine; - - @FXML - private SwingNode stressPlotSwingNode; - private JMultiAxisPlot stressPlot; - private JSubplot stressPlotFigure; - private Line stressZeroLine; - + private static final String displayName = "Site"; + @FXML - private SwingNode sdPlotSwingNode; - private JMultiAxisPlot sdPlot; - private JSubplot sdPlotFigure; + private StackPane site; @FXML private SwingNode rawPlotSwingNode; - private SpectralPlot rawPlot; @FXML private SwingNode pathPlotSwingNode; - private SpectralPlot pathPlot; @FXML private SwingNode sitePlotSwingNode; - private SpectralPlot sitePlot; - - @FXML - private ComboBox evidCombo; - - @FXML - private TableView eventTable; - - @FXML - private TableView iconTable; - - @FXML - private TableColumn evidCol; - - @FXML - private TableColumn mwCol; - - @FXML - private TableColumn stressCol; - - @FXML - private TableColumn measuredMwCol; - - @FXML - private TableColumn mistfitCol; - - // @FXML - // private TableColumn measuredMwSdCol; - - @FXML - private TableColumn measuredStressCol; - - @FXML - private TableColumn measuredCornerFreqCol; - - // @FXML - // private TableColumn measuredCornerFreqSdCol; - - @FXML - private TableColumn measuredMwUq1LowCol; - - @FXML - private TableColumn measuredMwUq1HighCol; - - @FXML - private TableColumn measuredMwUq2LowCol; - - @FXML - private TableColumn measuredMwUq2HighCol; - - @FXML - private TableColumn iterationsCol; - - @FXML - private TableColumn dataCountCol; - - @FXML - private TableColumn iconCol; - - @FXML - private TableColumn stationCol; - - @FXML - private TextField eventTime; - - @FXML - private TextField eventLoc; - - private SpectraClient spectraClient; - private ParameterClient paramClient; - private List spectralMeasurements = new ArrayList<>(); - private ObservableList evids = FXCollections.observableArrayList(); - - private ReferenceEventClient referenceEventClient; - private ObservableList mwParameters = FXCollections.observableArrayList(); - - private WaveformClient waveformClient; - - private ObservableList stationSymbols = FXCollections.observableArrayList(); - private final BiConsumer eventSelectionCallback; - private final BiConsumer stationSelectionCallback; - - private EventBus bus; - - protected Map rawSymbolMap = new ConcurrentHashMap<>(); - protected Map pathSymbolMap = new ConcurrentHashMap<>(); - protected Map siteSymbolMap = new ConcurrentHashMap<>(); - - private Map> plotPointMap = new HashMap<>(); - private final List selectedPoints = new ArrayList<>(); - - private SymbolStyleMapFactory symbolStyleMapFactory; - - private Map symbolStyleMap; - - private GeoMap mapImpl; - - private MapPlottingUtilities iconFactory; - - private MenuItem exclude; - private MenuItem include; - private ContextMenu menu; - - private final NumberFormat dfmt4 = NumberFormatFactory.fourDecimalOneLeadingZero(); - - private ColorMap colorMap = new ViridisColorMap(); - private final AtomicReference minFreq = new AtomicReference<>(1.0); - private final AtomicReference maxFreq = new AtomicReference<>(-0.0); - - private final AtomicReference minY = new AtomicReference<>(1.0); - private final AtomicReference maxY = new AtomicReference<>(-0.0); - - @FXML - private Button xAxisShrink; - private boolean shouldXAxisShrink = false; - private Label xAxisShrinkOn; - private Label xAxisShrinkOff; - - @FXML - private Button yAxisShrink; - private boolean shouldYAxisShrink = false; - private Label yAxisShrinkOn; - private Label yAxisShrinkOff; - - private boolean isVisible = false; @Autowired - private SiteController(SpectraClient spectraClient, ParameterClient paramClient, ReferenceEventClient referenceEventClient, WaveformClient waveformClient, SymbolStyleMapFactory styleFactory, + private SiteController(SpectraClient spectraClient, ParameterClient paramClient, EventClient referenceEventClient, WaveformClient waveformClient, SymbolStyleMapFactory styleFactory, GeoMap map, MapPlottingUtilities iconFactory, EventBus bus) { - this.spectraClient = spectraClient; - this.paramClient = paramClient; - this.referenceEventClient = referenceEventClient; - this.waveformClient = waveformClient; - this.symbolStyleMapFactory = styleFactory; - this.mapImpl = map; - this.bus = bus; - this.iconFactory = iconFactory; - - eventSelectionCallback = (selected, eventId) -> { - selectDataByCriteria(selected, eventId); - }; - - stationSelectionCallback = (selected, stationId) -> { - selectDataByCriteria(selected, stationId); - }; - - this.bus.register(this); + super(spectraClient, paramClient, referenceEventClient, waveformClient, styleFactory, map, iconFactory, bus); } + @Override @FXML public void initialize() { - evidCombo.setItems(evids); - - xAxisShrinkOn = new Label("><"); - xAxisShrinkOn.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - xAxisShrinkOn.setPadding(Insets.EMPTY); - xAxisShrinkOff = new Label("<>"); - xAxisShrinkOff.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - xAxisShrinkOff.setPadding(Insets.EMPTY); - xAxisShrink.setGraphic(xAxisShrinkOn); - double topPad = xAxisShrink.getPadding().getTop(); - double bottomPad = xAxisShrink.getPadding().getBottom(); - xAxisShrink.setPadding(new Insets(topPad, 0, bottomPad, 0)); - xAxisShrink.prefHeightProperty().bind(evidCombo.heightProperty()); - xAxisShrink.setOnAction(e -> { - shouldXAxisShrink = !shouldXAxisShrink; - if (shouldXAxisShrink) { - xAxisShrink.setGraphic(xAxisShrinkOff); - } else { - xAxisShrink.setGraphic(xAxisShrinkOn); - } - refreshView(); - }); - - yAxisShrinkOn = new Label("><"); - yAxisShrinkOn.setRotate(90.0); - yAxisShrinkOn.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - yAxisShrinkOn.setPadding(Insets.EMPTY); - yAxisShrinkOff = new Label("<>"); - yAxisShrinkOff.setRotate(90.0); - yAxisShrinkOff.setStyle("-fx-font-weight:bold; -fx-font-size: 12px;"); - yAxisShrinkOff.setPadding(Insets.EMPTY); - yAxisShrink.setGraphic(yAxisShrinkOn); - yAxisShrink.setPadding(new Insets(yAxisShrink.getPadding().getTop(), 0, yAxisShrink.getPadding().getBottom(), 0)); - yAxisShrink.prefHeightProperty().bind(evidCombo.heightProperty()); - - yAxisShrink.setOnAction(e -> { - shouldYAxisShrink = !shouldYAxisShrink; - if (shouldYAxisShrink) { - yAxisShrink.setGraphic(yAxisShrinkOff); - } else { - yAxisShrink.setGraphic(yAxisShrinkOn); - } - refreshView(); - }); + spectraPlotPanel = site; + super.initialize(); SwingUtilities.invokeLater(() -> { - - rawPlot = new SpectralPlot(); - rawPlot.addPlotObjectObserver(new Observer() { - @Override - public void update(Observable observable, Object obj) { - handlePlotObjectClicked(obj, sym -> rawSymbolMap.get(getPoint2D(sym))); - } - }); - rawPlotSwingNode.setContent(rawPlot); - - pathPlot = new SpectralPlot(); - pathPlot.addPlotObjectObserver(new Observer() { - @Override - public void update(Observable observable, Object obj) { - handlePlotObjectClicked(obj, sym -> pathSymbolMap.get(getPoint2D(sym))); - } - }); - - pathPlotSwingNode.setContent(pathPlot); - - sitePlot = new SpectralPlot(); - sitePlot.addPlotObjectObserver(new Observer() { - @Override - public void update(Observable observable, Object obj) { - handlePlotObjectClicked(obj, sym -> siteSymbolMap.get(getPoint2D(sym))); - } - }); - sitePlotSwingNode.setContent(sitePlot); - - rawPlot.setLabels("Raw Plot", X_AXIS_LABEL, "log10(non-dim)"); - rawPlot.setYaxisVisibility(true); - rawPlot.setAllXlimits(0.0, 0.0); - rawPlot.setDefaultYMin(-2.0); - rawPlot.setDefaultYMax(7.0); - - pathPlot.setLabels("Path Corrected", X_AXIS_LABEL, "log10(non-dim)"); - pathPlot.setYaxisVisibility(true); - pathPlot.setAllXlimits(0.0, 0.0); - pathPlot.setDefaultYMin(-2.0); - pathPlot.setDefaultYMax(7.0); - - sitePlot.setLabels("Moment Rate Spectra", X_AXIS_LABEL, "log10(dyne-cm)"); - sitePlot.setYaxisVisibility(true); - - mwPlot = new JMultiAxisPlot(); - mwPlotFigure = mwPlot.addSubplot(); - - mwPlot.getTitle().setText("Mw comparison"); - mwPlot.getXaxis().setLabelText("Measured"); - mwPlot.setYaxisVisibility(true); - mwPlotSwingNode.setContent(mwPlot); - - mwPlotFigure.getYaxis().setLabelOffset(2.5d * mwPlot.getXaxis().getLabelOffset()); - mwPlotFigure.setAxisLimits(0.0, 10.0, 0.0, 10.0); - mwPlotFigure.getYaxis().setLabelText("Reference"); - - stressPlot = new JMultiAxisPlot(); - stressPlotFigure = stressPlot.addSubplot(); - - stressPlot.getTitle().setText("Stress comparison"); - stressPlot.getXaxis().setLabelText("Measured"); - stressPlot.setYaxisVisibility(true); - stressPlotSwingNode.setContent(stressPlot); - - stressPlotFigure.getYaxis().setLabelOffset(2.5d * stressPlot.getXaxis().getLabelOffset()); - stressPlotFigure.setAxisLimits(0.0, 10.0, 0.0, 10.0); - stressPlotFigure.getYaxis().setLabelText("Reference"); - - sdPlot = new JMultiAxisPlot(); - sdPlotFigure = sdPlot.addSubplot(); - - sdPlot.getTitle().setText("Site correction overview"); - sdPlot.getXaxis().setLabelText("Frequency"); - sdPlot.setYaxisVisibility(true); - sdPlotSwingNode.setContent(sdPlot); - - sdPlotFigure.getYaxis().setLabelOffset(2.5d * sdPlot.getXaxis().getLabelOffset()); - sdPlotFigure.setAxisLimits(0.0, 10.0, 0.0, 2.0); - sdPlotFigure.getYaxis().setLabelText("Standard Deviation"); - - int points = 50; - double dx = 20.0 / (points - 1); - float[] xy = new float[points]; - for (int i = 0; i < points; i++) { - xy[i] = (float) (-5.0 + (dx * i)); - } - mwZeroLine = new Line(xy, xy, Color.LIGHT_GRAY, PaintMode.COPY, PenStyle.DASH, 2); - stressZeroLine = new Line(xy, xy, Color.LIGHT_GRAY, PaintMode.COPY, PenStyle.DASH, 2); - mwPlotFigure.AddPlotObject(mwZeroLine); - stressPlotFigure.AddPlotObject(stressZeroLine); - }); - - evidCombo.valueProperty().addListener((observable, oldValue, newValue) -> { - if (newValue != null && !newValue.equals(oldValue)) { - refreshView(); - } + final SpectraPlotController raw = new SpectraPlotController(SpectraMeasurement::getRawAtMeasurementTime); + SpectralPlot plot = raw.getSpectralPlot(); + plot.addPlotObjectObserver(getPlotpointObserver(() -> raw.getSymbolMap())); + plot.setLabels("Raw Plot", X_AXIS_LABEL, "log10(non-dim)"); + plot.setYaxisVisibility(true); + plot.setAllXlimits(0.0, 0.0); + plot.setDefaultYMin(-2.0); + plot.setDefaultYMax(7.0); + rawPlotSwingNode.setContent(plot); + + final SpectraPlotController path = new SpectraPlotController(SpectraMeasurement::getPathCorrected); + plot = path.getSpectralPlot(); + plot.addPlotObjectObserver(getPlotpointObserver(() -> path.getSymbolMap())); + plot.setLabels("Path Corrected", X_AXIS_LABEL, "log10(non-dim)"); + plot.setYaxisVisibility(true); + plot.setAllXlimits(0.0, 0.0); + plot.setDefaultYMin(-2.0); + plot.setDefaultYMax(7.0); + pathPlotSwingNode.setContent(plot); + + final SpectraPlotController site = new SpectraPlotController(SpectraMeasurement::getPathAndSiteCorrected); + plot = site.getSpectralPlot(); + plot.addPlotObjectObserver(getPlotpointObserver(() -> site.getSymbolMap())); + plot.setLabels("Moment Rate Spectra", X_AXIS_LABEL, "log10(dyne-cm)"); + plot.setYaxisVisibility(true); + site.setYAxisResizable(true); + sitePlotSwingNode.setContent(plot); + + rawPlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); + pathPlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); + sitePlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); + + spectraControllers.add(raw); + spectraControllers.add(path); + spectraControllers.add(site); }); - - CellBindingUtils.attachTextCellFactoriesString(evidCol, MeasuredMwDetails::getEventId); - evidCol.comparatorProperty().set(new MaybeNumericStringComparator()); - - CellBindingUtils.attachTextCellFactories(mwCol, MeasuredMwDetails::getRefMw, dfmt4); - CellBindingUtils.attachTextCellFactories(stressCol, MeasuredMwDetails::getRefApparentStressInMpa, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwCol, MeasuredMwDetails::getMw, dfmt4); - CellBindingUtils.attachTextCellFactories(mistfitCol, MeasuredMwDetails::getMisfit, dfmt4); - // CellBindingUtils.attachTextCellFactories(measuredMwSdCol, MeasuredMwDetails::getMwSd, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredStressCol, MeasuredMwDetails::getApparentStressInMpa, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredCornerFreqCol, MeasuredMwDetails::getCornerFreq, dfmt4); - // CellBindingUtils.attachTextCellFactories(measuredCornerFreqSdCol, MeasuredMwDetails::getCornerFreqSd, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq1LowCol, MeasuredMwDetails::getMw1Min, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq1HighCol, MeasuredMwDetails::getMw1Max, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq2LowCol, MeasuredMwDetails::getMw2Min, dfmt4); - CellBindingUtils.attachTextCellFactories(measuredMwUq2HighCol, MeasuredMwDetails::getMw2Max, dfmt4); - - iterationsCol.setCellValueFactory( - x -> Bindings.createIntegerBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(MeasuredMwDetails::getIterations).orElseGet(() -> 0)).asObject()); - - dataCountCol.setCellValueFactory( - x -> Bindings.createIntegerBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(MeasuredMwDetails::getDataCount).orElseGet(() -> 0)).asObject()); - - iconCol.setCellValueFactory(x -> Bindings.createObjectBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(pp -> { - ImageView imView = new ImageView(SwingFXUtils.toFXImage( - SymbolFactory.createSymbol(pp.getStyle(), 0, 0, 2, pp.getColor(), pp.getColor(), pp.getColor(), "", true, false, 10.0).getBufferedImage(256), - null)); - imView.setFitHeight(12); - imView.setFitWidth(12); - return imView; - }).orElseGet(() -> new ImageView()))); - - stationCol.setCellValueFactory(x -> Bindings.createStringBinding(() -> Optional.ofNullable(x).map(CellDataFeatures::getValue).map(LabeledPlotPoint::getLabel).orElseGet(String::new))); - - eventTable.setItems(mwParameters); - iconTable.setItems(stationSymbols); - - iconCol.prefWidthProperty().bind(iconTable.widthProperty().multiply(0.3)); - stationCol.prefWidthProperty().bind(iconTable.widthProperty().multiply(0.7)); - - menu = new ContextMenu(); - include = new MenuItem("Include Selected"); - menu.getItems().add(include); - exclude = new MenuItem("Exclude Selected"); - menu.getItems().add(exclude); - - EventHandler menuHideHandler = (evt) -> { - if (MouseButton.SECONDARY != evt.getButton()) { - menu.hide(); - } - }; - rawPlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); - pathPlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); - sitePlotSwingNode.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, menuHideHandler); - } - - protected Object getPoint2D(Symbol sym) { - return new Point2D.Double(sym.getXcenter(), sym.getYcenter()); - } - - private void showWaveformPopup(Waveform waveform) { - bus.post(new WaveformSelectionEvent(waveform.getId())); - } - - private void plotSpectra() { - clearSpectraPlots(); - rawSymbolMap.clear(); - pathSymbolMap.clear(); - siteSymbolMap.clear(); - plotPointMap.clear(); - List filteredMeasurements; - - rawPlot.setAutoCalculateXaxisRange(shouldXAxisShrink); - pathPlot.setAutoCalculateXaxisRange(shouldXAxisShrink); - sitePlot.setAutoCalculateXaxisRange(shouldXAxisShrink); - if (!shouldXAxisShrink) { - rawPlot.setAllXlimits(minFreq.get(), maxFreq.get()); - pathPlot.setAllXlimits(minFreq.get(), maxFreq.get()); - sitePlot.setAllXlimits(minFreq.get(), maxFreq.get()); - } - - if (evidCombo != null && evidCombo.getSelectionModel().getSelectedIndex() > 0) { - filteredMeasurements = filterToEvent(evidCombo.getSelectionModel().getSelectedItem(), spectralMeasurements); - Spectra referenceSpectra = spectraClient.getReferenceSpectra(evidCombo.getSelectionModel().getSelectedItem()).block(Duration.ofSeconds(2)); - List fittingSpectra = new ArrayList<>(spectraClient.getFitSpectra(evidCombo.getSelectionModel().getSelectedItem()).block(Duration.ofSeconds(2))); - fittingSpectra.add(referenceSpectra); - rawPlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getRawAtMeasurementTime), Boolean.TRUE); - pathPlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getPathCorrected), Boolean.TRUE); - sitePlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getPathAndSiteCorrected), Boolean.TRUE, fittingSpectra); - if (filteredMeasurements != null && filteredMeasurements.size() > 0 && filteredMeasurements.get(0).getWaveform() != null) { - Event event = filteredMeasurements.get(0).getWaveform().getEvent(); - eventTime.setText("Date: " + DateTimeFormatter.ISO_INSTANT.format(event.getOriginTime().toInstant())); - eventLoc.setText("Lat: " + dfmt4.format(event.getLatitude()) + " Lon: " + dfmt4.format(event.getLongitude())); - eventTime.setVisible(true); - eventLoc.setVisible(true); - } - } else { - eventTime.setVisible(false); - eventLoc.setVisible(false); - filteredMeasurements = spectralMeasurements; - rawPlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getRawAtMeasurementTime), Boolean.FALSE); - pathPlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getPathCorrected), Boolean.FALSE); - sitePlot.plotXYdata(toPlotPoints(filteredMeasurements, SpectraMeasurement::getPathAndSiteCorrected), Boolean.FALSE); - } - rawSymbolMap.putAll(mapSpectraToPoint(filteredMeasurements, SpectraMeasurement::getRawAtMeasurementTime)); - pathSymbolMap.putAll(mapSpectraToPoint(filteredMeasurements, SpectraMeasurement::getPathCorrected)); - siteSymbolMap.putAll(mapSpectraToPoint(filteredMeasurements, SpectraMeasurement::getPathAndSiteCorrected)); - mapMeasurements(filteredMeasurements); - - minY.set(100.0); - maxY.set(0.0); - DoubleSummaryStatistics stats = filteredMeasurements.stream() - .filter(Objects::nonNull) - .map(spec -> spec.getPathAndSiteCorrected()) - .filter(v -> v != 0.0) - .collect(Collectors.summarizingDouble(Double::doubleValue)); - maxY.set(stats.getMax() + .1); - minY.set(stats.getMin() - .1); - - sitePlot.setAutoCalculateYaxisRange(shouldYAxisShrink); - if (shouldYAxisShrink) { - sitePlot.setAllYlimits(minY.get(), maxY.get()); - } else { - sitePlot.setAllYlimits(); - } - } - - private void mapMeasurements(List measurements) { - if (measurements != null) { - mapImpl.addIcons( - iconFactory.genIconsFromWaveforms( - eventSelectionCallback, - stationSelectionCallback, - measurements.stream().map(m -> m.getWaveform()).filter(Objects::nonNull).collect(Collectors.toList()))); - } - } - - private void clearSpectraPlots() { - rawPlot.clearPlot(); - pathPlot.clearPlot(); - sitePlot.clearPlot(); - } - - private List filterToEvent(String selectedItem, List spectralMeasurements) { - return spectralMeasurements.stream().filter(spec -> selectedItem.equalsIgnoreCase(spec.getWaveform().getEvent().getEventId())).collect(Collectors.toList()); - } - - private Map mapSpectraToPoint(List spectralMeasurements, Function func) { - return spectralMeasurements.stream() - .filter(spectra -> !func.apply(spectra).equals(0.0)) - .collect( - Collectors.toMap( - spectra -> new Point2D.Double(Math.log10(centerFreq(spectra.getWaveform().getLowFrequency(), spectra.getWaveform().getHighFrequency())), - func.apply(spectra)), - Function.identity(), - (a, b) -> b, - HashMap::new)); - } - - private List toPlotPoints(List spectralMeasurements, Function func) { - List list = spectralMeasurements.stream() - .filter(spectra -> !func.apply(spectra).equals(0.0)) - .filter( - spectra -> spectra != null - && spectra.getWaveform() != null - && spectra.getWaveform().getStream() != null - && spectra.getWaveform().getStream().getStation() != null) - .map(spectra -> { - String key = spectra.getWaveform().getStream().getStation().getStationName(); - PlotPoint pp = getPlotPoint(key, spectra.getWaveform().isActive()); - PlotPoint point = new LabeledPlotPoint(key, - new PlotPoint(Math.log10( - centerFreq(spectra.getWaveform().getLowFrequency(), spectra.getWaveform().getHighFrequency())), - func.apply(spectra), - pp.getStyle(), - pp.getColor())); - if (hasEventAndStation(spectra)) { - plotPointMap.computeIfAbsent(spectra.getWaveform().getEvent().getEventId(), k -> new ArrayList<>()).add(point); - plotPointMap.computeIfAbsent(spectra.getWaveform().getStream().getStation().getStationName(), k -> new ArrayList<>()).add(point); - } - return point; - }) - .collect(Collectors.toList()); - return list; - } - - private PlotPoint getPlotPoint(String key, boolean active) { - PlotPoint pp = new PlotPoint(symbolStyleMap.get(key)); - if (!active) { - pp.setColor(Color.GRAY); - } - return pp; - } - - private boolean hasEventAndStation(SpectraMeasurement spectra) { - return spectra != null - && spectra.getWaveform() != null - && spectra.getWaveform().getEvent() != null - && spectra.getWaveform().getEvent().getEventId() != null - && spectra.getWaveform().getStream() != null - && spectra.getWaveform().getStream().getStation() != null - && spectra.getWaveform().getStream().getStation().getStationName() != null; - } - - private double centerFreq(Double lowFrequency, Double highFrequency) { - return lowFrequency + (highFrequency - lowFrequency) / 2.; - } - - private void reloadData() { - clearSpectraPlots(); - - mwParameters.clear(); - try { - SwingUtilities.invokeAndWait(() -> { - mwPlotFigure.Clear(); - stressPlotFigure.Clear(); - sdPlotFigure.Clear(); - mwPlotFigure.AddPlotObject(mwZeroLine); - stressPlotFigure.AddPlotObject(stressZeroLine); - List evs = referenceEventClient.getMeasuredEventDetails() - .filter(ev -> ev.getEventId() != null) - .collect(Collectors.toList()) - .subscribeOn(Schedulers.elastic()) - .block(Duration.ofSeconds(10l)); - - maxFreq.set(-0.0); - minFreq.set(1.0); - - DoubleSummaryStatistics stats = paramClient.getSharedFrequencyBandParameters() - .filter(Objects::nonNull) - .collectList() - .block(Duration.of(10l, ChronoUnit.SECONDS)) - .stream() - .map(sfb -> Math.log10(centerFreq(sfb.getLowFrequency(), sfb.getHighFrequency()))) - .collect(Collectors.summarizingDouble(Double::doubleValue)); - maxFreq.set(stats.getMax()); - minFreq.set(stats.getMin()); - - double minMw = 10.0; - double maxMw = 0.0; - double minStress = 1.0; - double maxStress = 0.0; - for (MeasuredMwDetails ev : evs) { - mwParameters.add(ev); - if (ev.getMw() != null && ev.getMw() != 0.0 && ev.getRefMw() != null && ev.getRefMw() != 0.0) { - Double mw = ev.getMw(); - Double ref = ev.getRefMw(); - if (mw < minMw) { - minMw = mw; - } - if (mw > maxMw) { - maxMw = mw; - } - if (ref < minMw) { - minMw = ref; - } - if (ref > maxMw) { - maxMw = ref; - } - - Double stress = ev.getApparentStressInMpa(); - Double refStress = ev.getRefApparentStressInMpa(); - - if (stress != null) { - if (stress < minStress) { - minStress = stress; - } - if (stress > maxStress) { - maxStress = stress; - } - - if (refStress == null) { - refStress = 0.0; - } - - if (refStress < minStress) { - minStress = refStress; - } - if (refStress > maxStress) { - maxStress = refStress; - } - - Circle stressSym = new Circle(stress, refStress, 2.0, Color.RED, Color.RED, Color.RED, ev.getEventId(), true, false, 6.0); - stressPlotFigure.AddPlotObject(stressSym); - } - - Circle mwSym = new Circle(mw, ref, 2.0, Color.RED, Color.RED, Color.RED, ev.getEventId(), true, false, 6.0); - mwPlotFigure.AddPlotObject(mwSym); - } - } - - maxMw = maxMw + .1; - minMw = minMw > maxMw ? minMw = maxMw - .1 : minMw - .1; - - mwPlotFigure.setAxisLimits(minMw, maxMw, minMw, maxMw); - - maxStress = maxStress + .1; - minStress = minStress > maxStress ? minStress = maxStress - .1 : minStress - .1; - - stressPlotFigure.setAxisLimits(minStress, maxStress, minStress, maxStress); - }); - - spectralMeasurements.clear(); - stationSymbols.clear(); - - evids.clear(); - evids.add("All"); - - spectralMeasurements.addAll( - spectraClient.getMeasuredSpectraMetadata() - .filter(Objects::nonNull) - .filter(spectra -> spectra.getWaveform() != null && spectra.getWaveform().getEvent() != null && spectra.getWaveform().getStream() != null) - .toStream() - .collect(Collectors.toList())); - - symbolStyleMap = symbolStyleMapFactory.build(spectralMeasurements, new Function() { - @Override - public String apply(SpectraMeasurement t) { - return t.getWaveform().getStream().getStation().getStationName(); - } - }); - stationSymbols.addAll(symbolStyleMap.entrySet().stream().map(e -> new LabeledPlotPoint(e.getKey(), e.getValue())).collect(Collectors.toList())); - - evids.addAll(spectralMeasurements.stream().map(spec -> spec.getWaveform().getEvent().getEventId()).distinct().sorted(new MaybeNumericStringComparator()).collect(Collectors.toList())); - eventTable.sort(); - - SwingUtilities.invokeAndWait(() -> { - Map> evidStats = new HashMap<>(); - - double minSite = 1E2; - double maxSite = -1E2; - double minFreq = 1E2; - double maxFreq = -1E2; - int minStations = 2; - int maxStations = 3; - - for (SpectraMeasurement meas : spectralMeasurements) { - String evid = meas.getWaveform().getEvent().getEventId(); - Double freq = centerFreq(meas.getWaveform()); - evidStats.computeIfAbsent(evid, key -> new HashMap<>()).computeIfAbsent(freq, (key) -> new SummaryStatistics()).addValue(meas.getPathAndSiteCorrected()); - } - - for (Map freqStats : evidStats.values()) { - for (Entry entry : freqStats.entrySet()) { - double site = entry.getValue().getStandardDeviation(); - if (entry.getValue() != null && entry.getValue().getN() > 1) { - if (maxStations < entry.getValue().getN()) { - maxStations = (int) entry.getValue().getN(); - } - if (site < minSite) { - minSite = site; - } - if (site > maxSite) { - maxSite = site; - } - if (entry.getKey() < minFreq) { - minFreq = entry.getKey(); - } - if (entry.getKey() > maxFreq) { - maxFreq = entry.getKey(); - } - } - } - } - - colorMap.setRange(minStations, maxStations); - - for (Map freqStats : evidStats.values()) { - for (Entry entry : freqStats.entrySet()) { - double site = entry.getValue().getStandardDeviation(); - if (entry.getValue() != null && entry.getValue().getN() > 1) { - Color color = colorMap.getColor(entry.getValue().getN()); - Circle sdSym = new Circle(entry.getKey(), site, 2.0, color, color, color, "", true, false, 6.0); - sdPlotFigure.AddPlotObject(sdSym); - } - } - } - - maxSite = maxSite + .1; - minSite = minSite > maxSite ? minSite = maxSite - .1 : minSite - .1; - - maxFreq = maxFreq + 5.0; - minFreq = minFreq > maxFreq ? minFreq = maxFreq - .1 : minFreq - 1.0; - - sdPlotFigure.setAxisLimits(minFreq, maxFreq, minSite, maxSite); - sdPlotFigure.AddPlotObject(createColorLegend(minStations, maxStations)); - }); - - mwPlot.repaint(); - stressPlot.repaint(); - sdPlot.repaint(); - } catch (InvocationTargetException ex) { - //nop - } catch (InterruptedException ex) { - log.warn("Swing interrupt during re-plotting of site controller", ex); - Thread.currentThread().interrupt(); - } - } - - private PlotObject createColorLegend(int minVal, int maxVal) { - int range = maxVal - minVal; - int legendEntries = range; - if (legendEntries > MAX_LEGEND_COLORS) { - legendEntries = MAX_LEGEND_COLORS; - } - List legendSymbols = new ArrayList<>(range); - - Color color = colorMap.getColor(minVal); - legendSymbols.add(new SymbolTextPair(Integer.toString(minVal), new SymbolDef(SymbolStyle.CIRCLE, 1.0, color, color))); - if (legendEntries > 2) { - int i = minVal + 1; - while (i < legendEntries + minVal) { - color = colorMap.getColor(i); - legendSymbols.add(new SymbolTextPair(Integer.toString(i), new SymbolDef(SymbolStyle.CIRCLE, 1.0, color, color))); - i = i + (range / (legendEntries - 1)); - } - } - color = colorMap.getColor(maxVal); - legendSymbols.add(new SymbolTextPair(maxVal + "+", new SymbolDef(SymbolStyle.CIRCLE, 1.0, color, color))); - return new SymbolLegend(legendSymbols, sdPlot.getTitle().getFontName(), 8.0, HorizPinEdge.RIGHT, VertPinEdge.TOP, 1, 1); - } - - private Double centerFreq(Waveform waveform) { - return ((waveform.getHighFrequency() - waveform.getLowFrequency()) / 2.0) + waveform.getLowFrequency(); } @Override - public void refreshView() { - if (isVisible) { - mapImpl.clearIcons(); - plotSpectra(); - Platform.runLater(() -> { - rawPlot.repaint(); - pathPlot.repaint(); - sitePlot.repaint(); - }); - } + protected String getDisplayName() { + return displayName; } @Override - public Runnable getRefreshFunction() { - return () -> reloadData(); + protected List getFitSpectra() { + return new ArrayList<>(spectraClient.getFitSpectra(evidCombo.getSelectionModel().getSelectedItem()).block(Duration.ofSeconds(2))); } @Override - public Consumer getScreenshotFunction() { - return (folder) -> { - String timestamp = SnapshotUtils.getTimestampWithLeadingSeparator(); - try { - if (resultsTab.isSelected() && evidCombo.getValue() != null) { - SnapshotUtils.writePng(folder, new Pair<>("Site", resultsTab.getContent()), timestamp); - rawPlot.exportSVG(folder + File.separator + "Site_Raw_" + evidCombo.getValue() + timestamp + ".svg"); - pathPlot.exportSVG(folder + File.separator + "Site_Path_" + evidCombo.getValue() + timestamp + ".svg"); - sitePlot.exportSVG(folder + File.separator + "Site_Full_" + evidCombo.getValue() + timestamp + ".svg"); - } else { - mwPlot.exportSVG(folder + File.separator + "Site_Mw" + timestamp + ".svg"); - stressPlot.exportSVG(folder + File.separator + "Site_Stress" + timestamp + ".svg"); - sdPlot.exportSVG(folder + File.separator + "Site_Station_Event_SD" + timestamp + ".svg"); - } - } catch (UnsupportedEncodingException | FileNotFoundException | SVGGraphics2DIOException e) { - log.error("Error attempting to write plots for path controller : {}", e.getLocalizedMessage(), e); - } - }; - } - - private void selectDataByCriteria(Boolean selected, String key) { - List points = plotPointMap.get(key); - if (selected) { - selectPoints(points); - } else { - deselectPoints(points); - } - } - - private void selectPoints(List points) { - if (points != null && !points.isEmpty()) { - if (!selectedPoints.isEmpty()) { - deselectPoints(selectedPoints); - } - selectedPoints.addAll(points); - SwingUtilities.invokeLater(() -> { - points.forEach(point -> { - selectPoint(point); - }); - }); - } - } - - private void deselectPoints(List selected) { - if (selected != null && !selected.isEmpty()) { - List points = new ArrayList<>(selected.size()); - points.addAll(selected); - selectedPoints.clear(); - SwingUtilities.invokeLater(() -> { - points.forEach(point -> { - deselectPoint(point); - }); - }); - } - } - - private void selectPoint(PlotPoint point) { - Point2D.Double xyPoint = new Point2D.Double(point.getX(), point.getY()); - boolean existsInPlot = rawSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - rawPlot.selectPoint(xyPoint); - } - - existsInPlot = pathSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - pathPlot.selectPoint(xyPoint); - } - - existsInPlot = siteSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - sitePlot.selectPoint(xyPoint); - } - } - - private void deselectPoint(PlotPoint point) { - Point2D.Double xyPoint = new Point2D.Double(point.getX(), point.getY()); - boolean existsInPlot = rawSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - rawPlot.deselectPoint(xyPoint); - } - - existsInPlot = pathSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - pathPlot.deselectPoint(xyPoint); - } - - existsInPlot = siteSymbolMap.containsKey(xyPoint); - if (existsInPlot) { - sitePlot.deselectPoint(xyPoint); - } - } - - protected void setSymbolsActive(List objs, Boolean active) { - SwingUtilities.invokeLater(() -> { - objs.forEach(sym -> { - if (active) { - sym.setFillColor(sym.getEdgeColor()); - sym.setEdgeColor(Color.BLACK); - } else { - sym.setEdgeColor(sym.getFillColor()); - sym.setFillColor(Color.GRAY); - } - }); - Platform.runLater(() -> { - rawPlot.repaint(); - pathPlot.repaint(); - sitePlot.repaint(); - }); - }); - } - - private void showContextMenu(List waveforms, List plotObjects, MouseEvent t, BiConsumer, Boolean> activationFunc) { - Platform.runLater(() -> { - include.setOnAction(evt -> setActive(waveforms, plotObjects, true, activationFunc)); - exclude.setOnAction(evt -> setActive(waveforms, plotObjects, false, activationFunc)); - menu.show(sitePlotSwingNode, t.getXOnScreen(), t.getYOnScreen()); - }); - } - - private void setActive(List waveforms, List plotObjects, boolean active, BiConsumer, Boolean> activationFunc) { + protected void setActive(List waveforms, List plotObjects, boolean active, BiConsumer, Boolean> activationFunc) { waveformClient.setWaveformsActiveByIds(waveforms.stream().map(w -> w.getId()).collect(Collectors.toList()), active).subscribe(s -> activationFunc.accept(plotObjects, active)); } - @Subscribe - private void listener(WaveformChangeEvent wce) { - List nonNull = wce.getIds().stream().filter(Objects::nonNull).collect(Collectors.toList()); - synchronized (spectralMeasurements) { - Map activeMeasurements = spectralMeasurements.stream().collect(Collectors.toMap(x -> x.getWaveform().getId(), Function.identity())); - if (wce.isAddOrUpdate()) { - waveformClient.getWaveformMetadataFromIds(nonNull).collect(Collectors.toList()).block(Duration.ofSeconds(10l)).forEach(md -> { - SpectraMeasurement measurement = activeMeasurements.get(md.getId()); - if (measurement != null) { - measurement.getWaveform().setActive(md.isActive()); - } - }); - } else if (wce.isDelete()) { - nonNull.forEach(id -> { - SpectraMeasurement measurement = activeMeasurements.remove(id); - if (measurement != null) { - spectralMeasurements.remove(measurement); - } - }); - } - } - refreshView(); - } - - private void handlePlotObjectClicked(Object obj, Function measurementFunc) { - if (obj instanceof PlotObjectClicked && ((PlotObjectClicked) obj).getMouseEvent().getID() == MouseEvent.MOUSE_RELEASED) { - PlotObjectClicked poc = (PlotObjectClicked) obj; - PlotObject po = poc.getPlotObject(); - if (po instanceof Symbol) { - SpectraMeasurement spectra = measurementFunc.apply((Symbol) po); - if (spectra != null && spectra.getWaveform() != null) { - if (SwingUtilities.isLeftMouseButton(poc.getMouseEvent())) { - selectPoints(plotPointMap.get(((Symbol) po).getText())); - if (spectra != null) { - showWaveformPopup(spectra.getWaveform()); - } - Platform.runLater(() -> menu.hide()); - } else if (SwingUtilities.isRightMouseButton(poc.getMouseEvent())) { - showContextMenu(Collections.singletonList(spectra.getWaveform()), Collections.singletonList((Symbol) po), poc.getMouseEvent(), (objs, active) -> { - setSymbolsActive(objs, active); - }); - } - } - } - } - } - @Override - public void setVisible(boolean visible) { - isVisible = visible; - } - - @FXML - private void clearRefEvents() { - removeRefEvents(mwParameters); - } - - @FXML - private void removeRefEvents() { - List evs = new ArrayList<>(eventTable.getSelectionModel().getSelectedIndices().size()); - eventTable.getSelectionModel().getSelectedIndices().forEach(i -> evs.add(mwParameters.get(i))); - removeRefEvents(evs); + protected List getSpectraData() { + return spectraClient.getMeasuredSpectraMetadata() + .filter(Objects::nonNull) + .filter(spectra -> spectra.getWaveform() != null && spectra.getWaveform().getEvent() != null && spectra.getWaveform().getStream() != null) + .toStream() + .collect(Collectors.toList()); + } + + @Override + protected void runGuiUpdate(Runnable runnable) throws InvocationTargetException, InterruptedException { + SwingUtilities.invokeAndWait(runnable); } - private void removeRefEvents(List evs) { - if (evs != null && !evs.isEmpty()) { - referenceEventClient.removeReferenceEventsByEventId(evs.stream().map(mwd -> mwd.getEventId()).distinct().collect(Collectors.toList())) - .doOnSuccess((v) -> Platform.runLater(() -> reloadData())) - .subscribe(); - } + @Override + protected List getEvents() { + return referenceEventClient.getMeasuredEventDetails() + .filter(ev -> ev.getEventId() != null) + .collect(Collectors.toList()) + .subscribeOn(Schedulers.elastic()) + .block(Duration.ofSeconds(10l)); } } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SpectraPlotController.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SpectraPlotController.java new file mode 100644 index 00000000..da63f08a --- /dev/null +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/controllers/SpectraPlotController.java @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.gui.controllers; + +import java.awt.geom.Point2D; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import gov.llnl.gnem.apps.coda.calibration.gui.plotting.SpectralPlot; +import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurement; + +public class SpectraPlotController { + private final Logger log = LoggerFactory.getLogger(this.getClass()); + private SpectralPlot spectraPlot = new SpectralPlot();; + private Map spectraSymbolMap = new ConcurrentHashMap<>(); + private boolean isYaxisResizble = false; + private Function dataFunction; + + public SpectraPlotController(Function dataFunction) { + this.dataFunction = dataFunction; + } + + public SpectralPlot getSpectralPlot() { + return spectraPlot; + } + + public Map getSymbolMap() { + return spectraSymbolMap; + } + + public void setYAxisResize(boolean shouldYAxisShrink, double minY, double maxY) { + if (isYaxisResizble) { + spectraPlot.setAutoCalculateYaxisRange(shouldYAxisShrink); + if (shouldYAxisShrink) { + spectraPlot.setAllYlimits(minY, maxY); + } else { + spectraPlot.setAllYlimits(); + } + } + } + + public void setYAxisResizable(boolean isYaxisResizble) { + this.isYaxisResizble = isYaxisResizble; + } + + public Function getDataFunc() { + return dataFunction; + } +} diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoader.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoader.java index 53b0643c..6647521f 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoader.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoader.java @@ -25,6 +25,7 @@ import static gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.CalibrationJsonConstants.SITE_CORRECTION_FIELD; import static gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.CalibrationJsonConstants.TYPE_FIELD; import static gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.CalibrationJsonConstants.TYPE_VALUE; +import static gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.CalibrationJsonConstants.VALIDATION_EVENTS_FIELD; import static gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.CalibrationJsonConstants.VELOCITY_CONFIGURATION; import java.io.File; @@ -55,6 +56,7 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeFitterConstraints; import gov.llnl.gnem.apps.coda.calibration.model.domain.SiteCorrections; import gov.llnl.gnem.apps.coda.calibration.model.domain.SiteFrequencyBandParameters; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.VelocityConfiguration; import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.SharedFrequencyBandParametersFileMixin; import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.SiteFrequencyBandParametersFileMixin; @@ -93,21 +95,23 @@ public Flux> convertFiles(List files) { public List> convertJsonParamFile(File file) { if (file == null) { - return Collections.singletonList( - exceptionalResult(new LightweightIllegalStateException(String.format("Error parsing (%s): file does not exist or is unreadable. %s", "NULL", "File reference is null")))); + return Collections.singletonList(exceptionalResult(new LightweightIllegalStateException(String.format("Error parsing (%s): file does not exist or is unreadable. %s", + "NULL", + "File reference is null")))); } List> results = new ArrayList<>(); try { JsonNode node = mapper.readTree(file); - + //TODO: Collapse these into generic method with self-validation type at some point. if (node.has(SCHEMA_FIELD) && node.get(SCHEMA_FIELD).asText().equalsIgnoreCase(SCHEMA_VALUE) && node.has(TYPE_FIELD) && node.get(TYPE_FIELD).asText().equalsIgnoreCase(TYPE_VALUE)) { results.addAll(convertJsonFields(node, BAND_FIELD, x -> sharedFrequenyBandFromJsonNode(x))); results.addAll(convertJsonFields(node, SITE_CORRECTION_FIELD, x -> siteFrequenyBandsFromJsonNode(x))); results.addAll(convertJsonFields(node, MDAC_PS_FIELD, x -> mdacPsFromJsonNode(x))); results.addAll(convertJsonFields(node, MDAC_FI_FIELD, x -> mdacFiFromJsonNode(x))); results.addAll(convertJsonFields(node, REFERENCE_EVENTS_FIELD, x -> refEventsFromJsonNode(x))); + results.addAll(convertJsonFields(node, VALIDATION_EVENTS_FIELD, x -> valEventsFromJsonNode(x))); results.addAll(convertJsonFields(node, VELOCITY_CONFIGURATION, x -> velocityConfigurationFromJsonNode(x))); results.addAll(convertJsonFields(node, SHAPE_CONSTRAINTS, x -> shapeConstraintsFromJsonNode(x))); } else if (node.has(ENVELOPE_JOB_NODE)) { @@ -168,6 +172,17 @@ protected Result refEventsFromJsonNode(JsonNode node) { } } + protected Result valEventsFromJsonNode(JsonNode node) { + ObjectReader reader = mapper.readerFor(ValidationMwParameters.class); + try { + //TODO: Validate all fields + ValidationMwParameters val = reader.readValue(node); + return new Result<>(true, val); + } catch (IOException e) { + return exceptionalResult(e); + } + } + protected Result mdacPsFromJsonNode(JsonNode node) { ObjectReader reader = mapper.readerFor(MdacParametersPS.class); try { diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/CalibrationWebClient.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/CalibrationWebClient.java index d2c2c2a3..2c978947 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/CalibrationWebClient.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/CalibrationWebClient.java @@ -45,6 +45,19 @@ public Mono runCalibration(Boolean autoPickingEnabled) { return client.get().uri("/calibration/start/" + autoPickingEnabled).accept(MediaType.APPLICATION_JSON).exchange().flatMap(resp -> resp.bodyToMono(String.class)); } + @Override + public Mono cancelCalibration(Long id) { + return client.post() + .uri("/calibration/cancel/") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(id) + .exchange() + .doOnError(e -> log.error(e.getMessage(), e)) + .doOnSuccess(cr -> log.error(cr.toString())) + .flatMap(resp -> resp.bodyToMono(String.class).map(Boolean::valueOf)); + } + @Override public Mono makeMwMeasurements(Boolean autoPickingEnabled) { return makeMwMeasurements(autoPickingEnabled, null); diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/ReferenceEventWebClient.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/EventWebClient.java similarity index 66% rename from calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/ReferenceEventWebClient.java rename to calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/EventWebClient.java index 9b106787..fd4aa413 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/ReferenceEventWebClient.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/EventWebClient.java @@ -23,21 +23,22 @@ import com.fasterxml.jackson.core.JsonProcessingException; -import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ReferenceEventClient; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.common.model.domain.Event; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @Component -public class ReferenceEventWebClient implements ReferenceEventClient { +public class EventWebClient implements EventClient { private WebClient client; @Autowired - public ReferenceEventWebClient(WebClient client) { + public EventWebClient(WebClient client) { this.client = client; } @@ -98,4 +99,48 @@ public Mono removeReferenceEventsByEventId(List evids) { .flatMap(resp -> Mono.empty()); } + @Override + public Flux getValidationEvents() { + return client.get() + .uri("/validation-events") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .flatMapMany(response -> response.bodyToFlux(ValidationMwParameters.class)) + .onErrorReturn(new ValidationMwParameters()); + } + + @Override + public Mono postValidationEvents(List events) throws JsonProcessingException { + return client.post() + .uri("/validation-events/batch") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(events) + .exchange() + .flatMap(resp -> resp.bodyToMono(String.class)); + } + + @Override + public Mono removeValidationEventsByEventId(List evids) { + return client.post() + .uri("/validation-events/delete/batch-by-evids") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(evids) + .exchange() + .flatMap(resp -> Mono.empty()); + } + + @Override + public Flux toggleValidationEventsByEventId(List evids) { + return client.post() + .uri("/calibration/toggle-validation/batch-by-evids") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(evids) + .exchange() + .flux() + .flatMap(resp -> resp.bodyToFlux(String.class)); + } + } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/SpectraWebClient.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/SpectraWebClient.java index a1129624..fa7a36b6 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/SpectraWebClient.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/SpectraWebClient.java @@ -70,6 +70,18 @@ public Mono getReferenceSpectra(String eventId) { .flatMap(response -> response.bodyToMono(Spectra.class)) .onErrorReturn(new Spectra()); } + + @Override + public Mono getValidationSpectra(String eventId) { + return client.post() + .uri("/spectra-measurements/validation-spectra") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .bodyValue(eventId) + .exchange() + .flatMap(response -> response.bodyToMono(Spectra.class)) + .onErrorReturn(new Spectra()); + } @Override public Mono> getFitSpectra(String eventId) { diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationClient.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationClient.java index 26dd49bb..ec08ac0d 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationClient.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationClient.java @@ -22,6 +22,8 @@ public interface CalibrationClient { public Mono runCalibration(Boolean autoPickingEnabled); + + public Mono cancelCalibration(Long id); public Mono makeMwMeasurements(Boolean autoPickingEnabled); diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationJsonConstants.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationJsonConstants.java index ac372a33..bf868e19 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationJsonConstants.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/CalibrationJsonConstants.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2019, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -24,6 +24,7 @@ public class CalibrationJsonConstants { public static final String MDAC_PS_FIELD = "mdac-ps"; public static final String MDAC_FI_FIELD = "mdac-fi"; public static final String REFERENCE_EVENTS_FIELD = "reference-events"; + public static final String VALIDATION_EVENTS_FIELD = "validation-events"; public static final String MEASURED_EVENTS_FIELD = "measured-events"; public static final String VELOCITY_CONFIGURATION = "velocity-configuration"; public static final String SHAPE_CONSTRAINTS = "shape-constraints"; diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/ReferenceEventClient.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/EventClient.java similarity index 77% rename from calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/ReferenceEventClient.java rename to calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/EventClient.java index 34800d5d..4f6d8d0e 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/ReferenceEventClient.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/EventClient.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -21,21 +21,30 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.common.model.domain.Event; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -public interface ReferenceEventClient { - - public Flux getReferenceEvents(); +public interface EventClient { public Flux getMeasuredEvents(); - - public Mono postReferenceEvents(List refEvents) throws JsonProcessingException; + + public Flux getMeasuredEventDetails(); + + public Flux getReferenceEvents(); + + public Flux getValidationEvents(); public Mono getEvent(String eventId); - public Flux getMeasuredEventDetails(); + public Mono postReferenceEvents(List refEvents) throws JsonProcessingException; + + public Mono postValidationEvents(List valEvents) throws JsonProcessingException; public Mono removeReferenceEventsByEventId(List evids); + + public Mono removeValidationEventsByEventId(List evids); + + public Flux toggleValidationEventsByEventId(List evids); } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/SpectraClient.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/SpectraClient.java index 4df136a6..32cfbc05 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/SpectraClient.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/client/api/SpectraClient.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -29,5 +29,8 @@ public interface SpectraClient { public Mono getReferenceSpectra(String eventId); + public Mono getValidationSpectra(String eventId); + public Mono> getFitSpectra(String eventId); + } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/JsonTempFileWriter.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/JsonTempFileWriter.java index 69704037..5582a48b 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/JsonTempFileWriter.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/JsonTempFileWriter.java @@ -34,19 +34,20 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeType; -import com.fasterxml.jackson.databind.node.MissingNode; import com.fasterxml.jackson.databind.node.ObjectNode; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.CalibrationJsonConstants; import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.MeasuredMwTempFileWriter; import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.ParamTempFileWriter; import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.ReferenceMwTempFileWriter; +import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.ValidationMwTempFileWriter; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersFI; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersPS; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeFitterConstraints; import gov.llnl.gnem.apps.coda.calibration.model.domain.SiteFrequencyBandParameters; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.VelocityConfiguration; import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.MdacFiFileMixin; import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.MdacPsFileMixin; @@ -54,12 +55,13 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.ShapeFitterConstraintsFileMixin; import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.SharedFrequencyBandParametersFileMixin; import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.SiteFrequencyBandParametersFileMixin; +import gov.llnl.gnem.apps.coda.calibration.model.domain.mixins.ValidationMwParametersFileMixin; import gov.llnl.gnem.apps.coda.common.model.domain.FrequencyBand; import gov.llnl.gnem.apps.coda.common.model.domain.SharedFrequencyBandParameters; import gov.llnl.gnem.apps.coda.common.model.domain.Station; @Component -public class JsonTempFileWriter implements ParamTempFileWriter, MeasuredMwTempFileWriter, ReferenceMwTempFileWriter { +public class JsonTempFileWriter implements ParamTempFileWriter, MeasuredMwTempFileWriter, ReferenceMwTempFileWriter, ValidationMwTempFileWriter { private static final Logger log = LoggerFactory.getLogger(JsonTempFileWriter.class); @@ -79,6 +81,7 @@ public JsonTempFileWriter() { mapper.addMixIn(ShapeFitterConstraints.class, ShapeFitterConstraintsFileMixin.class); mapper.addMixIn(MdacParametersFI.class, MdacFiFileMixin.class); mapper.addMixIn(MdacParametersPS.class, MdacPsFileMixin.class); + mapper.addMixIn(ValidationMwParameters.class, ValidationMwParametersFileMixin.class); } @Override @@ -103,6 +106,21 @@ public void writeReferenceMwParams(Path folder, List mws) } } + @Override + public void writeValidationMws(Path folder, List validationMws) { + writeValidationMws(folder, CALIBRATION_JSON_NAME, validationMws); + } + + @Override + public void writeValidationMws(Path folder, String filename, List validationMws) { + try { + JsonNode document = createOrGetDocument(folder, filename); + writeValidationEvents(createOrGetFile(folder, filename), document, validationMws); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + @Override public void writeMeasuredMws(Path folder, List measuredMwsDetails) { writeMeasuredMws(folder, MW_JSON_NAME, measuredMwsDetails); @@ -125,12 +143,12 @@ private void writeParams(File file, JsonNode document, Map>> siteBands = siteParameters.entrySet() .stream() - .collect( - Collectors.groupingBy( - e -> e.getKey().getNetworkName(), - Collectors.toMap( - e -> e.getKey().getStationName(), - e -> e.getValue().values().stream().collect(Collectors.toList())))); + .collect(Collectors.groupingBy(e -> e.getKey().getNetworkName(), + Collectors.toMap(e -> e.getKey().getStationName(), + e -> e.getValue() + .values() + .stream() + .collect(Collectors.toList())))); writeArrayNodeToFile(file, document, siteBands.entrySet(), CalibrationJsonConstants.SITE_CORRECTION_FIELD); } @@ -152,6 +170,10 @@ private void writeReferenceEvents(File file, JsonNode document, List validationMws) throws IOException { + writeArrayNodeToFile(file, document, validationMws, CalibrationJsonConstants.VALIDATION_EVENTS_FIELD); + } + private void writeMeasuredEvents(File file, JsonNode document, List measuredMwsDetails) throws IOException { writeArrayNodeToFile(file, document, measuredMwsDetails, CalibrationJsonConstants.MEASURED_EVENTS_FIELD); } @@ -208,7 +230,7 @@ private JsonNode createOrGetDocument(Path folder, String filename) throws JsonPr } else { rootNode = mapper.createObjectNode(); } - + if (rootNode == null || rootNode.getNodeType().equals(JsonNodeType.MISSING)) { rootNode = mapper.createObjectNode(); } @@ -217,7 +239,7 @@ private JsonNode createOrGetDocument(Path folder, String filename) throws JsonPr private File createOrGetFile(Path folder, String filename) throws IOException { Files.deleteIfExists(folder.resolve(filename)); - File file = Files.createFile(folder.resolve(filename)).toFile(); + File file = Files.createFile(folder.resolve(filename)).toFile(); return file; } } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/ParamExporter.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/ParamExporter.java index 0032b724..8d557060 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/ParamExporter.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/ParamExporter.java @@ -39,17 +39,19 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ParameterClient; -import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ReferenceEventClient; import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.MeasuredMwTempFileWriter; import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.ParamTempFileWriter; import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.ReferenceMwTempFileWriter; +import gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api.ValidationMwTempFileWriter; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersFI; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersPS; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeFitterConstraints; import gov.llnl.gnem.apps.coda.calibration.model.domain.SiteFrequencyBandParameters; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.VelocityConfiguration; import gov.llnl.gnem.apps.coda.common.model.domain.FrequencyBand; import gov.llnl.gnem.apps.coda.common.model.domain.SharedFrequencyBandParameters; @@ -63,19 +65,21 @@ public class ParamExporter { private ParameterClient paramClient; private List paramWriters; - private ReferenceEventClient eventClient; + private EventClient eventClient; private List mwWriters; private List referenceMwWriters; + private List validationMwWriters; @Autowired - public ParamExporter(ParameterClient paramClient, ReferenceEventClient eventClient, List paramWriters, List mwWriters, - List referenceMwWriters) { + public ParamExporter(ParameterClient paramClient, EventClient eventClient, List paramWriters, List mwWriters, + List referenceMwWriters, List validationMwWriters) { this.paramClient = paramClient; this.paramWriters = paramWriters; this.eventClient = eventClient; this.mwWriters = mwWriters; this.referenceMwWriters = referenceMwWriters; + this.validationMwWriters = validationMwWriters; } public File createExportArchive() throws IOException { @@ -132,6 +136,14 @@ public File createExportArchive() throws IOException { writer.writeReferenceMwParams(tmpFolder, referenceMws); } } + + if (validationMwWriters != null) { + List validationMws = new ArrayList<>(); + validationMws.addAll(eventClient.getValidationEvents().filter(Objects::nonNull).toStream().collect(Collectors.toList())); + for (ValidationMwTempFileWriter writer : validationMwWriters) { + writer.writeValidationMws(tmpFolder, validationMws); + } + } } File zipDir = File.createTempFile("zip-dir", "tmp"); diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/api/ValidationMwTempFileWriter.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/api/ValidationMwTempFileWriter.java new file mode 100644 index 00000000..d0836dc4 --- /dev/null +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/data/exporters/api/ValidationMwTempFileWriter.java @@ -0,0 +1,26 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.gui.data.exporters.api; + +import java.nio.file.Path; +import java.util.List; + +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; + +public interface ValidationMwTempFileWriter { + public void writeValidationMws(Path folder, List validationMws); + + public void writeValidationMws(Path folder, String filename, List validationMws); +} diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlot.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlot.java index ab8bb26a..b5a991ef 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlot.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlot.java @@ -277,21 +277,25 @@ private void plotSynthetic(Waveform waveform, SyntheticCoda synth, final TimeT b if (startTime.lt(endTime)) { interpolatedSeries.cut(startTime, endTime); synthSeriesBeforeEndMarker.cut(startTime, endTime); - - TimeSeries diffSeis = interpolatedSeries.subtract(synthSeriesBeforeEndMarker); - int synthStartTimeShift = (int) (startTime.subtractD(beginTime) + 0.5); - double median = diffSeis.getMedian(); - - subplot.DeletePlotObject(legendRef); - subplot.AddPlotObject(createLegend(labelText + "Shift: " + dfmt4.format(median))); - subplot.AddPlotObject(createLine(synthStartTimeShift, median, synthSeriesBeforeEndMarker, Color.GREEN), PLOT_ORDERING.MODEL_FIT.getZOrder()); - - if (endTime.lt(synthSeriesRemaining.getEndtime())) { - synthSeriesRemaining.cutBefore(endTime); - int remainingStartTimeShift = (int) (endTime.subtractD(beginTime) + 0.5); - subplot.AddPlotObject(createLine(remainingStartTimeShift, median, synthSeriesRemaining, Color.GREEN, DEFAULT_LINE_WIDTH, PenStyle.DASH), PLOT_ORDERING.MODEL_FIT.getZOrder()); + if (synthSeriesBeforeEndMarker.getLength() > 1) { + TimeSeries diffSeis = interpolatedSeries.subtract(synthSeriesBeforeEndMarker); + int synthStartTimeShift = (int) (startTime.subtractD(beginTime) + 0.5); + double median = diffSeis.getMedian(); + + subplot.DeletePlotObject(legendRef); + subplot.AddPlotObject(createLegend(labelText + "Shift: " + dfmt4.format(median))); + subplot.AddPlotObject(createLine(synthStartTimeShift, median, synthSeriesBeforeEndMarker, Color.GREEN), PLOT_ORDERING.MODEL_FIT.getZOrder()); + + if (endTime.lt(synthSeriesRemaining.getEndtime())) { + synthSeriesRemaining.cutBefore(endTime); + int remainingStartTimeShift = (int) (endTime.subtractD(beginTime) + 0.5); + if (synthSeriesRemaining.getLength() > 1) { + subplot.AddPlotObject(createLine(remainingStartTimeShift, median, synthSeriesRemaining, Color.GREEN, DEFAULT_LINE_WIDTH, PenStyle.DASH), + PLOT_ORDERING.MODEL_FIT.getZOrder()); + } + } + repaint(); } - repaint(); } } } @@ -363,12 +367,11 @@ protected void handlePickMovedState(Object obj) { pick.setPickTimeSecFromOrigin((float) (vpl.getXval() - new TimeT(pick.getWaveform().getEvent().getOriginTime()).subtractD(new TimeT(pick.getWaveform().getBeginTime())))); if (pick.getPickName() != null && PICK_TYPES.F.getPhase().equalsIgnoreCase(pick.getPickName().trim())) { pick.getWaveform() - .setAssociatedPicks( - pick.getWaveform() - .getAssociatedPicks() - .stream() - .filter(p -> p.getPickName() != null && !PICK_TYPES.AP.getPhase().equalsIgnoreCase(p.getPickName().trim())) - .collect(Collectors.toList())); + .setAssociatedPicks(pick.getWaveform() + .getAssociatedPicks() + .stream() + .filter(p -> p.getPickName() != null && !PICK_TYPES.AP.getPhase().equalsIgnoreCase(p.getPickName().trim())) + .collect(Collectors.toList())); } waveformClient.postWaveform(pick.getWaveform()).subscribe(this::setWaveform); } diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlotManager.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlotManager.java index 848b7c93..77f8be02 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlotManager.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/CodaWaveformPlotManager.java @@ -91,7 +91,7 @@ public class CodaWaveformPlotManager extends JPanel { @Override public void actionPerformed(ActionEvent e) { - if (currentPage < totalPages) { + if ((currentPage + 1) < totalPages) { currentPage++; loadWaveformsForPage(currentPage); } @@ -240,7 +240,12 @@ public void setOrderedWaveformIDs(List waveformIDs) { allWaveformIDs.add(waveformIDs.get(i)); } if (waveformIDs.size() > pageSize) { - totalPages = (int) ((waveformIDs.size() - 1) / pageSize); + double page = waveformIDs.size() / (double) pageSize; + if (page % 1.0 > 0.001) { + totalPages = (int) (page + 1.0); + } else { + totalPages = (int) (page); + } } else { totalPages = 1; } @@ -270,7 +275,7 @@ private void loadWaveformsForPage(int pageNumber) { results.add(createPlot(waveformClient.getWaveformFromId(allWaveformIDs.get(0)).publishOn(Schedulers.elastic()).block(Duration.ofSeconds(10)))); } } else { - pagingLabel.setText(pageNumber + 1 + "/" + (totalPages + 1)); + pagingLabel.setText(pageNumber + 1 + "/" + totalPages); List pageIds = new ArrayList<>(pageSize.intValue()); long skipVal = pageNumber * pageSize; if (skipVal != 0 && allWaveformIDs.size() > pageSize && allWaveformIDs.size() - skipVal < pageSize) { diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/SpectralPlot.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/SpectralPlot.java index a2e7cf50..0be3b579 100644 --- a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/SpectralPlot.java +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/plotting/SpectralPlot.java @@ -208,6 +208,9 @@ private void plotSpectraObject(JSubplot jsubplot, Spectra spectra, Legend legend case REF: line = new Line(x, y, Color.BLACK, PaintMode.COPY, PenStyle.DASH, 2); break; + case VAL: + line = new Line(x, y, Color.BLUE, PaintMode.COPY, PenStyle.DASHDOT, 2); + break; case UQ1: line = new Line(x, y, Color.LIGHT_GRAY, PaintMode.COPY, PenStyle.DASH, 2); break; diff --git a/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/util/Axis.java b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/util/Axis.java new file mode 100644 index 00000000..930cbdec --- /dev/null +++ b/calibration-gui/src/main/java/gov/llnl/gnem/apps/coda/calibration/gui/util/Axis.java @@ -0,0 +1,18 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.gui.util; + +public enum Axis { + X, Y; +} diff --git a/calibration-gui/src/main/resources/fxml/Data.fxml b/calibration-gui/src/main/resources/fxml/Data.fxml index be063020..980e75db 100644 --- a/calibration-gui/src/main/resources/fxml/Data.fxml +++ b/calibration-gui/src/main/resources/fxml/Data.fxml @@ -25,6 +25,7 @@ + diff --git a/calibration-gui/src/main/resources/fxml/MeasuredMws.fxml b/calibration-gui/src/main/resources/fxml/MeasuredMws.fxml index e513f701..eba18b79 100644 --- a/calibration-gui/src/main/resources/fxml/MeasuredMws.fxml +++ b/calibration-gui/src/main/resources/fxml/MeasuredMws.fxml @@ -4,7 +4,9 @@ + + @@ -18,13 +20,14 @@ - + - + @@ -41,31 +44,30 @@ - + - - + - - - - - - + + + + + + @@ -88,7 +90,7 @@ - + @@ -97,36 +99,87 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/calibration-gui/src/main/resources/fxml/Site.fxml b/calibration-gui/src/main/resources/fxml/Site.fxml index f963a3af..b787f03e 100644 --- a/calibration-gui/src/main/resources/fxml/Site.fxml +++ b/calibration-gui/src/main/resources/fxml/Site.fxml @@ -20,7 +20,8 @@ - + @@ -43,30 +44,30 @@ - + - + - - - - - - + + + + + + @@ -160,35 +161,36 @@ - - + - + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + + diff --git a/calibration-gui/src/test/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoaderTest.java b/calibration-gui/src/test/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoaderTest.java index f6d7398c..eed5b4c0 100644 --- a/calibration-gui/src/test/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoaderTest.java +++ b/calibration-gui/src/test/java/gov/llnl/gnem/apps/coda/calibration/gui/converters/param/CodaJsonParamLoaderTest.java @@ -32,6 +32,7 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeFitterConstraints; import gov.llnl.gnem.apps.coda.calibration.model.domain.SiteCorrections; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.common.model.domain.SharedFrequencyBandParameters; import gov.llnl.gnem.apps.coda.common.model.messaging.Result; import reactor.core.publisher.Flux; @@ -116,6 +117,16 @@ public final void testRefMw(String filePath) throws Exception { Long.valueOf(2l), results.filter(r -> r.isSuccess() && r.getResultPayload().orElse(null) instanceof ReferenceMwParameters).count().block()); } + + @ParameterizedTest + @MethodSource("filePaths") + public final void testValidationMw(String filePath) throws Exception { + Flux> results = convertFile(filePath); + Assert.assertEquals( + "Expected to have 2 valid validation event definitions", + Long.valueOf(2l), + results.filter(r -> r.isSuccess() && r.getResultPayload().orElse(null) instanceof ValidationMwParameters).count().block()); + } @ParameterizedTest @MethodSource("filePaths") diff --git a/calibration-gui/src/test/resources/calibration-params-test.json b/calibration-gui/src/test/resources/calibration-params-test.json index cf2bce7a..86caf0b6 100644 --- a/calibration-gui/src/test/resources/calibration-params-test.json +++ b/calibration-gui/src/test/resources/calibration-params-test.json @@ -1,545 +1,546 @@ { - "schemaVersion": 1, - "type": "llnl/coda-calibration-tool", - "bands": [ - { - "lowFreqHz": 0.02, - "highFreqHz": 0.03, - "minWindowLengthSec": 100, - "maxWindowLengthSec": 1000, - "snrThresholdAboveNoiseLog10": 0.5, - "measurementTimeSec": 100.0, - "velocity0": 1, - "velocity1": 2, - "velocity2": 3, - "beta0": 4, - "beta1": 5, - "beta2": 6, - "gamma0": 7, - "gamma1": 8, - "gamma2": 9, - "p1": 10, - "p2": 11, - "xc": 12, - "xt": 13, - "q": 14 - }, - { - "lowFreqHz": 0.03, - "highFreqHz": 0.05, - "minWindowLengthSec": 100, - "maxWindowLengthSec": 800, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 0.05, - "highFreqHz": 0.1, - "minWindowLengthSec": 75, - "maxWindowLengthSec": 600, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 0.1, - "highFreqHz": 0.2, - "minWindowLengthSec": 75, - "maxWindowLengthSec": 550, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 0.2, - "highFreqHz": 0.3, - "minWindowLengthSec": 50, - "maxWindowLengthSec": 550, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 0.3, - "highFreqHz": 0.5, - "minWindowLengthSec": 50, - "maxWindowLengthSec": 500, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 0.5, - "highFreqHz": 0.7, - "minWindowLengthSec": 50, - "maxWindowLengthSec": 500, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 0.7, - "highFreqHz": 1.0, - "minWindowLengthSec": 40, - "maxWindowLengthSec": 450, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 1.0, - "highFreqHz": 1.5, - "minWindowLengthSec": 40, - "maxWindowLengthSec": 450, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 1.5, - "highFreqHz": 2.0, - "minWindowLengthSec": 40, - "maxWindowLengthSec": 400, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 2.0, - "highFreqHz": 3.0, - "minWindowLengthSec": 40, - "maxWindowLengthSec": 400, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 3.0, - "highFreqHz": 4.0, - "minWindowLengthSec": 40, - "maxWindowLengthSec": 400, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 4.0, - "highFreqHz": 6.0, - "minWindowLengthSec": 40, - "maxWindowLengthSec": 400, - "snrThresholdAboveNoiseLog10": 0.5 - }, - { - "lowFreqHz": 6.0, - "highFreqHz": 8.0, - "minWindowLengthSec": 40, - "maxWindowLengthSec": 350, - "snrThresholdAboveNoiseLog10": 0.5 - } - ], - "mdac-fi": { - "alphaR": 5000, - "alphas": 6000, - "betas": 3500, - "betaR": 2900, - "sigma": 0.3, - "delSigma": 98.0, - "psi": 0.25, - "delPsi": 99.0, - "zeta": 1.0, - "m0ref": 10000000000000000, - "radPatP": 0.44, - "radPatS": 0.6, - "rhor": 2500, - "rhos": 2700 - }, - "mdac-ps": [ - { - "phase": "Pn", - "q0": 210, - "delQ0": 100, - "gamma0": 0.65, - "delGamma0": 101, - "u0": 7900, - "eta": 1.1, - "delEta": 102, - "distCrit": 0.001, - "snr": 2 - }, - { - "phase": "Pg", - "q0": 190, - "delQ0": 0, - "gamma0": 0.45, - "delGamma0": 0, - "u0": 6000, - "eta": 0.5, - "delEta": 0, - "distCrit": 100, - "snr": 2 - }, - { - "phase": "Sn", - "q0": 590, - "delQ0": 0, - "gamma0": 0.55, - "delGamma0": 0, - "u0": 4500, - "eta": 1.1, - "delEta": 0, - "distCrit": 0.001, - "snr": 2 - }, - { - "phase": "Lg", - "q0": 200, - "delQ0": 0, - "gamma0": 0.54, - "delGamma0": 0, - "u0": 3500, - "eta": 0.5, - "delEta": 0, - "distCrit": 100, - "snr": 2 - } - ], - "reference-events": [ - { - "eventId": "0331199924", - "refMw": 3.0 - }, - { - "eventId": "0401199924", - "refMw": 5.0, - "apparentStressInMpa": 0.7 - } - ], - "shape-constraints" : { - "maxVP1" : 1600.0, - "minVP1" : 150.0, - "v0reg" : 1100.0, - "maxVP2" : 15000.0, - "minVP2" : 11.0, - "maxVP3" : 15000.0, - "minVP3" : 11.0, - "maxBP1" : 11000.0, - "minBP1" : -1500.0, - "b0reg" : 110000.0, - "maxBP2" : 120.0, - "minBP2" : 10.1, - "maxBP3" : 11500.0, - "minBP3" : 11.0E-4, - "maxGP1" : 1100.0, - "minGP1" : 10.0, - "g0reg" : 1100.0, - "maxGP2" : 1101.0, - "minGP2" : 10.0, - "g1reg" : -11.0, - "maxGP3" : 1101.0, - "minGP3" : 11.0, - "yvvMin" : 10.5, - "yvvMax" : 16.01, - "vDistMax" : 11600.0, - "vDistMin" : 10.0, - "ybbMin" : -10.12, - "ybbMax" : 15.0E-4, - "bDistMax" : 11550.0, - "bDistMin" : 10.0, - "yggMin" : 10.01, - "yggMax" : 1100.0, - "gDistMin" : 1600.0, - "gDistMax" : 10.0, - "minIntercept" : 10.001, - "maxIntercept" : 120.0, - "minBeta" : -14.0, - "maxBeta" : -11.0E-4, - "minGamma" : 10.001, - "maxGamma" : 14.0, - "iterations" : 110 - }, - "site-corrections": [ - { - "BK": { - "SAO": [ - { - "siteTerm": 19.160301172988373, - "lowFreqHz": 0.2, - "highFreqHz": 0.3 - }, - { - "siteTerm": 19.160301172988373, - "lowFreqHz": 0.2, - "highFreqHz": 0.3 - }, - { - "siteTerm": 19.078495953084072, - "lowFreqHz": 0.3, - "highFreqHz": 0.5 - }, - { - "siteTerm": 19.00135341977889, - "lowFreqHz": 0.5, - "highFreqHz": 0.7 - }, - { - "siteTerm": 19.03492718945587, - "lowFreqHz": 0.7, - "highFreqHz": 1.0 - }, - { - "siteTerm": 18.94226636451329, - "lowFreqHz": 1.0, - "highFreqHz": 1.5 - }, - { - "siteTerm": 18.92723226138862, - "lowFreqHz": 1.5, - "highFreqHz": 2.0 - }, - { - "siteTerm": 19.184367156400697, - "lowFreqHz": 2.0, - "highFreqHz": 3.0 - }, - { - "siteTerm": 19.14718589386693, - "lowFreqHz": 3.0, - "highFreqHz": 4.0 - }, - { - "siteTerm": 19.211116316565025, - "lowFreqHz": 4.0, - "highFreqHz": 6.0 - }, - { - "siteTerm": 19.57881986308872, - "lowFreqHz": 6.0, - "highFreqHz": 8.0 - }, - { - "siteTerm": 20.164195454405423, - "lowFreqHz": 8.0, - "highFreqHz": 10.0 - }, - { - "siteTerm": 20.325371990356185, - "lowFreqHz": 10.0, - "highFreqHz": 15.0 - }, - { - "siteTerm": 21.24328806924078, - "lowFreqHz": 15.0, - "highFreqHz": 20.0 - }, - { - "siteTerm": 21.48709133874192, - "lowFreqHz": 20.0, - "highFreqHz": 25.0 - } - ], - "CVS": [ - { - "siteTerm": 18.99512062088609, - "lowFreqHz": 0.2, - "highFreqHz": 0.3 - }, - { - "siteTerm": 18.712207283591184, - "lowFreqHz": 0.3, - "highFreqHz": 0.5 - }, - { - "siteTerm": 18.688751493057524, - "lowFreqHz": 0.5, - "highFreqHz": 0.7 - }, - { - "siteTerm": 18.84134477372329, - "lowFreqHz": 0.7, - "highFreqHz": 1.0 - }, - { - "siteTerm": 18.891154656359777, - "lowFreqHz": 1.0, - "highFreqHz": 1.5 - }, - { - "siteTerm": 18.82400240637313, - "lowFreqHz": 1.5, - "highFreqHz": 2.0 - }, - { - "siteTerm": 18.949633953462328, - "lowFreqHz": 2.0, - "highFreqHz": 3.0 - }, - { - "siteTerm": 18.961351413110204, - "lowFreqHz": 3.0, - "highFreqHz": 4.0 - }, - { - "siteTerm": 19.06547621563001, - "lowFreqHz": 4.0, - "highFreqHz": 6.0 - }, - { - "siteTerm": 19.591903909961985, - "lowFreqHz": 6.0, - "highFreqHz": 8.0 - }, - { - "siteTerm": 20.181175758798673, - "lowFreqHz": 8.0, - "highFreqHz": 10.0 - }, - { - "siteTerm": 20.371678739288434, - "lowFreqHz": 10.0, - "highFreqHz": 15.0 - }, - { - "siteTerm": 21.34581922180849, - "lowFreqHz": 15.0, - "highFreqHz": 20.0 - }, - { - "siteTerm": 21.607084224674125, - "lowFreqHz": 20.0, - "highFreqHz": 25.0 - } - ], - "WENL": [ - { - "siteTerm": 18.736694993008697, - "lowFreqHz": 0.2, - "highFreqHz": 0.3 - }, - { - "siteTerm": 18.6085082031463, - "lowFreqHz": 0.3, - "highFreqHz": 0.5 - }, - { - "siteTerm": 18.580578107370048, - "lowFreqHz": 0.5, - "highFreqHz": 0.7 - }, - { - "siteTerm": 18.661130492426334, - "lowFreqHz": 0.7, - "highFreqHz": 1.0 - }, - { - "siteTerm": 18.587026724834214, - "lowFreqHz": 1.0, - "highFreqHz": 1.5 - }, - { - "siteTerm": 18.495225296106195, - "lowFreqHz": 1.5, - "highFreqHz": 2.0 - }, - { - "siteTerm": 18.802400569430816, - "lowFreqHz": 2.0, - "highFreqHz": 3.0 - }, - { - "siteTerm": 19.062474655337304, - "lowFreqHz": 3.0, - "highFreqHz": 4.0 - }, - { - "siteTerm": 19.293388411261628, - "lowFreqHz": 4.0, - "highFreqHz": 6.0 - }, - { - "siteTerm": 19.927795134546052, - "lowFreqHz": 6.0, - "highFreqHz": 8.0 - }, - { - "siteTerm": 20.71777025105482, - "lowFreqHz": 8.0, - "highFreqHz": 10.0 - }, - { - "siteTerm": 20.95605674566051, - "lowFreqHz": 10.0, - "highFreqHz": 15.0 - }, - { - "siteTerm": 21.977061937887687, - "lowFreqHz": 15.0, - "highFreqHz": 20.0 - }, - { - "siteTerm": 22.434419365054662, - "lowFreqHz": 20.0, - "highFreqHz": 25.0 - } - ] - }, - "UNK": { - "SAO": [ - { - "siteTerm": 19.160301172988373, - "lowFreqHz": 0.2, - "highFreqHz": 0.3 - }, - { - "siteTerm": 19.160301172988373, - "lowFreqHz": 0.2, - "highFreqHz": 0.3 - }, - { - "siteTerm": 19.078495953084072, - "lowFreqHz": 0.3, - "highFreqHz": 0.5 - }, - { - "siteTerm": 19.00135341977889, - "lowFreqHz": 0.5, - "highFreqHz": 0.7 - }, - { - "siteTerm": 19.03492718945587, - "lowFreqHz": 0.7, - "highFreqHz": 1.0 - }, - { - "siteTerm": 18.94226636451329, - "lowFreqHz": 1.0, - "highFreqHz": 1.5 - }, - { - "siteTerm": 18.92723226138862, - "lowFreqHz": 1.5, - "highFreqHz": 2.0 - }, - { - "siteTerm": 19.184367156400697, - "lowFreqHz": 2.0, - "highFreqHz": 3.0 - }, - { - "siteTerm": 19.14718589386693, - "lowFreqHz": 3.0, - "highFreqHz": 4.0 - }, - { - "siteTerm": 19.211116316565025, - "lowFreqHz": 4.0, - "highFreqHz": 6.0 - }, - { - "siteTerm": 19.57881986308872, - "lowFreqHz": 6.0, - "highFreqHz": 8.0 - }, - { - "siteTerm": 20.164195454405423, - "lowFreqHz": 8.0, - "highFreqHz": 10.0 - }, - { - "siteTerm": 20.325371990356185, - "lowFreqHz": 10.0, - "highFreqHz": 15.0 - }, - { - "siteTerm": 21.24328806924078, - "lowFreqHz": 15.0, - "highFreqHz": 20.0 - }, - { - "siteTerm": 21.48709133874192, - "lowFreqHz": 20.0, - "highFreqHz": 25.0 - } - ] - } - } - ] + "schemaVersion": 1, + "type": "llnl/coda-calibration-tool", + "bands": [{ + "lowFreqHz": 0.02, + "highFreqHz": 0.03, + "minWindowLengthSec": 100, + "maxWindowLengthSec": 1000, + "snrThresholdAboveNoiseLog10": 0.5, + "measurementTimeSec": 100.0, + "velocity0": 1, + "velocity1": 2, + "velocity2": 3, + "beta0": 4, + "beta1": 5, + "beta2": 6, + "gamma0": 7, + "gamma1": 8, + "gamma2": 9, + "p1": 10, + "p2": 11, + "xc": 12, + "xt": 13, + "q": 14 + }, + { + "lowFreqHz": 0.03, + "highFreqHz": 0.05, + "minWindowLengthSec": 100, + "maxWindowLengthSec": 800, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 0.05, + "highFreqHz": 0.1, + "minWindowLengthSec": 75, + "maxWindowLengthSec": 600, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 0.1, + "highFreqHz": 0.2, + "minWindowLengthSec": 75, + "maxWindowLengthSec": 550, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 0.2, + "highFreqHz": 0.3, + "minWindowLengthSec": 50, + "maxWindowLengthSec": 550, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 0.3, + "highFreqHz": 0.5, + "minWindowLengthSec": 50, + "maxWindowLengthSec": 500, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 0.5, + "highFreqHz": 0.7, + "minWindowLengthSec": 50, + "maxWindowLengthSec": 500, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 0.7, + "highFreqHz": 1.0, + "minWindowLengthSec": 40, + "maxWindowLengthSec": 450, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 1.0, + "highFreqHz": 1.5, + "minWindowLengthSec": 40, + "maxWindowLengthSec": 450, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 1.5, + "highFreqHz": 2.0, + "minWindowLengthSec": 40, + "maxWindowLengthSec": 400, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 2.0, + "highFreqHz": 3.0, + "minWindowLengthSec": 40, + "maxWindowLengthSec": 400, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 3.0, + "highFreqHz": 4.0, + "minWindowLengthSec": 40, + "maxWindowLengthSec": 400, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 4.0, + "highFreqHz": 6.0, + "minWindowLengthSec": 40, + "maxWindowLengthSec": 400, + "snrThresholdAboveNoiseLog10": 0.5 + }, + { + "lowFreqHz": 6.0, + "highFreqHz": 8.0, + "minWindowLengthSec": 40, + "maxWindowLengthSec": 350, + "snrThresholdAboveNoiseLog10": 0.5 + } + ], + "mdac-fi": { + "alphaR": 5000, + "alphas": 6000, + "betas": 3500, + "betaR": 2900, + "sigma": 0.3, + "delSigma": 98.0, + "psi": 0.25, + "delPsi": 99.0, + "zeta": 1.0, + "m0ref": 10000000000000000, + "radPatP": 0.44, + "radPatS": 0.6, + "rhor": 2500, + "rhos": 2700 + }, + "mdac-ps": [{ + "phase": "Pn", + "q0": 210, + "delQ0": 100, + "gamma0": 0.65, + "delGamma0": 101, + "u0": 7900, + "eta": 1.1, + "delEta": 102, + "distCrit": 0.001, + "snr": 2 + }, + { + "phase": "Pg", + "q0": 190, + "delQ0": 0, + "gamma0": 0.45, + "delGamma0": 0, + "u0": 6000, + "eta": 0.5, + "delEta": 0, + "distCrit": 100, + "snr": 2 + }, + { + "phase": "Sn", + "q0": 590, + "delQ0": 0, + "gamma0": 0.55, + "delGamma0": 0, + "u0": 4500, + "eta": 1.1, + "delEta": 0, + "distCrit": 0.001, + "snr": 2 + }, + { + "phase": "Lg", + "q0": 200, + "delQ0": 0, + "gamma0": 0.54, + "delGamma0": 0, + "u0": 3500, + "eta": 0.5, + "delEta": 0, + "distCrit": 100, + "snr": 2 + } + ], + "reference-events": [{ + "eventId": "0331199924", + "refMw": 3.0 + }, + { + "eventId": "0401199924", + "refMw": 5.0, + "apparentStressInMpa": 0.7 + } + ], + "validation-events": [{ + "eventId": "0331199924", + "mw": 3.2 + }, + { + "eventId": "0401199924", + "mw": 5.2, + "apparentStressInMpa": 0.7 + } + ], + "shape-constraints": { + "maxVP1": 1600.0, + "minVP1": 150.0, + "v0reg": 1100.0, + "maxVP2": 15000.0, + "minVP2": 11.0, + "maxVP3": 15000.0, + "minVP3": 11.0, + "maxBP1": 11000.0, + "minBP1": -1500.0, + "b0reg": 110000.0, + "maxBP2": 120.0, + "minBP2": 10.1, + "maxBP3": 11500.0, + "minBP3": 11.0E-4, + "maxGP1": 1100.0, + "minGP1": 10.0, + "g0reg": 1100.0, + "maxGP2": 1101.0, + "minGP2": 10.0, + "g1reg": -11.0, + "maxGP3": 1101.0, + "minGP3": 11.0, + "yvvMin": 10.5, + "yvvMax": 16.01, + "vDistMax": 11600.0, + "vDistMin": 10.0, + "ybbMin": -10.12, + "ybbMax": 15.0E-4, + "bDistMax": 11550.0, + "bDistMin": 10.0, + "yggMin": 10.01, + "yggMax": 1100.0, + "gDistMin": 1600.0, + "gDistMax": 10.0, + "minIntercept": 10.001, + "maxIntercept": 120.0, + "minBeta": -14.0, + "maxBeta": -11.0E-4, + "minGamma": 10.001, + "maxGamma": 14.0, + "iterations": 110 + }, + "site-corrections": [{ + "BK": { + "SAO": [{ + "siteTerm": 19.160301172988373, + "lowFreqHz": 0.2, + "highFreqHz": 0.3 + }, + { + "siteTerm": 19.160301172988373, + "lowFreqHz": 0.2, + "highFreqHz": 0.3 + }, + { + "siteTerm": 19.078495953084072, + "lowFreqHz": 0.3, + "highFreqHz": 0.5 + }, + { + "siteTerm": 19.00135341977889, + "lowFreqHz": 0.5, + "highFreqHz": 0.7 + }, + { + "siteTerm": 19.03492718945587, + "lowFreqHz": 0.7, + "highFreqHz": 1.0 + }, + { + "siteTerm": 18.94226636451329, + "lowFreqHz": 1.0, + "highFreqHz": 1.5 + }, + { + "siteTerm": 18.92723226138862, + "lowFreqHz": 1.5, + "highFreqHz": 2.0 + }, + { + "siteTerm": 19.184367156400697, + "lowFreqHz": 2.0, + "highFreqHz": 3.0 + }, + { + "siteTerm": 19.14718589386693, + "lowFreqHz": 3.0, + "highFreqHz": 4.0 + }, + { + "siteTerm": 19.211116316565025, + "lowFreqHz": 4.0, + "highFreqHz": 6.0 + }, + { + "siteTerm": 19.57881986308872, + "lowFreqHz": 6.0, + "highFreqHz": 8.0 + }, + { + "siteTerm": 20.164195454405423, + "lowFreqHz": 8.0, + "highFreqHz": 10.0 + }, + { + "siteTerm": 20.325371990356185, + "lowFreqHz": 10.0, + "highFreqHz": 15.0 + }, + { + "siteTerm": 21.24328806924078, + "lowFreqHz": 15.0, + "highFreqHz": 20.0 + }, + { + "siteTerm": 21.48709133874192, + "lowFreqHz": 20.0, + "highFreqHz": 25.0 + } + ], + "CVS": [{ + "siteTerm": 18.99512062088609, + "lowFreqHz": 0.2, + "highFreqHz": 0.3 + }, + { + "siteTerm": 18.712207283591184, + "lowFreqHz": 0.3, + "highFreqHz": 0.5 + }, + { + "siteTerm": 18.688751493057524, + "lowFreqHz": 0.5, + "highFreqHz": 0.7 + }, + { + "siteTerm": 18.84134477372329, + "lowFreqHz": 0.7, + "highFreqHz": 1.0 + }, + { + "siteTerm": 18.891154656359777, + "lowFreqHz": 1.0, + "highFreqHz": 1.5 + }, + { + "siteTerm": 18.82400240637313, + "lowFreqHz": 1.5, + "highFreqHz": 2.0 + }, + { + "siteTerm": 18.949633953462328, + "lowFreqHz": 2.0, + "highFreqHz": 3.0 + }, + { + "siteTerm": 18.961351413110204, + "lowFreqHz": 3.0, + "highFreqHz": 4.0 + }, + { + "siteTerm": 19.06547621563001, + "lowFreqHz": 4.0, + "highFreqHz": 6.0 + }, + { + "siteTerm": 19.591903909961985, + "lowFreqHz": 6.0, + "highFreqHz": 8.0 + }, + { + "siteTerm": 20.181175758798673, + "lowFreqHz": 8.0, + "highFreqHz": 10.0 + }, + { + "siteTerm": 20.371678739288434, + "lowFreqHz": 10.0, + "highFreqHz": 15.0 + }, + { + "siteTerm": 21.34581922180849, + "lowFreqHz": 15.0, + "highFreqHz": 20.0 + }, + { + "siteTerm": 21.607084224674125, + "lowFreqHz": 20.0, + "highFreqHz": 25.0 + } + ], + "WENL": [{ + "siteTerm": 18.736694993008697, + "lowFreqHz": 0.2, + "highFreqHz": 0.3 + }, + { + "siteTerm": 18.6085082031463, + "lowFreqHz": 0.3, + "highFreqHz": 0.5 + }, + { + "siteTerm": 18.580578107370048, + "lowFreqHz": 0.5, + "highFreqHz": 0.7 + }, + { + "siteTerm": 18.661130492426334, + "lowFreqHz": 0.7, + "highFreqHz": 1.0 + }, + { + "siteTerm": 18.587026724834214, + "lowFreqHz": 1.0, + "highFreqHz": 1.5 + }, + { + "siteTerm": 18.495225296106195, + "lowFreqHz": 1.5, + "highFreqHz": 2.0 + }, + { + "siteTerm": 18.802400569430816, + "lowFreqHz": 2.0, + "highFreqHz": 3.0 + }, + { + "siteTerm": 19.062474655337304, + "lowFreqHz": 3.0, + "highFreqHz": 4.0 + }, + { + "siteTerm": 19.293388411261628, + "lowFreqHz": 4.0, + "highFreqHz": 6.0 + }, + { + "siteTerm": 19.927795134546052, + "lowFreqHz": 6.0, + "highFreqHz": 8.0 + }, + { + "siteTerm": 20.71777025105482, + "lowFreqHz": 8.0, + "highFreqHz": 10.0 + }, + { + "siteTerm": 20.95605674566051, + "lowFreqHz": 10.0, + "highFreqHz": 15.0 + }, + { + "siteTerm": 21.977061937887687, + "lowFreqHz": 15.0, + "highFreqHz": 20.0 + }, + { + "siteTerm": 22.434419365054662, + "lowFreqHz": 20.0, + "highFreqHz": 25.0 + } + ] + }, + "UNK": { + "SAO": [{ + "siteTerm": 19.160301172988373, + "lowFreqHz": 0.2, + "highFreqHz": 0.3 + }, + { + "siteTerm": 19.160301172988373, + "lowFreqHz": 0.2, + "highFreqHz": 0.3 + }, + { + "siteTerm": 19.078495953084072, + "lowFreqHz": 0.3, + "highFreqHz": 0.5 + }, + { + "siteTerm": 19.00135341977889, + "lowFreqHz": 0.5, + "highFreqHz": 0.7 + }, + { + "siteTerm": 19.03492718945587, + "lowFreqHz": 0.7, + "highFreqHz": 1.0 + }, + { + "siteTerm": 18.94226636451329, + "lowFreqHz": 1.0, + "highFreqHz": 1.5 + }, + { + "siteTerm": 18.92723226138862, + "lowFreqHz": 1.5, + "highFreqHz": 2.0 + }, + { + "siteTerm": 19.184367156400697, + "lowFreqHz": 2.0, + "highFreqHz": 3.0 + }, + { + "siteTerm": 19.14718589386693, + "lowFreqHz": 3.0, + "highFreqHz": 4.0 + }, + { + "siteTerm": 19.211116316565025, + "lowFreqHz": 4.0, + "highFreqHz": 6.0 + }, + { + "siteTerm": 19.57881986308872, + "lowFreqHz": 6.0, + "highFreqHz": 8.0 + }, + { + "siteTerm": 20.164195454405423, + "lowFreqHz": 8.0, + "highFreqHz": 10.0 + }, + { + "siteTerm": 20.325371990356185, + "lowFreqHz": 10.0, + "highFreqHz": 15.0 + }, + { + "siteTerm": 21.24328806924078, + "lowFreqHz": 15.0, + "highFreqHz": 20.0 + }, + { + "siteTerm": 21.48709133874192, + "lowFreqHz": 20.0, + "highFreqHz": 25.0 + } + ] + } + }] } \ No newline at end of file diff --git a/calibration-service/calibration-application/pom.xml b/calibration-service/calibration-application/pom.xml index 379e7de2..15316612 100644 --- a/calibration-service/calibration-application/pom.xml +++ b/calibration-service/calibration-application/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.calibration calibration-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -77,14 +77,6 @@ org.springframework spring-webmvc - - io.springlets - springlets-data-jpa - - - io.springlets - springlets-data-commons - org.springframework.boot spring-boot-starter-actuator diff --git a/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/CalibrationJsonController.java b/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/CalibrationJsonController.java index 65783e0a..7d1c5eef 100644 --- a/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/CalibrationJsonController.java +++ b/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/CalibrationJsonController.java @@ -14,11 +14,19 @@ */ package gov.llnl.gnem.apps.coda.calibration.application.web; +import java.util.List; + +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -47,6 +55,15 @@ public ResponseEntity runCalibration(@PathVariable(name = "autoPickingEnabled } } + @PostMapping(value = "/cancel", name = "cancelCalibration") + public ResponseEntity cancelCalibration(@Valid @RequestBody Long id, BindingResult result) { + if (getService().cancelCalibration(id)) { + return ResponseEntity.ok().build(); + } else { + return ResponseEntity.badRequest().build(); + } + } + @GetMapping(value = "/clear-data", name = "clearData") public ResponseEntity clearData() { if (getService().clearData()) { @@ -55,7 +72,15 @@ public ResponseEntity clearData() { return ResponseEntity.badRequest().build(); } } - + + //TODO: A little gross API wise to cram this here but will do for now. Revisit in V2 + @PostMapping(value = "/toggle-validation/batch-by-evids", name = "toggleValidationByEvids") + public ResponseEntity deleteBatchByEvids(@Valid @RequestBody List eventIds, BindingResult result) { + if (result.hasErrors()) { + return ResponseEntity.status(HttpStatus.CONFLICT).body(result); + } + return ResponseEntity.ok(service.toggleAllByEventIds(eventIds)); + } public CalibrationService getService() { return service; diff --git a/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/SpectraMeasurementJsonController.java b/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/SpectraMeasurementJsonController.java index 94a81a3e..ffd1748a 100644 --- a/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/SpectraMeasurementJsonController.java +++ b/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/SpectraMeasurementJsonController.java @@ -62,6 +62,14 @@ public ResponseEntity computeSpectraForEventId(@RequestBody String eventId, B Spectra theoreticalSpectra = service.computeReferenceSpectraForEventId(eventId, sharedParamsService.getFrequencyBands(), PICK_TYPES.LG); return ResponseEntity.ok(theoreticalSpectra); } + + @PostMapping(value = "/validation-spectra", name = "computeValidationSpectraForEventId") + public ResponseEntity computeValidationSpectraForEventId(@RequestBody String eventId, BindingResult result) { + //FIXME: Accept a phase to use! + Spectra theoreticalSpectra = service.computeValidationSpectraForEventId(eventId, sharedParamsService.getFrequencyBands(), PICK_TYPES.LG); + return ResponseEntity.ok(theoreticalSpectra); + } + @PostMapping(value = "/fit-spectra", name = "getFitSpectraForEventId") public ResponseEntity getFitSpectraForEventId(@RequestBody String eventId, BindingResult result) { diff --git a/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/ValidationEventsJsonController.java b/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/ValidationEventsJsonController.java new file mode 100644 index 00000000..ee9a45f6 --- /dev/null +++ b/calibration-service/calibration-application/src/main/java/gov/llnl/gnem/apps/coda/calibration/application/web/ValidationEventsJsonController.java @@ -0,0 +1,78 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.application.web; + +import java.util.Collection; +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; +import gov.llnl.gnem.apps.coda.calibration.service.api.ValidationMwParametersService; + +@RestController +@RequestMapping(value = "/api/v1/validation-events", name = "ValidationEventsJsonController", produces = MediaType.APPLICATION_JSON_VALUE) +public class ValidationEventsJsonController { + + private ValidationMwParametersService service; + + @Autowired + public ValidationEventsJsonController(ValidationMwParametersService service) { + this.service = service; + } + + @GetMapping(name = "getValidationEvents") + public List getValidationEvents() { + return service.findAll(); + } + + @PostMapping(value = "/batch", name = "createBatch") + public ResponseEntity createBatch(@Valid @RequestBody Collection referenceEvents, BindingResult result) { + if (result.hasErrors()) { + return ResponseEntity.status(HttpStatus.CONFLICT).body(result); + } + service.save(referenceEvents); + return ResponseEntity.ok().build(); + } + + @PostMapping(value = "/delete/batch-by-evids", name = "deleteBatchByEvids") + public ResponseEntity deleteBatchByEvids(@Valid @RequestBody Collection eventIds, BindingResult result) { + if (result.hasErrors()) { + return ResponseEntity.status(HttpStatus.CONFLICT).body(result); + } + service.deleteAllByEventIds(eventIds); + return ResponseEntity.ok().build(); + } + + public ValidationMwParametersService getService() { + return service; + } + + public void setService(ValidationMwParametersService service) { + this.service = service; + } + +} diff --git a/calibration-service/calibration-integration/pom.xml b/calibration-service/calibration-integration/pom.xml index 9d2215da..001db916 100644 --- a/calibration-service/calibration-integration/pom.xml +++ b/calibration-service/calibration-integration/pom.xml @@ -1,10 +1,10 @@ - + gov.llnl.gnem.apps.coda.calibration calibration-service - 1.0.8.1 + 1.0.9 4.0.0 diff --git a/calibration-service/calibration-model/pom.xml b/calibration-service/calibration-model/pom.xml index 427fb1c8..cc931d11 100644 --- a/calibration-service/calibration-model/pom.xml +++ b/calibration-service/calibration-model/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.calibration calibration-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -14,14 +14,6 @@ calibration-model - - io.springlets - springlets-context - - - org.springframework - spring-context - org.springframework.data spring-data-jpa diff --git a/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/MeasuredMwDetails.java b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/MeasuredMwDetails.java index dd9985c6..ccc246a6 100644 --- a/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/MeasuredMwDetails.java +++ b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/MeasuredMwDetails.java @@ -38,6 +38,8 @@ public class MeasuredMwDetails { private Double mw2Min; private Double refMw; + + private Double valMw; private Double apparentStressInMpa; @@ -50,6 +52,8 @@ public class MeasuredMwDetails { private Double apparentStress2Min; private Double refApparentStressInMpa; + + private Double valApparentStressInMpa; private Double cornerFreq; @@ -61,17 +65,18 @@ public class MeasuredMwDetails { private Double longitude; + private Double depth; + private String datetime; private Integer iterations; private Double misfit; - public MeasuredMwDetails(MeasuredMwParameters meas, ReferenceMwParameters ref, Event event) { + public MeasuredMwDetails(MeasuredMwParameters meas, ReferenceMwParameters ref, ValidationMwParameters val, Event event) { if (meas != null) { this.eventId = meas.getEventId(); this.mw = meas.getMw(); - // this.mwSd = meas.getMwSd(); this.mw1Max = meas.getMw1Max(); this.mw1Min = meas.getMw1Min(); this.mw2Max = meas.getMw2Max(); @@ -82,7 +87,6 @@ public MeasuredMwDetails(MeasuredMwParameters meas, ReferenceMwParameters ref, E this.apparentStress2Max = meas.getApparentStress2Max(); this.apparentStress2Min = meas.getApparentStress2Min(); this.cornerFreq = meas.getCornerFrequency(); - // this.cornerFreqSd = meas.getCornerFrequencySd(); this.dataCount = meas.getDataCount(); this.iterations = meas.getIterations(); this.misfit = meas.getMisfit(); @@ -91,6 +95,7 @@ public MeasuredMwDetails(MeasuredMwParameters meas, ReferenceMwParameters ref, E this.eventId = event.getEventId(); this.latitude = event.getLatitude(); this.longitude = event.getLongitude(); + this.depth = event.getDepth(); if (event.getOriginTime() != null) { this.datetime = DateTimeFormatter.ISO_INSTANT.format(event.getOriginTime().toInstant()); } @@ -102,6 +107,14 @@ public MeasuredMwDetails(MeasuredMwParameters meas, ReferenceMwParameters ref, E this.refApparentStressInMpa = ref.getRefApparentStressInMpa(); this.refMw = ref.getRefMw(); } + + if (val != null) { + if (eventId == null) { + this.eventId = val.getEventId(); + } + this.valApparentStressInMpa = val.getApparentStressInMpa(); + this.valMw = val.getMw(); + } } public MeasuredMwDetails() { @@ -143,6 +156,15 @@ public MeasuredMwDetails setRefMw(Double refMw) { this.refMw = refMw; return this; } + + public Double getValMw() { + return valMw; + } + + public MeasuredMwDetails setValMw(Double mw) { + this.valMw = mw; + return this; + } public Double getApparentStressInMpa() { return apparentStressInMpa; @@ -152,6 +174,15 @@ public MeasuredMwDetails setApparentStressInMpa(Double apparentStressInMpa) { this.apparentStressInMpa = apparentStressInMpa; return this; } + + public Double getValApparentStressInMpa() { + return valApparentStressInMpa; + } + + public MeasuredMwDetails setValApparentStressInMpa(Double stressMpa) { + this.valApparentStressInMpa = stressMpa; + return this; + } public Double getRefApparentStressInMpa() { return refApparentStressInMpa; @@ -189,6 +220,15 @@ public MeasuredMwDetails setLongitude(double longitude) { return this; } + public Double getDepth() { + return depth; + } + + public MeasuredMwDetails setDepth(double depth) { + this.depth = depth; + return this; + } + public String getDatetime() { return datetime; } @@ -325,6 +365,8 @@ public String toString() { .append(mw2Min) .append(", refMw=") .append(refMw) + .append(", valMw=") + .append(valMw) .append(", apparentStressInMpa=") .append(apparentStressInMpa) .append(", apparentStress1Max=") @@ -337,6 +379,8 @@ public String toString() { .append(apparentStress2Min) .append(", refApparentStressInMpa=") .append(refApparentStressInMpa) + .append(", valApparentStressInMpa=") + .append(valApparentStressInMpa) .append(", cornerFreq=") .append(cornerFreq) .append(", cornerFreqSd=") @@ -347,6 +391,8 @@ public String toString() { .append(latitude) .append(", longitude=") .append(longitude) + .append(", depth=") + .append(depth) .append(", datetime=") .append(datetime) .append(", iterations=") @@ -359,29 +405,31 @@ public String toString() { @Override public int hashCode() { - return Objects.hash( - apparentStress1Max, - apparentStress1Min, - apparentStress2Max, - apparentStress2Min, - apparentStressInMpa, - cornerFreq, - cornerFreqSd, - dataCount, - datetime, - eventId, - iterations, - latitude, - longitude, - misfit, - mw, - mw1Max, - mw1Min, - mw2Max, - mw2Min, - mwSd, - refApparentStressInMpa, - refMw); + return Objects.hash(apparentStress1Max, + apparentStress1Min, + apparentStress2Max, + apparentStress2Min, + apparentStressInMpa, + cornerFreq, + cornerFreqSd, + dataCount, + datetime, + depth, + eventId, + iterations, + latitude, + longitude, + misfit, + mw, + mw1Max, + mw1Min, + mw2Max, + mw2Min, + mwSd, + refApparentStressInMpa, + refMw, + valApparentStressInMpa, + valMw); } @Override @@ -393,28 +441,14 @@ public boolean equals(Object obj) { return false; } MeasuredMwDetails other = (MeasuredMwDetails) obj; - return Objects.equals(apparentStress1Max, other.apparentStress1Max) - && Objects.equals(apparentStress1Min, other.apparentStress1Min) - && Objects.equals(apparentStress2Max, other.apparentStress2Max) - && Objects.equals(apparentStress2Min, other.apparentStress2Min) - && Objects.equals(apparentStressInMpa, other.apparentStressInMpa) - && Objects.equals(cornerFreq, other.cornerFreq) - && Objects.equals(cornerFreqSd, other.cornerFreqSd) - && Objects.equals(dataCount, other.dataCount) - && Objects.equals(datetime, other.datetime) - && Objects.equals(eventId, other.eventId) - && Objects.equals(iterations, other.iterations) - && Objects.equals(latitude, other.latitude) - && Objects.equals(longitude, other.longitude) - && Objects.equals(misfit, other.misfit) - && Objects.equals(mw, other.mw) - && Objects.equals(mw1Max, other.mw1Max) - && Objects.equals(mw1Min, other.mw1Min) - && Objects.equals(mw2Max, other.mw2Max) - && Objects.equals(mw2Min, other.mw2Min) - && Objects.equals(mwSd, other.mwSd) - && Objects.equals(refApparentStressInMpa, other.refApparentStressInMpa) - && Objects.equals(refMw, other.refMw); + return Objects.equals(apparentStress1Max, other.apparentStress1Max) && Objects.equals(apparentStress1Min, other.apparentStress1Min) + && Objects.equals(apparentStress2Max, other.apparentStress2Max) && Objects.equals(apparentStress2Min, other.apparentStress2Min) + && Objects.equals(apparentStressInMpa, other.apparentStressInMpa) && Objects.equals(cornerFreq, other.cornerFreq) && Objects.equals(cornerFreqSd, other.cornerFreqSd) + && Objects.equals(dataCount, other.dataCount) && Objects.equals(datetime, other.datetime) && Objects.equals(depth, other.depth) && Objects.equals(eventId, other.eventId) + && Objects.equals(iterations, other.iterations) && Objects.equals(latitude, other.latitude) && Objects.equals(longitude, other.longitude) && Objects.equals(misfit, other.misfit) + && Objects.equals(mw, other.mw) && Objects.equals(mw1Max, other.mw1Max) && Objects.equals(mw1Min, other.mw1Min) && Objects.equals(mw2Max, other.mw2Max) + && Objects.equals(mw2Min, other.mw2Min) && Objects.equals(mwSd, other.mwSd) && Objects.equals(refApparentStressInMpa, other.refApparentStressInMpa) + && Objects.equals(refMw, other.refMw) && Objects.equals(valApparentStressInMpa, other.valApparentStressInMpa) && Objects.equals(valMw, other.valMw); } @JsonIgnore diff --git a/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/ValidationMwParameters.java b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/ValidationMwParameters.java new file mode 100644 index 00000000..6f1ed79f --- /dev/null +++ b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/ValidationMwParameters.java @@ -0,0 +1,149 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.model.domain; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; +import javax.persistence.Version; + +import org.springframework.format.annotation.NumberFormat; + +@Entity +@Table(name = "Validation_Mws", indexes = { @Index(columnList = "eventId", name = "val_mw_event_id_index") }) +public class ValidationMwParameters implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "ID") + private Long id; + + @Version + private Integer version = 0; + + @Column(name = "eventId") + private String eventId; + + @NumberFormat + private double mw; + + @NumberFormat + @Column(nullable = true) + private Double apparentStressInMpa; + + public Long getId() { + return id; + } + + public ValidationMwParameters setId(Long id) { + this.id = id; + return this; + } + + public Integer getVersion() { + return version; + } + + public String getEventId() { + return eventId; + } + + public ValidationMwParameters setEventId(String eventId) { + this.eventId = eventId; + return this; + } + + public double getMw() { + return mw; + } + + public ValidationMwParameters setMw(double mw) { + this.mw = mw; + return this; + } + + public Double getApparentStressInMpa() { + return apparentStressInMpa; + } + + public ValidationMwParameters setApparentStressInMpa(Double apparentStressInMpa) { + this.apparentStressInMpa = apparentStressInMpa; + return this; + } + + @Override + public String toString() { + return "ValidationMwParams [id=" + id + ", version=" + version + ", eventId=" + eventId + ", Mw=" + mw + ", ApparentStressInMpa=" + apparentStressInMpa + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((eventId == null) ? 0 : eventId.hashCode()); + long temp; + temp = Double.doubleToLongBits(mw); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + ((apparentStressInMpa == null) ? 0 : apparentStressInMpa.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ValidationMwParameters other = (ValidationMwParameters) obj; + if (eventId == null) { + if (other.eventId != null) { + return false; + } + } else if (!eventId.equals(other.eventId)) { + return false; + } + if (Double.doubleToLongBits(mw) != Double.doubleToLongBits(other.getMw())) { + return false; + } + if (apparentStressInMpa == null) { + if (other.apparentStressInMpa != null) { + return false; + } + } else if (!apparentStressInMpa.equals(other.apparentStressInMpa)) { + return false; + } + return true; + } + + public ValidationMwParameters merge(ValidationMwParameters overlay) { + this.mw = overlay.getMw(); + this.apparentStressInMpa = overlay.getApparentStressInMpa(); + return this; + } + +} \ No newline at end of file diff --git a/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ReferenceMwParametersFileMixin.java b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ReferenceMwParametersFileMixin.java index be8debe8..151a1922 100644 --- a/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ReferenceMwParametersFileMixin.java +++ b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ReferenceMwParametersFileMixin.java @@ -15,9 +15,6 @@ package gov.llnl.gnem.apps.coda.calibration.model.domain.mixins; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; - -import gov.llnl.gnem.apps.coda.common.model.domain.FrequencyBand; @JsonIgnoreProperties(value = { "id", "version" }) public class ReferenceMwParametersFileMixin { diff --git a/common-service/common-application/src/main/java/gov/llnl/gnem/apps/coda/common/application/config/WebMvcConfiguration.java b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ValidationMwParametersFileMixin.java similarity index 57% rename from common-service/common-application/src/main/java/gov/llnl/gnem/apps/coda/common/application/config/WebMvcConfiguration.java rename to calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ValidationMwParametersFileMixin.java index 3a147337..c094c0ad 100644 --- a/common-service/common-application/src/main/java/gov/llnl/gnem/apps/coda/common/application/config/WebMvcConfiguration.java +++ b/calibration-service/calibration-model/src/main/java/gov/llnl/gnem/apps/coda/calibration/model/domain/mixins/ValidationMwParametersFileMixin.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2019, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -12,20 +12,10 @@ * This work was performed under the auspices of the U.S. Department of Energy * by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. */ -package gov.llnl.gnem.apps.coda.common.application.config; +package gov.llnl.gnem.apps.coda.calibration.model.domain.mixins; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -@Configuration -public class WebMvcConfiguration implements WebMvcConfigurer { - - @Primary - @Bean - public LocalValidatorFactoryBean validator() { - return new LocalValidatorFactoryBean(); - } +@JsonIgnoreProperties(value = { "id", "version" }) +public class ValidationMwParametersFileMixin { } diff --git a/calibration-service/calibration-repository/pom.xml b/calibration-service/calibration-repository/pom.xml index 8d82e625..6b424794 100644 --- a/calibration-service/calibration-repository/pom.xml +++ b/calibration-service/calibration-repository/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.calibration calibration-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -23,14 +23,6 @@ h2 test - - io.springlets - springlets-data-commons - - - io.springlets - springlets-data-jpa - gov.llnl.gnem.apps.coda.calibration calibration-model diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/CalibrationShapeFitterConstraintsRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/CalibrationShapeFitterConstraintsRepository.java index be88c978..7e3ba17f 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/CalibrationShapeFitterConstraintsRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/CalibrationShapeFitterConstraintsRepository.java @@ -17,7 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeFitterConstraints; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface CalibrationShapeFitterConstraintsRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersFiRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersFiRepository.java index 30a8fa53..9a410753 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersFiRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersFiRepository.java @@ -17,7 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersFI; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface MdacParametersFiRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersPsRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersPsRepository.java index ccb817c5..a19a542e 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersPsRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MdacParametersPsRepository.java @@ -17,7 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.calibration.model.domain.MdacParametersPS; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface MdacParametersPsRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MeasuredMwsRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MeasuredMwsRepository.java index dd65f5ae..40f51793 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MeasuredMwsRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/MeasuredMwsRepository.java @@ -21,7 +21,7 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwParameters; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface MeasuredMwsRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PathCalibrationMeasurementRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PathCalibrationMeasurementRepository.java index b15e9169..3c3a1a7a 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PathCalibrationMeasurementRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PathCalibrationMeasurementRepository.java @@ -17,7 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.calibration.model.domain.PathCalibrationMeasurement; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface PathCalibrationMeasurementRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PeakVelocityMeasurementRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PeakVelocityMeasurementRepository.java index 52c27901..c2c5f6fa 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PeakVelocityMeasurementRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/PeakVelocityMeasurementRepository.java @@ -22,7 +22,7 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.PeakVelocityMeasurement; import gov.llnl.gnem.apps.coda.calibration.model.domain.PeakVelocityMeasurementMetadata; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface PeakVelocityMeasurementRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ReferenceMwParametersRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ReferenceMwParametersRepository.java index ae1e79e2..666e4ab8 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ReferenceMwParametersRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ReferenceMwParametersRepository.java @@ -22,7 +22,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface ReferenceMwParametersRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ShapeMeasurementRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ShapeMeasurementRepository.java index 293e4de1..a7d83d95 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ShapeMeasurementRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ShapeMeasurementRepository.java @@ -21,7 +21,7 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeMeasurement; import gov.llnl.gnem.apps.coda.calibration.model.domain.ShapeMeasurementMetadata; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface ShapeMeasurementRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SharedFrequencyBandParametersRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SharedFrequencyBandParametersRepository.java index 58f1a154..3b9305fb 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SharedFrequencyBandParametersRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SharedFrequencyBandParametersRepository.java @@ -22,7 +22,7 @@ import gov.llnl.gnem.apps.coda.common.model.domain.FrequencyBand; import gov.llnl.gnem.apps.coda.common.model.domain.SharedFrequencyBandParameters; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface SharedFrequencyBandParametersRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SiteFrequencyBandParametersRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SiteFrequencyBandParametersRepository.java index c51edd99..124f8cb7 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SiteFrequencyBandParametersRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SiteFrequencyBandParametersRepository.java @@ -21,7 +21,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.calibration.model.domain.SiteFrequencyBandParameters; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface SiteFrequencyBandParametersRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SpectraMeasurementRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SpectraMeasurementRepository.java index e4e9224a..d47e9e38 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SpectraMeasurementRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SpectraMeasurementRepository.java @@ -21,7 +21,7 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurement; import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurementMetadata; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface SpectraMeasurementRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SyntheticRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SyntheticRepository.java index e474ebda..713dd622 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SyntheticRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/SyntheticRepository.java @@ -22,7 +22,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.common.model.domain.SyntheticCoda; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface SyntheticRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ValidationMwParametersRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ValidationMwParametersRepository.java new file mode 100644 index 00000000..a40f03b0 --- /dev/null +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/ValidationMwParametersRepository.java @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.repository; + +import java.util.Collection; +import java.util.List; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; + +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; + +@Transactional +public interface ValidationMwParametersRepository extends DetachableJpaRepository { + + @Query("select v from ValidationMwParameters v where v.eventId in :eventIds") + public List findAllByEventIds(@Param("eventIds") Collection eventIds); + + public ValidationMwParameters findOneByEventId(String eventId); +} diff --git a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/VelocityConfigurationRepository.java b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/VelocityConfigurationRepository.java index 7e80ed18..e7133a2a 100644 --- a/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/VelocityConfigurationRepository.java +++ b/calibration-service/calibration-repository/src/main/java/gov/llnl/gnem/apps/coda/calibration/repository/VelocityConfigurationRepository.java @@ -17,7 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.llnl.gnem.apps.coda.calibration.model.domain.VelocityConfiguration; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface VelocityConfigurationRepository extends DetachableJpaRepository { diff --git a/calibration-service/calibration-service-api/pom.xml b/calibration-service/calibration-service-api/pom.xml index 419b5fb2..e8ea6d36 100644 --- a/calibration-service/calibration-service-api/pom.xml +++ b/calibration-service/calibration-service-api/pom.xml @@ -1,10 +1,10 @@ - + gov.llnl.gnem.apps.coda.calibration calibration-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -17,10 +17,6 @@ gov.llnl.gnem.apps.coda.calibration calibration-model - - io.springlets - springlets-data-commons - gov.llnl.gnem.apps.coda.common common-service-api diff --git a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/CalibrationService.java b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/CalibrationService.java index 8bfdd687..dfac5804 100644 --- a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/CalibrationService.java +++ b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/CalibrationService.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -25,6 +25,8 @@ public interface CalibrationService { public boolean startCalibration(Boolean autoPickingEnabled); + + public boolean cancelCalibration(Long id); public boolean clearData(); @@ -33,4 +35,6 @@ public interface CalibrationService { public Future> makeMwMeasurements(Boolean autoPickingEnabled, Boolean persistResults, Set eventIds); public Future> makeMwMeasurements(Boolean autoPickingEnabled, Boolean persistResults, List stacks); + + public List toggleAllByEventIds(List eventIds); } diff --git a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/PathCalibrationService.java b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/PathCalibrationService.java index f96eca02..31a19eba 100644 --- a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/PathCalibrationService.java +++ b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/PathCalibrationService.java @@ -25,5 +25,5 @@ public interface PathCalibrationService { Map measurePathCorrections(Map> dataByFreqBand, - Map frequencyBandParameters, VelocityConfiguration velConf); + Map frequencyBandParameters, VelocityConfiguration velConf) throws InterruptedException; } diff --git a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ReferenceMwParametersService.java b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ReferenceMwParametersService.java index 7423be39..8847852a 100644 --- a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ReferenceMwParametersService.java +++ b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ReferenceMwParametersService.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -25,4 +25,6 @@ public interface ReferenceMwParametersService extends BaseService findAllByEventIds(Collection eventIds); public void deleteAllByEventIds(Collection eventIds); + + public ReferenceMwParameters findByEventId(String evid); } diff --git a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ShapeCalibrationService.java b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ShapeCalibrationService.java index 90ae365a..4d78b48e 100644 --- a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ShapeCalibrationService.java +++ b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ShapeCalibrationService.java @@ -25,5 +25,5 @@ public interface ShapeCalibrationService { public Map measureShapes(Collection velocityMeasurements, - Map frequencyBandParameters, ShapeFitterConstraints constraints, boolean autoPickingEnabled); + Map frequencyBandParameters, ShapeFitterConstraints constraints, boolean autoPickingEnabled) throws InterruptedException; } diff --git a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/SpectraMeasurementService.java b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/SpectraMeasurementService.java index bf3a3d70..0ed498b5 100644 --- a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/SpectraMeasurementService.java +++ b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/SpectraMeasurementService.java @@ -52,5 +52,7 @@ public List measureSpectra(List generatedSynt public Spectra computeReferenceSpectraForEventId(String eventId, List frequencyBands, PICK_TYPES selectedPhase); + public Spectra computeValidationSpectraForEventId(String eventId, List frequencyBands, PICK_TYPES selectedPhase); + public List getFitSpectraForEventId(String eventId, List frequencyBands, PICK_TYPES selectedPhase); } diff --git a/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ValidationMwParametersService.java b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ValidationMwParametersService.java new file mode 100644 index 00000000..4d7051ab --- /dev/null +++ b/calibration-service/calibration-service-api/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/api/ValidationMwParametersService.java @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.service.api; + +import java.util.Collection; +import java.util.List; + +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; +import gov.llnl.gnem.apps.coda.common.service.api.BaseService; + + +public interface ValidationMwParametersService extends BaseService { + + public List findAllByEventIds(Collection eventIds); + + public void deleteAllByEventIds(Collection eventIds); + + public ValidationMwParameters findByEventId(String evid); +} diff --git a/calibration-service/calibration-service-impl/pom.xml b/calibration-service/calibration-service-impl/pom.xml index 394651fd..1bf4766a 100644 --- a/calibration-service/calibration-service-impl/pom.xml +++ b/calibration-service/calibration-service-impl/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.calibration calibration-service - 1.0.8.1 + 1.0.9 4.0.0 diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/CalibrationServiceImpl.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/CalibrationServiceImpl.java index d73dfea2..5498ca6e 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/CalibrationServiceImpl.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/CalibrationServiceImpl.java @@ -28,6 +28,7 @@ import java.util.Set; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.RejectedExecutionException; @@ -60,6 +61,7 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurement; import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurementMetadata; import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurementMetadataImpl; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.VelocityConfiguration; import gov.llnl.gnem.apps.coda.calibration.model.messaging.CalibrationStatusEvent; import gov.llnl.gnem.apps.coda.calibration.model.messaging.MeasurementStatusEvent; @@ -79,6 +81,7 @@ import gov.llnl.gnem.apps.coda.calibration.service.api.SpectraMeasurementService; import gov.llnl.gnem.apps.coda.calibration.service.api.SyntheticCodaGenerationService; import gov.llnl.gnem.apps.coda.calibration.service.api.SyntheticService; +import gov.llnl.gnem.apps.coda.calibration.service.api.ValidationMwParametersService; import gov.llnl.gnem.apps.coda.calibration.service.impl.processing.SpectraCalculator; import gov.llnl.gnem.apps.coda.common.model.domain.Event; import gov.llnl.gnem.apps.coda.common.model.domain.FrequencyBand; @@ -97,6 +100,7 @@ @Service @Transactional +//FIXME: Kind of becoming a god-class, maybe see if we can break this up. public class CalibrationServiceImpl implements CalibrationService { private static final Logger log = LoggerFactory.getLogger(CalibrationServiceImpl.class); @@ -113,6 +117,7 @@ public class CalibrationServiceImpl implements CalibrationService { private MdacParametersFiService mdacFiService; private MdacParametersPsService mdacPsService; private ReferenceMwParametersService referenceMwService; + private ValidationMwParametersService validationMwService; private SiteCalibrationService siteCalibrationService; private SyntheticService syntheticService; private NotificationService notificationService; @@ -130,12 +135,14 @@ public class CalibrationServiceImpl implements CalibrationService { }); private final ExecutorService measureService; + private Map> runningJobs = new ConcurrentHashMap<>(2); + @Autowired public CalibrationServiceImpl(WaveformService waveformService, PeakVelocityMeasurementService peakVelocityMeasurementsService, SharedFrequencyBandParametersService sharedParametersService, ShapeCalibrationService shapeCalibrationService, SpectraMeasurementService spectraMeasurementService, SyntheticCodaGenerationService syntheticGenerationService, PathCalibrationService pathCalibrationService, MdacParametersFiService mdacFiService, MdacParametersPsService mdacPsService, ReferenceMwParametersService referenceMwService, - SiteCalibrationService siteCalibrationService, SyntheticService syntheticService, NotificationService notificationService, DatabaseCleaningService cleaningService, - ConfigurationService configService, SiteFrequencyBandParametersService siteParamsService, SpectraCalculator spectraCalc, AutopickingService picker, + ValidationMwParametersService validationMwService, SiteCalibrationService siteCalibrationService, SyntheticService syntheticService, NotificationService notificationService, + DatabaseCleaningService cleaningService, ConfigurationService configService, SiteFrequencyBandParametersService siteParamsService, SpectraCalculator spectraCalc, AutopickingService picker, @Qualifier("MeasurementExecutorService") ExecutorService measureService) { this.waveformService = waveformService; this.peakVelocityMeasurementsService = peakVelocityMeasurementsService; @@ -147,6 +154,7 @@ public CalibrationServiceImpl(WaveformService waveformService, PeakVelocityMeasu this.mdacFiService = mdacFiService; this.mdacPsService = mdacPsService; this.referenceMwService = referenceMwService; + this.validationMwService = validationMwService; this.siteCalibrationService = siteCalibrationService; this.syntheticService = syntheticService; this.notificationService = notificationService; @@ -182,13 +190,12 @@ public Future> makeMwMeasurements(Boolean autoPi if (stacks != null && !stacks.isEmpty()) { measuredMws = makeMwMeasurements(id, autoPickingEnabled, persistResults, stacks); } else { - notificationService.post( - new MeasurementStatusEvent(id, - MeasurementStatusEvent.Status.ERROR, - new Result(false, - new LightweightIllegalStateException("No matching waveforms found for event ids: " + eventIds != null - ? eventIds.toString() - : "{null}")))); + notificationService.post(new MeasurementStatusEvent(id, + MeasurementStatusEvent.Status.ERROR, + new Result(false, + new LightweightIllegalStateException("No matching waveforms found for event ids: " + eventIds != null + ? eventIds.toString() + : "{null}")))); } return measuredMws; @@ -271,13 +278,12 @@ private MeasuredMwReportByEvent makeMwMeasurements(Long id, Boolean autoPickingE List spectra = spectraCalc.measureAmplitudes(synthetics, frequencyBandParameterMap, velocityConfig, stationFrequencyBandMap); - List measuredMwsParams = siteCalibrationService.fitMws( - spectraByFrequencyBand(spectra), - mdacFiService.findFirst(), - collectByFrequencyBand(mdacPsService.findAll()), - collectByEvid(referenceMwService.findAll()), - stationFrequencyBandMap, - PICK_TYPES.LG); + List measuredMwsParams = siteCalibrationService.fitMws(spectraByFrequencyBand(spectra), + mdacFiService.findFirst(), + collectByFrequencyBand(mdacPsService.findAll()), + collectByEvid(referenceMwService.findAll()), + stationFrequencyBandMap, + PICK_TYPES.LG); Map measuredMwsMap = Optional.ofNullable(measuredMwsParams).orElseGet(ArrayList::new).stream().map(mwp -> { Event event = getEventForId(mwp.getEventId(), eventsInStacks); @@ -290,9 +296,8 @@ private MeasuredMwReportByEvent makeMwMeasurements(Long id, Boolean autoPickingE Map> fitSpectra = measuredMwsMap.entrySet() .parallelStream() - .map( - mw -> new AbstractMap.SimpleEntry<>(mw.getKey().getEventId(), - computeFitSpectra(mw.getValue(), frequencyBandParameterMap.keySet(), PICK_TYPES.LG))) + .map(mw -> new AbstractMap.SimpleEntry<>(mw.getKey().getEventId(), + computeFitSpectra(mw.getValue(), frequencyBandParameterMap.keySet(), PICK_TYPES.LG))) .collect(Collectors.toConcurrentMap(kv -> kv.getKey(), kv -> kv.getValue())); if (persistResults) { @@ -304,13 +309,14 @@ private MeasuredMwReportByEvent makeMwMeasurements(Long id, Boolean autoPickingE details.setFitSpectra(fitSpectra); - details.setMeasuredMwDetails( - measuredMwsMap.entrySet().parallelStream().collect(Collectors.toConcurrentMap(kv -> kv.getKey().getEventId(), kv -> new MeasuredMwDetails(kv.getValue(), null, kv.getKey())))); + details.setMeasuredMwDetails(measuredMwsMap.entrySet() + .parallelStream() + .collect(Collectors.toConcurrentMap(kv -> kv.getKey().getEventId(), kv -> new MeasuredMwDetails(kv.getValue(), null, null, kv.getKey())))); - details.setSpectraMeasurements( - spectra.parallelStream() - .map(s -> new AbstractMap.SimpleEntry(s.getWaveform().getEvent().getEventId(), new SpectraMeasurementMetadataImpl(s))) - .collect(Collectors.groupingByConcurrent(kv -> kv.getKey(), Collectors.mapping(kv -> kv.getValue(), Collectors.toList())))); + details.setSpectraMeasurements(spectra.parallelStream() + .map(s -> new AbstractMap.SimpleEntry(s.getWaveform().getEvent().getEventId(), + new SpectraMeasurementMetadataImpl(s))) + .collect(Collectors.groupingByConcurrent(kv -> kv.getKey(), Collectors.mapping(kv -> kv.getValue(), Collectors.toList())))); } else { log.info("Unable to measure Mws, no waveforms were provided."); } @@ -344,7 +350,7 @@ public boolean startCalibration(Boolean autoPickingEnabled) { // FIXME: These *All methods should be *AllByProjectID instead! final Long id = atomicLong.getAndIncrement(); try { - calService.submit(() -> { + runningJobs.put(id, calService.submit(() -> { try { notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.STARTING)); log.info("Starting calibration at {}", LocalDateTime.now()); @@ -380,6 +386,7 @@ public boolean startCalibration(Boolean autoPickingEnabled) { // Now save the new ones we just calculated peakVelocityMeasurementsService.save(snrFilteredVelocity); + ConcurrencyUtils.checkInterrupt(); notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.SHAPE_STARTING)); // 2) Compute the shape parameters describing each stack @@ -398,11 +405,11 @@ public boolean startCalibration(Boolean autoPickingEnabled) { // values back stacks = filterToEndPicked(stacks); - List spectra = spectraMeasurementService.measureSpectra( - syntheticGenerationService.generateSynthetics(stacks, frequencyBandParameterMap), - frequencyBandParameterMap, - velocityConfig); + List spectra = spectraMeasurementService.measureSpectra(syntheticGenerationService.generateSynthetics(stacks, frequencyBandParameterMap), + frequencyBandParameterMap, + velocityConfig); + ConcurrencyUtils.checkInterrupt(); notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.PATH_STARTING)); // 4) For each event in the data set find all stations that @@ -411,11 +418,13 @@ public boolean startCalibration(Boolean autoPickingEnabled) { frequencyBandParameterMap = pathCalibrationService.measurePathCorrections(spectraByFrequencyBand(spectra), frequencyBandParameterMap, velocityConfig); frequencyBandParameterMap = mapParamsToFrequencyBands(sharedParametersService.save(frequencyBandParameterMap.values())); + ConcurrencyUtils.checkInterrupt(); // 5) Measure the amplitudes again but this time we can // compute ESH path corrected values spectra = spectraMeasurementService.measureSpectra(syntheticGenerationService.generateSynthetics(stacks, frequencyBandParameterMap), frequencyBandParameterMap, velocityConfig); + ConcurrencyUtils.checkInterrupt(); notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.SITE_STARTING)); // 6) Now using those path correction values plus a list of @@ -424,31 +433,33 @@ public boolean startCalibration(Boolean autoPickingEnabled) { // from the expected source spectra for that MW value. This value is // recorded as the site specific offset for measured values at each // frequency band - Map> frequencyBandSiteParameterMap = siteCalibrationService.measureSiteCorrections( - spectraByFrequencyBand(spectra), - mdacFiService.findFirst(), - collectByFrequencyBand(mdacPsService.findAll()), - collectByEvid(referenceMwService.findAll()), - frequencyBandParameterMap, - PICK_TYPES.LG); - + Map> frequencyBandSiteParameterMap = siteCalibrationService.measureSiteCorrections(spectraByFrequencyBand(spectra), + mdacFiService.findFirst(), + collectByFrequencyBand(mdacPsService.findAll()), + collectByEvid(referenceMwService.findAll()), + frequencyBandParameterMap, + PICK_TYPES.LG); + + ConcurrencyUtils.checkInterrupt(); // 7) Measure the amplitudes one last time to fill out the // Path+Site corrected amplitude values - spectra = spectraMeasurementService.measureSpectra( - syntheticService.save(syntheticGenerationService.generateSynthetics(stacks, frequencyBandParameterMap)), - frequencyBandParameterMap, - velocityConfig, - frequencyBandSiteParameterMap); + spectra = spectraMeasurementService.measureSpectra(syntheticService.save(syntheticGenerationService.generateSynthetics(stacks, frequencyBandParameterMap)), + frequencyBandParameterMap, + velocityConfig, + frequencyBandSiteParameterMap); log.info("Calibration complete at {}", LocalDateTime.now()); notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.COMPLETE)); + } catch (InterruptedException interrupted) { + notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.COMPLETE, new Result<>(true, interrupted))); } catch (Exception ex) { log.error(ex.getMessage(), ex); notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.ERROR, new Result<>(false, ex))); throw ex; + } finally { + runningJobs.remove(id); } - return new CompletableFuture<>(); - }); + })); } catch (RejectedExecutionException e) { notificationService.post(new CalibrationStatusEvent(id, CalibrationStatusEvent.Status.ERROR, new Result(false, e))); return false; @@ -456,6 +467,17 @@ public boolean startCalibration(Boolean autoPickingEnabled) { return true; } + @Override + public boolean cancelCalibration(Long id) { + boolean cancelled = false; + Future task = runningJobs.get(id); + if (task != null) { + task.cancel(true); + cancelled = true; + } + return cancelled; + } + private List filterToEndPicked(List stacks) { return stacks.parallelStream().filter(wave -> wave.getAssociatedPicks() != null).map(wave -> { Optional pick = wave.getAssociatedPicks().stream().filter(p -> p.getPickType() != null && PICK_TYPES.F.name().equalsIgnoreCase(p.getPickType().trim())).findFirst(); @@ -519,4 +541,43 @@ public boolean clearData() { return false; } + + @Override + public List toggleAllByEventIds(List eventIds) { + List infoMesssages = new ArrayList<>(0); + for (String evid : eventIds) { + ReferenceMwParameters ref = referenceMwService.findByEventId(evid); + ValidationMwParameters val = validationMwService.findByEventId(evid); + + //Has ref but no validation (move Ref to Val) + if (ref != null && ref.getRefMw() != 0.0 && (val == null || val.getMw() == 0.0)) { + if (val == null) { + val = new ValidationMwParameters(); + } + val.setEventId(ref.getEventId()); + val.setMw(ref.getRefMw()); + val.setApparentStressInMpa(ref.getRefApparentStressInMpa()); + referenceMwService.delete(ref); + validationMwService.save(val); + infoMesssages.add("Evid " + evid + " converted from reference event to validation."); + } + //Has val but no reference (move Val to Ref) + else if (val != null && val.getMw() != 0.0 && (ref == null || ref.getRefMw() == 0.0)) { + if (ref == null) { + ref = new ReferenceMwParameters(); + } + ref.setEventId(val.getEventId()); + ref.setRefMw(val.getMw()); + ref.setRefApparentStressInMpa(val.getApparentStressInMpa()); + validationMwService.delete(val); + referenceMwService.save(ref); + infoMesssages.add("Evid " + evid + " converted from validation event to reference."); + } + //Has both/neither (info message?) + else { + infoMesssages.add("Ignoring request to convert evid " + evid + ", either the event has both or both are blank. Ref " + ref + "; Val " + val); + } + } + return infoMesssages; + } } diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ConcurrencyUtils.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ConcurrencyUtils.java new file mode 100644 index 00000000..570641a1 --- /dev/null +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ConcurrencyUtils.java @@ -0,0 +1,23 @@ +/* +* Copyright (c) 2019, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.service.impl; + +public class ConcurrencyUtils { + + public static void checkInterrupt() throws InterruptedException { + if (Thread.currentThread().isInterrupted()) { + throw new InterruptedException(); + } + } +} diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/Joint1DPathCorrection.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/Joint1DPathCorrection.java index 42231627..22e3bf74 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/Joint1DPathCorrection.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/Joint1DPathCorrection.java @@ -111,7 +111,7 @@ public Joint1DPathCorrection(SpectraCalculator spectraCalc, PathCalibrationMeasu @Override public Map measurePathCorrections(Map> dataByFreqBand, - Map frequencyBandParameters, VelocityConfiguration velConf) { + Map frequencyBandParameters, VelocityConfiguration velConf) throws InterruptedException { if (velConf != null) { Double phase = velConf.getPhaseVelocityInKms(); @@ -128,9 +128,12 @@ public Map measurePathCorrections( Map pathCorrectedFrequencyBandParameters = new HashMap<>(); Map>> dataMappedToEventAndStation = removeSingleStationOrFewerEntries(mapToEventAndStation(dataByFreqBand)); - - frequencyBandParameters.entrySet().parallelStream().forEach(frequencyBandParams -> { - + + ConcurrencyUtils.checkInterrupt(); + frequencyBandParameters.entrySet().parallelStream().forEach(frequencyBandParams -> { + if (Thread.currentThread().isInterrupted()) { + return; + } SharedFrequencyBandParameters pathCorrectedParams = frequencyBandParams.getValue(); Map eventCountByStation = new HashMap<>(); @@ -150,6 +153,9 @@ public Map measurePathCorrections( for (Entry> eventEntry : freqBandData.entrySet()) { Event event = eventEntry.getKey(); for (Entry stationEntry : eventEntry.getValue().entrySet()) { + if (Thread.currentThread().isInterrupted()) { + return; + } SpectraMeasurement spectra = stationEntry.getValue(); Station station = stationEntry.getKey(); @@ -266,6 +272,7 @@ public Map measurePathCorrections( pathCorrectedFrequencyBandParameters.put(frequencyBand, pathCorrectedParams); } }); + ConcurrencyUtils.checkInterrupt(); pathCalibrationMeasurementService.deleteAll(); pathCalibrationMeasurementService.save(measurements); diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/MeasuredMwsServiceImpl.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/MeasuredMwsServiceImpl.java index 98a770d4..a5d31fa1 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/MeasuredMwsServiceImpl.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/MeasuredMwsServiceImpl.java @@ -24,8 +24,10 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.calibration.repository.MeasuredMwsRepository; import gov.llnl.gnem.apps.coda.calibration.repository.ReferenceMwParametersRepository; +import gov.llnl.gnem.apps.coda.calibration.repository.ValidationMwParametersRepository; import gov.llnl.gnem.apps.coda.calibration.service.api.MeasuredMwsService; import gov.llnl.gnem.apps.coda.common.service.api.WaveformService; @@ -35,12 +37,15 @@ public class MeasuredMwsServiceImpl implements MeasuredMwsService { private MeasuredMwsRepository measuredMwsRepository; private ReferenceMwParametersRepository referenceMwsRepository; + private ValidationMwParametersRepository validationMwsRepository; private WaveformService eventRepository; @Autowired - public MeasuredMwsServiceImpl(MeasuredMwsRepository measuredMwsRepository, ReferenceMwParametersRepository referenceMwsRepository, WaveformService eventRepository) { + public MeasuredMwsServiceImpl(MeasuredMwsRepository measuredMwsRepository, ReferenceMwParametersRepository referenceMwsRepository, + ValidationMwParametersRepository validationMwParametersRepository, WaveformService eventRepository) { this.measuredMwsRepository = measuredMwsRepository; this.referenceMwsRepository = referenceMwsRepository; + this.validationMwsRepository = validationMwParametersRepository; this.eventRepository = eventRepository; } @@ -102,16 +107,33 @@ public Class getIdType() { public List findAllDetails() { List measured = measuredMwsRepository.findAll(); List reference = referenceMwsRepository.findAll(); + List validation = validationMwsRepository.findAll(); List details = measured.stream().map(meas -> { - ReferenceMwParameters rmw = reference.stream().filter(ref -> ref.getEventId().equals(meas.getEventId())).findAny().orElseGet(() -> null); - return new MeasuredMwDetails(meas, rmw, eventRepository.findEventById(meas.getEventId())); + ReferenceMwParameters refMw = reference.stream().filter(ref -> ref.getEventId().equals(meas.getEventId())).findAny().orElseGet(() -> null); + ValidationMwParameters valMw = validation.stream().filter(val -> val.getEventId().equals(meas.getEventId())).findAny().orElseGet(() -> null); + return new MeasuredMwDetails(meas, refMw, valMw, eventRepository.findEventById(meas.getEventId())); }).collect(Collectors.toList()); + //Ref v Meas details.addAll(reference.stream() .filter(ref -> measured.stream().noneMatch(meas -> ref.getEventId().equals(meas.getEventId()))) - .map(ref -> new MeasuredMwDetails(null, ref, eventRepository.findEventById(ref.getEventId()))) + .map(ref -> new MeasuredMwDetails(null, ref, null, eventRepository.findEventById(ref.getEventId()))) + .map(ref -> { + validation.stream().filter(val -> ref.getEventId().equals(val.getEventId())).findFirst().ifPresent(v -> { + ref.setValMw(v.getMw()); + ref.setValApparentStressInMpa(v.getApparentStressInMpa()); + }); + return ref; + }) .collect(Collectors.toList())); + //Val ^ (Ref v Meas) + details.addAll(validation.stream() + .filter(val -> measured.stream().noneMatch(meas -> val.getEventId().equals(meas.getEventId()))) + .filter(val -> reference.stream().noneMatch(ref -> val.getEventId().equals(ref.getEventId()))) + .map(val -> new MeasuredMwDetails(null, null, val, eventRepository.findEventById(val.getEventId()))) + .collect(Collectors.toList())); + return details; } } diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ReferenceMwParametersServiceImpl.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ReferenceMwParametersServiceImpl.java index 9ab95f47..2817eb7a 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ReferenceMwParametersServiceImpl.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ReferenceMwParametersServiceImpl.java @@ -126,4 +126,9 @@ public Class getIdType() { public List findAllByEventIds(Collection eventIds) { return referenceMwParametersRepository.findAllByEventIds(eventIds); } + + @Override + public ReferenceMwParameters findByEventId(String evid) { + return referenceMwParametersRepository.findOneByEventId(evid); + } } diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ShapeCalibrationServiceImpl.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ShapeCalibrationServiceImpl.java index aaa6e6bf..78ccd0ea 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ShapeCalibrationServiceImpl.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ShapeCalibrationServiceImpl.java @@ -61,7 +61,7 @@ public ShapeCalibrationServiceImpl(ShapeMeasurementService shapeMeasurementServi @Override public Map measureShapes(Collection velocityMeasurements, - Map frequencyBandParameters, ShapeFitterConstraints constraints, boolean autoPickingEnabled) { + Map frequencyBandParameters, ShapeFitterConstraints constraints, boolean autoPickingEnabled) throws InterruptedException { if (frequencyBandParameters.isEmpty()) { // TODO: Propagate warning to the status API log.warn("No frequency band parameters available, unable to compute shape parameters without them!"); @@ -69,6 +69,7 @@ public Map measureShapes(Collectio } final CalibrationCurveFitter fitter = new CalibrationCurveFitter(); + ConcurrencyUtils.checkInterrupt(); Map frequencyBandCurveFits = fitter.fitAllVelocity( velocityMeasurements.stream() .filter(vel -> vel.getWaveform() != null) @@ -76,20 +77,25 @@ public Map measureShapes(Collectio frequencyBandParameters, constraints); + ConcurrencyUtils.checkInterrupt(); // 1) If auto-picking is enabled attempt to pick any envelopes that // don't already have F-picks in this set if (autoPickingEnabled) { velocityMeasurements = picker.autoPickVelocityMeasuredWaveforms(velocityMeasurements, frequencyBandParameters); velocityMeasurements = velocityMeasurements.parallelStream().map(v -> v.setWaveform(waveService.save(v.getWaveform()))).collect(Collectors.toList()); } + ConcurrencyUtils.checkInterrupt(); // 2) Filter to only measurements with an end pick Collection> filteredVelocityMeasurements = filterMeasurementsToEndPickedOnly(velocityMeasurements); + ConcurrencyUtils.checkInterrupt(); // 3) For every Waveform remaining, measure picks based on start // (computed from velocity) and end (from 'End'/'F' picks) List betaAndGammaMeasurements = shapeCalc.fitShapelineToMeasuredEnvelopes(filteredVelocityMeasurements, frequencyBandCurveFits, constraints); + ConcurrencyUtils.checkInterrupt(); + // Shape measurements are intermediary results so rather than trying to // merge them we want to just drop them wholesale if they exist and // replace them with the new data set. @@ -103,8 +109,9 @@ public Map measureShapes(Collectio Collectors.groupingBy( meas -> new FrequencyBand(meas.getWaveform().getLowFrequency(), meas.getWaveform().getHighFrequency()))); - + ConcurrencyUtils.checkInterrupt(); frequencyBandCurveFits = fitter.fitAllBeta(frequencyBandShapeMeasurementMap, frequencyBandCurveFits, constraints); + ConcurrencyUtils.checkInterrupt(); frequencyBandCurveFits = fitter.fitAllGamma(frequencyBandShapeMeasurementMap, frequencyBandCurveFits, constraints); return frequencyBandCurveFits; } diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/SpectraMeasurementServiceImpl.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/SpectraMeasurementServiceImpl.java index 9d1c5715..5bc8ae2b 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/SpectraMeasurementServiceImpl.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/SpectraMeasurementServiceImpl.java @@ -28,10 +28,12 @@ import gov.llnl.gnem.apps.coda.calibration.model.domain.Spectra; import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurement; import gov.llnl.gnem.apps.coda.calibration.model.domain.SpectraMeasurementMetadata; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.VelocityConfiguration; import gov.llnl.gnem.apps.coda.calibration.repository.MeasuredMwsRepository; import gov.llnl.gnem.apps.coda.calibration.repository.ReferenceMwParametersRepository; import gov.llnl.gnem.apps.coda.calibration.repository.SpectraMeasurementRepository; +import gov.llnl.gnem.apps.coda.calibration.repository.ValidationMwParametersRepository; import gov.llnl.gnem.apps.coda.calibration.service.api.SpectraMeasurementService; import gov.llnl.gnem.apps.coda.calibration.service.impl.processing.SpectraCalculator; import gov.llnl.gnem.apps.coda.common.model.domain.FrequencyBand; @@ -50,16 +52,19 @@ public class SpectraMeasurementServiceImpl implements SpectraMeasurementService private SpectraMeasurementRepository spectraRepo; private ReferenceMwParametersRepository referenceEventRepo; + + private ValidationMwParametersRepository validationEventRepo; private MeasuredMwsRepository measuredEventRepo; @Autowired public SpectraMeasurementServiceImpl(SpectraMeasurementRepository spectraRepo, SpectraCalculator spectraCalc, MeasuredMwsRepository measuredEventRepo, - ReferenceMwParametersRepository referenceEventRepo) { + ReferenceMwParametersRepository referenceEventRepo, ValidationMwParametersRepository validationEventRepo) { this.spectraRepo = spectraRepo; this.spectraCalc = spectraCalc; this.measuredEventRepo = measuredEventRepo; this.referenceEventRepo = referenceEventRepo; + this.validationEventRepo = validationEventRepo; } @Override @@ -128,6 +133,16 @@ public Spectra computeReferenceSpectraForEventId(String eventId, List frequencyBands, PICK_TYPES selectedPhase) { + Spectra valSpectra = new Spectra(); + ValidationMwParameters valEvent = validationEventRepo.findOneByEventId(eventId); + if (valEvent != null) { + valSpectra = spectraCalc.computeSpecificSpectra(valEvent.getMw(), valEvent.getApparentStressInMpa(), frequencyBands, selectedPhase, SPECTRA_TYPES.VAL); + } + return valSpectra; + } @Override public List getFitSpectraForEventId(String eventId, List frequencyBands, PICK_TYPES selectedPhase) { diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ValidationMwParametersServiceImpl.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ValidationMwParametersServiceImpl.java new file mode 100644 index 00000000..265c140e --- /dev/null +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/ValidationMwParametersServiceImpl.java @@ -0,0 +1,134 @@ +/* +* Copyright (c) 2018, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.calibration.service.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; +import gov.llnl.gnem.apps.coda.calibration.repository.ValidationMwParametersRepository; +import gov.llnl.gnem.apps.coda.calibration.service.api.ValidationMwParametersService; + +@Service +@Transactional +public class ValidationMwParametersServiceImpl implements ValidationMwParametersService { + + private ValidationMwParametersRepository validationMwParametersRepository; + + @Autowired + public ValidationMwParametersServiceImpl(ValidationMwParametersRepository validationMwParametersRepository) { + this.validationMwParametersRepository = validationMwParametersRepository; + } + + public ValidationMwParametersRepository getValidationMwParametersRepository() { + return validationMwParametersRepository; + } + + public void setValidationMwParametersRepository(ValidationMwParametersRepository validationMwParametersRepository) { + this.validationMwParametersRepository = validationMwParametersRepository; + } + + @Override + @Transactional + public void delete(ValidationMwParameters validationMwParameters) { + validationMwParametersRepository.delete(validationMwParameters); + } + + @Override + @Transactional + public List save(Iterable entities) { + List results = new ArrayList<>(); + for (ValidationMwParameters ref : entities) { + results.add(save(ref)); + } + return results; + } + + @Override + @Transactional + public void delete(Iterable ids) { + List toDelete = validationMwParametersRepository.findAllById(ids); + validationMwParametersRepository.deleteInBatch(toDelete); + validationMwParametersRepository.flush(); + } + + @Override + @Transactional + public void deleteAllByEventIds(Collection eventIds) { + List toDelete = validationMwParametersRepository.findAllByEventIds(eventIds); + validationMwParametersRepository.deleteInBatch(toDelete); + validationMwParametersRepository.flush(); + } + + @Override + @Transactional + public ValidationMwParameters save(ValidationMwParameters entity) { + ValidationMwParameters persistentRef = validationMwParametersRepository.findOneByEventId(entity.getEventId()); + if (persistentRef == null) { + persistentRef = entity; + } else { + persistentRef.merge(entity); + } + return validationMwParametersRepository.save(persistentRef); + } + + @Override + public ValidationMwParameters findOne(Long id) { + return validationMwParametersRepository.findOneDetached(id); + } + + @Override + public ValidationMwParameters findOneForUpdate(Long id) { + return validationMwParametersRepository.findOneDetached(id); + } + + @Override + public List findAll(Iterable ids) { + return validationMwParametersRepository.findAllById(ids); + } + + @Override + public List findAll() { + return validationMwParametersRepository.findAll(); + } + + @Override + public long count() { + return validationMwParametersRepository.count(); + } + + public Class getEntityType() { + return ValidationMwParameters.class; + } + + public Class getIdType() { + return Long.class; + } + + @Override + public List findAllByEventIds(Collection eventIds) { + return validationMwParametersRepository.findAllByEventIds(eventIds); + } + + @Override + public ValidationMwParameters findByEventId(String evid) { + return validationMwParametersRepository.findOneByEventId(evid); + } +} diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/MaxVelocityCalculator.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/MaxVelocityCalculator.java index c4fe5a6e..1a8dd354 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/MaxVelocityCalculator.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/MaxVelocityCalculator.java @@ -71,6 +71,9 @@ public Stream computeMaximumVelocity(List wav private Stream computeMaximumVelocity(List waveforms, double gv1GtDistanceThreshold, double gv2GtDistanceThreshold, double gv1LtDistanceThreshold, double gv2LtDistanceThreshold, double thresholdInKm) { return waveforms.stream().parallel().map(rawWaveform -> { + if (Thread.currentThread().isInterrupted()) { + return null; + } TimeSeries waveform = converter.convert(rawWaveform); double distance = EModel.getDistanceWGS84( rawWaveform.getEvent().getLatitude(), @@ -123,6 +126,6 @@ private Stream computeMaximumVelocity(List wa log.info("Unable to compute maximum velocity, this stack will be skipped. {} {}.", ill.getMessage(), rawWaveform); return new PeakVelocityMeasurement(); } - }).filter(measurement -> measurement.getWaveform() != null); + }).filter(measurement -> measurement != null && measurement.getWaveform() != null); } } diff --git a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/ShapeCalculator.java b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/ShapeCalculator.java index 86884aac..b6cc470f 100644 --- a/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/ShapeCalculator.java +++ b/calibration-service/calibration-service-impl/src/main/java/gov/llnl/gnem/apps/coda/calibration/service/impl/processing/ShapeCalculator.java @@ -80,7 +80,6 @@ public List fitShapelineToMeasuredEnvelopes(Collection fitShapelineToMeasuredEnvelopes(Collection fitShapelineToMeasuredEnvelopes(Collection 0 && synthSeis.getLengthInSeconds() < frequencyBandParameter.getMinLength()) { - log.trace( - "Encountered a too small window length while processing {} with length {} and minimum window of {}; processing will skip this file", - velocityMeasurement, - synthSeis.getLengthInSeconds(), - frequencyBandParameter.getMinLength()); + log.trace("Encountered a too small window length while processing {} with length {} and minimum window of {}; processing will skip this file", + velocityMeasurement, + synthSeis.getLengthInSeconds(), + frequencyBandParameter.getMinLength()); return null; } else if (frequencyBandParameter.getMaxLength() > 0 && synthSeis.getLengthInSeconds() > frequencyBandParameter.getMaxLength()) { - log.trace( - "Encountered a too large window length while processing {} with length {} and maxium window of {}; processing will continue on a truncated envelope", - velocityMeasurement, - synthSeis.getLengthInSeconds(), - frequencyBandParameter.getMaxLength()); + log.trace("Encountered a too large window length while processing {} with length {} and maxium window of {}; processing will continue on a truncated envelope", + velocityMeasurement, + synthSeis.getLengthInSeconds(), + frequencyBandParameter.getMaxLength()); synthSeis.cutAfter(travelTime.add(frequencyBandParameter.getMaxLength())); } diff --git a/calibration-service/pom.xml b/calibration-service/pom.xml index 17205e0a..2e05cae8 100644 --- a/calibration-service/pom.xml +++ b/calibration-service/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 4.0.0 diff --git a/calibration-standalone/pom.xml b/calibration-standalone/pom.xml index 052f0244..8068f722 100644 --- a/calibration-standalone/pom.xml +++ b/calibration-standalone/pom.xml @@ -1,12 +1,12 @@ - + gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 4.0.0 @@ -199,14 +199,6 @@ org.springframework spring-webmvc - - io.springlets - springlets-data-jpa - - - io.springlets - springlets-data-commons - org.springframework.boot spring-boot-starter-web diff --git a/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/CalibrationLocalClient.java b/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/CalibrationLocalClient.java index 7a0efeba..a14798e8 100644 --- a/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/CalibrationLocalClient.java +++ b/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/CalibrationLocalClient.java @@ -47,6 +47,11 @@ public CalibrationLocalClient(CalibrationService service) { public Mono runCalibration(Boolean autoPickingEnabled) { return Mono.just(Boolean.toString(service.startCalibration(autoPickingEnabled))); } + + @Override + public Mono cancelCalibration(Long id) { + return Mono.just(service.cancelCalibration(id)); + } @Override public Mono makeMwMeasurements(Boolean autoPickingEnabled) { diff --git a/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/ReferenceEventLocalClient.java b/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/EventLocalClient.java similarity index 69% rename from calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/ReferenceEventLocalClient.java rename to calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/EventLocalClient.java index 9c59fd2e..b55cd3fb 100644 --- a/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/ReferenceEventLocalClient.java +++ b/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/EventLocalClient.java @@ -23,12 +23,15 @@ import com.fasterxml.jackson.core.JsonProcessingException; -import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.ReferenceEventClient; +import gov.llnl.gnem.apps.coda.calibration.gui.data.client.api.EventClient; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwDetails; import gov.llnl.gnem.apps.coda.calibration.model.domain.MeasuredMwParameters; import gov.llnl.gnem.apps.coda.calibration.model.domain.ReferenceMwParameters; +import gov.llnl.gnem.apps.coda.calibration.model.domain.ValidationMwParameters; +import gov.llnl.gnem.apps.coda.calibration.service.api.CalibrationService; import gov.llnl.gnem.apps.coda.calibration.service.api.MeasuredMwsService; import gov.llnl.gnem.apps.coda.calibration.service.api.ReferenceMwParametersService; +import gov.llnl.gnem.apps.coda.calibration.service.api.ValidationMwParametersService; import gov.llnl.gnem.apps.coda.common.model.domain.Event; import gov.llnl.gnem.apps.coda.common.service.api.WaveformService; import reactor.core.publisher.Flux; @@ -36,16 +39,21 @@ @Component @Primary -public class ReferenceEventLocalClient implements ReferenceEventClient { +public class EventLocalClient implements EventClient { private ReferenceMwParametersService refEventService; + private ValidationMwParametersService valEventService; private MeasuredMwsService measureService; private WaveformService waveformService; + private CalibrationService calService; @Autowired - public ReferenceEventLocalClient(ReferenceMwParametersService refEventService, MeasuredMwsService measureService, WaveformService waveformService) { + public EventLocalClient(ReferenceMwParametersService refEventService, ValidationMwParametersService valEventService, MeasuredMwsService measureService, CalibrationService calService, + WaveformService waveformService) { this.refEventService = refEventService; + this.valEventService = valEventService; this.measureService = measureService; + this.calService = calService; this.waveformService = waveformService; } @@ -59,6 +67,33 @@ public Mono postReferenceEvents(List refEvents) t return Mono.just(refEventService.save(refEvents).toString()); } + @Override + public Mono removeReferenceEventsByEventId(List evids) { + refEventService.deleteAllByEventIds(evids); + return Mono.empty(); + } + + @Override + public Flux getValidationEvents() { + return Flux.fromIterable(valEventService.findAll()).filter(Objects::nonNull).onErrorReturn(new ValidationMwParameters()); + } + + @Override + public Mono postValidationEvents(List valEvents) throws JsonProcessingException { + return Mono.just(valEventService.save(valEvents).toString()); + } + + @Override + public Mono removeValidationEventsByEventId(List evids) { + valEventService.deleteAllByEventIds(evids); + return Mono.empty(); + } + + @Override + public Flux toggleValidationEventsByEventId(List evids) { + return Flux.fromIterable(calService.toggleAllByEventIds(evids)); + } + @Override public Flux getMeasuredEvents() { return Flux.fromIterable(measureService.findAll()).filter(Objects::nonNull).onErrorReturn(new MeasuredMwParameters()); @@ -77,11 +112,4 @@ public Mono getEvent(String eventId) { public Flux getMeasuredEventDetails() { return Flux.fromIterable(measureService.findAllDetails()).filter(Objects::nonNull).onErrorReturn(new MeasuredMwDetails()); } - - @Override - public Mono removeReferenceEventsByEventId(List evids) { - refEventService.deleteAllByEventIds(evids); - return Mono.empty(); - } - } diff --git a/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/SpectraLocalClient.java b/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/SpectraLocalClient.java index 166230b8..c63af385 100644 --- a/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/SpectraLocalClient.java +++ b/calibration-standalone/src/main/java/gov/llnl/gnem/apps/coda/calibration/standalone/data/client/SpectraLocalClient.java @@ -60,6 +60,13 @@ public Mono getReferenceSpectra(String eventId) { return Mono.just(Optional.ofNullable(service.computeReferenceSpectraForEventId(eventId, sharedParamsService.getFrequencyBands(), PICK_TYPES.LG)).orElseGet(() -> new Spectra())) .onErrorReturn(new Spectra()); } + + @Override + public Mono getValidationSpectra(String eventId) { + //FIXME: Use the calibrations phase for this! + return Mono.just(Optional.ofNullable(service.computeValidationSpectraForEventId(eventId, sharedParamsService.getFrequencyBands(), PICK_TYPES.LG)).orElseGet(() -> new Spectra())) + .onErrorReturn(new Spectra()); + } @Override public Mono> getFitSpectra(String eventId) { diff --git a/common-gui/pom.xml b/common-gui/pom.xml index a69ae567..af8bbc27 100644 --- a/common-gui/pom.xml +++ b/common-gui/pom.xml @@ -1,24 +1,24 @@ - + 4.0.0 gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 gov.llnl.gnem.apps.coda.common common-gui jar common-gui - http://www.llnl.gov + https://www.llnl.gov Lawrence Livermore National Laboratory (LLNL) - http://www.llnl.gov + https://www.llnl.gov diff --git a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/controllers/ProgressGui.java b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/controllers/ProgressGui.java index 850c794d..74ae3717 100644 --- a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/controllers/ProgressGui.java +++ b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/controllers/ProgressGui.java @@ -27,6 +27,7 @@ import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; +import javafx.scene.control.Button; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; @@ -45,6 +46,9 @@ public class ProgressGui { @FXML private TableView progressTable; + @FXML + private TableColumn cancelColumn; + @FXML private TableColumn progressColumn; @@ -92,6 +96,9 @@ protected void updateItem(Node item, boolean empty) { }; } }); + + cancelColumn.setCellValueFactory(value -> Bindings.createObjectBinding(() -> value.getValue().getCancelButton())); + progressTable.setItems(monitors); progressTable.getSelectionModel().selectedItemProperty().addListener((obs, prevSelection, newSelection) -> { if (newSelection != null) { diff --git a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporter.java b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporter.java index 9a293a83..c2f00e05 100644 --- a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporter.java +++ b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporter.java @@ -48,62 +48,16 @@ public Result writeWaveformToDirectory(File exportDirectory, Waveform w) String filename = getFileName(w); if (filename != null && !filename.trim().isEmpty()) { try (DataOutputStream os = new DataOutputStream(new BufferedOutputStream(Files.newOutputStream(exportDirectory.toPath().resolve(filename))))) { - try (SACHeader header = new SACHeader()) { - header.setTime(new TimeT(w.getEvent().getOriginTime())); - header.setBeginTime(new TimeT(w.getBeginTime())); - header.setOriginTime(new TimeT(w.getEvent().getOriginTime())); - - header.nevid = Integer.parseInt(w.getEvent().getEventId()); - if (w.getAssociatedPicks() != null) { - for (int i = 0; i < w.getAssociatedPicks().size() && i <= 10; i++) { - try { - WaveformPick pick = w.getAssociatedPicks().get(i); - if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.F.getPhase())) { - header.f = pick.getPickTimeSecFromOrigin(); - } else if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.A.getPhase())) { - header.a = pick.getPickTimeSecFromOrigin(); - } else if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.B.getPhase())) { - header.b = pick.getPickTimeSecFromOrigin(); - } else if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.O.getPhase())) { - header.o = pick.getPickTimeSecFromOrigin(); - } else { - header.setTimePick(i, pick.getPickTimeSecFromOrigin(), pick.getPickName()); - } - } catch (RuntimeException e) { - log.error(e.getMessage(), e); - } - } - } - - header.delta = (float) (1.0 / w.getSampleRate()); - header.kstnm = w.getStream().getStation().getStationName(); - header.kcmpnm = w.getStream().getChannelName(); - header.stla = (float) w.getStream().getStation().getLatitude(); - header.stlo = (float) w.getStream().getStation().getLongitude(); - header.knetwk = w.getStream().getStation().getNetworkName(); - header.kevnm = w.getEvent().getEventId(); - header.evla = (float) w.getEvent().getLatitude(); - header.evlo = (float) w.getEvent().getLongitude(); - String depType = w.getSegmentType(); - if (depType != null && !depType.trim().isEmpty()) { - if (depType.toLowerCase(Locale.ENGLISH).startsWith("dis")) { - header.idep = 6; - } else if (depType.toLowerCase(Locale.ENGLISH).startsWith("vel")) { - header.idep = 7; - } else if (depType.toLowerCase(Locale.ENGLISH).startsWith("acc")) { - header.idep = 8; - } - } - float[] sequence = new Sequence(w.getSegment()).getArray(); - header.npts = sequence.length; - header.write(os); - for (int i = 0; i < sequence.length; i++) { - os.writeFloat(sequence[i]); - } - os.flush(); - - return new Result<>(true, filename); + SACHeader header = sacHeaderFromWaveform(w); + float[] sequence = new Sequence(w.getSegment()).getArray(); + header.npts = sequence.length; + header.write(os); + for (int i = 0; i < sequence.length; i++) { + os.writeFloat(sequence[i]); } + os.flush(); + + return new Result<>(true, filename); } catch (IOException e) { log.error(e.getMessage(), e); return new Result<>(false, e.toString()).setErrors(Collections.singletonList(e)); @@ -115,6 +69,58 @@ public Result writeWaveformToDirectory(File exportDirectory, Waveform w) return new Result<>(false, message); } + public SACHeader sacHeaderFromWaveform(Waveform w) throws IOException { + try (SACHeader header = new SACHeader()) { + header.setTime(new TimeT(w.getEvent().getOriginTime())); + header.setBeginTime(new TimeT(w.getBeginTime())); + header.setOriginTime(new TimeT(w.getEvent().getOriginTime())); + + header.nevid = Integer.parseInt(w.getEvent().getEventId()); + if (w.getAssociatedPicks() != null) { + for (int i = 0; i < w.getAssociatedPicks().size() && i <= 10; i++) { + try { + WaveformPick pick = w.getAssociatedPicks().get(i); + if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.F.getPhase())) { + header.f = pick.getPickTimeSecFromOrigin(); + } else if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.A.getPhase())) { + header.a = pick.getPickTimeSecFromOrigin(); + } else if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.B.getPhase())) { + header.b = pick.getPickTimeSecFromOrigin(); + } else if (pick.getPickType().equalsIgnoreCase(PICK_TYPES.O.getPhase())) { + header.o = pick.getPickTimeSecFromOrigin(); + } else { + header.setTimePick(i, pick.getPickTimeSecFromOrigin(), pick.getPickName()); + } + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + } + } + } + + header.delta = (float) (1.0 / w.getSampleRate()); + header.kstnm = w.getStream().getStation().getStationName(); + header.kcmpnm = w.getStream().getChannelName(); + header.stla = (float) w.getStream().getStation().getLatitude(); + header.stlo = (float) w.getStream().getStation().getLongitude(); + header.knetwk = w.getStream().getStation().getNetworkName(); + header.kevnm = w.getEvent().getEventId(); + header.evla = (float) w.getEvent().getLatitude(); + header.evlo = (float) w.getEvent().getLongitude(); + header.evdp = (float) w.getEvent().getDepth(); + String depType = w.getSegmentType(); + if (depType != null && !depType.trim().isEmpty()) { + if (depType.toLowerCase(Locale.ENGLISH).startsWith("dis")) { + header.idep = 6; + } else if (depType.toLowerCase(Locale.ENGLISH).startsWith("vel")) { + header.idep = 7; + } else if (depType.toLowerCase(Locale.ENGLISH).startsWith("acc")) { + header.idep = 8; + } + } + return header; + } + } + private boolean waveformFullySpecified(Waveform w) { return w != null && w.getLowFrequency() != null diff --git a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoader.java b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoader.java index a0f47840..2ff52fb7 100644 --- a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoader.java +++ b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoader.java @@ -178,7 +178,15 @@ public Result convertSacFileToWaveform(File file) { return exceptionalResult(headerResult.getErrors()); } double stationLongitude = header.stlo; - + + double eventDepth; + if (SACHeader.isDefault(header.evdp)) { + eventDepth = 0; + } + else { + eventDepth = header.evdp; + } + String dataType = StringUtils.trimToEmpty((String) header.getVariableMap().get("depvariabletype")).toLowerCase(Locale.ENGLISH); if (dataType.startsWith("acc")) { dataType = ACCELERATION; @@ -239,6 +247,7 @@ public Result convertSacFileToWaveform(File file) { new Event().setEventId(evid) .setLatitude(eventLatitude) .setLongitude(eventLongitude) + .setDepth(eventDepth) .setOriginTime(Date.from(Instant.ofEpochMilli(originTime.getMilliseconds())))) .setSegment(segment) .setSegmentType(dataType) diff --git a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/data/client/CodaWebClientBuilder.java b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/data/client/CodaWebClientBuilder.java index 575439cc..a172d8e1 100644 --- a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/data/client/CodaWebClientBuilder.java +++ b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/data/client/CodaWebClientBuilder.java @@ -186,7 +186,6 @@ public void close() { if (strategies != null) { builder.exchangeStrategies(strategies); } - // builder.exchangeStrategies(configurer -> configurer.codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(-1))); return builder.build(); } diff --git a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/util/ProgressMonitor.java b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/util/ProgressMonitor.java index 9908bea0..93e3fe2d 100644 --- a/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/util/ProgressMonitor.java +++ b/common-gui/src/main/java/gov/llnl/gnem/apps/coda/common/gui/util/ProgressMonitor.java @@ -15,20 +15,31 @@ package gov.llnl.gnem.apps.coda.common.gui.util; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Observable; import java.util.Observer; import gov.llnl.gnem.apps.coda.common.model.messaging.Progress; import javafx.application.Platform; +import javafx.beans.binding.Bindings; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; +import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Parent; +import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ProgressBar; import javafx.scene.layout.VBox; import javafx.scene.text.Font; +import javafx.scene.text.TextAlignment; public class ProgressMonitor extends VBox implements Observer { + private Button cancelButton = new Button(); @FXML private ProgressBar progressBar; @@ -38,6 +49,7 @@ public class ProgressMonitor extends VBox implements Observer { private String displayableName; private String progressStage; + private final ObservableList cancelFunctions = FXCollections.observableArrayList(); public ProgressMonitor(String displayableName, ProgressListener progressListener) { this.displayableName = displayableName; @@ -58,6 +70,19 @@ public ProgressMonitor(String displayableName, ProgressListener progressListener progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS); } label.setText(""); + + cancelButton.setAlignment(Pos.CENTER); + cancelButton.setPadding(new Insets(0, 0, 0, 0)); + cancelButton.setPrefSize(25.0, 25.0); + cancelButton.setText("X"); + cancelButton.setTextAlignment(TextAlignment.CENTER); + cancelButton.setOnAction((ActionEvent event) -> { + List funcs = new ArrayList<>(cancelFunctions.size()); + funcs.addAll(cancelFunctions); + funcs.forEach(Runnable::run); + }); + cancelButton.visibleProperty().bind(Bindings.size(cancelFunctions).greaterThan(0)); + } catch (IOException e) { throw new IllegalStateException(e); } @@ -100,4 +125,16 @@ public ProgressMonitor setProgressStage(String progressStage) { public ProgressBar getProgressBar() { return progressBar; } + + public void addCancelCallback(Runnable cancelFunction) { + cancelFunctions.add(cancelFunction); + } + + public void clearCancelCallbacks() { + cancelFunctions.clear(); + } + + public Button getCancelButton() { + return cancelButton; + } } diff --git a/common-gui/src/main/resources/fxml/ProgressDisplay.fxml b/common-gui/src/main/resources/fxml/ProgressDisplay.fxml index b81ec37a..7700da15 100644 --- a/common-gui/src/main/resources/fxml/ProgressDisplay.fxml +++ b/common-gui/src/main/resources/fxml/ProgressDisplay.fxml @@ -26,8 +26,8 @@ minWidth="200.0" prefWidth="-1.0" text="Task" /> - + diff --git a/common-gui/src/main/resources/fxml/ProgressMonitor.fxml b/common-gui/src/main/resources/fxml/ProgressMonitor.fxml index 99d3f8ee..7c486582 100644 --- a/common-gui/src/main/resources/fxml/ProgressMonitor.fxml +++ b/common-gui/src/main/resources/fxml/ProgressMonitor.fxml @@ -1,14 +1,13 @@ + - + diff --git a/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporterTest.java b/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporterTest.java index a6b41992..4809c73d 100644 --- a/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporterTest.java +++ b/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacExporterTest.java @@ -20,17 +20,22 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.sql.Date; +import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.junit.Assert; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.aggregator.ArgumentsAccessor; import org.junit.jupiter.params.provider.MethodSource; @@ -40,6 +45,7 @@ import gov.llnl.gnem.apps.coda.common.model.domain.Stream; import gov.llnl.gnem.apps.coda.common.model.domain.Waveform; import gov.llnl.gnem.apps.coda.common.model.messaging.Result; +import llnl.gnem.core.io.SAC.SACHeader; public class SacExporterTest { @@ -55,23 +61,24 @@ private static Collection testParamSet() throws Exception { params.add(new Object[] { new Waveform().setStream(new Stream()), "", waveformNotValidAssertions() }); params.add(new Object[] { new Waveform().setStream(new Stream()).setEvent(new Event()), "", waveformNotValidAssertions() }); params.add(new Object[] { new Waveform().setStream(new Stream().setStation(new Station())).setEvent(new Event()), "", waveformNotValidAssertions() }); - params.add( - new Object[] { new Waveform().setLowFrequency(.0).setHighFrequency(.0).setSegmentType("vel").setStream(new Stream().setStation(new Station())).setEvent(new Event()), "", - waveformNotValidAssertions() }); - - params.add( - new Object[] { new Waveform().setLowFrequency(.0) - .setHighFrequency(.0) - .setSegmentType("vel") - .setSampleRate(.0) - .setBeginTime(Date.from(Instant.now())) - .setEndTime(Date.from(Instant.now())) - .setStream(new Stream().setChannelName(Stream.TYPE_STACK).setStation(new Station().setStationName("RNG"))) - .setEvent(new Event().setEventId("12345").setOriginTime(Date.from(Instant.now()))), - "RNG_STACK_12345_0.0_0.0_VEL_.ENV", waveformValidAssertions() }); + params.add(new Object[] { new Waveform().setLowFrequency(.0).setHighFrequency(.0).setSegmentType("vel").setStream(new Stream().setStation(new Station())).setEvent(new Event()), "", + waveformNotValidAssertions() }); + + params.add(new Object[] { createValidWaveform(), "RNG_STACK_12345_0.0_0.0_VEL_.ENV", waveformValidAssertions() }); return params; } + public static Waveform createValidWaveform() { + return new Waveform().setLowFrequency(.0) + .setHighFrequency(.0) + .setSegmentType("vel") + .setSampleRate(.0) + .setBeginTime(Date.from(Instant.now())) + .setEndTime(Date.from(Instant.now())) + .setStream(new Stream().setChannelName(Stream.TYPE_STACK).setStation(new Station().setStationName("RNG"))) + .setEvent(new Event().setEventId("12345").setDepth(100.0).setOriginTime(Date.from(Instant.now()))); + } + @BeforeAll public static void setUpBeforeClass() throws Exception { testDir = Files.createDirectory(Paths.get(".sac_exporter_test_" + Instant.now().toEpochMilli())).toFile(); @@ -107,6 +114,14 @@ public void testGetFileName(Waveform input, String expectedFilename) throws Exce Assert.assertEquals(expectedFilename, actual); } + @Test + public void testEventDepthPopulated() throws Exception { + //GMPAPPS-1947 Envelope tool was dropping event depth info during import/export. + Waveform waveform = createValidWaveform(); + SACHeader header = exporter.sacHeaderFromWaveform(waveform); + Assert.assertTrue("Expect that the waveform should have a populated event depth if the original file had it.", header.evdp != 0 && !SACHeader.isDefault(header.evdp)); + } + private static Consumer> waveformNotValidAssertions() throws Exception { return res -> { Assert.assertFalse("Result on an invalid waveform should be false", res.isSuccess()); diff --git a/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoaderTest.java b/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoaderTest.java index 736ba729..9470c52b 100644 --- a/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoaderTest.java +++ b/common-gui/src/test/java/gov/llnl/gnem/apps/coda/common/gui/converters/sac/SacLoaderTest.java @@ -61,9 +61,17 @@ public void teardown() { @MethodSource("singleFile") public void testConvertFile(File inputFile) throws Exception { Result res = loader.convertFile(inputFile).doOnError(error -> Assert.fail(error.getMessage())).block(Duration.ofSeconds(10l)); - Assert.assertTrue("Expect that waveform result should all complete successfully", res.isSuccess()); - Assert.assertTrue("Expect that waveform result should have no error or warning messages", res.getErrors().isEmpty()); - Assert.assertTrue("Expect that waveform result should have a Waveform payload", res.getResultPayload().isPresent()); + Assert.assertTrue("Expect that waveform results should all complete successfully", res.isSuccess()); + Assert.assertTrue("Expect that waveform results should have no error or warning messages", res.getErrors().isEmpty()); + Assert.assertTrue("Expect that waveform results should have a Waveform payload", res.getResultPayload().isPresent()); + } + + public static Collection singleFile() throws IOException { + try (Stream stream = Files.walk(Paths.get("src/test/resources/sac/"))) { + return stream.filter(path -> path.getFileName().toString().toLowerCase(Locale.ENGLISH).endsWith(".sac")).map(path -> { + return Arguments.of(path.toFile()); + }).collect(Collectors.toList()); + } } @Test @@ -79,16 +87,25 @@ public void testConvertFiles() throws Exception { List> results = loader.convertFiles(multipleFiles.get(0)).doOnError(error -> Assert.fail(error.getMessage())).collectList().block(Duration.ofSeconds(10l)); for (Result res : results) { Assert.assertTrue("Expect that waveform results should all complete successfully", res.isSuccess()); - Assert.assertTrue("Expect that waveform result should have no error or warning messages", res.getErrors().isEmpty()); - Assert.assertTrue("Expect that waveform result should have a Waveform payload", res.getResultPayload().isPresent()); + Assert.assertTrue("Expect that waveform results should have no error or warning messages", res.getErrors().isEmpty()); + Assert.assertTrue("Expect that waveform results should have a Waveform payload", res.getResultPayload().isPresent()); } } - public static Collection singleFile() throws IOException { - try (Stream stream = Files.walk(Paths.get("src/test/resources/sac/"))) { - return stream.filter(path -> path.getFileName().toString().toLowerCase(Locale.ENGLISH).endsWith(".sac")).map(path -> { - return Arguments.of(path.toFile()); - }).collect(Collectors.toList()); + @Test + public void testEventDepthPopulated() throws Exception { + //GMPAPPS-1947 Envelope tool was dropping event depth info. + List> multipleFiles = IntStream.range(0, 3).mapToObj(i -> { + try (Stream stream = Files.walk(Paths.get("src/test/resources/sac/"))) { + return stream.filter(path -> path.getFileName().toString().toLowerCase(Locale.ENGLISH).endsWith(".sac")).map(path -> path.toFile()).collect(Collectors.toList()); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + }).filter(o -> o != null).collect(Collectors.toList()); + List> results = loader.convertFiles(multipleFiles.get(0)).doOnError(error -> Assert.fail(error.getMessage())).collectList().block(Duration.ofSeconds(10l)); + for (Result res : results) { + Assert.assertTrue("Expect that the waveform should have a populated event depth if the original file had it.", res.getResultPayload().get().getEvent().getDepth() != 0); } } } diff --git a/common-service/common-application/pom.xml b/common-service/common-application/pom.xml index ee22a23a..ec7dbdbe 100644 --- a/common-service/common-application/pom.xml +++ b/common-service/common-application/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.common common-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -86,14 +86,6 @@ org.springframework spring-webmvc - - io.springlets - springlets-data-jpa - - - io.springlets - springlets-data-commons - org.springframework.boot spring-boot-starter-actuator diff --git a/common-service/common-model/pom.xml b/common-service/common-model/pom.xml index e221f3d0..6497be2f 100644 --- a/common-service/common-model/pom.xml +++ b/common-service/common-model/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.common common-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -22,10 +22,6 @@ org.eclipse.collections eclipse-collections - - io.springlets - springlets-context - org.springframework spring-context diff --git a/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/domain/Event.java b/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/domain/Event.java index ccaaa46b..a21d86a7 100644 --- a/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/domain/Event.java +++ b/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/domain/Event.java @@ -56,6 +56,10 @@ public class Event implements Serializable { @NumberFormat private double longitude; + @Column(name = "eventDepth") + @NumberFormat + private double depth; + public String getEventId() { return this.eventId; } @@ -95,6 +99,15 @@ public Event setLongitude(double longitude) { return this; } + public double getDepth() { + return this.depth; + } + + public Event setDepth(double depth) { + this.depth = depth; + return this; + } + @Override public int hashCode() { final int prime = 31; @@ -127,7 +140,18 @@ public boolean equals(Object obj) { @Override public String toString() { - return "Event [eventId=" + eventId + ", originTime=" + originTime + ", latitude=" + latitude + ", longitude=" + longitude + "]"; + StringBuilder builder = new StringBuilder(); + builder.append("Event [eventId=") + .append(eventId) + .append(", originTime=") + .append(originTime) + .append(", latitude=") + .append(latitude) + .append(", longitude=") + .append(longitude) + .append(", depth=") + .append(depth) + .append("]"); + return builder.toString(); } - } diff --git a/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/util/SPECTRA_TYPES.java b/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/util/SPECTRA_TYPES.java index 218e7293..93b612f8 100644 --- a/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/util/SPECTRA_TYPES.java +++ b/common-service/common-model/src/main/java/gov/llnl/gnem/apps/coda/common/model/util/SPECTRA_TYPES.java @@ -15,5 +15,5 @@ package gov.llnl.gnem.apps.coda.common.model.util; public enum SPECTRA_TYPES { - REF, FIT, UQ1, UQ2, UNK + REF, FIT, UQ1, UQ2, VAL, UNK } diff --git a/common-service/common-repository/pom.xml b/common-service/common-repository/pom.xml index 9ce79aac..330ea915 100644 --- a/common-service/common-repository/pom.xml +++ b/common-service/common-repository/pom.xml @@ -1,10 +1,10 @@ - + gov.llnl.gnem.apps.coda.common common-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -18,14 +18,6 @@ h2 test - - io.springlets - springlets-data-commons - - - io.springlets - springlets-data-jpa - gov.llnl.gnem.apps.coda.common common-model diff --git a/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepoImpl.java b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepoImpl.java index 84912d06..0d54ab28 100644 --- a/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepoImpl.java +++ b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepoImpl.java @@ -19,19 +19,9 @@ import javax.persistence.EntityManager; import org.springframework.data.jpa.repository.support.JpaEntityInformation; +import org.springframework.data.jpa.repository.support.SimpleJpaRepository; -import io.springlets.data.jpa.repository.support.DetachableJpaRepositoryImpl; - -/** - *

- * This is a quick hack to the existing DetachableJpaRepositoryImpl to correctly - * implement the findOneDetached with the new findById API changes in Spring - * JPA. It should be removed ASAP when the API has settled. - *

- * - * @see DetachableJpaRepositoryImpl - */ -public class DetachableJpaRepoImpl extends DetachableJpaRepositoryImpl { +public class DetachableJpaRepoImpl extends SimpleJpaRepository implements DetachableJpaRepository { private EntityManager entityManager; public DetachableJpaRepoImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { diff --git a/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepository.java b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepository.java new file mode 100644 index 00000000..b78d1203 --- /dev/null +++ b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/DetachableJpaRepository.java @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2019, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* CODE-743439. +* All rights reserved. +* +* Licensed under the Apache License, Version 2.0 (the “Licensee”); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and limitations under the license. +* +* This work was performed under the auspices of the U.S. Department of Energy +* by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344. +*/ +package gov.llnl.gnem.apps.coda.common.repository; + + +import java.io.Serializable; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.NoRepositoryBean; +@NoRepositoryBean +public interface DetachableJpaRepository extends JpaRepository { + + /** + * Retrieves an entity by its id and detaches it from the EntityManager. + * + * @param id must not be {@literal null}. + * @return the entity with the given id or {@literal null} if none found + * @throws IllegalArgumentException if {@code id} is {@literal null} + */ + T findOneDetached(ID id); + +} \ No newline at end of file diff --git a/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformPickRepository.java b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformPickRepository.java index 622c1124..a33a96b4 100644 --- a/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformPickRepository.java +++ b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformPickRepository.java @@ -18,7 +18,7 @@ import gov.llnl.gnem.apps.coda.common.model.domain.Waveform; import gov.llnl.gnem.apps.coda.common.model.domain.WaveformPick; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface WaveformPickRepository extends DetachableJpaRepository { diff --git a/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformRepository.java b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformRepository.java index 38aab568..0f5eae6a 100644 --- a/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformRepository.java +++ b/common-service/common-repository/src/main/java/gov/llnl/gnem/apps/coda/common/repository/WaveformRepository.java @@ -28,7 +28,7 @@ import gov.llnl.gnem.apps.coda.common.model.domain.Stream; import gov.llnl.gnem.apps.coda.common.model.domain.Waveform; import gov.llnl.gnem.apps.coda.common.model.domain.WaveformPick; -import io.springlets.data.jpa.repository.DetachableJpaRepository; +import gov.llnl.gnem.apps.coda.common.repository.DetachableJpaRepository; @Transactional public interface WaveformRepository extends DetachableJpaRepository { diff --git a/common-service/common-service-api/pom.xml b/common-service/common-service-api/pom.xml index 72089254..96dc89ba 100644 --- a/common-service/common-service-api/pom.xml +++ b/common-service/common-service-api/pom.xml @@ -1,10 +1,10 @@ - + gov.llnl.gnem.apps.coda.common common-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -17,10 +17,6 @@ gov.llnl.gnem.apps.coda.common common-model
- - io.springlets - springlets-data-commons -
diff --git a/common-service/common-service-impl/pom.xml b/common-service/common-service-impl/pom.xml index ab19f2d3..f401e5ac 100644 --- a/common-service/common-service-impl/pom.xml +++ b/common-service/common-service-impl/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.common common-service - 1.0.8.1 + 1.0.9 4.0.0 diff --git a/common-service/pom.xml b/common-service/pom.xml index 1355880b..b6e677fc 100644 --- a/common-service/pom.xml +++ b/common-service/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 gov.llnl.gnem.apps.coda.common diff --git a/envelope-gui/pom.xml b/envelope-gui/pom.xml index f9a8f056..093fda9b 100644 --- a/envelope-gui/pom.xml +++ b/envelope-gui/pom.xml @@ -1,24 +1,24 @@ - + 4.0.0 gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 envelope-gui gov.llnl.gnem.apps.coda.envelope jar envelope-gui - http://www.llnl.gov + https://www.llnl.gov Lawrence Livermore National Laboratory (LLNL) - http://www.llnl.gov + https://www.llnl.gov @@ -38,7 +38,7 @@ spring-milestones - http://repo.spring.io/milestone + https://repo.spring.io/milestone diff --git a/envelope-service/envelope-application/pom.xml b/envelope-service/envelope-application/pom.xml index 11a1086d..f93a4aff 100644 --- a/envelope-service/envelope-application/pom.xml +++ b/envelope-service/envelope-application/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.envelope envelope-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -82,14 +82,6 @@ org.springframework spring-webmvc
- - io.springlets - springlets-data-jpa - - - io.springlets - springlets-data-commons - org.springframework.boot spring-boot-starter-web diff --git a/envelope-service/envelope-model/pom.xml b/envelope-service/envelope-model/pom.xml index 0f234bba..d4904595 100644 --- a/envelope-service/envelope-model/pom.xml +++ b/envelope-service/envelope-model/pom.xml @@ -1,10 +1,10 @@ - + gov.llnl.gnem.apps.coda.envelope envelope-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -13,10 +13,6 @@ envelope-model - - io.springlets - springlets-context - org.springframework spring-context diff --git a/envelope-service/envelope-repository/pom.xml b/envelope-service/envelope-repository/pom.xml index 9422f684..4aad408d 100644 --- a/envelope-service/envelope-repository/pom.xml +++ b/envelope-service/envelope-repository/pom.xml @@ -1,10 +1,10 @@ - + gov.llnl.gnem.apps.coda.envelope envelope-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -22,14 +22,6 @@ h2 test - - io.springlets - springlets-data-commons - - - io.springlets - springlets-data-jpa - gov.llnl.gnem.apps.coda.common common-repository diff --git a/envelope-service/envelope-service-api/pom.xml b/envelope-service/envelope-service-api/pom.xml index 9e430d28..15cacf0a 100644 --- a/envelope-service/envelope-service-api/pom.xml +++ b/envelope-service/envelope-service-api/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.envelope envelope-service - 1.0.8.1 + 1.0.9 4.0.0 @@ -18,10 +18,6 @@ gov.llnl.gnem.apps.coda.envelope envelope-model - - io.springlets - springlets-data-commons - gov.llnl.gnem.apps.coda.common common-model diff --git a/envelope-service/envelope-service-impl/pom.xml b/envelope-service/envelope-service-impl/pom.xml index 550aab49..cbc31199 100644 --- a/envelope-service/envelope-service-impl/pom.xml +++ b/envelope-service/envelope-service-impl/pom.xml @@ -1,12 +1,12 @@ - + gov.llnl.gnem.apps.coda.envelope envelope-service - 1.0.8.1 + 1.0.9 4.0.0 diff --git a/envelope-service/pom.xml b/envelope-service/pom.xml index 66035bbb..00e61912 100644 --- a/envelope-service/pom.xml +++ b/envelope-service/pom.xml @@ -1,11 +1,11 @@ - + gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 gov.llnl.gnem.apps.coda.envelope diff --git a/envelope-standalone/pom.xml b/envelope-standalone/pom.xml index fea19da2..ee8a5ae7 100644 --- a/envelope-standalone/pom.xml +++ b/envelope-standalone/pom.xml @@ -1,12 +1,12 @@ - + gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 4.0.0 diff --git a/externals/pom.xml b/externals/pom.xml index 3c853fe0..5b885ade 100644 --- a/externals/pom.xml +++ b/externals/pom.xml @@ -1,29 +1,29 @@ - + 4.0.0 gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 externals jar externals - http://www.llnl.gov + https://www.llnl.gov Lawrence Livermore National Laboratory (LLNL) - http://www.llnl.gov + https://www.llnl.gov - + com.google.guava guava diff --git a/externals/src/main/java/llnl/gnem/core/io/SAC/SACFileReader.java b/externals/src/main/java/llnl/gnem/core/io/SAC/SACFileReader.java index 122270a8..863e6ba8 100755 --- a/externals/src/main/java/llnl/gnem/core/io/SAC/SACFileReader.java +++ b/externals/src/main/java/llnl/gnem/core/io/SAC/SACFileReader.java @@ -38,33 +38,6 @@ public SACFileReader(File file) throws IOException { path = file.getAbsolutePath(); } - //constructor - public SACFileReader(ObjectInput stream) { - try { - header = new SACHeader(stream); - - totalNumSamples = header.npts; - nextSample = 0; - numSamplesRemaining = totalNumSamples; - station = (header.kstnm).trim(); - channel = (header.kcmpnm).trim(); - samplingRate = 1.0 / (header.delta); - timeT = new TimeT(header.nzyear, header.nzjday, header.nzhour, header.nzmin, header.nzsec, header.nzmsec); - foff = 4 * WORDS_IN_HEADER; - timeT = timeT.add(header.b); - startTime = timeT.getEpochTime(); - - if (header.checkByteSwap()) { - format = CSS_F4; - } else { - format = CSS_T4; - } - - } catch (IOException e) { - throw new IllegalStateException(e.getMessage()); - } - } - public SACFileReader(InputStream stream) { try { header = new SACHeader(stream); diff --git a/externals/src/main/java/llnl/gnem/core/util/Passband.java b/externals/src/main/java/llnl/gnem/core/util/Passband.java index 7a919272..91f2cdfd 100755 --- a/externals/src/main/java/llnl/gnem/core/util/Passband.java +++ b/externals/src/main/java/llnl/gnem/core/util/Passband.java @@ -1,5 +1,5 @@ /* -* Copyright (c) 2018, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory +* Copyright (c) 2020, Lawrence Livermore National Security, LLC. Produced at the Lawrence Livermore National Laboratory * CODE-743439. * All rights reserved. * This file is part of CCT. For details, see https://github.com/LLNL/coda-calibration-tool. @@ -14,13 +14,10 @@ */ package llnl.gnem.core.util; -/** - * A type-safe enum that describes the passband for a filter. - * - * @author Doug Dodge - */ -public class Passband { - private final String name; +public enum Passband { + BAND_PASS("BP"), BAND_REJECT("BR"), LOW_PASS("LP"), HIGH_PASS("HP"); + + private String name; private Passband(String name) { this.name = name; @@ -28,7 +25,7 @@ private Passband(String name) { /** * A string representation of the passband for a filter suitable for use - * with the dbh.ButterworthFilter.. + * with the ButterworthFilter.. * * @return A String with the one of the values "LP", or "HP", "BP", "BR" */ @@ -36,16 +33,6 @@ public String toString() { return name; } - /** - * Get all the passband codes known to this class - * - * @return A String array containing all the passband codes - */ - public static String[] getPassBandCodes() { - String[] codes = { "BP", "BR", "LP", "HP" }; - return codes; - } - /** * Returns a Passband object given a 2-character String descriptor. Only * recognized codes are "BP", "LP", "HP", "BR". Any other String will result @@ -55,7 +42,7 @@ public static String[] getPassBandCodes() { * The code of the desired passband object. * @return The specified Passband object. */ - public static Passband getPassbandFromString(final String code) { + public static Passband getPassband(final String code) { if (code.equals("BP")) return Passband.BAND_PASS; else if (code.equals("LP")) @@ -67,30 +54,4 @@ else if (code.equals("BR")) else return null; } - - public static Passband[] getAvailablePassBands() { - Passband[] result = new Passband[4]; - result[0] = BAND_PASS; - result[1] = BAND_REJECT; - result[2] = LOW_PASS; - result[3] = HIGH_PASS; - return result; - } - - /** - * Specifies a band-pass filter - */ - public final static Passband BAND_PASS = new Passband("BP"); - /** - * Specifies a band-reject filter - */ - public final static Passband BAND_REJECT = new Passband("BR"); - /** - * Specifies a low-pass filter - */ - public final static Passband LOW_PASS = new Passband("LP"); - /** - * Specifies a high-pass filter - */ - public final static Passband HIGH_PASS = new Passband("HP"); } diff --git a/mapping/pom.xml b/mapping/pom.xml index f2f8f908..36f09f82 100644 --- a/mapping/pom.xml +++ b/mapping/pom.xml @@ -1,24 +1,24 @@ - + 4.0.0 gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 gov.llnl.gnem.apps.coda.common mapping jar mapping - http://www.llnl.gov + https://www.llnl.gov Lawrence Livermore National Laboratory (LLNL) - http://www.llnl.gov + https://www.llnl.gov diff --git a/mapping/src/main/resources/leaflet/images/cancel.png b/mapping/src/main/resources/leaflet/images/cancel.png new file mode 100755 index 0000000000000000000000000000000000000000..a4e7c492ef6361dfcc8d2584c8b6b72212d8e9e8 GIT binary patch literal 397 zcmV;80doF{P)!kTFgIQ4~eb9Y&Z*6xo3t ziO^xR#}0cM&=A2!tyl|*+93wkU`c4Gq%yMt7eGib42k*AVgOARe4zFPxYJO&jKP^sj|g7?GKFo5Ya(6%nVqzEXjof8e~2DycWBznNb>RjX-HV`T$4{o$T ziH0BsbFz_VS_RZsqcIFzX75E%{O4O=bD8Y1*XxzzRLWHhqQ7A0KF&Iw{Bl#Q(HI7n r-n}+am#MIJ2KD!Y>_exMUjlprupxbFzN5i;00000NkvXXu0mjf1P-X} literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/cancel.svg b/mapping/src/main/resources/leaflet/images/cancel.svg new file mode 100755 index 00000000..081c4fdf --- /dev/null +++ b/mapping/src/main/resources/leaflet/images/cancel.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/mapping/src/main/resources/leaflet/images/cancel_@2X.png b/mapping/src/main/resources/leaflet/images/cancel_@2X.png new file mode 100755 index 0000000000000000000000000000000000000000..dcc72f0c191f021818a99133bd298c558cca57ce GIT binary patch literal 762 zcmV}PgtpK4o^yWBd+vSCJ(sAXvFZJG(^O#quK@%Ecvc>fD}rYb&q{GxH0Hd zj7;pck;Wn*Z%C?oO^ApF@x?5u+4NfX`J)EW$^9s(J`s3Y5A0x7pyt&2YH*{vTGQRT z*ufmB63xQ_fId-3MPr8_YO2+plPb|X*e(G^lks5s!5}iR*G6TW{9Wfx4w4r#kc8d59ha@VyRdw>(D*HC572U;zNs*z|t8h`hC~BvmM}(vvM3PX++_<^nrm z$G%jmt02Xe!A9W#K%j%s*x?<47Izb%x@!Pv1YX(0UER;X|BwRY>XA7$&-~AecTHE7 zc&P}UH468ZZnNG}F;gd97RjlCAlE1yKyRIN*`x(IMdjHP5p6fu3+`#DO&3)8)LLYc z+#&!(V+Y#=hb;~Th=eMK$Sp0qLRqBXGeDnZES-o4M-2clOKR3I^ib_2`aot}!1wB- zu+O%6;9Bd_98kFr(rex4)SP+*)`U2@vHJ4og8=}nuLd_D`1sFkk@v}X_x6L8bvzn7 z9HGcENPkmY;2Pj$H5{;9nE;TC2h&0Z0Bkv?%Ptc@+T+myD;#k7tGL(5_))82=&*qO s1UdkDURibt$f*|ONNy$L!3#IWZz+CGCOrV=;s5{u07*qoM6N<$f~%rcF8}}l literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/check.png b/mapping/src/main/resources/leaflet/images/check.png new file mode 100755 index 0000000000000000000000000000000000000000..55f274b1d85c7930ebcc253cbca86aaf358fb76e GIT binary patch literal 387 zcmV-}0et?6P)kkTFXF0T_m#_wLj?DDxk* z3E5`Y(vl5OYE00rt)bB-r<~+|L2HX(p>*EYkitRUJAORh_rC8Z zR%&)eK`_f-11-ZU0FolZ2F_x3-|N-q00L-TjCVaRc?IpUK?afQCXJ_u!w)q(qagUo zjkDnNQmIfpaQJBY4TP!yLbtJ3$i>*{e;7c0 zh2hXo3fu33{mk-!!K73u)|_6iK6l-uVXIGM!ATOIb-U$-*26Fy`j+3iG|`r+vd#?Z h@A$>XZnwMu_ysFna@?3hyu<(i002ovPDHLkV1fVxrO*HX literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/check.svg b/mapping/src/main/resources/leaflet/images/check.svg new file mode 100755 index 00000000..e0efc03f --- /dev/null +++ b/mapping/src/main/resources/leaflet/images/check.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/mapping/src/main/resources/leaflet/images/check_@2X.png b/mapping/src/main/resources/leaflet/images/check_@2X.png new file mode 100755 index 0000000000000000000000000000000000000000..df8032e49651d82a009edfaf0ef29badc9c7b7f6 GIT binary patch literal 692 zcmV;l0!#ggP)8cT8;vkC&{spvFlokpk`~xNiS5m5zu($|ef)R1*y`KXG z`r}e^>pQ;ZyU+W5C+Fl`(MA)Qarac1@UBfY|V>Zl<)@zjtLoGF46@w;;II4jdA7qCnG2d2glOZRl=1y*(?r zLUcHQuA5^ynXbHSaO*plTp>ERRR*KQoL4#z7@OMak&FNAtn;u0`(sj~nDh1>fOGNr z|A8C)Z7`%R!90K_GUeWCRllw}Ep4>q2h}$*#lIr%UJPM@@4H^-`);^%xP9)q)jzqC zA3Q*08i$aJ$Ae+V=_TqA?meHIQ}8TZxo1YHr2-8(AQ2gD_Ng8o7~dprHrEOI+{N{8 z!F<7}hQWJpdsA1zYt`MMdvA~}2gnN9fsM0}PT-(JC$!r- zL9j5Mu1o>cLLNki1K5tnQ?FKSl9-DEH#qi#>MYdWgVJLE zo&rrr=O=u<5X=vX`tW>PZ!4!jfqny8s;@S2)N!~(;&R$q^-|>(b%pjnmOi->kb++tyAin zBDQq*+w0<;Q-l*XPCk^dHb*^hS#AA)o3n@P-5KImJ$B}rx+?A1gL}8{Fy>_EJ0Ive zQPK2nadfR@gNW9GA4_-4Fjiq$HH&fG{inWjW|{9SeJQQ5+s1%xdyConrH*~m`<=ay@wZ*H UQzopr05^1kr2qf` literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/focus.svg b/mapping/src/main/resources/leaflet/images/focus.svg new file mode 100755 index 00000000..1761ea65 --- /dev/null +++ b/mapping/src/main/resources/leaflet/images/focus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/mapping/src/main/resources/leaflet/images/focus_@2X.png b/mapping/src/main/resources/leaflet/images/focus_@2X.png new file mode 100755 index 0000000000000000000000000000000000000000..1eb7dd4cef4cd2eacd5738c37f37d5a14fdb4177 GIT binary patch literal 462 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 z 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

LKhF)X++hn1F?y^anO~Pd9r7Lx%Oc&vC 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�u;-LHqtr(;^4(!iPydtL9L{)4I^er_4`Ld!57O>3|ui! z>?;;7Vrny1GHjOr%4D8~=yOhBIo&N-FsjJpp%Y#1(cr%}bKD7i{*o~LWnAs%;@c4Wvq$V7T?fgCc*i{m< zD8XHoiVW@a*J=VN&Axrxc>me44PVHDqN>QNkN8dFrr9CJ%fa%uIsB2 z_@vPyill=&Of<{bz!r@3Ab3h+b$~l4X7KYDsefABGFW^l)!oC)mb`h(cj-c(oMYuJr}i}=9wIuSes8ke zKkLywn@(?<_3X2I-C!%U1X++HmLN-f1w}2PWf@u?R7$K)mYA~l3}dDYE^@x4!Ry}H zEFZQEi)3r>rNJJ+Clf{l;a=qAH@U}E6F{PB3i8*`;z>KjC^V9%ep2E~MvyvKeB?V( z+WsYOQG8Jdl&p_!g~MM0GFYDFs}W@-uzZixdiZZqxcBiry;BmIM;WwB`Ud_D=X zs5;|#2wuUWV!*|2Vaz;=EG1$ZA;|;$GR0h9F0Du4<)g=rc__tPpv4$@a!pqFcEc}g zs@{37{toJ}fYXs!q3^bqzLeGI8&dvltW@9!a{Ogq0iDJ=-N&p=Et<|3O_^Axv@*Hl z^&kEewEXbLU;g;3H(rG9d|+xM<+^o87y2QPrq;X z{$f3rSTaK$#VHwOog9KB4v=jW|KdWkdfsKs+~s`SS2q}URR!SW&t^0mpr^D>_JGATVD7#S=g3$>Q@ zDgCBEDV15KlLg6AY{imIpNA}ebYeZX`eKKQmG>QcKQPxf4_V@KgAMtf`;fpAvmEKE z>EZlTU5ALTa z9WB!xo>R>7;p?-J3og3Pib6h-P2H4Ip@hj2?qQbi;oHFZQma;G&!@ePz4pW{c3BZj z444Q_2w4bCV%Z~X5n$G-Mib>Ja3acRSW@9pkR@ca7$E8oiz17CUd$UL&Sd#AUWemh z8qmDLKet}v_5E((h2Q@Svizc3Wa+mR3mGNkz4sqopZbA!t}pI;`DG#uq__7yh5ml( z*WT~w-xz}>*%xbx3OO(Y8?17#?%X`#;Y1Z^WWtYn4JCpP*WmSq*3VrJXk48USGBwfMp<}OyN=Wb) zEjq6nEvTSYu%2RnCt0=el0D9}C|8>$wW+0Svh?x_3#;u@qc^TjZF%j@pZ@5lZ~pej zUw;1U3{4Way!vU8MZm}*!lITGvnT@=_X#Zsxag+hmiwN3X$J|h-7MG-MBMSOlOEn}Rh7ju^$5jd0M{kTyu4I?n4*r8Ipe2!I6%&$U$9U&5t{NTIEQ`Hi zg+UiW8G1(W0CF{-t~2|R@x^!seaG%oulCEO$lZ#Y6|$uEm2LvxigI5m8RZkZ$&w-# zktLU~)2nMM(FI;Ks9{q+$_{wtgccaXRp7-Jp%}k(6@TYJVNSPYfXv*CvtdCNIC%Wp z_~0tLx_ro++#7bhFT1&XR&VA@1Pz8p!*RASCCHMB=}9r=&I{&Wji-i;A8xuwEO*l9 zqQMq`t7fufQ`R zt++vsTjo?UkR^QCG=7N#G}~f~nHu$n zZ7~L?ac;kw7-P&#_8<6oKHsm;eR@0UoVuw`#@*+>^zO>w^XTi_^K}F3_!VM94amYI zyvz0;GI3f;bN7gLu`i@q{9TGTc3qYD$R&S-%;3Acp1U3+IAOBH4M#db5`)BWNv&g` zC8#5Q-OL3g9Rih)vi$6zn~llcNk_ct>#t<7ih+$`8?$)2o^Gb?4nEYX6pJcaf>1TF3i)9%R8DUCpu6y=mW;g~F0 z$|4&tz`wgg>hEN032BEygQWC?(ZabMvJgE0qaGMSz`}&kz@eBJbf-jHp zgpobff`Svs(r>bO;oX>Kp?vqr$?eLix|-ABBF=}p)@%hBZm(y%HeH3xvWP7u&j}A# z0gDC^$v=&T8CVNhPHGM0AS3(@+RLI^Z^WS7?8Wjyx;=|5Ibp8L$%5LcVucl^8qzX9 z7=1k5wR5L~8P{ENUJ`aafE6-t)^?Hd7qD(Vnxq*mb)gS^lQxN*=OgWcwUwQPZ*Y^tnWqSDt?G zH0M)sPsU;9h?vpjN(3#flc0V`DYI)4L5t85ZpZ%ctz_{rG0WAEW$o2L7C9X+QDEX6 zn7V&m`siejy?0&Sdx*YDuNIbw|vH%D|4)*TB6jwS_w{#`n3>jARA(z;i`p`16D1LCnfs!)}OcGgo z^i`PNQvs=tai-TmzBWAeDl#hD7(ml604&Yih%7tpjcGSY!;(TvQkQ-GWvTD#KQ!YR zc%eHLCb0C$WJ)JoRuGCTc)3JZGt$yAz|zZWh%9BrE=68xuwG*0+03Rrt4|)d^z&c; z`la7pe)Uhkdh|*1UQfEJ@_B*9TnU{~xMBraq^C?4ZkjQW1+?6<_cmIOp^C_Yh+EzT zSz6KJi`g<+{42-H`>l>E8;3Owk6T>ysZJOz&8A~O~c0AFl@KSM;&1qPt7Kb`F6uxpZ)VvWgVW6NsH z%~F=vdNIDY4{e7mt4S_Hu_U8)7QnD~CmzX(?Kd zS84%qSmV#KrUY71gOOriF<2nE6@~i{=rDzHns_Z`Xs5{{zC^?lv6Ef=aj^6?WRZQ? zC?7I?w&d#4Ia{{<3e9q$Y~So?#iU|DCB(7LdP=J4ti5)v&R7Bqu!+~^%3!%!Nj8rB zWtfR5;lCDf#DQKk$P#Mr90)_qP7aI}%UttPG6IWhKebEkPny^GjDU0a!57boEKk4k z%8Q40eR0=8-qeoqSwo!Ak}xBE=WRCnK^dpQGOb5C)u%S&76~%SgRR#b%aVt_lw2nn zQq&NOb>H{z$Y$}ii;INUO^iwIB3Gsw3oi_qt>g{EbM!WeS?jGkLWf;yX|ls;5xKaX zE4`JzoRYt1W^iC`ZcdA4iz8{%7hp-J*QJ03s}xqy z)bmlrT{MW6Gw8%P3#a%YdV}>w&Os3=@r1$RHrws*0~FyF1_I%VU5foJvDBqY+cR8i zDH3BqC3))e)tY^*c(TSNdJRJ-r$F4+c|*L-Yf8gW@P|4Qn>M!fmR-9yqcn-HVN7jV zW=~&rX68pve*3BCkH7r-tCvB`lixh^{0#Xpe8N;@QBRnh^OKrjiRCOdI~H~Q6pZ+s)j@=woAs`L+CS`>6?B}`<(mKrnfzh-a#f-CczOIosP2}eqi zCG~mj2O&C=6tYaXz+%NHrLHq;7X>O;2Ftj(;sYG*hlYd}DqB0yEjWygjF>J%V>7GA z9~;pk{Lk)K09l5Jpt~p6Y&~>HF)fWH^n%E3b=k7oWMj=qkE?V*7R|SqEccl#URzfo zjD{@RiuOtEL4(7L^$)LHnUjTTi0P1#<)mYl3Sv8C!-FeHgAgX!iTT20iK%=A77?nn zlI7DW3)U`P!DRUell8N~LK=(@vTmI&+1K(3de(rG4KFDJ-E3DEAt2Y{d_TP-iP>cN zXd77^xujiQv#h~DL{1iEs03xo)wq zIRY&K7A9Me(cx|zKp1bsWrb3>=RjR z%3t;@isFrp-pgcrK#kJ7O5?r!>Par^BUVW2dGB#```8#0Z`&tNPOO=%4iyEKf*ZqJ zU}Aoy=mLvM_(7J^#G$DgpOK}pF4LL#pf7$J*xe>sno(o&9ac$)jJh+SX=Tnq7GTI5NZ zB>>7xhK&^<5mLzV5Q8{)(h!(HENkC_%%z83NB;Nq&o=8VZA@j|K6(rh5}5gbb&adG4k<8Q*EJJY7G zY3F|(bHEj5O3VYhtdJ8kUn)$vt7QxKEjp}B7LAIy)5_h&%23sf5-uF}$5;!8yq5Zc zbw!e_(x)D@Qq4gU&1mvrfh#*@xL>va!$3U0Grq~f%S<1d9@fI)N_D78oqQR+&X_C_ z@nCW6+!++p=QCOS&$d`r%;I{y;e?oQC}f?-r8Hh?!fcUjrOX}LbgZpR1I#1nr&0QT zJk){_Os#jDW<-b6{xZyMbw#K`>;g=C_I>%D35~yv((Z^!qXKFP3C&)m*z-Vmvn9hmgyun7HYWN8mvOca+` z{tIxKJ7#IghCr)(J=)GC>l%*jEcv7)n}e4vt1JU7x*<2% zm|=;aC2?g{EX1eO9#IDhvP2!_)8ttvLw_(7Ng~coGfv#R-lM27*7(O+)cb9vZ$)!t&!_9vfO#o zRXjov;SKej8oBQjE#$l(?R$<{)POb%Eq?Z9k;Pl`4HpDojwP8a0hYWqnP(eBpd_hj z9r~s`UEV6ugr)Xb&$Dmv)S(T%c2We{xl^Mp#4PMSc{nZXD+3gEeV3$i-CWUmx>Pn& zVwV>XC=y+$(&C;iJr|7dsQi|gAR(rZWKl*F7hkEEhVY@+`K9o}+%i3^B`RM2xT4Wb z#wy5Si%UJri^&do%S&Am*I<FAz8J0`Ssimk2C#PmmauLNm;W_*Q+^puJ%8zkul@ct z?V0@ilkNnINQ7lyy0Ux^`LZTiFhFMA86M?l6>Pxy;fqop!WQUO8>d1RW{j_65f>sCMlY5JQIgpsa-3kU zC@QY4NMyOrG0SzWWLYIeD$HQX;*K0F##K%hZ_(%8L>6SOr7}w;Ist4rskg;}R>Lj) zRu;@zGW3SP@|FXLS&GoZP)M6ZSidqSSwbxqV6NJ8=uDP!Ud;EMp6wwv`z-Cb6omy5 zja=JGDkM7Qz+nb5_HURJWg+Z^OqiZgwn<*cj2K=A>U+qP-J=W zMZogczrvOy2T#YkVkN=?ED^Ir#FBZqL>8=#ECdwB3QFgD*YBf%kJg8kKZSbL%sm`Q z*r4dTNvaZL9fQ=me{g&r|HTp)$JixVQ(??P_0ur&_vHe2~k5QB^QWh` z^kD0#mMITb(vZa$Xck76`wIJ&s`8+V!xyP6FAKpU+n%BlJofo&YgQi`xaoBZb39vF z=%r*H*jU2KJ>nPqRQgp>j}2p$vJGYqsdr0plhR;>TZJz~*UP8Qf90Tk}h0sJ`*SI(aoS;U?1o`3fIGfzGMTW%+6 zsj`TzjV$P&BTKFY)*La*g8#9YCEHn?PfGfS3a{+qWbIMOd<*@VAqEScQlJ zpk!mc3S4Filar#0$fA%%8zu^gEVQ+yACbt(vh%32d>t0bdzM!yvS^?&7U?-3)^NbG z46+z6Yq*KHgb_g&SMOI@zAr+SKugvcW>N%McIK6pK#L!)bRSiggZyqvFp2QR^O4N2_(kY%iXoNRMPwma#@nRsXLejc76e$N zH-54RvZNxudX7;7UXVq~$r5&yT+dcChBcMCjRP*4Ke^iDl6T9p{%&_<`9$y70_fbd z-mYG59VVnv<)kxS!JHzG=BOoa;mc9tOxt=tm~^8~IDQ4bkB(864ubJ{#2Dr#TL1c$1|Xv6+6u~MZbYqG+2 zvTu_E9KjZR1jSD1Gf37;WSKBoG|R7bAj-Z?Oz7kG5VKIcJ#?1A`vVVL`r+lvmtTJQ zTSc5>mvax2#$1oQ5{G@MorO_ol-5tmFLe`j!rta0J z?2K4WmdEb19wBKp23c0$CMn@%3^Ucj;fO!qNQWKv=}i_{hRCNaSTF=qhG_ec8C`{w zKN4H|yAeK>%ur$}rrD^m$pJi1d)5S57}~Llis9vfTv>;xWH6bSl|@Vzc(uavizlSG zNsI$y#ALC!g<8o%slVyol0_gvmKNn-A2hKSW*o0bWMLjZ$TB@T9cx^6%hlyuuUsvy zM=fM=89ygWHZ9*af*;fH&98~pW6Y;ON*B@538aig6qi<<4galoVcGxjD&IoHRAdb_dE{JZ$7JG{<5NJD;1 zFNfu1npn|d7Wo`UrpjSUA_~|NS9q{f0gZJ4O;9;Rnk!OEy611rcGE^nH*g-WU7E?m{pImuIG|8gcH zM&`z#B|zdyMkTsjcS)**)e8@}$UmwoPdRO%?5WESEGedz%SGi4R_LG9@H+i#^wvr} zOBiB`k%)u^F1TiFVM>ipEtT|&;*&of5YZxAuL_gOptlsx=Nki+vNnE(_)iz_y%CN;5@4xxsY74v)bE#JBH(-(em`SK5ce*T-{ z#sv~xa7B2@lVRwap$j}g;)v$~mS@i&mjnN%r)~!=Bb%ywzzW5dR{hH{i{#;A*341LT9|jt009|bfLv$AuTpfF$=ut;F2^LtQaaPGrM9HhO14s z^cT5XkGd;>K)8|2v&Z|!$LA9hC9*V1qxQY`>aIccg=OJ{$pRgg87};8aMeIubGpyT zGMEY?nE*>3vnXUqg_~rNY-B{N64GHFpCmFFEOvM?Sp3GLO%E|DKe2l9Z$vDtk$gK@ z7H4wv77|%9q6AHH#6T8_uS&D^28&?gQ++m=;@)GlHa6s&1)&I8KFLNg#~__I->m4v zFQr(d)BC4bRNor3h$A^!I%D)D$YNW?t6Apt&_j^rE@nscHYN*#ED^7yi*t*X=qm)H zEM|#-#b5y~SQV^7|TC>T zev>6)j06_h8uQhv<}cDNN&iu14R}qAnJgM|k5?H!63>PaKRIA@Gc-;p%xqoDX0*FIX>ZKjbyd`1HK9NO8Fq0%?X0WdO*@QjO zdqL$IEt<5$08i43@+l+g5=`q{*w}?Un4HV(9j5JMJX^;#y4bLef-RFX&p)Ba1%pax zqKM>z#IYrsWY^qnuyAn!sGR2-vS9y$-54v5Z-4w7yEkoGhaD*HI{zM7cI+T(X(vk_ zwET~dMKKGO{sER|%;GH$DWcSNI?$rQkx)U45Afs~m`oG#|Q#AchwiF&$uL$g^T%d(ke zQZ49`fhEuqimHAEIbty&LJ2KAm%B1=FeyE>Du+^(XH1qsfu-g*R`JJV@o>#bt(ZKg zT-ckLXXNaVWl@wvX6^9;DWRM!VYFiLb!nm`q8*|XUwc9Y-H@BRG|3XB49R3kFS-_o zvd%>&3;j^3^56O48$S1Sk;Q1qz>Mu0Txwo zQkg~k0!fIBo&Ttp{565)oS*& zD)KlFsL*j#QY}3)V_M*4BDu_7H$Nh9aY`%=tf+F|<0?)MZ<+AJIoje7Ho5puR$zHW zE0QbA^)I;6t#+{vktwNR(*{JSRON3_|6rijBHvCT87r`8PQ(Pj-g^Vlk$*7T=JZg zz~XM=1xQiLPzTN~1GTDG;uFBz^P3!M1Eme6yHOtl_Ov$Q6_i4%E-tpuUusCo^JSIx z0q;C}G+94p9xT!EtDr?-8SA!|)e>7$tv)n}bm42Ml0*pIl~zzA ztNd5|bvp$jfyM7V=C%TTQWtfWQN6#$t}ZuRJy*;EDw^tqEOTmBQ?8;GN#Nkfl>yFo z66Zw^wCJHWvV1fr3%nv5mifbU=46SOC1mgZ+I^Bm6v2smnqW+W;Vaa|n zd9CD*k@7hvlu5cfRzu=N30ZbQ9c^a0)AAo7QqIe0$>8No?i|-n7g1tY93hMRQGkZL@@xJPG6+QwZUYD*b=+Yz$ zPt#{B^NA-8i9?MZ!W^C>e!3TXo7YV$PN{ndzP&9A-m1^8Ovu*7ZSrG{vS#MSmaRH@ z_Ru{SZ+YS6%fJ5BOV55+(TM5Nq)JW}B9!wyk{*I7&l)X{YSKk}D4*Z-1m=|MHaTn& zDgH&WXpiv@A4S~KikAN=vgEyCEp?Xe3Yn&%q2de)G0>4*N+%V;jE!^Zu67TA7CQ8> z78>YgAA*Ay&s-58%=g}4xS|wUSW`Yi0v$$l$a&%3dq;-4$Ho-4R5b}HaPjJZMN5sL z3W6*s%J?0Hneh=WiJ$fm<6sEx7JK)8poZM;`u0E;wuJ6kC+Erm(s-opyep{Cv9#(r zex0c~U3;b-0zei`&c`4<>lz)h%q-($AtD&D1+wT-!J}Q3P|9g}3#FnVvjzFCxD~E2 zTocSRG%+(QcQAilBFi9D>vlIa`8f~Wk4g^C$(9XUC832{zZp_D7f2S#3t77*bF!4V@+&&Bfh)v7*c3B+sGaq0 z>@{Pi$XM~BXQ!{Dn_fSAP2<(nP{^`o$}Sq#WPf$MyAZvdQ!4WVmR|B@?p#aziY0v@ zn@J*SE;{faJ;9BsM;9D)plM1n1WNt2HGBru`niWi zVB2_8n{{ehZjC(j_dfdbU;O-cKm7Htes=x>H5Je@TPY(({!3)hvB81_n&Zd6`J@ey zH$C+XE-zY34q9R{{<}sCUL`qM=ALbN7i@X|>MZ#@3$cnK0hd~^RjJwm8?cxx<5kvy zDpY_h`-oZks*!%;{4Qswfa()AF&gWoS(8Tv{#4c<%U8jjk-U zNh$wXPK1pNO-_z4SUAG^?QU-_Qg4Y0i;YH!2FQj+^5MZcL{G5-CpxB81Y)}n8t9k@ z2>HuKYnY}}u8R}@2XnGS`P{j%1FI8RmOE^5qZkMw;YF~rvf^LuU>VfX;-f(p$1XZb zWU(8+XZS6y^@;*UtlYQbGVcRf4iXZ z9TAdbpBEIvlC&aw$i-X{mrNG$7Gw#qyz=zvU0O&;`YR7v z^1WY~*|L&VJkLH|^nE3=#OTT4)7Tk@0kL$9c^B@H*zx6@7-S)zXa!lE6cY_B&;BDD z3?zTH&BY?O=o_28+?6XYfq(1+oAYp^6offaSh>+>nKEH8xou7Fj$X>3W58 zVYIKfnof``8)A>s_l&0EIDKT^l5Y{2m@KRcKDtx+rjk7NF{_t%v31n1sqOVrY7FK@ z{k6K{{O^5%b)WPJI*v~F(6^>NucOLEpQRMDl@O)kyoc4`+%Ys>EF`qJ0>1}qz_O&6 zL^4V2>=HyF;*bx&)z2{=uL$z?-niphh$OE(msRVn4UU2-M~QQB-t<~ND^7l3}or(BZxu# zCE!Pn3URH$PmeoFn;$>c&uq&)WN%|hOC-$NapWi)h!n5?fBhb=1l8byH%q>fh9`u31s@w5S(PoX^zh6KcpR$UmR6CCj-~;Z8*f}>R~P7EK^7~=3rD(pZnF3=S2K0i^c@2t zyQo>ym6huF+$qJAjFpTmEo&p$xc?={k}^AsG&HGmA7{=Yl>l|{Prb(+ZsrRp5M zBgo=0#mz^~ojbDmux{G*-ouhQlphP>jj~|ukD>3{z63!QEBfs6(vFal_SgGcPY#xf zn2XUdG*szMUu}cr3wbG3Tv)qhO*u*_M?12+iiaa+L8RD7_rfgM z;Cr29FNT8}aig3epW}Tp8^aUR))h=BYZ7q^l%x&fBtlfnrQL=!MPa5;m{H=rN}i#z zW@2iqKAG(^Jfg;c4cU(3e7eKB9)a(1_Dgx*z=}5A!A!@Pp+|v zQUr4zY#?C;4pLyx>tFK=E^-GRdTv3V8#U*^*^|K&L z3RxV%2svk-VzNaxmbkp&db|VILXACe+JBd5Nx86Avb6Sy{kPdN_Y8i3#rgn~sMrfD z9HereYivv>`gwgtrJoYkCo3#2HTXe%8M;)9-bU$K3*Vb-_sFGqA`}9kWizWc4GnGT zo|$Yk(;(gfK!cZokr7*8!@+99#sj-qU0Y-SxBrWY?fKg;oZ~&K(e6&Fdf-ayXQN;Xk zX(g5Glkx{33nd(Qf&dIn!#?I7eXiIamW4MfR+4qAxqP3%BC?v02?VMQp&f>IQ~?0eKql3I5%Ca|brLR)d# z4g-*=x#&ddlEIyve?bgwU&w6v%)u5JQ$ZF>U{Sv_kr7CR)kDp{M9+him$@q~5SaO}5YsA*23dL@^leyE7vB z{`06`1jVMW!#b|>vr1y(`R0bjflHZMNph+VfIB@agJyXx0fBDtdUk5Ee3%2Oe za7pT$O3z!H(557K^EzD$g*jV$Ra?z3$R?7EDQgK$-W;^kw6E%Bb%wmd?6*UY2> zpve`>_w3lQoBjaBEVY`rB6as&^No8!%g9J_fI%XRZzxAbHyK}3YmC}rRryNBuaE{G zS2R`Ne3wHV^f({ka+ z1twEZCAv047T4>^EOrW61VH4+0LwA`^q{Zdm|B)~&R}`ah4&JFlTDR}5p2h%Avq`@~Mj5@1mko-HX#Z^^1NYU?a4@YYCVN!`Ulf} zS~@u;Ph^*B2pPDx!?+v$>+<))>``2q(suim!}1v)9_1^h8bxXulLH8_jPrEJvb~^_ zjMHL6ef`SB7f*YVZ=nWt3}SS%f! zcLL0y5oXL4l-5kjQ=iMnA7?n`rnR#r-8zUX20bS!}p$)pR6r+ zxxL!G%-v9hF?rST|GKdB-s_hx zKFs6^WT`duiBfNvxisF_SEE)$^B7N-jj&s?Qa^AqcL}m|qp{W1O$0`(gDfuUHwGa{ zRAWpQl2mfpkM=NQgHrtT&P0|^M6hD1$l`7?fHsWu#d?L{8_zUYOqS6GsW{$sB~lc& zZ26{Y=IRo`Ne+|%O-`0hdw!*)5)P95m!gU$I3iJ|Ba@{SEp%MDgW2ar4vZN;Emt&k z!57}m=3zu9+_%V7BN24&CqFsz@q_A4OAWVhC6~^sIav~VvNgp*3sDMJTmlxP#}1n; zZaJ2D7-C#dKkj>HCQ4+9eZ_{jmUTh&CO^CluciNhTzLlTdL@5?8>4MmMIl)_$+q4 zr%r*k^_G}y_W-@i>H8kuIk;}!@bJ2IpidEHJ26@it=3 z+YBS+yOK|g+-13CcNVHH9zk)yB41=GD);vFI9T)eilZ37!hw6-YAV~PA}o_it$a~0 zGH5{%rp}509LZG8ajvfhch*&xO`pB^)TLj)`uc0HyVzoYI8Z@QMAxZgk95DTJVmLk z#!oQNLa{}@$Irg-!cU)hYSZ(Z_G)?VyD|=AiPbF&12O+6Wbr)9(gc=Sb(WgW&!o2? zL6u1o4Y72Qj_kljK*N$`yD$#x>*JvTt$dWd=s?O_7TATr;l!3h6KgQIUpgAzb)@JwW;R7z9 zrO*8wYP?@YoJ-5vl${;ab0#NCI-GeUP(foX#*UXX z8Cb@Ll3FozpO;#=TU8s_qPdh%?51?QqKBLP$-{^%;RV!a-bD!VGc7(tg+Rr=l-#$H zKb`858$X#}q=6T=Zs>IkGeU-%R{4|e`8K&4Kd_# zZ^x}*1(7}>A{mV7705ykOf)HbYuBI&W9hrGzl$22qg*eeWH7?V7Ha$vDzT}!T+#H3 z^JKMtIFdSjm~(NzGdqtNw$w;WnIMmsP%%m03@48jt5zJ?d+LRkUuR>>%k+p{$cy&o zie;dL*x+I(F{G9FcqNN07*xLS!n2P)bzt?Ty$|fTMMID8%9N7dZ%0cE2wtBG`u{Dk zbXe^%%Tm=@kiilW%m)Ys)y=Dn=TQ7Gp^61T%e?JfA=uKh2nDjgJA3TwVlNl>?baDv53+!SL#Z*jcd*BD=;Ga5DL&v!xRjseGzEXP4J+mz z1Xd*(_EP}i%nn$n(qqX|YLo}%FR5%;aoC>&Y?)ev^}3q|aMQ00)^)bF!AFfXu|u2? zx~t51Tt6QZ52(U#?eqd7W}93iRaQ|{G7*kng8@D+dCrs2a% z`ALc84V3xLFyljE>tyS??jlx19QEZd201e5}7 zv1q*zTELAKyp30RE8cw^*}Y|`8yPLTS%jm2Ls~~}43Q3!Jy>;nm`%=*E+gPjfo07} zvdf$u5+i<%38OR>6iXh37Q>NDo@%U@notI5TZMqhh|5tVprV=}E*#E{JL zSJf074e?gs%v@nqQm)5(OCB~^v_BX%hf|s(^qF0y@Zx79lc+gwKb)x|dH6oZP`roB zF>q(q({KId$3Onoo3A8Sm(CXDWU=DtZKuw;6c6RkawaWPN?OfLA}b%IS)^YUSusv| zYL5N5&)BVG3BLG4$7wxdOLLLFq+78TQ($q+F=SD@u@7m_x=CS@*Wah+G(?gQwp^R) z_=GE(vnJrU$3~Cj!Zh}B2RSK~>kl8%hxp~@V*-o&!8|WXu#)K} zDV&U>huK%*kJA#a1VYlg@dx5;X8r|`ktQ`-pWSk{X!B+o0~`(kA|@%->G0n zk-(jh7q}33C?-hxE-)n!L6&-BF!|!!K`c#E@=JLr&ho=p5jXltO!rmP^IL>0RaI5= zv#m`B$3N6DAB^xBVMc;S4~F@QwEzq6!nYxt%z6n}aHH2tyke+@fP|=}Y6n_*!>C$P z=}lD@P(kQZBm&}I?qcd*k({iPYZWm?-@p_XDTX5?)1QmQ8D_=F>66bt`g7{|Dz*@; zP`S5-n05T~={lCE|;b*EvzZI@f>;I6QDOE=y7F)2rkX-D? zD7r{x&|+t?g2+--vEL@fL@)DHsi`_2rh>XwtcfhU5o}rR+4t@~q`z;T$u(=%DH#S? z$j>ogBDMeok!5O>;JjQAS-^_tG&x@2hDK%Qwu&q?xmhbJ#4Tt~db8#HH%#oJma>(g zWsO_2NYOb^0xyuo{RxRH28+;=#T(9onJ2dWio*np;EFP5P20*GEFQe{OX!&a7RhAc zD_;E8k2C!NSC@lxlZE4VLzcJiD~Yj|oGbJOch2>NNJlwYayF3I(jA^_;YQrmP8L_9 z11%w-6bj!;z#_7MmgX#r%lD9lX+i&h?@9Y6S!|M-d$=t5Fl4d(fn$=T4J^Enm4y!+ z`g7|Mo9dmC~IE0n96r#kMZ+L^w&i zTztfD51cYxZ_8vF0(b;wK^E=3XNeg1N^g3Fq#TVu65U*Bu2K6POB~t0OK$d_v8N?U zc_fo%>%K3?rYwPg^D6O-PPc=p`d+r9Se>+)=|H4H*pd2vuS;G;*O?or9^GO@Eb6+7 zaYnMyF%)CtWRXQ71`qJ;t)<>x{!Nxy)32UlTw`l;?&#K>bn;>9n9oUOTQ4ViBp+ij zW}?@dSP;0GP#L63P*j$6WxY6mTfOY>46xL&ES4vw&jQ<=%R*d2R42ipjJwNRo_CHA zKJD9rA2cys%ICpWkCisu)DZVHDl0hKoW1zO3qLeken*d3%7~@jV*f@_*Ed<7$?zhs z2rSz0;;7})Gkf>$0WF@W|M$s~%O=SGFlY(e%J-ct`Fi{hlp6JdEnBKp4Tf~F{A+s$ zP+-~DIM?&$<4s9{+`e9SU9UkEOC@@niPZ+mns-t~zPq5#54}HR5n4w2T=M`Zy0q>^ z!4}0WRV1fU#4V4Pu=gI-oSS-1-B@I(RG5(SQEvgHxSb#cFV|e(vAvsVDz~&Xrak8? zKs1;-1T9vIlh##->HNi8--Um5{Z>~yV%eUuVMdEHWndz>B8G@<0L0lYam748K9A;P;o9>xderqDk5`H;95@#yur%u|=NMMR zvfpH(0Xm4Xq=hUf+sxuS$cMEPHxVt@+K5_mi8iX702V&S<|BNLUy3Yrf=RLdF(P1j+ACgMi#DGW0tkiA7;97yhKRx$1rr@iV>p!si!+T4|ht@k*tT_{OY#= zi)#0Zl`E>>!+?FvZLpJ`T7e2IkcDzOB8K6i31SQTM5d~T{ZUfsLMD!whwTFc!)&y7 zb)qME$|te}N|XuX-wIVjiBKTLE>cXr$UsKn1b6ErnRSMhe)C>HrN&70KyM!aD>r7Y{jX2|~28<=v#j-kC1# zB!DjOH(3Z-_z!)ck?LAqg(|pU;*jMm9ScsJm^Uu6s1X5EF!G`uHkiEj#9bYc=^AH* zl7Jz(A(sn;50HiMG`+vcLQ}DT0!ajt2jHh-|1)ncVWLY^&FhCF)OH?=lO@oSt{phF zkOjHSVl&Dh3nCZB85dc;3kfAH8|+0GzCTP}m_WgHjG>+!Emt5*L@EHfnJ_b1P#T%!x4d3byV_~? zGrJpE9{P)Qufg&bV2R~eMoaSjst@+)d~44Z3?fSir$)_0D!Ifh^#Lbi6iO*lti&qw zte)Y%O70w{el8j3LzYl9RQd$%0T`4@<)+IaMmCjkie31;qx@ph2z~m^tUG0nLeXHs zL8B}m;&Q)d5-FB+QMXlAtk}EJ5V1l2gz7kD=fW(qT7ZGROiugwAD0PQwuvkD!ndnS zHdF~&9D!LijvZ4$7Ro1*>C;={OSA-&une4*G}$SzOgB7EYLkAxRmCjqFg|5GSvbe}{{{AmxXJN?*YLI@unO0XtrjJ zM|Y|y*wXL`Uup&ydF4e1jJdRs#i=vJHx`6>n~W!tVFpXsTmqQvMPGp?sja``sbAaWer%e^Nhy_@#bTW=3bHHzt%Ra~ILC#hlXEIBg3RjgD zvIN#pig`?ytm1O`^xMe7&SFlrhL+KixZ*;-0~BspS;TTJRsJirPUkUG7Ea|s3pbFs zLSVrNK05v2=9?beeATgIhYzR5FkM0x#FcN8vs&wI#f#`+Kz5i6v?P+`%6V+*Syr?{ zBsVd8BIAF&=rCjmbB@sN0oaEzIeLC+eh}%1H6xdJ${rM*vlwN*r`$D ziis_NC2e!G*QEE=b6zcpEES3}MEKYp`)kr}l|dA>75s}H7IR$P_W3zgXiS#mpFbF7 zZ@DU)EG6UuOudE*Qol~s4X@*}B~(Ec$8z`^=%?g6pCQXG@kmx-@`mAKqI#V9dy>E9 z)N~vxRH>(JE3sD@@ya5CYbpG$7!D~XH;nw@Ig}9rpFrnp?f)#`1N6$0RLNe?O6&J{I{?X%) zKC2==XxT)U(2&sLy8A4&v}MEIHDlVkkl$Wsc@L}j?;Nvq>$IxkiN}{drhw#;hd{{n zn6*Hb6R_oadkZ`yuv~+_@s+Q9=PTbJ5j9>kSyURs<&DO1yCj1qN!#y-_C(2EylAK+ zEBsWtli-b9yKB1AV;b>b3i9M=gRU;ff|L(ifmZq_k1B7{FBIaJtT~$?i-Q;PWPAEN zupj6`PPq*aFY^vb+It%n$O68w&!2%TMoUq}d_#>rcxH&t{2NS@Tv2y-5OQ4xmX?sE z!ag7lmdJ6t+(F%bCwUA4Hm?8ki~j;WVySY8WAxtoNvuZ77p6U z5(n=N$vn7E_1@zI5DxY>qC%*Bz#KM2`pPVi(s3) zQ9WXiL57qY6`7HF<6+%p1zExaeIlWS0zTCgRO{8SKAcg+!Y4QV%H+(rm&mKU1yd9(DIwtUZwjO1zFrHhX14|@&U_}uH6F` z^&4|cPK-^)Cd>I}(WS?4A!u2B+sKYofo~Fm$`e`5!f91K z8bh83tfjJvl2Em#zzmNJ))c=gUn)c34p9 zMLR<-o~}8QD3rnQG;sJwm+U4tx(B_ARfFQqq$jz103^03~)M~mV*Qo z;5!yb0Sy5Ng&f90k8b8<@hnUwlc(@+93}+^g`iZ7=7*oONp@3t&NQ4aV(zm2>mVM3xpy z|Hy^~S*UNs{5?eu;*|#<1T5+6fQiWBtzWb3n}adwdkwM}Ev<1&mXfm4F{m6WFSA#M~$k?$Bq`J=J>7qJGR9FW3i*?)9 zmk0X$2exiGG|gKoh|=()8p?{;4{vnPGXGX;x_FN9)OuHa;{?1x`|ISq3QXG<>)gTt zEoHU<4NurA#>kK*HMu#)(G$FhnQIP;?D*o7s-mR%$GYh%r%lVBk{Cyianh+1Le&dI zLcEXJSf?U$V`KW{vQ3)~oP6$*gBGFXC4}>2(>xz*<1^?9YAeJlfCULG+<|@AGkW6j z^YG=;CG06504imnzB_w1-MHd9sv@dkm@Ld%+Nlzjh2b(_=nzgccxmm9sHI!3$R^9^)LD^5 zRhDJSgpF0z8n#*=a7M4fpM&BdVkl`ASro$<1KGq%J6U9qybQ3QSjEDnB{tgUOgs`< zZX7mR(hFb=qbkc^-f}KXN4k77HmV07IBY@7JCG$m3K>UMJm7J9g&ZP_&@qQnD{suu zw2;MUif&^k*4m{9qdn~ER7KePy)AXb!S$I3o z?x&C?TM(u?i{4=~kMk;w!o~{8{hY#u6GI~APRg8i$!*o^np02v7$HKBPxv$sPY|Lc zu*BJtpnwBst1`bA5Hy`-u*z0ME7Hy&3!Tn~c9xRazIQlkz}?=-dK<1(0C$J5D>}TC zsW$)-@O;`|ytU4p8Of|^@I@>`>;ocjjKsKuQVSu?ewAE2i_I}#G@vgfD@D$mi!NRS zek%RP3_aO0f|`22cNq7la*7^;99f^&mZ+|%BWxIWIF8`~6Nn=lIXfq)z^0eL2FZKf zX*OZ4q_5*VwPMpA$a3-2&o94@jFz9d|5%|)D_NcoDP%#e zrR9Afi$j+CeElBipNv^%2G&fDFT@~{b@UWdt}$8ex=(sYU~!N_<^I0=9~*z{gpL(Vg-mqtS|OZWB!7MOs95uNG18`xAqE~_XjS{p<)t{Mp^uw}(6 zm(p*^yMPLfCEAc<#$~xdg0SR7bY=zE32ERhzp@j3{cBh1$M~RlyMfS zKtncU?hui7^MzFxegM%dvLJIL<-szm7T?taTJ&%tOJYlNQw)_fuNe`G7vO82g|Z6`(QjL0HhUpUpoKevER3MFEK9R1}kv@(Tknc0In6FvW3;Ll)KA7d68WxR6gs&L#iZ#aj#M zes<7C3g6{yJ3q!Tz(|bDS4e8JV^bo_mI;>}z)Q*9Q(+;wQz!f>LJ|cb2}Rn5RW93l zD|JkHA!NzjTnbeDdMFAcB15Jygz%xn!?&S_s~7{}w_Cf`+tCrL@0Z z>?iurru+T#mx6;7FOZgsSb_tX0b1b5{;d;`rNCA$)}Z&>?OrB?b&fQy4`#N~8^FgR z%1GHVn2L%{mz5N04c0uu;)2VeL?PE(9HP`_HMHp}4UqDBb(;qi`80Uy*1L)_sNpqv z7^gD*kh^L3?o9_SKKIn4zhbOKQ47t-Sh}3?K74cIR3gh0*t#4z@Vo;Ti)Uz$K2m%` zHUB$=Ew}GTXfX@^lWe&@*ZUZ=SpP)KLbYLLeBm|P6g-ctlDYDT7uw(VCD0-{WZ|C2 z?q8_7%e-+4GF7LdbV}|+<_ooZpYKU8an9x-wGzAK%hUL}={%V4BW{2XLJM(^nn3K2 zpSGE-RAD3mWfQ0D8>=FVJQ`SpZ)sKWSdF(T`h656$#!3#L-Q$qhwdb<2~<|rD%eYc z4cf;PNsZ$ar`7u-tS4LOkVip_`qgr@WEFh0iYmQ67zr*~G6#JhXz}9;sX|e<*Ck}p z7cigcx<6>)6~lz;!tkDh}iL(5J1jEl|y#6Ua0=j6i{-MRVj`or>g0W3k53@iu?sm9`9MTxK@ z8Clx%V68XvKN8+8!?KP<6Um5kgu@kJA(lxiB*)c7EKcZbhz3*DWMkRxjLdhWGBsoY zEGYGODdAI2W${E7g*dipq@7IrfwgydR6oQwazdcPnf9v{%(v4JS)k1dF~#O*309sKuaAcDaAK|c-Xyh{i^WShV4qj z;59_k+t1&oz=c805|tPFjMm+_?7;F(Pn-uW@~3q3G45bb8ZO@ySwM?w_a;l?O1M(0 z#D7Y?V}8ctmxPuSwd@G8p!b$6QD^bNd!&CNW}!oBZ1vD%m_d%u;~T!~5ebMqrtBBF z!ABnBNV@N?haTeUG1p^?)wBy=sV6rQtK7jg2i8c(P&EV;VtOS`_b`Qf5VSB_Dk*f~ z9Pag3?&Ydf0LpR%W^lb19Z>0Ie~2=R8;<|%GX5W$5NNSfL?+9Uw|T#`Jhfd{n5WFnuO4pv2V`j-vCO~N zm-5$Vtx7uM%V0TtGH1_9&Ow&b{OW80 zDlg99I#Oe=!9pU+khqDOJp1SGyi*SwC92>Pr)XZ%1s5y5PJ)xy4jWOelajg3jWN#s zt+_EIrX$sL^rG>}fEyiW+^;NI0?YmCFP0)_rKTxCLj{P5jgCe9Z%1*2z%pfbc_)5g zkgZ$7>P5}GdeHV^C5gYler4sa<$_|Bk46baY{7@WqMcy8wyqpH*-t;)Eh(<_Y&1~H z<^5a@3{W>Ibk*x!RKtrROPOcl^F1Xl5%Dxi$kX&>>>v{12|$^@)Tegmzl0V?EjSi( zs~pzGZk@I-rN5hvb~>wg*}b_cjMj)cYEFP9t|&f2!!diQea70zkv4pz!C{C2P?YEaZI1l!i#ZLiKUJ= z>RBNYVVthHo5y6xY|nh&6|l&dzmcZ*8)}k=EMwg!3xXc5{zRfo0vmLcXi`QdLItKl zW1&t$i-VRbI5b-HPB~d3eDbGqR<4+Gc=ibJT>mmDypfT~G90lNahM-zC5x10!^nj} zmXr<4&*iN_Ly*PCdG%#ZvV>Ym5l>0m?Cr%rx9r8$P8QwAb?dtQoGd=q2U&ckZKDe6 z42f(?hXq-@^oy%=n}aNA=NQ*HS$MD6Xo-FMYXf+>0==zdS!A+!>cm_TU{Y4grFmi& z5F@g{lAJ8Z9I*rfa)-$~zxTb*eLOmtBLs=!QKJ;o+nIg*}*FZL_rpHs~Ifc zy6@q%G(}2e;n?;jfMv@B6$u9sHovFLV6-4Py@)kp4$n1}QmtW1U1NGus!NbN^B!=f zohx$U^8OW%#H6)e_{Grij10JFA@IPu_~L5KL=T}yi2PO^bzx&$*fzhIwnCamn2{YN z!l~&pt43f5RImxwO+Gw&6%G4E`85^ZkxmOwt+UO5}??CRz>H||~0xnPHfTc)#J;v95wou~;jyyI5pV-fiGk46k}O;)vru!Y`^gz zj9S`bmNn&^T;Kc|Ex?do4bK5Gi=^ zL_aXpE-}#JzpjzrZonT0EmCfc?A|baFN8Y+3rfWodmlH+@>dPBIA$?fRKfpS%b7fD z30ogzi9^YEw9eRH87)p8wN>YJeq#sN++b;z!UHLmzlL{hErDo3j2;tNGNPc!o`nRI zz)J3g3|W*D5?Q?S3;p(ua}OTYRv61*S^Sw)RGHm(oTbDvq-39Tt`;qoGXP1%EFntr zQfva#D2dV1sUYPT9+a-Kgi)Bl!c#r#c;p=V-se8|@n}2as%ao*w6r45&zP<;cSt!fb2MU@9 zAmmVF1@8P6c2DsT4jlxb!DF1M|BG(2LVf=LFmbfQhznpTZbSY1agY=?F{l(s`;ooF zta9?oFO_ABDYS4!ri`?P{m^P@TQSQ1j9{DE+bB)-6U}J8WuVUDvX6bt&WH(In%iVj zzdU;Mp0gFk9-jNrgPw%naDV+~9Se{H|VUlIsyVS%#=&-!|ir1*Yg^+YDKl$(M{7YA^RAkp(F%a3e8@ zQEY&!l8fsK93;x*icX*ar(UJFUjp@a~G)}hQlayf^IEUIC6bBa`}6b6Jf z=pnFF?YGZuM<}7}(+s7Kua1#D+KcJCT@5nE=z?Q&rP6vF$++g;dlz26n_9m3A_Q76 z4Q>b=%aeC@j-Vaw>XG#eWeOZ zP8Jq3rk>+-zkDM%cX@D8B1;~zm?wz$Y#nJ)u_eA4)VlQF?|)UuWHDL{k&G;Pj%%&J za>Ehl!`K7HCKfTpQZumq!ZNGkBP^$ZEH`{+@xkW!rPti6FyGdY9au4UTG$d$>$LJD z+TAZ2EO#;nFQ-XIDkV>G2rVT=34xZfjfEvgDQRM{VzRIZQe;pXi4>Y%fTs!t$$PTL z^ZM!|(>fO~WTe;2gOf(f&a$&?T)+dsl1y9#ra?wSoP#o1?nz`BAP=V2uHJ2QhN+LZ zt|C3P4XEVZ^qzoEaznJhQjGjp0n=MNZwsiaOMW0-A`7Ou#r+#=sSH1{&ut5cx>15_ zDRmjknR1)+TZ3Hnx#LSCI0lUN5o_{A;<>4)4~Zg{sSq!1E7%qhDJZIM1udp8%QKl! zSa$KbADv3278xI_hVLRiR{@p>zGke5EWU%^xvyCAe>r8c+_F~#ld-Dh-%p33E3U_% zyUy}Hk%c2uINq?#Qk4HF8$qAe>pJ;tkHKqgvKGKECXKC12fVc`k{ z0jn}Uvn@;oK6UfShj~)63=n$MnjrXbNItBQvS%d2n9ZySQQ$I7dk))G-)Nz-|CfXo zU;6kjtr;i|*0)sf^W~BT&MaiKbEI`){*~(UIa%hio^QnpiZgjmmaL{8nW-3*$)l21 zu*Et{`KJ+su9fv_$w46?ITyVz{hq1S@_f&v!12o3fVY^lhujeQ7)r(FxW|003P0DqPA^abJ%dvaO|yEjtN8 zh$R3EaR+qZ<*ZO=zk}sZR{Lz(%`gQkAKwO-+V_yR|%~ zg4aG|0fBI>x3`PW&k*N6RgY+UV^hJp8=qTo@#1q&Uivi?ld9s|obpKvjxd4G^vVMd zJn_WWp7NSvn}{h9)-mPL6-k?%#zD>mjAqSSjRhRX%b|?sl`46 z>@r)hLjl@C3A~ILE=cZ^W8?QHvTzgLa1W28Qs zWr|CN>^ifXuimqii$2EoS+pMulD(CgE6_p>e}r*<(qeE*C^1VMVpZ2Q$pWMLT&soS{Y{OC={ug(=B~BQydT9)&E+If{uGnvs_zcNfJhU-jWDEoF0E<@I_;8-bRr zoPQ;<^D3os&S^_HR(qu`Cw>%6lXO(OVR}L2BG#cda zh~wt~%hx|n%yKaGnt8*q(BiU7&JHPUWodVNvDB4zI*~=Ao`8i-U({G$(b5&mow6BO z`03qb@!8w;6_I7IY_bRx!IVg3$$P83C6T3k$i9&!o5!afM^Mz-U zh(d}?Ocr-4C$eZJzZAxl3ZUp7Chn+nV(x-0%5xblCX3&z%sITMB`&2(&BHZ8mcIUe z@BvS{pbNi+7=DuylkkGsII&e!;q}}POtQ=`9Awd^F(>WJx>|)ugm+gf93Pv~ia1;6 z)2e5HCx|~a&C@`ZrEW-tEZdmYOliE2^#T^kI9tptC-H`_TXk_2^Y~9b`@`3NqlDN? z_#FpW9HEd3+xx&1w_q9uQgjEGf=Zqblh2Fw_!D0fSvbvPOnDEBE^#^(7Ok0UHw?ji-4iyHUHV+vD1%OiI!xbJ?iUQsAe)hTtwSofHEei39r zoW%_mOIs=tWO1W0l*xQu1RC%Eaz@nk#B9|Bx&ZujJ+Y z7A~}>zS{0+V@v+bcCxf;R>abFzMqpUv!f?p7e$*{GHxC#g*Ez1 z7_dn819SZ0-%*aynO0R3-5|k5(kVSlyNhj;uYD^yU%0=f5k|din$P#76%^T2hg4e^RBF2j1CKmWB8D6?prYK+E3peK!LrO znxiSHEEHLW?DY>NL5p3^ss-^10hrx8Ocroxupm>cC}iy}Rzy=Gm2i)#SzaBs60m?7 z6X2S0sxgmalLz7h0n9A)rW3 zh~;PzFhYPuE0IOFMVf<8VTnP6I3hjfi5AA=ldExz-qUfc`aNX%_~*|3glGk-fRD1iuql7AA84uC+%4K#OU-%Jj71@?$zJ?{x`2nPow+mrZS$_n_ZfjTaiP$!ea%`(&5OX=$0#F|2Rf{b?4b!JQH`l#cu>+5H zv+e|>Aci3nnE)x0P+}^e_4z!D?iN}4c}G9kPRka;O5ddlpNhp2UuqVXELyTej&LQ& zve_?!76O-gX3GPFBU;uk^WwA|25p2aWV%Md3qYZWvQp8EVwM3B68!Amy@H<`tf=#v zUj!HO4&e7OGc+_au%#{qGvsHP*atW*1pp^EOA!OJn0Dk<`u$0E5(6KAvfX4wCX2Wd zrj*|Gaz|;crdX^$yhKU6zT!S7ODMvXOaTT?w9Q(Bnwr8qHMx|UceCVLOcoc>Ev}p8 zDt=gl`RE!?S0~FNwA2Hahn~DEk68jOx$0oaW0pwzg;qB>K^hT6CSk{ATGYj%z`;yP zkRa%zC6C-NlKcQh?}=GN69p|fSlG0D>|JLc`lfmh#1{R165OE19mZC^nlqHVjz9b+ zt&b!Dmv(@?=DwHHrY}vm?wd345S!hZ8 z(D&g>h-B#DLOg>vfO%`N{K))`)l%KTqo)MPqFzTufl{!yhy+<4cbq`ZJNxCPCbATW zlW0hDjfi9#&Xl67_IU2${ole@zH%|khyCa&b%nXT_>*%B3v)A+SI!~j!t`OZq;-=L zmu3y0)Pp{{p9V240y7!3!uUTFvw##a<$?cr%(5&fA}vP^75w3ah2i0aiLI%4!V#xe zi}Lo+Zsya?mSr?hA(6!;ip_v!e0-coVdN>YfRqV2PP*hh3p}jIAO&BnKug3jr4qpi ziLOIsQ-`~(^=vLy$O2i~Q%u0pdq*Tbr}Gl`4b0g1t0qmXS0zM+c@mv7^4(*wrOD)o|jMm(ecV3^8r7Uo#$WQfR;E4BVhzS{w7&C%)tU$ zu0xjV@2Skl!i}6KuRZn}e<%=1WO25u!6p+u?mrn?j!E1Kv=}Zoo_*--0i#7=X=Y21 z}~Cyqb;bCmWMij(ZRx&k;dsKzrv*$frse#M`9jQ^v!3qyc391fQqx?|OWI;~7 z@%U^-ioZn+EAqGsRUh?Tg;_r5b?qda1AkTEGuf@mxz&Yk$cb&Ura)U`@0V4q zR8u_(*0`cn<3clzL&_ad(i;wJ{iA7)r%fFc{8{^M1q2)hg?$Qhv zb42kgqNCTul4za7Zrv_%P=Zvju-!3#{}@aR4@pSNWo6WswemywY@k3*$F zb#9fa+|r!BCt1cO+X}^_ZABo02$3e+$W1ZBPi!*g8GTJ&rfmRVNL>hoDtq@T6Q)Eafb6F?kPPRhU?9u3j4Vx-V1VV?WLX_#xjzun1eUnFA!30pe>Yi{?pqd9Vz{KK z-jbsQ1zDCt%dwCG78_IsS%_L*o0DZVCNiQ+6Imi8Yw+8YM{tf7X;I7~u5iw05ei&E z?}RNv%UkPYxzU#TYbbdLCnU#Y6s9Z~WOS5?RVI1EN)06))JT zDo_$ah+6zrJ2bq)J#w|gcORN)rKD>to>T6W*YGew0;P;L4Zh0`vXhz$+7UJTHe0`t z_EN3hKdFK)-IMhlM^_vYcu2XKW}XFA^PEkYv2RKA;N=Yt^6P1}gBq<0O0%_6{pr+C z=Pot>sJI5OFNUYqjAjayI=$3ou#a*4O$%3_`N2;;i~q}Se+IG;gq*v&FuzbI3q^hT z9Y2xPS45VOZ{T1FS+3yoGQ*qknY0=I?tfoz7^1?Wk344iQiLr34YK4h3r9hg{+j)| zJnbjC%%fn7c*AGZQ@pe6IAAaP@TrT_ro12Mo_|fu38K`I zTM4wpDoFuH6YmA(l196_F!~|@0vfZG%IsE7;xmWfN~{V~Z9cUzLzYprkIxe~p+ok} z7h6&fG3GNdrNRfVcqcbWizOBmhUH~3u@$oLAmosR1fWu2smQ{AcLZGKWq@{ zRsOQ7{=$mMLTn_+4sp=lzB$mQ3?9NeA78M;j#+??OE9kR*OG^_HW(vsK&D4bWNG#^ zbO$ZErg?6p!?YV-Y6eTQ&V!cgB*L0>=QYR@{Ge!mXG59&&QNYp`S{XkK~YcP(qxgS zh(Gk?+1qu<^ZMCu6J2i0x&{JjQvRy*GK&fp5!59CkB|ssvaq}nsDPJuq60wZ_5-m8 z%*$G6tcEO#HT*o@Doog6u0WR10lwf}2M(Nl?wbTH-~Wa5ee})Hb3)5wJkDSVqBPM3 z(KT@28$R;DNA6p5;eiKY(-#p7e~(Pb&esXCZKqH75gVj&_=aGjieh%e)p?IM3MlV6 zE%7X9%mXAHB8z*cZ2V)>OS$b1%KcZbIv6DGlRA+3TsuUd>1L(5IZ1-m8vpXiVDq zMYW{uewE6D@kK||q@AvImMezL0X=-bv#%FBpa*uwfv3j*-s-waZ{NvfC zOvnn6#i14lLtGU)^%8yCp3H*=sL~IY=C6K%sTQ`i{P34gedYCtTNbwc$}_H7H*IYyYej!aCs0Wa4AahQha6h_RS!Z1+;)2 zS6oJual;aeP_#t9xgkIK^CNPNsz@|$@ydp2s*8R#h#L?ooENJrOz7!nxLGXP8+|U?DPvOR3>kiywa4;tD0BhA^`mt0Aa!><;neH5$5?VU>6tr=VK}j>)1qp15U;+#C zmJIc%)8Q8N9$&nIgV?WKYEk!>9Q3oLEZ9&gA@+jOVL=pM^O&2Rl_rCF-)qU@og1rIC+A_^oJ-Jt;KZV<$$}E^#oqkZwF_% zm~;w~@wDjFkjWAfGF5L8tst6BVTKg5447QYhJe@37_NaS{097k+dN-JmY%rO>SS-! zL^W2287z2r?BVyDk)^57YqB(QB@BEsKf|0X&B-ty1say1Nq&4iU(1l6ItPozNxzva zp~o8=%<^fMMzUCb3x7;Qh-AZ#-FeJPL-_h^9e@q23hD6E)OXZbN;L8QYhK%;s~utl+rXLep0kfJzJ zGEAG0&ZJFWeK&8rl~6_Ik42M(J@@#B!3lk+flFDjJ+XmBr^>peSgFtCp}Im}m~HiS zo*z@I7D`cyCn+6ZzyU;^+6~Umd5J6zSSXZp>hEMyCFR5+3rQ#b8QBV-n?)ca!Z2)U zW)-=do`O^=dJ`%UGU>?sEL#;xdBK*{Ynyxxk#OVa(auiIezsCJ?dKs zBzyBQMA&ZTQJcZ(zL(UQCPm3@DaHb&%D7ehy8r>jF@|nH%RTGp7r^L66ZeBf+XfKR zR6XM})>oXO=%iU8@2TmdY!u7;3k678pC9V1>i2~YTUTk*r4#d4pZLK~jh0_hYN23H zQ`lAc=Zh>JllkOEgqaCM>KN^F$Z%QvRF511jPQ6 zB)WnuvEOl#%CW9Rgn=v(3Jggmi@_47c0H(H@s92BD-C1;Ef7IoEYL@VcCdojWoZgn z%8pGC%9BaM+?e`1x7|7hS1g{vZyr=nYJ)Q~;Ie=fi3Y#e5% zvS9=D?qu2yZq>NTdM5D?>LqT0ezFs=^-EtL3nnpzIt*HF-E=LotPa_zqzNqyw2$n$28%{$9;ThL$*|OONoUE>&5qybr7yEZ$@(1zA=J5(!Wu3-9C) za5^?wEW1(i_gxKK39>Y4)uL_paTxB#0NQA|i>Z{mt&I^Lrvy!qyBeYfs8or0wb za+JeY_+O)IEIl|^iY(0I+rnNW`#qYpBy>@avd`}PeA?uqF%vA2JGU!jfqq5BYN#@} zjz?R~HrtQ|u%LIJggGNXcWDoGkcL;(RO*v3;)M zlkq|SK)k}ArK1+hr52+_OC^n!|0Y?u%*nz|;Blt<$oL~N|H-Mhgu4}$0KK=~bC`Ks zoJp6j+(0gf!i7937pQg5Ar~POJrKM+OY~v^m_ykJNG|Tn#WApeEJlkb7R3|QIk?Z+ zH6Jl}Nend6o`&yjW4v=;kcIEcv*N|FRcOHtU^Y(w5XBnx>+MY&ly@#Wx#FN>4TmhS z1#>ipVgZ!HuXG7r&Ykm3yyj%}V<%{7c7mUq#M%&n3uyB9AcBz>|4@`tDAe0BfM2KU zDO$H|`Z*&us~Uc(zaO&jt39lLh9i*W@O167pZyJFSydMUhtd*T3Kx^b6sgzLbz^bD zipyM$xvUH&O==pAe0H_}@@ytcn1nt1+9sJRIRMbAhG#Wf0-I66Uv+0rmLyK(iXuY( z6nNnRWk1i-WXaJY5we&pp)@Z;3I9RMWVta@9WA=lFUDjEw1AV)0Ut(tg2&19B<%i%o|=j-COAdAo16e&y& zR4P)P#(kJ7%bsE}g)D<5kEVFrBJ6RAzZC#kgcf*{k-R#RChx}*tUQOf3$P$9Z>hkL z;bgY&P(^q43OB`Jy-V73`1t9=heuR9^x5Oq_wc-L;iFajxOt zGLn6z=Mxz|i;8@UmO28#c%7Z;9`zgp9yBSkFlW*>X`8Y!``h?osq@jr$G$X>Xcsk!{xbMk=}cRWy?{V{cJO?f zc}eQ^pHb8jt;bsQwJ@(5KI8Uvy>_;yvk{~V-L1JNx!Q$mC$ZX+SNh~4_gGFQgn-R5n7*pQd4p?SpbViu)Z=4Hy03N=}x*N93wZh72;z*)H8^CJTj)K#M=( z{s2oIEoRFj*8mG+_<3ceF=j!*6=bvoSWFO$vUmeo2w4IwIa%(sxNaf~GJ197&M?5T zh%BpKof?qE6~Kayy|WQ4zQoTNvIrybsi29DAq$x>1zRSILKX)tfF%!FTyim5AdB;1 zO)C(xQrhcjH$L-`2Y&ZiZTjjt@t!wA7D?s!it?u0-UwLUc>3_o+ipfVS-jtUEcFv7 zv~>1ir%3IbNQ6fzeMaAGCuBLH)?-(#2X)qV@0iJ=r@2+%fX8ZnBY7gLwU=3Vqos%- zONmOpwg6WmR?(Hnq72lnQ#E2-^i$kS;wx=~{?9kU1hjhI;4k|an6azIy0xwQv+Rs9?gR0?MP^3&G5${a(764T-&mWE{rkmc>KesSX z75|r>YN0>uBCA@i&d(p7zk2aApYrsiXcA;es7Yu^Q1OL!P?8b**0-LOr~c;gEvHV2 z3;#&OvNTyjQD=cC|Al!L&~ja}blc8~bE3(DN_qp*7x9bixLcO%c~b~*RJ~O2y1yT| zAWgvF^)lOEiRlj&u?I_w=G z5NR;)hzraN4a{&br24)d%umUZKymE-1w;4ONyLaPBH-B#R2>+UXoF!?{Vm z4p=c3{`m%rE+33YL>Vu^4k zS-f~9=Zer56jUzkzO@waUou!$YD4h0;Nim_t>$XNl`mBy^xAg5nCr*IEn{U2#aBv%=no~4|DjDVk zmo~Ss!BHbEk~R|CyT$b)CBIY(>Y<8%W>6jk+8fh4GIe}M6&OW@ z$Ig`1>ggjLwe_TDcqjeBw|_4Ku^;~63l{+ku=&{3!V9b{c0$bgFph{#>TKb|f-C+k z?qXjAEnnP!Y9Ev4OygUBFIdhSEICt}$Re;r%#xs@tN$)pU`x1CzDk)X$fCVf-6BiS zB#v-a)MgW0eTW0})Vq!n7f&Dp7sxV9W9|YoFm#itU%BSR!fAh(w#DP$l6aENsl$Yo z!?lnY(@*_^YReElUAw9NQ}_ogx!{UV$^#mhEVZxG4J7)g-TBaXx$LOOk4Y9{TImJb z11tnY^2$%%Vz>mbD$G`ynM4c^;QPQzIlh@sWN{2Nevj#=$;r)Od;_qY##^?L|KdaC zO3k8u8vz!?`^!zYbVrMve3#S6%Y^O4K+Dt~$Wp>rLu4Tv)-GP;T*!G-{|8NAwLDizf-as(sZP@E$WoIo2`UunoAQi|fmP(WitNqj1yg2m zokhXX@sXO({fs#G0He0O8-$ir#_wwMbA1iZSARqQgrdodWtDpbmDH_2b&AiGl=gzU5MFua1 z2VhZ!#WG;NAgu5aWTA$CGk__btdy0<`}Y!%=^U3-F=%{ zYi>8;-dr#R1kEFk{7A&1VMM8(5;ujHEp@wLlwGFV7|jSH6vYu2y8%kL5~D5c6Fl?Q zfs>b?efHUp5=d+oQ3_fy13D_R>s5}K4YIV&a&go{_H>{@jl>l$Edmz>FsCTEs7rwc z>w&FlRDxqc)VErfJY-@R8co8{c@Cw{7(Kcn4U#NZRK#{I5-E zl^XxdIb$$~wSzj#$LTtbH?)tx3IE%s%1Y=pQhxtpK;&659o5g)q1F7khBufh$SSJ) zS+hm*S@Ufpd!m?=DJT`+OUkDwSL@h)X^rk;6yyQN>bMbCt2l@_hd_lh`>{8@NrZ7d zpQht{Q_GzM6A`L3DyCZMeO>mK@vcU@<8w!&>6#8ml!+{_d)^6=jnu2<5(p(5yusKGOua87<@t=)gq z{tK^!i*d3jZb6D${BeC){2L$>_r*|)kE!5$XQRk+hsgq3s68W@lXhzZV`^Bo9VKLO zF|QZ0NG8OBx|Bn1Ufwpnr`7Q~Pd1;+^ZoPFQ&ZD=;JhBnrwMGFLgH{!zx~3>mKY;{ z7p{Hz+L+5^ z7kvW}xR@=(E8@%L{a)NN>w;41Iwr{mWd8t51F<6=0F;!D=MZz`G@M->z2wF#oZUIh zBZp?Pxa)P%B4Is@Qu-pY1fnvsyt0B0KN`^zx9VMF5ygZ=79i0;8$^7deq;<@ZajPT zwRhfs|1nj~buxb!WHE(ImS}_vs&NrV`F>>$&ENLw)v!Z{s}(DRVL@!;v^WT|fRvcf zM+$dh%{_t%fQ8t_;Y^U_7~*9@mB$`C``mZba@-uW1Xv#O1ipW=*bNF9F-sBCNzJbG>GTURR92DwqQz&879PNH zgb}px60Y!fyI{l@#4=)USJ|U1o5*rFCNRf#a6+DJb%T|6KlUYeu@fhFI7s4ar+CYV zsDFT~LAtUgr{t=lVuvDv6Iw^vXF(aLVmGf^39_{6v{BHq$mKn*;kaCasO57TbhMH4 zs&oR=Z2K57#UPnC)m=1V%?b*8lz_5&R#qvql;@i7R zjC%90l0LiEk=AM#wH7+AJ4$^rACUF4@?k~^=cEzJGcsfrL}LI*|4MoBoC5FJi{U;Y z%G@JAA!zya*S`J9g{i59tDDzv+SJ|Mzc4pW%wn>LCngKZ$MJpSf(vMQ>IzW{wU#ZL zXH$6^N5kuHE*4kzuf6Hb>41;7@h2n83aincvWYC*T9Pb$?q3UEali8g@hN* zzX+xvIK$_31ZoyVH{n0u?_f%N3CT>%oN)!CytSX*l58!8NCpJ?H2a*L94gOFfR<3j zV3Cu3{jOcRc2RYiP3tf18{{xjje7joIihI#b}|; z-Z&#jWU;oreH+?jv>b{)kQJk9Uz3}q3@^IMrOD$vCPfy%#eP3v`QRHq_@+8J5C;Jk zyfA0*@Zsl-m?eHtE}K{P0~eD;h)^NwzBT@-ID#xDies5<{R#@VN{*bk zf-GPSi6rb`1}q-Pw*(ud?4ZhX&wb~|!IhVMnRkc%IE~?pEY$mXI{;R4t?|#HAK^Tr zE9})?$nx}AC{3zV(v*r&{*~THvbjKv|2WaV-;wlaG+t}Fqd#5~CNxR7=w^F&|j1iHd^I5%B zMEqjYeOc0!%p)&xxx`6+M6FoGBHN6YBb}tRZwqnRwt)d`?+k8ZVue$?VK-JWaJPjgh6~vCP4a=8r*xR#fmz?kmyY_Axf)gcw9|nBrMVL*_%a5Ytf-cT>f`LK%Pm!ST6$18#h>TW%9a8bqYxyDlhb zSh*1=0X60|HMJ?xXC9&iV2Dp@96Gv5WVv)H&|=z5gBo+lc%g7n6I`tIAYJg*{-zKz(T2quu_^IN}6{e zKPIqjCEO8N81dl*anr_?ZegQ-lAvm^NP(8}p`qO<$O2ll``@k?8Cl5VfR;4>7}bHC zEUQtRpaDxGS=L;eEL=5^g(pbCNiO#aG)~FqqbH4E38FNTCC`S1>ZDn`PdMF<2WDj! zg+@Y*pyDuK6*5^?uX@v+2j0pKEl%`0k%ux;F6~}phVTJd5?Ub3efJqSj0Kr1=+$;W zwpIx(=87%#MH9y+5waxRCbHx=N!URiu<}iDrBTEzj$6L@o#zmCV_J;QZ(UqzB#U)k zddEB7pH@f;9+n}YTSXuHmdK&l!yUP?S1|=3N9@9AvUnRgk{D!@drE0RcaENlS+;O0@dn~VSwO_ww z+W`;dz=lGlt!FP&-#jZ@R#*+`AKWd9d0Dflm)y>9L3Z}XnkXQ-*j@!so};fmbEMxi7PWw|!zWJ%ZDr^9gi(Z>x!i=V@@ znJaHPuk72#0b0jw3$`iH64DRAOPkRynD;*XDAgHn88cW;7Alidlg@^{?)JOx;+z*g zBsjOfbJgQ2{hA{vZ=`ahv4|`hm#nV=10T8!vfLSDk+Q;hjuAI#>2ai+3?%+2=1|#M zk85N|Xlb$_M=Cj4bR&S}Ym-HCFK;S`H+UW2&f9!Yqpk8B9XOV2(d+r!u9~X@Et0oz z<{VDHTU?B@!F;<_3M}E00RBJ$zwZ>>fgp=(`!Omh=J>a5un@5*4`!6)oyO*h$@1J+ z&z^nmA<&WxDKoO@zoqymw7?a-jn|%k#|K~brmvVNPY}tf9BS+0fcqRF7%h?=86k_o z!nwCI-eeP-B*T{!;ULxb{cw||ReM@a@31LlI2y}4#txF4{wIfPo{Ss@Q5_K`2^G$Q z>EqHgiKSX8ZGqJ{ksUD&WQ^Jy&U%XOt?5=w?g8Z{$c5sb9MMoSCv3a!%e*gpz` zdFW(ug0oHkmM!a+#YL84)H%gn5KB-bvS_1>Ghc)Dfp#C6Pd~%$WaD~J z8!l(nnky~d0`|)fU7V%VqEK#n{gy*eg-Q#0##<*j&|YIf#$?IBVze+a=_)?+e`MEB zodga>i@~y1a1lnXsr?FBqT0fh*>Z#R-zN)dB1c&;DYzn;EM3+*O~@l5rC&DsJR_}W$>60w`wE98+zxU;EMLtN z%?LY@Y_m=7pDb1* zS^VWjOAeNhk&@c2GP1Y|5q^|DYx|sj7P5q!zQpTIM9iD3t@F)f;WFj&GAA5?C3J1F z5VCMXXbGO&o|7fp3YN$cVO52iRn!^OVm8b=^+vo@fk~zI;-BA65re7{~AMNiN48l zypOYafu|?FQ9?^$i`A=Lj(|lfKo+8S*%c$zKuTn-l7FN&vS>?KF}9fD(gIisOeUw; zM_JIbL6)k?g0tmzxddpRcsHACWuO!dMXk1jj(5Fkg(%sB+3SwE6j^LW$+7lka#n#X zbR6t53fp?N&QH%@ed=qe^Y}AY=Px;uo9;ez@RT-tX~_OlX{Lp1RvM#xq9w>euNbA4 zFD7lqLCksblUYIxtSl*T5+TdlsI&Y}$%6hSS-J^TP|a>GF5Z_VPm=RSAK`PqaygO8 zPTpGRe}v^5Mq4x~RTEKONtRe=KPYvvf6>D%-7?LRX(KL_D!1DoAG(BKj_vaO?R23{ zj6^ocyet=}K~veWa%MSL$cnkoOvU=GWkoHXaM`I1_deA3=Zp?nAOd802lFVv*Nh%X8iEEIs-s`A#Vd&)&yB{0_6ZmqwEqficZr$UpFeq z@=CXu?8_Tx{JDMwR&x9_aLKPUpJowRJcsWi_aq>4av_2i@61XYPU>Xg@8a(hsiYh( z+!tU$t8Kw zOcqJ~3H;2*)T8H!<;=bJZe07Cmz4_pGggYcN46k=b1#w$@NN{&Vivh($=L+1*csoE zO4UlO$J@t%f~Bf@ns6^>GLj^>aal~s5Vv$pnM1?zFqJ<97ImIUCt|L0q>mBcezyh` zy?MT~+AFg71*>0+ODzLy^^j&1!rfAKL;&Q0I2BV^A-q7~#8g3k!>Wy7)XFK>2N_kX z39>M1udk&EjGs`y3;$A%^ZLN+*!DKQUV)He7P50>*>Dc%DR(hRNBP)k{g|PwXq=J| zNXh8IN=-?+q;$JNBN`7-Wrt^<&x ztXWo;d3=&BEXmr-;R@fCv$;bS`ylVyCAJh?blI7MMMvG6`KyD}G8RqA*aF~KiLm0l zf$agK58wOnqndBI0km8OEeZfl7U#rNYjH&8kmb=wAKg6bIeu6EX*emD{R=i(ShNmU zgcgoi^TE{LymepCI<#sW}B2OiQi@;*C03`s#JWCY9)Sm#MxRoN7wHNMv_~DJ` z(+bI=$dZA@8$#^kUX`_pr&WBCcgUheCPm*rmRI_#X%S?20!zNP(}wWCB*#xq77kLz zOAO$M(u+2yC}446U7PmDf-PztrlE{!gg*Xn_I{U|x2~8hLW@z@!#vHPO;hkp3HM|& zOnURLwPS#;+*6$7yia(s;hsd64a*mig;KnnC}Xpkh+2KmbfCajAG_# z`t4lFw#$?22Fhf^C^ecaoKv-&O6jmVT0B=_u!I^{pk!ppSN1k;Uql==?37P;WVaL# zG?67K@>)$~2?bf2L6v>)_@qzh`92a*@}@Vv;SFz4B|CT3*MU8?Zgk)#u8<65PQH;W z*KqtlUq@m31kanJ#hq>`DHgK%v2%>k8wOP}C3E{GiHHYW#n&xIEJlkfEjds4lh;|! zKK3po2(32lVvrNrBH@0(BC=eFO<(jHt5lL85kPRIKJBy0vt-4Nk2z*Zv5a`Ih%88# zy^#d7ON$LrVhJ&-MnOiMwn+7P~n*t%iqV~CdRazXhP-&rtKT+`@I5Xq@S5HxBLFepwOuT|b7NNyt zStQWnas21M^-;P`11%?4tO&3ytzZimgfDAzvY`J@vY0K7R{G_>>uSrO{kErS#DiU= zzuF3rW%=j^%=Z!hli=P`@dS)jL;BA+xW3;DMuB2W3Gf5Lko`J9@;QtxqvI}%!CfXvr+g~}F9#)?|@ z?%cIg){>swNAi9V_W(%5QqG0>BP3h184cto=duAgCf|F*y^oF#F!7{eeGQ#r9gVz( zh4@8a*`g5`iY#dBF!;lLY@;?nuUteHphA#xmvUe?3N4&rDZ6->0HPVMMPT< zBWoo^I>|>8!HctDMVW==dxS-nT%d)sukW_Dn@;dbU`b@@TckuZE;`#L6$s^MIU1Xb z=_FR)aA{Ch!XvyxXZ5fb;7gE9RxR%J652pnpGc-B_B2dvv6MwWK@M3hg;hF9s~HTM z02;pBT;V8anoJ@!C(q~(g?F(9=7=ouGkbuNbX=)ZTaYudaOmiXheH;}Bi``}RTP={ zm&~#DeNkW0UzLERQhT|jrXd(Q8OG=d;BB+q(Ja-05?Kn&#mPSGsh<$E{OpHUE-uVg zG{-h|X_^Ae+{I^boa8UNz|cjJ1+XB37Llb_7q zA{P(AtS_a?d?gjqRXIuazlVY?hp6aBUaTE3i6|zE(K4>b@k&68#l6WBnb+3MRicFn z<4hSC;ehG-L?8u29ND3=Y^lnQT4Z%(yy!J?tDO!Ng0BrLk;rmXl@`zIn_7I|gqC(W zDCfQ}m}QzNVX+TnV9TSRW%t8I$B=$TI_P5+!7WI?3WFuc@+jYp*hp1>+R0Xqs)GOY zU%rlB{^RRz)LZK0_WoAH1@f5QHG-C8@#2%I!IEn+2b#$ex28J@V zInshGO?wn+lpNog|#3gDsZH5}%7( z_gTRfam0v_O`q zwD2K4^?A7R)VE)J{-dX^&S8ohQ+Vc!uW~iozYwUnG0b(A{1Ku59$A*=i*LgT$Wj;Q zrOcD_L+7II78{}Uy9!W(6*I0P|}#Y`xBwW7$;!$75AlS;rM-O--%Z$TD!3M)=Y(F(`oA`N8Ow{P^}hu=%4 zi+epqInG4xCV_=^J7brU4`2~lR)V32p^G+--NX>gih-S#+S8x?dg!x%^ofrXU5F;J zl!ZwXAZRgJUSlu!NVa6EhbcbHIC5+$vIJW4VaCLkYlSR<6U6hzVY;19*vI#6Buh-> zSln_l%wWmLk_!7?Nlz9Kw7kT}H|k{ZYs@D*@(` z*dTczfkoFQ3-@Q+@*T6N!Qz|9Xi?;nQ^m8A-vKPvYjX?FMKDwX6SACnIIWOu>*z?( z&>2&ZV3-lX7Aw$FCyQC*Xo}njJN=)Gr$y8J1VroP_UW6Gm zhuw2eFE2@C(Q7tNj(woP*HIoQbZGh z_ESzO0^=q3sT#!TMRnvrNU1vMJX$AFS547ZtddmFQZ84N`=1n9j!bERroK^mXB(c( zkVQ>w%v#hIXf*~cSAO`jU;Xy?k6c|Cp5V)mQ-?ai6y>RN@Whdei!E1Coh;EGmVxCd zeSG`dFJ9R{L(ZM3<>1LM1#@0(39=BgxXdE3T-M?LHCY68cOG*hyhAO)%E4ADs=bj5 zqoG`;4C^j4Gzs z6cS+V>MtCurClwRHpK8JzXRFq2U&V$gRE3si9edolna2DzR1Q!t}a8PkOjrs$r*|# z0LFqc8is@{>%;Omz*6oyD6Y^BrugP<_uh*Ekgb?+7^1}UXG10Q7q=+Uutdi(Csu_n z$y>yUC8Ho$WPBDk+~#D-yN_czWB8=h_n|bP1#IR0S9LGpV1?8e4xs>y@5n}29ykyy_urSrcK#P=<*Pd|FhAhAP9v{E^-b+tE_#oLZL&XPi84E3k6wn ztYl;{Ml2J~1NpiLx*07pgNd%^15w3y&?0(c@xpE0W5fhko(C*HelCKR01NtYP8Ppr zV`X*1aJK#hvTRH%B-<2E)JM!Uc;Yh~JOCf={))j#At8FLT)Wr9sm`OQX>(2{;9wDC z6)q$aA#){Dw4cROI-~$S3V@)BW>b2YV7Ku~hL)oEkvxbs5Rw+{yD_)3SNX3tk;Po_ zR|yK$h>h@}ado3sRKJ+_a1?la0iv)6e^;BPQ%HxYf&rRn>pd!_PKsu3{KEPle!Ahf zIA+*lq=xHcB1`L-KUwLR(vN4dRJYreU`N_FNi9XgDI@cYMcB=wRN;Z_^p`Difzw;Z zB-L4^FgTlOr(oAWJ6RapkTKa)P$j4URoZ0uFLLSvvP{UBa%%qK4}Sh@rX?><49~U< zv`@l8G(R^!H;Y51Y+lYe7ltmHEYHZMGDi#I3bcIj5ki)^8R?W)uq3uLDQ8PGhS}al z=aK&|SyrIGO_qFM60+3Kg|LBBw|XY{)q@uGVtGqx*X3{FqIP*Br|5!>w!C$;*4|F$ z$5!!l7gMGoP(ZGQly!oK5BOc;uP{|xKfYxgxmX`H6J52tyu#gyBZ^}JF^D6}K}!fO zg{7FS!Z>z6vErl3)`3F<^nW?30e+m*aknpc#j2`#2=gM%=5nW7-3Y;O79eOjTA+ZB zjaWq@*eGRcFCfUGy~OS@+ZP-7XU6vtvxqEP!-Ahr(dL28+#D}`ZmzxEJ$Jk|@18-+ z9tJGvJQ7(}U~=h1Sgt?anB1&x8lmHMI}P%fW>IZ1ZwOj@5+W>Gr6YvBuPTc@6b!%c=~B- zEvpjnyvXI+YccC!$;qPYXvI!ofhS(ZnWkG(7}ZRcZ2CUrOk4z8IGgDuI;epx!0*Qq zw3sX*aplL~dG4{t-u3A^rlqjT5ktMPat&Zfo4!gQ!c!)(aLc=U>ys-Hvt($AC6bYC z^22o+1}q;#yjc&jP*j(KB_fxO_;MqKiy%w5e{qh6ELWA&d$>5 z+GqDduV+(478gn)pJlQn@kmcqqN2#s<}z$y5XWyJ0!=Cub&wot~fAhrF@<97AWRXGI zrhethE`~SdC+&yqLW^L-Y<@FYKK0BCG?kq?cWP!}W;bX_T)7Te)@FZ%mj6$(EH_yc zvLv4{`ntGQ*sFdC_)=@-_gpEjyXo0)J^!uq8@t*I;N5#ii~29qMVl=(g>kzGP1ImCE>#x zCpCAEI5f@tX@L!qBRkj*EkKJ@9^}Wde+B+bfggk@G)L9O=#-GO>gF1gBKZg6^aUfir&nxc^Qo*+J-A4C=KAZS=9tDk4d^e%p)%N zO)5opbbHYglbux|356{hTWvMgl3L&#+Nr)DOS;AkR=g>l73}Cxokfelx_LvZx2v2K zO1-^_9U2F%)c9yu;k8guF$L>(4fD58^bSjIrf!SyO=NL!HQd{Na5tOGueyr=```Zh zhtJ-$uCm`i7=@e z(;WgUv5hiK*rNe4gzCKy6L3tH^rdbryXj;>p7}z{A*zVAj%j6-iFI2>H;nFuE=)O! zES{&dhnNk>_~`3PY!O&ubH27w@-S^uW~?RDNS4qzgS7`w9mJ@a*X$kt79GlOyZ`>T zy>0*g{aU@L@B15I@|!>X>FZp-{D-gW1`T5M)l>>w;sl4t$uy!R&4^@W@Qf^tMBz|j zNsxti{;)-V9JE+GMMf45{51_~$Zmzq6{{hG=HiT$KhEZ7ffgx76g7eGdIv4S$(f7g zD6B9sS}cbxCJShh2hEzCELH?9i+RSeq^o-EC68Hj3}iei86)*_M2_K>h*{Ep;@p5T z8j-n-D{^*_#b|L6AGE~$y}$xj01LnCAPbo<`Q-;#I8ZX|{DqBah2*lEZ%%tti~xJX z7b7llLzk};Us_{(Zq=Mfd#S2Uh{@)}bs43zv>nUEe4!^BY9X|#=h8B;gvb6AWZ|h5 zvOpFBp591-0hdn)Tx%G?--MwS5L3a97u~nHbMF&BICEm(nuBL36!V>$`DAKcWTD3E% z+k%Lh^v1QD3Ay%`cI}Aam!VadlhoZ)n~|D%3>L3o?rGt`D)y#HokUKPg&qaSa*`%t z@?nP;p7_ykfBo~XJv&rpWSkV*{6vin0vg?3fGi({6~rk|ys)q^ca>yVMwTYDK$aJt zdF09$KMGoAynogO{Oc$cT0qM`8ngUOW^i$RU7svbX2~k}bTpO9Tkc>F)rj{JXeKpf z#U?7H0zT3wPj+dl|DAV0rvD!M6$6ya9d<6+$nmtrO}w(xgVyvSQ< zDKiL#2a!e-i-ny%J);}kb<9d*h9sTu>Qed0b^>l1?lW1CJ;s(9EH?epyrd(Ri$+VX zY%^snz1%X+BV$>M7x+SF*TA8!9$Hy7El=ltYmV%B2baj$2O6O$8war+{;PQx+YnChn1Ne zTaCH60ACE0G?0ZWmpil*<~C$YU`V=(j_YrH;~P)Dp4g|oUa~v} zE+8fJ9ZlbVIma_V2}?{w;r={_fF*7ETFZuepB7bvuv9s5{n_{W1nM(CGE#ypmcB^U z>y9I-x{WwntA4M?#`)N1Sk*VyEjib zgH}7Vt}=zGGUk*Z#ZtB9;`sQ?IfPXuTv79Jqww2*;;HAq`{EU?#>Z1Vh9&=o_A6-7 zB{lq}kOei6#k&4tmS$))eChSbl!(&YbzDwl*|dp8Ej7Yjd-kxSEe)yaeLP43?; zq;?#0prLqiOJFftOcp7Th3clzBC_lo7~gkw{NlwK+w4o`i7&afVxm$OVLUh8<_|xL z-Yc<5Okf$I7^Vabm)y1;u%IY{Lz>mFC0E#_WWh_kS!V14vKS`0 za$y!Z%kxa^-8i3kHjo~P8PkGID?BU=TVRapnw*W#g!JI5vngU&TP#+$n1_TSU$vY5caXTE8jH&JpXMW86N8~#K)~04lzY#t$-%O^j}7#l z)dsTYJSrfhS_))wOi|6r;&3IC>()w!DF>BQB;?RTg$$F$9bNJk)AuozI8dEEBAM+8 z2F@n=I3=leh5bqu8C9CKDS2%?U;zX?RCO6Y2zeeQ<+3FEB?~UBee_u6AQ1H0t{_V< zlqs-nA0DZCUj=8o$e?s?ci`1p?D8=Bx|VF+Od`wJlz$s0O)`D9FHRVCZqG_jq|MZ4 zz^m0T-MCWgUd7*{M1EIUWa%w2$s#!ymRv2>zY{TwehCFfQG6tJ_R1}z$P;XyW%OR{ zVL$!#uYdmCkB&|ZOB3YpYIwV^A3t^X{%4TMLi_PWimxwR1TJ0}tjJs^jBZA|HMN?<}PX%Li={TG#cjWf2-y6XduL^pC) zhcS@cL*3rXZXoZ;volOb%?q~*?IMe_VQEmZFghepxPx7TGEuYlm%$P-%Ycl&l`NCJ zSnQv?N|ZY;vKTEsfG2z)VP;5LnTj(p&oVIZs5Jy#XjGor_p(s(m%l{J;-KXZHh6jZ z>AR8+P;W6-IKOe?<-F+dB3F2jWasgGe8q@3_DUHPX3Ju-9FU^d_CP~}a#K2NF-P)4 zPuw@FP8RffYjIADTXyXavRLH*q=c52UTP*w*oH+rTu5}u6)_83Ssb%uWKq#2cU$(W zitwM`L$YQdDfQxG^aOKW?KnSuZDJRIC*TVa?w1qusu)Kwx zTeohDv3QdMsd7D*PX3;+SIp9pn|{R=7xm6C$}FOf-mSY2nOcjUCcUM%_txTCO%|ra z_@%DkfV#TiN;PIvlI`rW<$K#?E*w%M!0B4CN3SCixvEfH2|)*uWwKiEJdNpMXEU1& zYe118q9C;Qd zyO0W8m>y_fLMS^KrGYjn)^fpcw*jlSS!CgwxW&!C z_}-f&x=@}>12L6Ky2rdgi;i3pfi>$%KcN-G`7aI9mb zhWbjHmeewUy@@Qty|be#pFx)HQb}kb7e+G75wqMXSDGyH+t;qJiCM&AFiLsjGogWy zk486d1}9pUkGRbtGFd|V9)0u^L!X#&r}3Zul42I5+Zq$JgV@vPt_R79X?MG`V&`D~pwB*rABUzeLWoS`0EYM=Ca1qswK#3l@ zI#wnlcP;R98Z9rq^yEXF`kTn&!^99TJFz)sBm+4}mM=M33>Kcf-b@f^F*_7FxmPWd z(E?0N9yJ*+MvJ=1be}9kF*1fM=^S2G_3)P$M`A`q!X)sDJ3C;yL2A_h{y-=X?t%SL8p~fiwcfp zYZ%$S9Cak&My;MspXM1-;f%^+a_T0N3X+oep57?bdDLJ5EwBg~L>_E`ENwkp2~*T- zCPkL$X45##_FSla&q2P!3%VF3zYDHk9FWRW*VL4e)6d>!+9 z+WX>cSOIY|;M;BmM{_f$PCfG7pZ|;+{;3Iem~&DPyEq*VuPnXS(YER z$9ddR|NGRHAH4Y8@4oo_7e951)%ZhcCHoDma#~uZO9U`dj+K9qEX)3lWI?ZtS?*w; z=g2gM(3e_kc4kn&@rYck;kU>_wJfbT(4rj5{KihZeMvBdB-98mFLGrhq6khP%aBGp zX1RO(6bz@DLb7X4WEmG-!c$?rdcu4FSt4eMQOoWGh`MMHDzgx?aQz#T zg=ZGc$g_#brLppHTMQ`;1jT*%qfAEpH2**VuU9>vOg&NDG2@;qrmcjB^T?cZs zG0Kqmc$O1haNeL{}F0^gF znsQx2OJ0%j`Bz=f1;sx?i*iZ|T#l!9G{AUNy;;0^!Gu>ySFgar_lGRhSU90;sAjmA zVVR0uk815|GEOh6RFYv!sTlnX@zWNkaJjLn=8BI}&Tne0hI1IFm5R*;c`i;A)bA0! z1RlM29!3$&L{FJQywfvB+X~{HavCey-?Ska&3%GXGTy|{bU zt2zoQ=vHe}J4P6=IJEm2i)0wXlWrxuC`)~lCC~y@?5M8}u`5Q)BX{qc8;`|>L@bI( zn&rFCJ8FrTCA4(R5;S;G3!VmgxHz%?%jo#mV=-l1sP5~Ck5)Llm4c1?= z#iXoInAC?YuHcg#<1=AeDcd;Hge#FH*|fL@=Uu^dvSj_vi^)=hPbvuU|KrH?Vec2i zUSLxnKNf+ujD~n$!svd#9R9-}X1&N_u$V0CgDm_CX&p;snH?S23||OZL>8A-7WIY6 zJlW=!Nl|mDYi5Y`U!M?J-n;vKyPXXKEieD(H!oAjcQ)*M$Q~!mb69|d*hRrhUe*r< zS(0mTMwZ}$jzpGvxkkm5ctagv37IUnKX!l*E*DkyeHpsOdX{T#zt2oqah5JreA_sBMW9ACtT1O^}Ll(%QXXcnWNkp&ly=TtcyDF`aJaHPZ5Km}k!+W_R zzY{Yke8gqQQG((aBgl`mwf>3Yt#sF>HH+!epVI?D3S{v{NOXkZ^G?3HHCZIPi#N^W z%P0l32p-vaJVg>?0({;LxL+_mLP(dxvv)Opj^sk?w!!H;|ot{0*WyhQdVgL z5Lr0GR8%PT?22b31s9D-RuCvrS6G2hXyIi$Wm(WdZ3VXI?692tT-1#;$urnfDiLj! zG257#y~^HVy2JL*Dm#w1Y%gd@-uvx`cHb?k2rZ<{=O9a19;0B31C~UV&p-9;ACM2D zihs&orA7;3iD4ADBcc^9xEV_9Sz^Mz(XJn5pN!l2r!sq&AdA3aYkDLarUFq=A`2UY z7JIwg^*V0W_vANXB?n188RjFW!?1j0W8)j{TWh*NjCwgIo+!KRKm-{qvIgKT$>}oZ z29wXRSmIHmQ2bi+Us(dnu}^=R3&}7H>LT@o-TT1CjrVyW%O6=_LTZ4GTlkr@rkc9Y z5cw(xDcSiyxN^ir>U5s2y46edaeFJOLriuncHG*YxvSWDt3zZtQ721ldd}z&h!k6I zN#*WpC>`|X^4Q{bE!bC)=E%pig3KMm8k+$?LJF$)P-ScZJ4h~V6=z%Z?>z2BYa-I@D!z%pSVHn z&^RW8pe4a#_qEWnWH7TNS*(A6Ea>`3S@dnw}Ih zJYRvqoPjPzZxlE6Ydw$-{4-!s9CP^V`(+w7FeI{UV779nw-d8I60(36D)@`zm96p~ z14JajkkPUkvWO@Fmb6QseAvt6})6Rl8cfh{hx{PFyqw><<}6t&QP`?QsyBEl#y zW-SIwy@u~gz;b(rmOzRxIX$Y4wlQYm!TdE?5Eo06g-tG|$I=$Zd68c)!-vxAlbNwu zVzA_72~*-E-=hnoHS@)3?X|KcZmgA!qKu< zu;5iXm}t?tzYVewT_~>d$`f2Lj~X@5$&CTbF$*kQfEL8hlgdcSOjjwrC~F~`Lo`6 z$U^vcX@vHl4$RJ4mapro%+nus?z=zz?N6^TJ4vd7EJ$qBlutoB1=x#;EVB!t+RuO+md1mrIMHX}&uw2Vlxv9=lrZWs!u%Ce6 ziJhkh(wx~Q^5dveo0u3T^ilrH^XGGbWq#Ab z!dFC;ImA_H+-ON!@AJ8dM9;D!mk2vJtdpgzwJIqUrltG?N>6zieOb-QQT0za;)$dB zZ@82OZHsm*f-Hx(**_CB61{2$*ISb%u6>mdOqYA0MpJs>MHJ7#ef$K&-vipdhbSH~oQB_|7NB1^7UZl4r9 zt|JK3K$bOOlkbx@A9b?$-dtg`&x6BWOl&b&WZ#tmAr}BSZ>`BxKZGc2`3q9kLY5G4 z5ya|b$@aH|Qg1=XV9~D?P6HMh=pVSvJHn8cM@Ga~ zjxzxk=eoSU1WYK6m5s=A8snZIjCcMPU1KpWq;UP>QoD+ob=S@jIdl;sjmiJ=ADgdWaf)&{l*W`mx4fR+mmCZPg-M$Gq7IY3NO8*?}C- z*3Yam~( z$VGcFy9-R?I?;h(khZo?%NXqN^hk#)Po4KH?~$L&r5B$6;m?2i;v>5UHqTD1XMc=S zlEUZ+^OBoqoDCyrxjI8V;FFmWTLLUkc%a!TAmw#^ zU7swWzl$vS7hjJlxt1b}Js(@j>(;6B9iJbVqTa$mt+u=8bEFQsfBXYjJ!bfCs>JS5+Hz_K#P z;-T3nd~hl!f{C;j;&J9lef)(_QX10YFsu?sEEgNYw#VCO6`3yl&h^!wJ>z8AVA3rk%k>p4l` z^5;HxHo3dJ3|Ern@m)iY4n2IsS{Ccy_SPq{(E5gZq(BRL8mV)Py)8mZ)KCl-WVA$` z#fdMZK^3(wrxm*4k1)=~J4nu(!B%b7CS?p&P@swqKr6k_5FePIld#Q(t0b^X5gxqIlw#OG`DoclcV^kMA& zobS{1&9Y&pMa;hBWC?J8MN%a{$btg=yxi^V4S3`cdcy9%>yf`2EUfaibei;bVmEWe zW_#emA!)1vWN{?pWSLF%p-$w+keiKFt7(~R;mUR=N_<(~m{k>7_RBVyM=17t&v6)2 z(rv5>NYBTs&?2(%0Kt@)m(XHfY;k3rT`g=2=KFI>ZY=qoC=vDsvh2;lVrxtIl*khM z%-nsjjMIOmAC1lOas?72ev`VKN<}q1?OlPL*O)-d*qDAt)bH`gSe z$`#YV899-~aS;shd8wq42Ht)89Ku((dk7CUavpIuEX}ew1;aP%EoMsErQ(Xiz?84l zp7dL8**~kFAIi3l(eE^Q_ViC*e)*ZFcTBArrS;5RY-x8HRt1x^E`b(G%u~nbb{yLw z7i4NJD592c2U(O7bBEXq&pbo#F*_y+T1bOkfGj)yBV-9`yhXBDOVRQ+&b6v&crr5g zGj&$1mF=P4wALg?{Q*x8re!XvtWFhS<%)|-ocO6=jd~slvZxrYB-bR30Sny%i|h7- zqRJr5Q7tB1CY!?y(`0e)aTqEwi7`wt=Rm|hPXG({gHtD*+BERaQ-2(V00 zKe=QpVbprC$MY;$w1H^GJz-o}Vi9ZsEGEn2wmQ!BI&=DRM7{#HT=t1;_N;sK?iZ6i zqrjrsbZ5zGXu1705$TJ6er->X<+8=tkZ;SnwD|V`=I;lVkR_g2Bg+BMBGr+ljxAYr zzJBX{W^tcsanPdri86I^r%`NWusA8Do`d?Bg`O;(^#d(BxII+okH!^&z`GIbfGpJT zb@Lj$ut+%1>nRQm@){jdEc@mPIKsk;UA0#K*JDLzK9YgXI7cTDaf$ znfn<=ue|P&4}Iv7`|pnxlDDxS*dYZ$i!(iG98h5h1b`kXV-;0=qac$A17{q;s0Lpw zWDC5BP4o_539)@hX*9}(Z0;i~M)2c$%Z*L0h?^`P*6+X@rOak6ovXW)e48b-F80dnF-{n4=<}=&+wjKgw_-i-xBM=mMIZ72`KSS*Gq; z^+gT;m6xA6G^Hiv)pDcv#DtUE?ELh|af=W2QJ{`6frl zn8bgE1~JB3RHfc3NNhGRF1Tj$!WH~n7bZ*SA0)~Z{0aHR>&Q}Vmkr8FirKKGC?iUf zrCcfF-$F)lOk`mP7&Qu_mN+vvV*^~G?U(oSD>szZUbL&HT+PU`Th7NCwC6JxGOoNpT>+3rsvVazz<~d0n4oQ4pZHvefT)}pK6taY3 zhq3-wAWFGOWQl=P-p^5J8FBL%K;b|BQ1{0cM&*_{!Da6CIE0v#-zs= z?z-!}R9%D?=fz&+7_{6I)t1-5iUeF<j{8v-mh#+}? zuGJOh@&mq)2`aZytd|`1zz2o|2AZmb=`h7@%wi1DkWIJr^7@jheW-rn^^XDzL?V&K z3k!Fgu~}L#>JhiJ%8d+^r1|+Ei$KEZJoZ95WEsodEIHHPbk#B~PZ3viMpo&+gE>SG z?)dcHKkjUxb6Ku!C{`&~nbYQ2 zj*`>BYUUrGdWjnTQ%5G&F95+UWc$1wTHWBY{I|)1{?S3+IvFwYU_ln*WMY;E zPQhLSc8haK(ZSWuG(MTIo|~FkzL4AKkppfj8AT?c0m^MNs5hP6u+y2Wa$!<{KPEr(8i57 z?INyy@g-&g)-_pSV+CU}0Az8arM+s{&?-y32VB%!%U$J@Euz@VgmT7~q zQRw_#2dqJ^wU_&6#ZlMi%TR*m&qS80tN@+cXtjj5F54NFH7hwD+i8TIy;NrW-N2MB zd<*>NaEWO~owr7t*EFx^5BYkZJjzI9X{gGOg`0&kO-iN0@K}LvXnrST{+wlVC->gM zrc~$INUj4LtBnI{b4$U@Shbt(q+`##>`Kc7%{!bc#nDa9T-v*8dV+uFn>VYbdiaiq zAAk1Q#~=P$CZi=jjF&@CJ^jK9sfypDpoL7>W)fl%w&eV%XUT;pC70^LWLe6W#kbEH zx$wtPOC4E;bOv7OHtH26m;zFi2`hH7x|*3=g$Y#f2?k|q429Hy)u`x!PA#?AuHSIc zB^ON)4~}*xvOKnV*N_=cs%d6$_i_F|fh>a~Za5xkHd)$D7Hq@9kJ1uOU_?2b^dn?h zNkbT4FUS%rh?#GkAM0mQvnsL_`#ig$?kdHvO`p$AxN?8TEfjeYEq`?vG^jP|e0f-VzRvFykv>3l@i7hOPYNx%$Agr#lJQuOsF*Vv@M( z0)BiuI*~cp0$5gTsW_=*vH&xKMH#40%;%d5f@Rs>W(;OGBgo=RcsnsmInAngM90?2 zu_)POvCpQbYfLstCNs&Tn5h-@8n0JYLDuI`OFk~0*trNZRe?n_Ee%uwicKCTqCiq; zY$TbbTZ%r65n-Ri1|qxY_;Rm1-b5B`DS!3SOTT)02NQ0MTfiuEBB0a0n{j!I%}l66 zZ0;yQ%MQ@;_`@QLK8%(iOLC^9`}ir?LeTR3;mvE^A11QIg2@Y$CG@Y61-*5$IB?;Q zAFU(Hq(&TvC}t$1o?>B~dHY_D$~13tmmXmSc0u!$-Ggog-i-^2y28QA#oE$)1>I7z zE>;KeK;N#%?%X}3zX>hvJ)^OE!aIj7F1EDE#l`7QSTi^>L^m==QQcQQES4EV95)9B zRbqcV8L;H#kD&tMeTmzHhe{5mN+{z=3Rl{dn+rqcRglFo$xzz>X;Q>(MBf--Ar+>O z#%v+znGsmJS1(M9EIlHNfpPH_R}izX0f_D})W&7I7Lf@n{y&%9rY`k=>|?r8E7(+z z$g;*Ui!Tfpp+!ltdOeWPl0-S@rjOnA2xw8N{=1LddhN*+w4D4ApdgP{uh(OFJ9-Cl zff*c~WT5|~z!GGM?O-`NvZ`|;3zr#LoWb%_ICukBmUxIIxa3@k?P9i2Hp6s{8A?VL zp00FQoXvBxgyMzu#iLUgWq4tAmdNs@cN;Tua!HQ`S)x2|PZ^=bWVued)nxIKV?Qb8 z^7CE&X1*4@ zjV&7sUD45nJnd02H;|gY3L*!JVhc~yL`m3#<%{OMcX3t=eFyNwQ;V?_6Y64&?;q%@ z+B4r%{+?UmYbj#clu(9qF=TOk1X_ruHn!|{D}Z`!3)sErd5Tte^FCaujPYHndXHSC zH&bj~8Dxo}e7Cxg3vTG38(2pFdPOumrdOl1)2fn(2I83B1eoPwA$b*2H*F+OZU2mR z{JC26&31TTC#~{QHl-_D(p=G|7cWzx)&lJ4DrnHSCf}TFzA$F8hdPvEpqhWQsu(MM z#)F0GXoG6}8h6vcXs^1KTlKXnHdb@_%k;8uG?+$R#R^OV9)1TvzW>Dh*<(-t>X{dI zteKuB%IVNdjY6FQWErQ(JhNu%D4n2>Z{B?5!8`7F_`$~?fAB%kC9Gb)!=g#VtfVf! ze(2EYr(Spgv^=q6S5J@Fa;N00oE-HuiKBlLS?ZO)&KpUyG-l!3&_O*}28fw81*GU; z1)hv_HjEb#Ik2FhVmgxUmFkD>YpkKgF9SwuYxSAiC}Q1arxdvv6Khn()l!#Wr4ld zZu}CBmw}39#4L#{jNXbYinvBJWy5#XStHBE2((}jv32V%CVQy(6SUBK9b`$>7L+rE z@fPR8?tAdQtw+HM5esB_|AvpR)QD$kyXS;vWCg!-7cKW9JE-MO0o@x zEaFP7IV|?#OZE{9w4kL1FD45TAEL0rVXn-&KBdHvAd{6<^dX{X98<4?1M|rz*FhFN zTQ-t_#mdQ|Peu-ik}H2&7+fy}Eg}m*NxjDb9XlGML>48+L>B(Qn;?s~1#jn&854&r zVMqxs{E%KLKqf93EDBjnmTQ@45m_$%_zmBnFM?KN1tua3$gF`yA&X-~o{-3L*>wpl zqq8@s_47>%C6sn<5?H#Di%U4TRDAYl%?ZaUeET$NvVfgz&k8MFvJDHK6x7x=?4uwH z*GR80W2@@y}%T!Zr+U@4|3$jx_SX~j##OBx|BckxxJvEZA=Pcz&u;mnFp-t>-3{D<%ktGT)-#&N{v^$4#RUJcJ4;>TEyWTcqL$&) zg>JzY?*Z%TB{op0zk^D3a>Y8jwg)wL_YbJ_O$5HN?+nxWfaRkf{phMQLoWGSBNk|( zu)#@L0SZ1j)T<1ZZjDlwG|aNHBsp4f2U_MtIk+<1z}&CAhD+~laloU`M7u3_MXR}O za8S!K;S0STD$#3GKO7oTf{eEuF5ef2qAPh7Pk=iv;b&w4g463qymscI6&G*Vwv6B1 z#SNoMhRsZ;=d=l(bP^CiB{SqGwAg@~`V73o9(A-^9O`acGZF=t6vRxdl?}4NA|BH+H)YS?cxr$&&|E+jq2bgHC#O4MslENjt3^ z9O0hGt@J?tDAy?;m4cs3X@|<~y%rfO2U!djg)AmSO@0+FnbA~Y2$$d>iwgBnC+r3!aIagW{ZeU2|QWvhnEl_m!#DZ3Wl#z>EbxUKVTwgn77 zt{7U^J)i|K_~K>)lf{{|{oF|v-oEZ@QTC z&)Zi#c4uSLZFB{Ass^taV0L2{=U{~%E#v$sGKpbBWkutO#e)33NMy;la=Bl(so*}| zE=|`V1s2Ow2bR0n*xb*w{a$0&tIs-FgvM7IFLU0|zsey>yUu3FJ+Mg~%>B&l(eFA* z0~!J>Wp%%n@r~hZ$IUT1?9iA7I2-sT6t~!}-&FMe@)g2730 z>#TnAA_E)Q@D^BPIii`Cv%HObcH%7K`o|wX@*o|^?E5+Y)6tAXj!Y#Sv&Diek3$yN zf+*nMci(4>mJfaS12*q{!n&Sq$D6PBU}e4j{4*6`>@dc#J|T+9l1cBR>q_+If~B}3 zNnFWuWzsu9iwiiAB^0S6DatJovYEFZf~-N0^@QufMQ+#7ofnfau( z35A`p2igG(5?{uK5l3FW$1P^epu|wUE@I1ZMl0D^6-1M4A){Dj@yz{5(T@~l z8RimYTlu3}P1bA^l=GYlGFf<7;_NQ$Aw8Jchk3r`V$MZZKXzv?G~vro#@Uz1vR^S$ zrPviTRUK#97WH;Dl)aU&A?<#IUGHyYC;pa|y>imzte=cH-MZE4=!oBt$U=5XF;;Sd zp^=#{G_HsQoDA7aO6QAWcQtb$=zsd;KtvnS|E9y5b0e8S2`avNulLl!nmo_&^K zd^CL))*N9${_#_6Z!uYn7A_#mw+|jWcIY%w%V~lZ$RY($YF=WwVov}3f&u?=vc#9l zQ5P98YSM2bsFQa=A`6@8OT5|V%q)iV62DaVb;}C1Lx_R#1c)VIr~&hyi!PdAq{B7p zneGL>>px?lq@aasRmF#VvcGq?;BxQCy#fJm*<&zYg$KjstV0Cvi*%@>uf`NpTZxJb zQuzh4s9BJ^cEbgFi;++45@hL-m@?9&WhoXsv=1TKURuN`Z2||ML~|H7!AU}kf);?{ zZZMRQWt5-=v=FtRi}>way<$W2^mH2yVFpXPNM)7VxKp+fxMY$y+hDMe4P)slDPEIB z0;_5hW6=Pw&V_gE3oT4h9zFWN<3!6rmIpuZfe(NdTE#v?0CS1Nc2ae@U!u?kH_IjZ z3wbXM>`OODI;a_2`VF+nQdgr7V}0W!B9&Y)1+XY;ae*e6&=MK1Q0&34i&z-R`NU;l zOIUjJQ5CbFdve`ni>&r@48*}dOqP$_fB(72viOO~G(W&{-KRmzr-YVRXUU;bUAY$+ zcnPvFOJlM~ci-@hd+L2}SO^lsoV7FZMu4WFa=>h>i&kxcMR*Tnr;37Rd6K zPrD1OwrIpHSS`Ip@>r^xSV9K>rM}$dNL7OZBP3w}$z!qEs?l|RkDeG!z8`+1*d@?m zFPO2;R$eQ-CM)StKMQ$Ry|p%-YAmOjDQheBO6fa7Ih7#+NHgyei>Ks|z>^8CI+)vj0qZ zKszZHyx);}jT{2}sje9{>1S7AJ^g4^#=SXBpeVQY=?$ZP?=;In1+o=GrS>6kqv}qH zpk=HotM*Rys{s}YGB$no#ut8W?P<}V4BU_80Y2Q0^J*}b_{B2b-l&z2+b?5zU1nQ z30r73Hd)qAjm)srL}%$Us}fn-MHQ39G0X13dyn5cc>MUi{CDqh&ac)?yUAj-U@aDg z`h*)rJB5iXHmy_>M|ZisS9a>bi3EBE9M~k5XUaY*z5;VvMLTvTV1!NIg?pb$fPL{Y1D7*!- zkPdtI{aSH6KPphDS1vWtl6 znI&z)QuyMgtnkXOw5m$c)WU0I)%uoX5fgc@fR_g^jh~$fOBDwf9F2_iQVg{=GV=VGOQMKiwrWdMIMhb;~y#^}Cy;3$Ll}$#4i0PKN zWGki>wX3z&YX0o$Km7iuho(=U+3|6&7Vs9ct8P-34U&)tn_f73R*uJ?hb%J_$BmY> zcT!NPCyR?M&p-df6}xt?^sW|3!HSRmak3yW;J+QS1X@g%6O!h5tG)b^OKK0R%2lnj zTkUutg?O`xZbvHonuOO{wv{U=HjGk4MW62i)b}4M}*=I5A*6X$cjyP>i)*QSqS6S;uTk~C^Y~Uz8~em07QU= z3lD!PLuazM)~`J03O=J7u;@_-S2le%Lp>VWkjQcgWC4r#RBAB)K653|!iC^szI=9K z4TGCWF5uVecMRz(Xt}{$@lsu}CZd=eEF3M}?-kjwI<$D(q$e<$yG+~0H2D}1a>OetS_J_ABUVX2mKmRmIc6nf)_@_lkTC^oT z+{IjHNfnYN%c(TiSfV>wXtKA9qmR^a=I0o7nn)MoI+JG$$2xR=t`o&_OT|K(EY#@v zCXcdYe8DG$P(_wAP}DUXRhm>ZakjnHom7ZGfCjWQB44hkqfA4OTi!oxXO&?sno%rJ z@cu1T>D{rW-%i?Pxk(OUvLXWtVqPz2urxc3W1#FkJoE;FA(GayYuuoy>T2&wWQz|R z-N(n;nhU%{XW8c;IVMxYNfZmCO<;*YPI4*1fo5Uk`9J*r7f(;k&rg!}8Lc{|O6u&N zCt=Br}FHs|l z&Af_P+NzL6)o>LoQi2J!X-)o+rXWd$sp%9Fi; zEc%WtaH7djU`P2r$btyX&V&yPKV>OZhzM9@wXMIv75_6OqkYJN zGt6Ai8lh$G@wuZ!C?-p2M?%Yo#g@K4xq?)%@hOgy6OqRNP7`;pziIKNP@~4h0OTi*y zZ2uG@1;&k#djptD!5m*?xfb4_hqgZyRxc{Eu$3RHwul6G=4iQ_`x9BbxmaL%(U;uR zuiPPv>~u1)yvT`2S*+G3qJ}UUmKSj$CyU2cykI_hcO`OIlA#mpw^F}SSuqPTFT!3d zM~lg#d&dy3C}&8^8(BQ6zdw;j^&U^U`%8qQ|E7@6_*&J{LDW*g+xxevQjyTV#c*`%u0Z*#r(0SIdOy~DbUb7*QWn1O8&ui## zc>G4@c3PUi7u3m|SBM-;7SMuZ4WLM);Q9MzcPJ2Pd%5j$Af(z?*i? zX#9(%C#gh)G0!e4z|!E*Ngp5tvM`IIm@O8`uo8{lV$qnh2Cp%4`WL@{`I%$Nb}evX zXi&82`F$;ZVTKi#7qD`K#$#3T8J#>nMF4XaxSTqC`0&?67P^o%-jX_ye+*bopML)I z;mx!jlMo{^iE4|k-%_3Be?pcVEs!O)vy2z`6_XHKf%S>JdsYfDlj9m>!n1A*4Sy?3 zvP{sxVw#jJmDcLLHgy9{vaIgo%n4aGuBLD=q^yE0ZL3zP7UJIHvu7x1X*D!SvEBTE zEI>vz76eaa195 z@@I|}WMRdr37Hf*&9AO1>XM;=tYHXRrkq(kI)%gj1NR9j8D4hyVh2~C1<{iXS?CR0 zik8<2SX^%=Vu35a`AwRvw4P(b?vpVG8RL?lJ`E8?~V-INMyn;Mc0Zii^zhATnJwP2wZW{ z0$F6kw(bV6U!&9_MYK}8{5i&MNvh~$lXlXZzJ7$&YcF7+I+9PR6bM;N7K1@|#K>f@ z1<401ql&oV(|FoV!skkUJ;I%Ij8ZKI+!!-ZKshn_QHCW~e4$B9Z!0T$ZnMG&rpbak zy(_C@GSj`lQrp5JZ86Lg+#<)07mP^&6EyK_6+vRFo1?))oZkjyhz@> zUzTdOoIsOs#AeB~G)#K20C(~4eW+LeJUP8#S2j;=rOcL=)Q&8;IPXP}d7IJFY0_(p zGfvH&m0m3!Eb1-i=AZuIl|MW`N1=Fz6Oa5hx4G2Bw<@v_)yyI1zvdLG%xPx}V+T{4 zS!OJzs0o>MlLiZ9`SFjxep-5B$L6h!Om5x$*kd)cTzyG~l%y;E|6-OaJd7V?nXHnS zoTQ}ExMCOb`|MGjpNs4aB`;Yhb||+L1F~f<%WcKcQIn-d##tnd?7*edID@}3Luk`* zVmH^!B@$Pt8gh09DvNujK%d5Y64ap8hyTmxzK^D+rLWJ@XOI>h+;)d40 z#G$m*_hFz{c=#~{^FNdcCulTDB6VUq

uEH=WBUKWJSIMLJM8U{1Qx-6<0NoT!cS^SXl9Idg`fP{OM0WJv^l`0tP*|Q0q5_ z-``N-JD8N8zD&;Le0;>VPTJWrb9QE8Zf?yCO!?ZEkLxl`wtyC-p-FUjGfO6Si7Z=H z2#w-q6OctfVid5PrCz-srN*#=Bs2{tNw-CHR(ReIUiGxiovUNi(ukxOL$KmgwW`$G1lCUHm}Xe)n56;>zhIPik_pI$HwK--HLcF~zq7~spcX$^}kR_|? zuksvAc;|=UM!nh;x`-@Bi&J4Hi(26L**p-6p+GlZg%K)Bchyd9ns7xYIioduUkzj# zNY$RIHY8tk(XNZKb(2$TW~S*xrji0#LW)#`mBWYc(4qAp6&Khdzp;9K(fZ5l_izS` zs3j-MZy4P_AT1t+G%M-?m)QB0?Ra6c{RI^h_yHE(3a)q)Sv^^3J9(wfhJZsT8sXLg++-Xkl4;bk5uHaYGjG- zVg)TyC48thRV3H%6_5xN**w0+_EoQlp06-ZR=mKA@ElHzj#q{=AIhk~#2kO@91HC5 zu;sI9>|)UhV&$f`u)^25r%Gpt=ZS)QIsfvI%jul^jUFY$*rTr((A0WVfeKwR7~nkJ z#J8v)1`!dpLZS{&$i!xJM{SmZvvOB zeGu(oD6_K6HIpk3TtZ99GNk%^YD1|G=&gzpy_55RM)E#QHr5O*kTo=XcwA(W7}7^m zWW%PdH4`kHOb~%7LJMGlEM|-W<8uCiC4-WG<}~(28|uEsNsty_MJ;*E@*ELML@iQ8 zCOKLXY%IWn{8-Qax{H;^S~K@Nr`st;L$Ea!RB8}7&xU)1Iy zi$j*+N87-k+E?$XDYPFcTHdxaYF|PS>Ot6dGVJ7E{Q2|b#l+8@3`{X zKMO3cH+3PMNDDfQn`9ekaHJt0jz$Rp>8EZ8~d^J2Qof z&i>EdHs)wdKOJ6|1?`rx0RgVgAcYH}x4rz>`U~u;c8e@WUij^=UwQ$utl{gVa*V<} zzM0mBQlrYO>&cXjh%9~!4OkX5)39cJzsYhuCyPDxza2r#Q_mmT!Kq zhF@05V#7LHR>nk&=J}@yM=9i&n%B1>ZO9*jCQ(%h>2<7#Px>Th!;-~uE>E;9WsB&d z5`22F9kS449U9VwYdVTc#4=wc615{64d^CM(X_EDhqjm|4`vxGGa}1_n`>m@ikO81 zZXw^{k(W1AT3&nLz90RK)Qi~iI|3Kba#BPQS&%BqK^E%(e~?za*KPFTI9!SSkR@)^ zFThV6Vtt9gk{&w;Ss2_8FBnh6pm$PeQ6ywN0a=#n%5&+$PstTk{UD2q_(7J35?Q3Q z&(hsrN^LO^A$WYLZmyA3!vsVrO8QJ~yD z>|CNlC2+%6;!;;eOM;C%(HgbaOXXjYVr-1^X7}WY0i~j80P+&#&XT*pRO2^U5DbDY z*^u4E)598d>Gq+U`VcPvIk;N3a z==}P(kcC(Z1z@7il97dUXTkgJ%KUBM0NTUY#xADuS<1VXvW3V}1nwkw2<%`7#SI#D zUFU!?)%kH*hTc zvIs5K>vdrH>;vdNR)GmFs<^y{P1lRrN`0sTEld_;MOW*-68tbgLV`q)rB+)JHH?ou zZV^|m$;lFE39^Jceip1S7Gvcld?O{c_`fMy2rjJpGRuXy5}#5Zw8W7wErBKM)hL?m z*#lcXPVe!fge~au%K^(Cuf<_5Xb;@kxsGWZg9Wl6gT*n6(BfFdV1Xl zcl8mXENVzLS!xb1!`W`J0F>YbSR@MhHsUhmJnT;WfENj}c$@DqnXWj)`--RW7GFb* zmLAjB72;Yw-bo$_@CY*cG6iPh`R8ucI5lH!{|=4GHJc(l41_osA5%N3r!6!xDfN5PB;S+R z5-jzv0%F*xOp`I{FXL=5bL8pY|M8Vy96GC%`Dp*JhB(8i0J88ibN=KcxRv#iBPPq4 z1)W;d#k%39X8{XiEy4<5FM7gA0-R)TI!XVEdhI5 zYf-hpVsi&%;TPM#9+wpR7t@-sVS2PGYqc`J^Aq##W>N$qGcdqH>WfM_=X^WJ6;<3< zHKBjCYVcI{fGHj2+@ecvDL8NN^`7OHc;|S*-Mo%(yr__%E~HypJG@J}tm< z?qQYllO-K_-w#26dNkTbaE)!X}0xV%!a1Ua{R4v7KLl@#0z```71xMs9sg`4d z#a$BoZUvS=i-Q*B!dzpy=F0o;`kTP=x8k7QsmXSav%P2J?I)>OK0aEaO-#7SqX{Rp zlz2*gVVp{DL*DzlWd*wrQ+>saT#AAGs2sUSwK+-D>W#q5`Mgb$^{VGbOXkh*6q)6( z6d#+Id=x_*`Gg;shc`Prqo0;@Yl>ME(*P88jp-}n;{^@fsr-J&FNPE6=ICA4Q@pnx zR{$_Ys~hzaf(93J&%5v*vlLftvb){s(^tTH>XhE)) zG|k?V+LcI$RW0};u&7R*?LAS4vC=vUVu?W;tNop1F7?c^jfvN5yimcMT_-)fl4%Z^ zDsJ?4$TEmD$1UPd&uFVo~=6|!W# zVBsGox(F-?wB%9=ADs&=?p!lTrWd&Kt;Co!GmcnfS_4_oD%j#hV%_$6Ud2~i2(qA& z!MR<#M;x=L)Tex(f)d6v^8Cckbf91LU)MT=tC1iViR!|!Nf)^r-su+L*u1N0O5?h>`@)LqAoKqo-yUBE_rzAlp z&BX~}CVVT6oaMY)g;Dj!27BK7v5F!sTqYY8d~huAlv}XzO1~H$6V+7Z&@>DDFSkB1ek>+Xrn-^CaOB+flsJVDWX_~2f&QB>D)>taj5ylZ)FFbpH&Yd_U?pr-jZ{<;(}Dc7ge-PYrte#?}>Nz8h5J3uK0o{11I9WQqRbm z5k~Y?PeF^gqPY!|X71^rB) zyPgY!h1v^I3-+MIJqP}l2QI9j)UpsMViv;%vq+36>y=NqfE#7Yf;x*=vIJPN`?6pL zrK`jfaix|IbI20%I>u{wC6mRfpNzav9VN)ZILn(Uo@_(P8d{>**?>!;KaZ( z*Su^W28l6{$R%}vla6#scO55l8{KRw;vFBJGYJFeQ2dWmIg%;Sw)D9wyDG%9kTeOKNp^2!uH<+~4X5KJTL zX-Hf7^>w+l$~d!lfLnMzofg}y+Zfj-fJZVH5n(Ft37L5Y7%`BXK;+a4G`jux6pQW96bh`N_;x)U| zX!r=m)4)I@0rrVUj_f|eSzv^-UE4HY6Kf}#Q{t!}_AaT0uY4Fs?m$-W@s6#W5PG(< z7Jn;YOD@giUm#}rpOD2bBC-_FDERbLpXP<8JryFO6p>{DtH)`EL~P0kQIx16J{aoT zc*`x5gaVp;kq`2&m0sCmvb3$?{DvS4XM0YSBa6u5d>CmP6miSkZqS0-VM=rJP*Txq zbJt#5Hir+o+!Yp8eRqbT)U7s>)HA4!%8&(|I9ds^1V$nq79inqqs7oMSWvUjva~@A zI&{Z@t^t8V7RYiOvPiDxr|;-YHzCWJGmNlwtHvU-V07%LtXee~Z9rqNL>7*?WqM+& zMwX*%HRpoo_T!|uo}GFeIdqXk7Dxk7?l^q?_39k+^vh=Lc2V?gZ43@`|411w5d#XVlvqWcp?uy@I4^Chkqdsmt%nVbTXFW33WVg*|Mak2;*CQH)x z>`w$Q`K{1<5tmj*7BXzMsl;Oc(t5J&aizt#eXq^(?Tw=c(mJ)BB8$rRC*^SfSE4!W zIqRN1Y-4%nt?$17b%Ui)9HdJ_6~o@9VMQGd5FkepX;RV!5YL7y>hOYhtHX+LA}Sxr zffBm#0wRk#k4=_Byf)AGDt9~Er^1KG!lx&ixkbyBc@=8*xf?9n$`X1yq)H4f@@ggv zMGSA6Z-pa{Ib6}UuRIwy1q|W;;xC9q7Pe4w3e10JAJ;tomnqxl zHGDAR12-V!^l}=s^e|416)k7+db0dWF$*$T{%N$JbCboydK*1@o&0^2ShmtYy}mrX zh7{H)zv%UA9Cxfyx7B+4+bdQfOz>*2RqtZ4{OT@Gy*AjTtAl-yycZbnAB~7bWLb*^ z@r2vC;R$I*dL)kHn?u~<{9%X!M4D#d!(;OjUZkm$s#*8OE-w}Eg9=Ds8I)WdPo68@ z2cz$BU@|(6SKBY&(~|L-P$r4T+#8+U4s%JAp@m)qg|L=-r-22R!VA|9S)2{CVzi|_ z{RkX((;n76!jIRkLd}R0Unv{L0%)p|-uDkuvJo0O5Z3lc@P$p3pdBAE;ya<{?8LK2 z=S&urSs;rd7*i(6HGb7)Ham~0Cg!NP{LU2@gC&tA_D8yUe>s35hU8w zr^#;ht;KW!C`i|43bX+%OyHwy?FkJ<5TS`Xkn!-8eT$3wmh4~n)|Ed4Es{r3rL61N zMlUB1T*mU358ah^6F2SOSZsG+SZ}cf4`B?$wZOaW)RzxeQ7c2ZDHPIrLMK^K$qo{z9vna%8OB z8oO~^XwmM-25Knu1$1_3fJK|qD{_}qgwQI^(61$%$YoHbLqjEwi`ZbP(22Rkel~i6 zmeDdA<(z~@lzk>X04LX5~e zSjtjTYZ*{h;_TsPUjFUxpB7mb=Aj!MWF3H|Q8@1aFFcj@CMLe;+69(1-KtL8{)Gt_ z_lM<%$DyyMOD)HL`t+e4Sahu28ikBlzv87}b=|(_(79od9lV*&36Z5iODI2%B8$kv zc)K{#+_SPYs&~`SVC!1Y0$FUGrAj=hFi!%e3do>hmW}UwpU6^dloJ9o`lXVWsx?VRF#zXDDJ3C%O_nP=Ey&<7L)K= zK7C{RZrjw591J_ONsTSWO2uFMiwwa9LbLgN$Hp9nY-k%D`=ypd@?Fw#0C2$ zbHyifl3|eLeUOD+ZzRJSy;Y@j@rsMr_wyoa9JBau7P8pg-fo|2GDZX~6Ns1w&VUtb zj29aOK#Q<~7POcqgv~Red!&6g+{{|c;FAC)gVic0v5|A`$sk_UU3@CI&?^(3bz%x972af0EWL`o zPckpAfk|;CdGqSfN?chqrSHHdlUM>95?FjYP$LCJf;x-XLIO=-p*(>CEID_c$jFkH z=FhKyM~x|QS*I|nG+C?wOCGfNn!DV6{7&y@amb>HdPMpD(e00Z9JF}C#b61UEO;ZM z$mxAU(?Xa}Y8#8)!Zb0o?$URDBGiyN<0=O9ZwrSrl%7KX;_6NTvQS-U^$z^x^qx{mS+8eMy0Yi;~jy`j#+dP)S#tZNMwykghZr7KosKnMoUmU zIfD-LuWz58IsWwTUwP*Avx-^fXUF%-A-Xa)EGkPP3)NLlR12$VU)4G*-gs*<6OJz` zwO~*gcE|o>1zVm5EnZ+uYMfKM0~hHr*@)fwUnC29i)7ilwr6@l^N#Xpk?EE^&@REl z8M0L23f8{V#qmvX2%(T=P^Rg6=$`j$B7A$gRx?z~p3!SR&2BJCq3-cu^Cf9uuEC)SbxEJ!BAi&sR zkv!P~%J@b^7Ckv&#$HT;r37OOYiNSa!IMFS2m!h}MPexFbhPx>D%! z;N}m1=z$L`uDFOSPbRMTY$(;x0!eb8eFZis9t*H|oP)~#x_SrX;7SBJzQ^ME^{!#z zQmITBw)|=GB_MDC|NQiLfF+=^RFNFZc?3o36a{=sNxF45qeRf-Qi0`DkK&NO=LS&X z$R*?rE@++QHa99W3<@3a{;$;Aec)2HoL%{d?T!C()w?#n>*iZN$$~@GQ!q#LEQ zDZS693z?i5;*|)aZp3-m6O2sryC2%VV9*LmIBFPEx=vVbQ78bF#&qF+Fmhr{ZmODN zi!vJGNRr`|JnGbZPowCef4%rEX#juB-KC8Zc7EW&VCmqwwin^vvS;%<8np(aqYsr99SO8ev`Jp_hOAi>JT5K>sLaVT3*&MGEV-CKY7{n0{%is+o+! zvqtL~QhDq#cC>h#@mX4pQ)z`i$aK-sA@X5}1;*qdrbs6RN%&lXmj7?EFt#$WegUv3 zJaO4xGZv6!knV-`5TewhJ3PjMQpCbPnw#GxvJ~wMN_%jz2w4EsKr6r2nk+;Nws`I2C{J4oDguV6tsve`Vu)=hJ41gSEX4JCwz{BDIwdZIIP;O?^K}x zEP*YnO_tao2~_ITmlbOQTmH!9)S7DS=E95}0ysc;(%^-rc!XfY$uC7RSUeA!F{_0X zp#^NLUVWw=rC0|7SDupb0yL0IflM=>#WAcZRM z6}V<}avrS<*VD9chqm>^3$5?X{5 z^JFPmf*E1$0$H|e_sTbH_ad?cSK>)t7Uqe3*yFU>qv-CP>RI0Tj_W>s-S#VQO<=ie ze^+ti#+y%k{__KDY}A^sBo#Xfi7ceQI6oD1GT&r!$fpWH9%s5Ljje#hh5Y~vmysNk z;y&F7byxyL8aC`yup*-5i}sV(F`O}3T%KPZODho%nJlV{MCyl&U<>zExJl#?4lI18 zJ~5se;~OE4D$AA5iw1;9G*PhQG5)E3SsTE<_?$uuyU@7Y_Wp_zK`LrE-61|%| zn&gHpq2&m6F4Xe5p77~%1hi;E5|TidL8vmKz{p?3_W13*h@DXc79E^3U@=+3@_1y| zouI%OGhznskMtyDnrS&VS(xuU7g>0XHvQ;sE=cnzRNyRS-{f4}-3~|+XOt~-Ja@*k zEY7!a34TDA2m)}NP>TW0qWm(sAGKxmq*AC^wfi}@*LkvPWXd`^w{>$=QjWnFA{B1Y z?oM?dwmit)hYw$W7_J=R16?nDB$>h7!Hf%vRxy(Ww79uRkxMNd7VyxO$r8NDx8w(5 zLViG`a4O90%-qg}bC^sggDg8yB8wZ%M3xxBzo1MDo+`3L%yQ28mq>*zAxl1ppU9H= z&nyDVjT%|>tepnSJ4lGR)=yMpo8)8#bGPa+@3`)+yB@hNf#q9Y`sB^n zycRazvTt7#RhHR(kj3_oqJpX~F^0r`HD%gHjB@?o4QW%82ccrwouf*SWz1trt%cc9Ednb(KC1l_ZC-zO2i*eiGkz>-8OC9eAjM=sa(?z9xY4MKNfK}YElF8*$8Z^h?LA~wNr%ngk{W2S<{Y#jh;l?zE&v8v zgXsxwJpTA*$1R7XKuhQj+LE6maLHW7o-2^T2sBd#M$ zKqVtf%7z74G&IR&E=u?&i^0P4(WBNoE@#|j`={^v*jkBYQAhA!Pi|=}|NO^JS=@=nHEbvzf zrpWw-ZZZQUcakBQ6qAmg%48zaLn+L!WVLyxzp|w#SOB4N#93{DbN}e zggNnTISI&-d(?bfQO0kU`I9Q9;QgB@-5Bjq(Ed+q;3L0y}iFda&*WXwxSi0#aGpGhe|X& zmx&gIecqlK*)T#KULUNW)bY^5H^6I-Vm>wZ%*(I5{KBDAQ!}(Yjp}nNjg6j0qUYG# z1lYeum$GUFJ-kB1r}%tvM37RI-FL{Y35}hWH*8lHCejXM6+;ELp&*?Gv~4fvjKsV9s4^AQhXbG+STNfAqW6nk9#4@$M=H`{lndSYHiGa{zZQqT?= z-zYRWx#wLnOxKqY1B!ZWM@G!CM82xZ#2V&mY^cF<4Yev4=MchVX~cRMYVut|n!OF% zzyUZ(K}%IZOSz3D zz=ye#ZNyJYB@s-?V;9URzb>*orI|?zG_VD-Tm)MF8M357MswgTk|ojOt&l|{-p{H& zEMv&IwG-3x+LgnKkt*w2z>0R?3ls8PDX9QbT(wcjuz^IDs?gF{k|2u+Fpmu!CsRJf zGnH93%o(r563s}8W;$U)0=?l6_pVww-e6fpA}Jz?JbbCeEATGu+b2ZOksTw+S+ys} zdXWXbd6=cflnaohPJ)tGX}gY}>M6S1oyJl;Ig^^c*0k%xJ!qMsOMGQFNE<7JFT^%{ zyJ?+s3UAasa7H8hs2har+t^O}3Q+3#ax& zF&58_&wcK5?kXd2$ty0{RMznF%U}M|uD$RDegFH)YGn+GhUA^MfA0F*xzk#*4Gh)U zhy`M<46vx=A7|%mnB@t9M*pFEH(}c1zB>mm@0K-FF?g1R!Gjy&hEdtP{iYSmAK+9y*6X1 z`K$;%_`ohNr1dLa6zNrtiYv^Z7NcdBrHn#@Tf%}TbQVXc*V&0N<>XxH zX}F3B7vdCK9jB27?yW=eK}5?Y>T9-kEX1etQxShgx3wuCGfRK^Y+{ljFj{8>wNezM&0 zFliLh^cZ-FENdXk`1s`b?1`o#8As2k$f^=fkbE*&D2xvbB(Mw&Xopd+{Z!OVR%SPr zs~hf&8e*_SPLa{zHD`9&L~N^yJ8KLUo}g6H5F+$2SfoCblO-IExz6SE9AHsZ!!e7W z>KvIm!v^#M;qY<}vg84bnc~ZMhLl?s$7&f)?|F0u#l$eIfYv(ba%9nNu1E%pRP8J3 z9@kwwuTRLrDoYA3$(4qhzrb>)MwT*t5UfGfOwq0prypk&$c;Eq;uq<3n91UxWlpYZ z))9WAkcBW?uKS`1VBu2d_s?Dbxx=5c4j#PY;m_GsEbNe{3S-1Th@6z?Qq|7Lx%bun4k*B{JVFWfsOm%@yI~6rT#7t*a^MT%7t^*>H$PyAdGRw#40897r ziE-dwF`LkMCkqQ4XJ=2Gm>uZtZEC5t7?>$toMF>t7i1CQ(tgR|@yR9V=no z`^rmC9XUQB^RTvNjp1nNRaYxz=vIAAKuCweO$s`;dY$f(QxBh#aTsVZSu&Fs;iO)N zRBbtpHiH&s5$=R62%7wd$#TiRLY6}ZkI`ntK7hkJ=H?u;ux$mh%(mcq&>Pc_Cr%7h z30cU66<1B7jY&YHrKL)=s_KBfBKy+`*_DMplLhNAp@nRiB)W(!>KnjOY&Y^COCW`h zlooQ4LPxRPWJJ<4bG2n;(O2Rbj#^xB(fbte<`TX_5_?hdabB`;o%n*Xc*TN|F?|_n zJ2i$OdtmND`~>_w*ox^su>@tW>l|HLvER)R5Ro~uw~h5h<(^9sRSL8;H&g&p0$x!*+Axm(1aZ%v% z;NrmL`v<;ngrv|0w8Vs^l<1N+Q+}1pP~uCFCALjswsnBzFp$NHX%^431X<2G&{9W> z`Wj2^(IpT%KUfgxFj*Y51X+xVh+O;>++7eiO%~8{yTF1jBWCfZDQfvRR3Q--GFd)& z>*Zb{`6?V~Y4IN7jjM`-?E{Kf#vw^;R%}u$vB6Skf-J+Gm6VTf)#D-tXc1W)w0xc? z`T(?`ChrH1%DxshrpbEIBd$%B#FjYnBuh%kG*w(7mko?ZU({3;9FfeDa9;EgmvN)j zcUS1|?X-uO=kue+-?_;JY7!lqO(R5V|)45)N>3INQP-0E-r@L zk^z)57u|gzq_q`FEwcL*SCD|B`IVTL+)a@M*eDqXq$*=$JTvP$US1|BQp_Th!4z`fMpQH~F0f+;_P^e>eI?k~r+ScrBXJzgpVD(DCEC zRISB}S`L~l5x>NAi#y<>)J`S&3=c7xVYAG%E*- zZS*fdmYg0-$dXHUpBF8-u`E$t(4xADba^Jbz0gt&JXB|?7wra%$nx<3OOQpEULpA! z@x}fo$S^QIdkbNEdlO`dHNxJ*;`;o!0-C0l<$HM_OSBTkxEf+~FIbm+#YB{S9P_ zHI;mLborJQC3-l|e)%cp@L&4r>EnhH_OB;%ZD9ec{83IhcC1?6kB~3_CLG z`gh)L(=n0d$$OMd%h?im$;pD2lEs(tz?;uVhT_?^>OR5AQn}IsC!{*EC|;q;0$3cj zL}%DeDW+NU>`PsP;X{`O3*u6+W;ZeK-?jI?*fjq6eXDy1+j-*+X;A9N^*$B9hi85g zM3CI#>|T(?qs_fs=P%+}sk1Mc1FpuM41+B6C%bmc)4>aM7rzwr*w2-RAoFyXuee_s zGSp)8%5372(GUbnM2L(mgaB806^YRj889hk@AYooWp>}+rj)Mbuj?1KE5}f$+Ko`VX)!^F%n=(? zW?!3 zw9aYr#15YQconC;5J_ckNAv2o^Zi z0xcJ?*stpvqbsaVaWifILR<(eI#9rJ?Vfw~02aECL5qSDaV5ZFtwXehWn_UVj#;>T z=%K%=eDycZrg9`Hax$bNj6lCwCFi4*i2b8H%tGlMcJPGg4puQ(Yp|S-w`WV2ixQ@c zTL5gvVi%ZAJXvJ%)M4we0sw0Gx{AtwjVzF?;Jh367%Yh}NPS~aL7P;dNS+KM20);N zdz1H=ohD=K9D+#3jlt8Ic^un$o*;dw&2KmPmdV!*tGT#E7`b_$(Xwwpp@(?7-(=w@ zL)~pI5)-wOut%# zjTW{?YMFYQ{vzN?S9DKE9-c=DExYyV#72;XHIxlylLd^B6Kmy1wS^jAjcJxNCWG4; zKYlD{Yfa11APY1(dyFFfZ=ZQ;ZhApYPy?$Vta<}is~>M~L1fu>_0^E&CVZQoHCfKq z$dXDeri~slVU9(6nC*`-*FQyKN%^pZmaTwg>whpCM#Pf$2Y`&XPL}UvWFeJz_}Gpk zO77r{G63ycW)N4j`x!Kb@L@mBcr6ST7N-|j@14vUNc=7I>5%r^)EIT4(k#e+L zj~1~-SULFBuO8H`(Dei^Vv7S8AtVC`NC^dIOq1+UU7I;ssfCv^T!Jj?G;#G&fPaRH8}~me?LE0p;ftdz&k!(=C{@;svrUq za&@iplqBY;Du>9Uy~-16B!s|4#$O_x_{N7c23cp5HZ;*VH?gqMC?t+4@iI&{#OW3~oM8hoq7kcPLqd$G zpothI-r{93@du3|Xe9AJ@bx^O_xF5zRws%WeY&1|Pfxq;`#SI2^ZufOmhV3F-S4_c zbOaw8g)Q^S4o!d+x2V$r=0e(PVit&k0E@}uY?x{*gUoKsP3WQ}vaEa4y4CGk$!n3j zNmCh0h;_*P__$h{C@1i}Hl#{5CpJ> zIQ}F3gLfhSVzQ*puk5mS1&M?vOW;ml?bOu<=s0|CjljY@Jui@NCbH}qzieQWTiB~3 z1T99aq~|IrZc)qxIQsP)t6?{72J4Arn3Tw3k|eWCxVVrk@eA=SRVFKw zvPsHR;#V73wx>93!fpaBQNx$=5&c{jxrgNoB`@Afe9fY2OH4`HzxX1uEGXi`6%?1b zope~8lMD^TR}ryXbrrktspI4Oa@FNj?*WU*k_1?YX+##Ygcj)ds!+zRIIt?MC9;eH3iXL;KZ^|`VF)8ID%T`N zw0a08nGA<_WoM_!aflB+8nO_c_`xEJ;FXBtseeSSOwNxYiyZQW4z@o!SP3}_NGUO# zxWteGJ5<=bD|Sn_f;sgl zs3^~GrQCGwSQpy`?Cs1`%4|~3=~O^GInRrS%G#iBvcy_51|tiDei^F&q@PMA`eUP7 zbEZ8_U{c zC8Oo&Io9Uou1Z^5yKHJt-}kKcv^=q$@oDBIqaUcdnC#t%@0@Vl30d~9O=LNpLY9OW zr2JTtki(RVsIq`8$G&jXL#YQrZ1Gfnm1)T$N#6JFDu8*v!`MJJ%t&!~GBKux5R)ZWjVw-!l}nSW_NbL1 zEe#4#O=DyF&YnV6~=`hav)1akWl@a(vIZu@g zjPrJT&dlynSg7Bw*5d4ThnTDQL6%?)gOh|Q!b;8-okie+Ui=%}$R)H~;E&Pb6Uo%! z;#VJd-}@-;ODe56Z^TiU1^Ye}^L9TR^Mw~fhq8<(`4^xigNwZ!ty&*)ZfR^mlmwO# z7xF;G57XDylckOv=^KC)6D;GI6l5VHxst%;rptLXG1j>($dV$LE3UZOb(pK24YS_4 z@*4-gadPEegXIO@N4jEA@yNXLUA)(VA!X|Eq_jYTx{u499NFAS+m`KKk(IBykt1=% zxV#vmey?0w5XOy2Rf~dMU>t|UBx8)g7sM~s#|epCR*0!cLV>Vw@lqAYA{&=9!2&n9 ziL$(I6GD{cvH2H?BSMMf9)`jZKNKrV(!rhsbW^pvjJkJeMSy<<5s!4(p+hq?POC+Z z7ueTXXki~FKEm1>+3oBd5(ar8g|1}XwX*|A!iZ-RO`b zBgWkVTWe*I-#UYuX(KW99F7p@hrj;&U;pY4&wXcVn#=-%ZTv0UMJ=jGjg32-hqNBU z6fr(H+&-oCU#E}H24A?!bt6Xw{n#|g#Un=^JbvofcfRu-=2|wjVRf7cka>wMqR8T9 z#yJ2Gr~h;-%Yr!NWoPh15wt9oL>5MI9uis7soIc_(>FamGC$JXSDly#EHM~Dd?B)s$`V;>8zOaS zeH~fWcbG%MNe&j(#j#oGm}RPC*ux?T24cZ#4#ocJdacf7u*^^EMB#?hsGV)AP@DeA zr6LZLOEvrcG>(#n>ElT6Y5AoxW5FJEWNwVE6qgP+X;RB?y*lExx@;4_qwspM#FOxW z=?|n7k#0fCmgUOH!jlrl!57G)nhTB3&IC@f`hivY0|Ot)`okE*zc1Tr?5iG{%-Irv zdEliN%@zkP1_~cO;Ukl;XdQ_om>>M;+jJodE76hcPAdQsX23>EZ7taQJPHF@Lbbpp z$l|hkJz4U?iggVaU2bHX*xel@r{`=Z-XfcGLTA~@mDIXrFyf_P;vaB z>549nnR#wY6Bpjo=(Z=mPSTtp$cf>ReX(meq}$vMfGYAs87wFiD=1Vs6sDU*E{s(l zLMqns0-HJ;@uIx86>H+_8?}!(^M7&HuZ;LlxOC~JW)?vr@5WDqq3{Dil(I-Bid04k zzm}UXjw-^p#TNX{B8z&;ilGXntA?V0(*s#XdPJ7$U=L)`;sMBVU==en4OpE)Vp-}} zOqQ4lmCE9thcIE0+bRe(ZB?^wf>DimmP`KrXTSR0v-hnfb-;$IO*^|P>dVm1;vJIR zII#s>o0f`1VDbf-9iJwJ15;u{BA{{Sn9&ks;UcG}zRu9(*S8P!E)B3ig9T(6uUk6# zax?k=lq~rdyh5@Z5n2RBVa0p_Eez)G*5a>`Dh+9v}JI`cR!0rAJu2tkGNg z!&X@K^)8I}T&y~-^b0D+3t$mhy67N8Hr8&p$)%eL=6Sf#f>M2?cBCH`NBFn0>cD}v zhQT?5Whu{K?*i(Bt2)9YKV{tXdqFu`R+}uA$g+W}K9lOnl7%dp%UGO=EK{D`1k{j_ zpoK{)xmVux4)1uREdxhNh9}LLyz)}V7wLimm)}I-Vx&mI$xAQ%=3C$T%?mH-DxW{$ z%;5{GNlX=YB&Yg3t;Bcc$s=8rG+Se17^ls0wjjV#N0u9EFo<3-=?#2*`7>V@NUo_@ zUfqw)EOp+Mxg&Bqk$jiwvq*|s2v=k}sp*@j*Q+5cFXC^Dm?gTxn2tPo_~6l#2`sIJ ziZ&o>y3TJ@$$3?~H*|RXu57Z9T()(wfui{ig(%`l^ak4*U#xINq!x#0l9Hz+rb&B- z2?T69roJz8$XGI1IDYeRivANV!c2EsHs;V`Ut)tN8?RFouoWaAGXe=QYN!p@Wbe7h ztKQ2Wms{C@B#P@y%rn{HuT>R)unAE|Av`%`n(RU?Et`2QT%`}U>iuJteWUw!th#K; z@(Mpz#9sCds1$ksuU@gzrh$RATIj11l-(*ps=_1JSGv3xopWUo-Qxyncom*RLGs2G zTe^5oWe0(MpUF}H3087)!r_a^MI(|W`pQ-ja2f!RrDCs`N=gGJaT$2(8B$SMwHX@w zQnQ~1j?SDp16qFfhhP8viE)u-aBgIT36>rF7CEfwc|p573!1Uzg($=-B*PT6KpFeJ zPbsNJ+`?teP>L*6^4*9GRdo5|#~#->{(URL^ImXJ)DmPFhb-Iq_|M4_kALN4p*QRZ zY!O`+qUGa43t>xjT~iY^$bxdhjq6u&@U|nRI;8lUF-~%xEV$?cyUF6f(+2$+S!AQ1 zY$$oqe$Yax3$pOMJ=Oj?usHQ)87y^d;WYeI+G9dK?$GxQvdF=!PSu<&X=Sn2)6c78 zcmzK?&07(oyI(QJWh~f|VvTu$MRj+}RhTx1`tyL^0vKTA^p~yl|7?qZH+$Xfq?{{~~jlmYfB_|5S7o7<$ivkx> z#2|SItVqBGwty3_P|V9QCJTLHcU*PT>)(gRBya9ro)B4<(Hmx&BKAt=ER>NY2a7z$ zZV0jj2@+T|aq0Y5=rjJf<(j&xKJ|`U_~INaw{Qc`7rJ<8KR>fnfl-^-<&fp3n>~F4 zQ9ukoRk)tT&U|_22U$M0cQ0f)dNi$&Y~Vnuqd66XHoZLsE#08T!^V9@rdzI6Trr`c zLS1kjq$!cZu}bbRxm9%tms_BRx~sg6-F0~nyl}@M%N=8qo(8rI0h_Ob@#dD6fd6_>aOEMYOPTo#iz!)qk?hsi%yz5P9 zvwuEQPiNi`S@E*|?VErQ7mBANR}AAy5`zs^DdUb~W!`F<25>=8ix6yFdK#$*<3@-91DXk5_GiX)Kma z&_YvJBV^g%vw!#YQ}>;^ABcb!DfNfV&J*}x+3VX>**^|Vf-PV4#g89LMlWAxJ&VW! z8;ll}L|)aH<>kR*EhbA=XbG}-LdRr@d>Cl?2w_WgO%J9n#qQOsyE%-qT)x=n{VZg# zT;qsX#l~FWyXX@iEtN-->#=&J2C?`Ym||g~Hy0CQSRKf3=$(2}p}P(&T(8}bh?0Xv zva9jD(4q~-OWT_eqdW*J65eK1^1fXQ=6+f8!seAMyGv<|g zN$Bd|@g9~1dDIHBOllXJViw4fn9}c0La7`qne0`dtRFCB4;Uw$B12~ZSI#>e3$D~0 zlI>RpSh8_a{P%`{IN|n3$cB*#yYcS3PDmfQ8@9yMBqwzWw1Al()CDdA$zKhX&|ej? zJk6&<8nXqmAe$ziO>guavMhVUvbT7fWPqh!0T@vL6%D!jm5)jWI;Dk$cHRS=Y90%t7^Hit64oMZA&2w#e2TNN@A7^ zUdVF2C*@^5Sk| zI`d`X_(2L}A{VCqO@{_t)Oib?1Fam!;f3qa%6+xkejbj zPomGjLk#<;V|tCL8Gyv>J``P|HYHa@p(Bfy8LYFEqVpUj6i!Gg9 z=b}ee+W++@|M&;`!={)-K;d&1UCMejdgVRfW0o#2{PW3(!4W8x9V z+7n4KbtKg?VHsHvCplRJBNjV)^d7MB3SDODF#(ce%0EL3non}an4D6VAh^)%9365H zMb~lsTzX!EB|Eg+c)+$0?Sm78MZhwt26?>?qPXv_Fo@!LM;GPm!4e9x*wn@+b!17o zxAW&xk9BY*q&_i|MbagHpVMC8wwrX=jW@o7zrz#vYIyR5!xm9Rk;=k4{(`85s}}_> zFMO*`F8~{ZC9%bDdAg>vS}1vy(So?hHWu7o7A}=k_inxfAGYKn%SB{~u}9=sB{)O8 zl7B2j%U*+|MwS%A1X$|Ga%oetWh%7XWVyDY$cuBXC9-S_vRoZx`Pi0w?m2w&-Ix7V_}gq|4jhX8{w@FuS0lW(3NZc%YK#xLmGwX=(H!okTd zV7aHI)RM$`u0yG5nSQ7kBF9#QdWo6fAjL+Li7Wz%X6<#Ib4{{Ddd+k6ATl-;`%8r$ zNoeu$+~STw>K{sL!B28uyC6#p4v>tW5(MG+V9K z!o=0+dzvLVAru~z3PfB)%lR;@2TQ9wus%B=HOySOOFir|L<5Zf7 z8(K^whVr}dHBmW!IV-PH9o|*`DqKXdonl$kpZZ9hp2M2jd&kuD6S^RbF9VKOu<;q@d zr@yo8%$Mr*w!BQ@HX=6qu&wKn`_Ukqf}xMDYbFkIEa#=WMq&ph|L-#z)ned7ab zNA&A;yuu%6I(c6)F<0fG)90tQn=JElOz(f;zWa_(i78V;%XwRuC$tOXekkmLN;Kwa>|-sAh~+Y6DtHAlI<-d?1m<7T4A0#bim!uU_hg zc3#B(gqAg{JF-A#br!WOA`7<#S_F!V$U>E*&8=YuOTvl2A|XIf;zj0U(LPGbNd6JW z_z@usGritAKrIutCF&&D=&yGhK%ABqva=0>tc`voQNzp zz2$PR#^UnR2`$vWQ9W4#En&M~YdLnzl9S~P1_|flhgorHvP4w{mIPT;&aVfHFXzx& zEQc&NnPQ!E^X_TTu#bH9J?S!{_*CX4f6e0q~+YkA$6$pTvBTYmcdJjI#w z$8WrGc6eUXmQ!roC1gSJ*oP@cV2kEjj@YM?=tXEz)Z&ELWdk``(EkTn5?7YLd&gULKd$>lLYUs#Biyh}=%G|sd^UlEk!DWL_yg6h9R zma+^VsQj5M3U7D{1WiI&DvA^DSE1vey=d=!v2|UQN|e_+w?~GMd-&<~4E`$Ek+UV6 zZ}IbTXPhMUy#XBw@|s`NrgluTp+ZdQ1h8 z;ju|5PU$1a(jFm4c39UX zy&}-cda>G;FK-RVNbA}YuOdulqVH>A*b-!E&yeNxTBt|jnp>Mw^E0tbP8Kn!n6GJe z?LHQd2`om7r3wpD4gXQdg7Qh0`dUl=k%X(*w?dyyZ27D!EeNPY72hk5fAsX(v##P_ zDHrg=BP($& zZz7X;Tp|k-_<%+0WUlflOcYtRT^@Uhod}aY@eRQ8&KKqBa+cXZ+v|ZApn*gdFym6a zYYp7Y`5}#@OHiQI?&_7TuCfF{JPWBod{pr|$RG%E8(1A#Oq9rnp>C91{=gGpi7j6u z%W?)n7?0U!vLItc@+x8^2pT2a4_DHSEP8h}reLz9wZzEf6_dq^WSgb{wSyk4fR2 zy%*?5971Y4+E1Y7P57k#e*gDkmI zSUp*|!E!LOm@Ppc$!%mbQ-htUL%u5bxqk`y=XNy zdip;07{e0zw?KeG?D);WV(vs?J!&|XreSJoioRn4r|2>ZbA4sJ^t^cB`w$sRBw>RM z7m=9K<+&71rhp+HZsLu4JH4I*@l{LEn{&9-R^n6R-b4mUaSH>9;K6EwxRC~Hg%q3@ zceF9iq8<86b`VMN6S$nDS`)uQbsZy4X!2sZ)N}BS_EzyWu2kQUT-a23M9~MGi)8_%xjDv$`dZ8C&8yOIY~)m@lk*<`Tg&#+Wji!oU(OP`CqPf+ZN(1mA`7Tu zPNRb-FPVAoL?PCjrC06BbALzs#I0x6?4c=may@gi=2KH_`{cp)zNxO0jqm=o?d_+B z&+ngRcHFKfBlFWkRz$6x8Quu*!`k#_z0aef| zAxlhda&EFb`lz9JWFcCpw`i{A#8XJwKMl>Rg~5_^1#=2q1x$ zm+LwXw1k~lF-zidT-Ub*33@?*WdT`)2hfrV`zhn)!oL4q`F`D0t&ye2WZ~7)yq1Mh zAzf^b99T{kFBS`V{?WbEnd;&-$l^bFT`GHmY1zD})?#TJm=$QLg(mOk_FHsxD^B4=#M)Gc7f=+yPZ|k8XF<7<93?S0RhIAgXBT$;JN0Ia!RAgcP$N z_Eq|Wm}MbZfJ#`rScXQBB`>o;jw^Gr7-D`TRbYdj%VEXtZ$Vqy~RrUP!Xo!C+4aMv7XEG1y5nBUsq(|d#H-ybXWldRMd^E zl`Wo-H(nYA9?zasm45?xMK~?6pmMS_Uz>Ib(sQh_$C(-CBKa-xqsXT~Pb1DmlLPz= zr-Fvo!XU4izKn$4Z1{&FQMm_^_wJuK^XW4^GQwpRp_wSLphoitCGFiTA)4Dlr zQts%OIt@s~klFAlpOR5YkY)Dtl!oz7dn;H@7LLw%>K}2?!v4QN%Q$HHFOcPR|1Mbo z^*{>0)KjnmL6&y_774P@f1IPmIzqAK{` zYn}c9SrS|lS;|HJ71HqzSp37J0)A9=Y6TI0wafZBBNAD3)}K)W>C`moNl@mp$?LC6 zaa9$vgrWv7FgWN4upl*mZK#i7ngcB;elxLRz?|jF8KLBtJmqwzTaHmeOR(e`*kWCp zEn> zOQ0bmi{c!Mg3B!?3wK2_tS)AeY+}ik+?{`;yeDB-R9P00#kvB??3fw~2{HQ}OIKMi z#`E~w@Id|;VA(=T*gaeJuDs{qC(@=bWq#aI8(A-@LLP=1hh0{7DT>hTI&Su9e4mMPPYlWU2R0ekEjiWTnXBkOe_R zX%SmK{@{aDVvgUh&g=auTZ=54S9cdSZ!Q$ptphCVNq>b5P!I!ispuvjtkZU)J5FC)`~`7F4$T zgVRiD!(^=&%$5Jt>4p4E8CJsM3oQC_Ze}c{Tl$C9U>&lbe!UgmN- z;<>N6<(6v#Er7)r@(0W7I9EoNjZ*j=bCbvtV2QFlRH?1DS8;w@P8P8RM5@Rl-!Sgj zcKNc6^co*L_>C=lw;aCbuL8?U_Gd`}iTj}ZDH9O#Fpy<4WI-}HQ7&jlvEaU3$1#Ug zU9de!5T>aTu9UVR9k;Mn_nU-pI(YRA?AKNgag5&e@>r9r| z@O53f&`B)9Y0QiyMN2`9zuRBNPo+aGi+7Ws|Go;x-!WyS%AiG}(lW@mr*T1@47+&E zB1>fIY@4oNOw0UbKd%xKn}mtg1S%bTIVES5evfh><97FAkMSL}3cb1Hpam73_G(+g z%i^UOEuN9I_n*mvF+P|JZcw4LNo1KBt-vV`|2#WSFyReT~AWyL5(Xp-^>3P1gHN*!NlA!^x9T5lXfmqlb*@#>HT{d;5~ z8@BQhk>#$tzzTRt;TFmwFQvqc7VG$F5ApP{Zt_-QmercADhoKd+z1)Cl?3xR{wv=42rmHYqpeM9j?D zC6AmOZ8?iIEwaEBG;OWz5L7mhiHr;x0P!4<{MJzW0RNVhJzu z*nhptERqiDL6$rT7HrUoxZ;Y9Yc+4YAuF)t75p4S^_RkgQZin2liiHDF_+h}U|{SW zUz|%f8!cSNAq+}tItL)qOO0;Ef|6!qk!4E)ON)@vor!#w_jEZdDO9Rshcq$>OPb(| zM&kR@!&H%}pHWdnB8YGl*J-+g&%By1*0d&1;J}P?VbLU(shi$rJMb60ZA|5B?sp_& zr!afD1C=PYfD{6i3P~=!@|_oR&BgVdw1`sTa4#PhX7c5Yj8cy>jl&cYMvA?SvERUEhuJ7I*XbG+aS|CfH<o-9Jcd$q#m9vb_l5b{!oa4Qkws^OFbH_|*OMjAksb?Z zI^-c%+xIWDSboy5>j#a^{Hu~*3(C+Uq)4uvBx=Zd(`50lEpOA#lVn^;*GmM`2`u$w z33f!xV!@UCLnqQ-oCE_cN{Pj&qDT)B$c0@nUGUu3 z2W)X-Oa*)p5MasEVT-3t-k^@(v)O<@XbJBy$1GAkQ1Z<#8Co`GWHD^q8WwKI0UgNV ztt_yGfF-2s0u51$$p+U%mhXT6>>XEMp#sY{SjqBNxbmf!sLj*;Wfi)e%~w)g6?BsY z8?ns_XhfD7*IGP>?Z#jaRRR#pv-Rn;z?tj%88{MJNJ&8!1a}Y*48TObECjZw)wq*@ zPAkCT)+CRiXn}jGv!I+T94_(idUK~Y-d6+;6V3G<`^F^8WVdK_w%X#voPt1Int87% zRM1*1t&I?Al!dB#y2i1G(Ne|R1{FCPgE<@cS72C6MPy-e)XM=ZDpfNx`bzfud&d?M zH|PeNxwcx;;I=1`VHwTNW(t)XZv<1J-}CXMqN*@eOpFbdE`g<;6qLwP(rhF(^fMCp zaSvG$E>W>Zp7UuX8fxq0wk%?4K%BXGyWm!4nhnApU)G&P&@$td&FrPp&Z_PX(qZZa z8W|!|;+xwSO_1+~N!m0zxRqefh5B(dK)dIrB#UHB79k6w-eMoI-LpAad;(a|sjocr z*fY<3{l;+?rf(No(5oD?yzbv7i?sp;St1=qgP3hea3q}U~Zd?&bXvx>7fiLd%N`0%B9G2OFgci#I zjY*Q04+uBS(uSl`n4dzcFC^-6fS+-WsShxf}h zl%MW*%#tXAa=+r7GKnqOGRZ)T$&&9#-UwQ*&J$o<(s@YvubXb#cE?%Wef7-(3uT%& z5VRcLyYX)V%irX&;?2Wpfl=8lT&kgO<{+kUFXLh9So+ zxM9U+dmiDv$#&dAO$gAX<;W75H5Ai-;k8dy+qLtC(k95F`Umgls|C|mm_(F0D&)Ny z+jj5-U0P46cl!I(ic4T}EeWr!TSb=C{Or=Wda@C94;#8*Tr2m%<~=J8tS=8*1+^MC zAbXx^FPAodsW-VHtqpH1HORWFEMaUs#M-10E&I}Uxma>i?nJK;rl*hCB4t?Bk5+{mz(?@0#cgfA8|`N!!r7FFUirduerJp1eu$F|R& z7}$Q}_7y8A<|it=vY178XGr(qI zqMoq8JYJ2zj!rs6ma5)~>{%ffnl*_mtDTaz0|5gJz-5 zv4*(+w)uY65wB*?eUwv7mI&wMZMLC~ESz{%zdA`+ZjEQ>lpUchk)=IT2AF2XOdT+D zj)E+}#`1ZH;6`@(fJJ1v`(?;trf}lZEU5WWZJg!B&!!Hs-+bvMj`HCh7Dg|w;YSf4 zv@9s%tA@`9bm3H2IK6|Z7bmJBtjIiG7L(;O8Cg>MvNB?C$jO2h=FaL9YV~MQoy7r4 zWXR&4j4azs7RM?+kKpBDI>feZGg&^$N|vk7e*f&v?47)F+0Iv+nt%_>uA~%tz8vlV@f`2ePAXFi1A@I-n|A1VT zIe#j=l$EohP|p0vNT>Ub%TgtIq&cEWReYw!7zf$W&GR(!y-}y82=xQ#hb$Dfl24)= zpk>tAH`SO-Gm>3PcJQP<#3MxQdvFA)I)_Ddr&G+q=gVYqW^S+n*2n`nbsaYV7Wt2f zEH2%vir+IfGj=8;3&j{!Rso{7o)P`nqjOLl%w)N`8gZ!%vh34}HfJ!)t=c~A*~dth zr3rt%iRgwb{7tVb?s?>q1CvwqD>1h+jR#bz4YZ(&q8Cmm?sQE~vR_xnujaK{3%$$XPU*r^8{wZInXn9an#_~29f=g%{i!aHo7#Ky2;^X9Lr=n_r8Dxqg+LAOa^ zQbK5g4cz?T{K)iBsaFTnQi95GQkn&cwps&4J;mmVZuEGd9+IxX7NbQ04;isi_?xXO zYF^SgscyZDU_iaH!TNS+7s@e`a#Uy$S8`=H1X3(toTp)dv)j0)KlriO+a&^(uB(h@RQ zA230LH`&5QX!_W;c>AW0z87$$V?2eZ68g=3~TVW{Nu^97T|bV!?s zeF#sxzFK0)&ScRpdgNNSfWyOWCnHxB&-KSQ)2Y&LdPfbmsGWHGV<>_a4vS`s9O98( zj)_^8P#1R=4Hb}IpA~&+otk*J|Ghh*9eR}AmgQ}ZU8>vLP^C3y1B>n_fV29snU_yw zG4)b^c4fy7I+#`B;m7nd`YU+>%XI*U75HtH*6Y~oIcASSmK#E_z{4g`g+BefG&`$%oBO&5qX< zT3#)(p#PLCcOz9(f-LGkPWH_jpoA>8KtA%t`@QUJ`#7ncsvMEd%$zY>D4a*S%4ErB z%r}cHlv^bEPCBHWuTHDujs#ID5hcKaYOTdtfD$u=lI&4}EW|cx*JR0LX>V6Dj^``V zfu{a2mqCPM-Jq`dtzQ?r)A5 z5U?04i^!6rCGS0sPo37tQjeCuB_HG${}PF?h*^XeXSyx~TYyWDB_ysqE3~*bS@|+$ zrOb$BTGA4$TC!k7r&*oFM|Msmwu=Q>QlTYC63MMlPL_yR%#VyL^`(ApR}CMOm?T6j zj$06y4>L_3JN`*EZ zfw-IaLCssxpwFvYDlrUM8@1>+k*u57<5A`1sz-Iu_k>bKiqxdDz4 zDtN9XxeU)}^Q0ful03jNhhokwMJsfQX+Xt}FF_WN;Vh5ImyY}*OQML2)><~HJXjMg zZe!|%Yt{S*^NJojk2#uXAK+qgIR-Dhv{A?cD>AaUf&^~aFqvASIk?yAJe+qqP9t?R zG1s$xQrj&chSsxa?L})cmywsGJt+|b^6q;cObIcnxg(Od5)ZNLOIfuE4njB`Pplin zD|be0vG$Q_l(!}M#+jMXLIJX{U^1Rt;fY=oEM?&|na;BQ2D=hjyqZn3HhumX-Jj9Y zw+ggSou8h&_0}_UT8>;Udty!nt0ozhwXK>RkbPN|-lj>XEt*SO>^|8$0AGfO2}K@x zWL9LsLu?UQIDP2ZC!ZuAcKn1YEr8|KBFpPu6|#H;jo)Ropu4@u3?s29wV*G49I~Xf zEpX>FBcYDq2F3e{u%Vr7!oa77c-$|8peZi9~Gac)@i0;!tu-W z>A5sne7hMH^5#iC<6EC|FrfldphuAk6wbhc?5QR|nh|SVWPvPZORv$gfGpfCK^Dg` zIaz!b_i>Uuj|CRUGMn1MaorLh*1MdE7s8{3a^naM)TBD65Qn3Khi3Z(FfOqlw4 zOYr4rB`PgG*}K=)`hJj*^Er0jUrp*OrN15)SNyW?cvxh)IqEK&lDy*Po3Gq^_~goE zR|Z&i7!n$+ZlWr};kT^uL~FE3o>fdzw0Z$PqzM&p1o3iS#U)KG0)_`wYz&ra_P%JQ zP)e!oxaT+)@6QWKqEEP4wssm;dLqkYG4B*3NzSEty4(t`=(tEX6fsI?>;QAlM=X+> z%sQojV4Ke9${o`!B8GM}x-VgjinM-gg)B@fHW-#7kYf(y_TWalNVd?CjE8Uo9$dx& z9RV5}QNru8*KXQL%?Ep~>l&8(B_mFq!yA;CTeBq}RM75vMI$z1ZV=_PQ>7to-RtZc zg)6BOtV}_C8bOxnp=RnBq?@>z#5YMXZzU93Ocu}kS6pn-H`Ibk4fa>;xTe6#PARFAe4(R`^ z-y{;IK$cQ@=)fZ@sLt5eY?v+Y+qcgSvlL%s!7Lc8WIOS#hn{)WMk>zd*`$u9!zW2}^AD`X5Uk6qSVJa0&ct9u} z&x=78d5`!#`~tLe;1kw^VUE_hi3aNvSkSQFZj0JROOPdYmIPSxuH&fhqyC6jz|^Gf zFZL9R0fN*UwwNrQN8vogOOZ^LG)7+|OZA_VB@$;jTI`8$`R4EzI~NMH)W{MOlYUJx zey=hu+z@0jIp{jx zCP1YpVyI==8+nAmVg*zZL*Pm%a$(x!6;VspeGFJYi?5k17=g)T5~wIld6+YEB}0qS zVzHn2h8s5WUG}n@cyC%ExrvNOo5`Zc!DOMbs|iWBBu1+%hj)*0I4BWM{4O1Fsk3RT z>JSMD?(OB0m*QKgt_?d9S|Cg6L#iMb&uQ1am4^g96dHNgyeJmST|AYUHtmB9wPe}a zCBUK^JX(T5q$8PBhRJeZu{cIA$WaqyvHO3w>qM|6>CT4Kw`Q=wUXew9E9}R2pHH*B z(LM6$#l!`BEvv}RAzox@OAA`kR$?AV228Cm8cuK>gN#$TM;B>54xeL2D&dxZ*XiwE z`?R-GPYznt4F=kAyd-d{DE?x@w2NA*gLSf_AXg+dJ#Rmz{=h=>z>Qyj;;~atDIGSw zf4VxxfQ^C{S^@;Z9gxN1e>MBu@i3SktPW5vo*o$@sl)A)lKd$l%NJ8~Sh74;m4%P5 zJoe0U&prFZ*S|39m}UElSK1qvgGCCiyh>ylXRO6^u^voH7Xi(Yv=!_tr^K5RbYH7j z(mtYtE43C8#-(XgLyInv88TVCJbr`7qIq-7k97MFC8m8D$h%)`t>W zQYMURQVArfsaNd-9L-Z!i{ibzj-!H~t3UB2oa&_*!56~F)`jDjWU^d36Bgr`^)g|6 zd+Ke=xuT1@2gLH2ti_?Dphbmz&|i*^v- zVSM>KDKF|H`BZM)y9Haam4^==yg=N>LY5}-T7DxdIzWU-`|xfam6589hF*R0)`rkeEV&HpS}gX%4`Bac^F_bmykaUMt7?1UR0pMwYFk zDx_+IIDbSK*Sdue8mS4gh*}^ExvLUf5pTMhK?Xqwj~bGuUBNE_mi06a>ACpBk;Bgk zRH{`>k|CfbW8{J+KT136C#xGKcho5jPsoE2aw^tJjp115T<3n|7&G$k+Xg>_qfOQJ zfv-RF&P zP~$j~cNnuQF5|~CEj}N5?D^-ObblCNxtJ{I<;ZgJ{rOjDo&JAFmT{8>J(}0??}i@& z3bUVvOpX@nFOOnVNplkKuXhfWwR^?R`Yw7TxD->+VzRh9Y>lL`jbTm958Go@O}<=F z+fX&%Pw7jj-%ZIG=RjC23(JBQ&*O?LF19$Hfh<##y~HeB z%@`7BS+Dl@-MZC^PCFtX8M~l`g_cN%#mA*w^|M8j@8d(_dffC9XhAO!gXkk77ey_= zC0f7|TJET!1-AH(cS!@w49XY1p&9$pSII5A2i@lfrMG?-C3hi#C?o=pG z&p!72Pk;L3hqQ#4|G`5e?42EHpdPbi37J&=2KaBz;g9jsIndHIH+Jhx7q7ECqN8MQ zviWDWMQDkg#W`AZ1+@J5$>*MY=CS*Z8!WFDSpqBLuMSzjiqZ1^BXo$#EKFH2$YQj7 z(P$wdM$|$agS$TCIl#7EzMZP$uj_#<{Dn!2mRzl|YMWH#ZtQpI2{#T?OctGmuVQlO zG7EHN;ZjMi`b1DFbp%={+Gu%LIJ-pfU~(+ZhHVQ`}5~&n#YU4-3Y4egBHa2n8{)vO<+5uVV`=kSRjKtxNFLDru*^8 zSAoAh&@wfPrXY*H9>Mt386nRwkaBU%a*G?mbdqb4uYQ0fPINu=gBMfS@)xZu4!Gc@ z|NW<3YstFAq6-<>?In!FJUw~VXpy(dVzdNUf-E;I^Q@$2S<*md4i@Vcc1Oa9#UV@H zbS$!%D`;ai6dEd~zj2-oROnCft6xv|#z7v7!#-*i3BK zM>|@%II+s#(N%;u(6bhno)cp{AlzAL*oLT`Sx`|8fEbwU2g*OTE>Ou z#Zf``S(7q&0F7juw%U8?OOR#PhYxMueCXB>A6m!joEU4NDUNJhxLFFKslPz0fXU(& z=g1Jjv8^HtzW|H3`y*W=o0cxUJ+x_OGA}dmmbc0ul2Ma#vw08`!nXL+ZyonC$Rb0` zCCV@fU`$IokHtPo;vAxZX#`m?Xm!%5S*c{rmpDJxp=z&K<85J`>M*OQ=(8%RZHKzT zK>c8{eFZY{ru<8|L~zxr+1$x$1q(@{c~-} zF`CrdFe0vEGc*1L(}a98gVQ7?c$Ez3F`FSn#A?sfac#_33M|MXv{+yG$`7A?4z$o8 zHapHlOLlC3rDVw!Cdx0bOOs`GmgX>tgVUoY2wL9%eyS~iMY%9hMgo^63urll@IW3% zpryGew9p?GcKX?V6svZCcj^bP`T&de!vl`0aHDq)SR0V{l`*cR~=d|21_2PWc^`sdsH3WNgoZe z5VUxnei_Gh>h`&q%nzqZpMwt!DM5=IyC|_FTS=3phLx3!mYiI+ssF5j8YNH;iCr+9z1&Z=)(fbmzJpoD~_}p z?Vw^p@3F|z9r=A+NZOi37LDAM)xqjzT5<+fguvFTH_NUo3hxE4vNcDz7PSq#*r!<+ z9cRO0q|!y{cS)Pc5{fFny<;5acww-|YP1Yl_X!rAA`2A_gGCXFDaRSFEcGMHiBWa_ zf^&2}wS$@J7p>|Zwg)`tbSmsZAO0|VBR?#cr$W;N{{7U#wMjrEYl^Stn@4kS!5v$K zaf*~wXOUSMU>O-1+VtAnb8P}G$gfSD>(Xv|`H#1I-=Hg@yu&XsBtI%h*@9RsC^f22 zpzOiO=As-v6tb8sXlEofE9#2+lQHE?G>GG8?f1A{~&%b5pu%ykKnyA`vkK>oE zK^FgA>31RW>a)voxkq2f3y}ev$kN%ocKoqF{r0y%eg4PaJ@x2$)Q$EOM3#u*^CghO!!q>?rR?4qCoqw4lcyKlc82++qDI>7M-pZp|9If#xP#g)ykPI8mM zJ|ZTtp$hHrr2cCH7P^MXd^NnC;!%2{C9B@b`ioAveVJp;i2mmxw^!;^|AmH$0Ys?w zG+k|{z;cNlm3yEF9NFQ&7X=<*o|wl$koRi965-n=uck(A!t{)4E3);APl$C$auMFa ze=my}8ai?8`QQE;w2%;c>ipDNH9Lzey`|0u{u+o`=H_~uoy}jtSY;c(9QPqCZJs+b zHn+dG7gv+^LG7F*9mZZ3fP%mYNb#B6!+!WAXnEq;>=fBBqoj^3uS{^|RU!*^5k0rX*RA zWjkac9mYL5S)|fAq-c9Ts^J&1Z;#z`7 zP`Jenxi;37-+MD=FCOs#Eh!f!>n`dY3SUS=v7^LphBbHmn4+}zu_jhb7Ua$@?=;-; z<{isv(PHmpz8oxk`0-9o2EoNZOUqcc0ZbG^#3Kt^!`yT{O2optN$g!5Lhaj%c#Wx* z&3noGQ?e2OvbeUy{!H}YTW^Idpk>!)31bri7n4PuZP}XQtwthp&B6{{9?GFLigURK z4~`ft2MvmXRUZni1B37Cg@;=BBZw(zj<- z*d{h|@?~vH+os1@SvgHB@?@zxab{v3Q%V^ge@zxCuD3*?g*W@u@SP4jK0r1M{pVzH z$nvU?#j+6#=o|HC)?R)Yiz1Hx zyv*Y7OX1%Nzp~Y{BaL>^#TMp9} z2AEF1(_nd64)QG;xSzSUP)KCac9ABO_8C?^%qO`AsH8*5pbzU#n{@g8@4gD}v~^4} zNqhhoga8ePdXcIUwBaFgM)bl*b}@F2^8L5E7a-eJ?BIYZhU@Fe&fna4EV+VV*gC)hjRb3P+_y?;;vgi{NWFi@_O4Y&ZxBPI>gy7ZQ++k zv1QzOGL*`NXi`vF9qGu=!JBdpvbp8R&U-)k$#)$+xN|3D5n7HCw1lpA&1HF`sL@`< zK{)2lq+(;Lg2Z?{nLLGtC~YeiS(>{>)~2wZx#M0JC`%;7QkPj7x>N@l>~Cka{hkAW zgRAY-q`@5-RcVzgux{3Klx46Itv@}9%*If@jt zDECz(i!)!TZ>$!xEMxzQd@l)qkRD^QP_ED7ln*f2LfM6s7*{yI8M2(cdgC`#T{&r_ zU16|Xpt%=A-tMx<(o`6Y#$X?X3$-2WgJ}j|+5bq@S7O-*CReGEb$MfuMaOR2gTtK6ERBEN>E1-qzhs5g)Rs_yS5~HejNqNlVkTiyAT+bu9HW1UU%@Yz_R6@oGkXAae}I$*xtiIWj>i@c$2-z0&z_i zM`JR~H(A&MEx)J6X2mSYL)dS{hDJvAm)6QUmrat&h^3|Y;NO2!emXxN(GbOSb+O4m z41TGPJUSWxznI&q%%rD_RId-RIMK)$=$n@=*>v4?n>KCQ{nS^U|M{C(2H_GT7Y)Cawu*G3$J#TjH#Pc#?j&diKe@xbaR`^|WV$zogJ^NB3>I~G|; zhy7B6_;?-@v`GIES=XGFmkR_QH23t@BE}-Qpqb24(zm`TOC35xmY29K5+&Zy-|WXUQl z(QcM52U+HIf`=Hx`9h0cdPbIc-QJ(qShSE^hMhwZsN_iTXnv4IEn{IW=D|tze^X}x zED~So*?n9;c`W6Z8>M=(EDl-Bm7Fq}?p(~32l#mWfd?K}*z)){{|Z=K$anP~Gkxo6 zKAaNUrme*xPfTV;Vn6b7e2VzX7-OLgETjrcD0;&JEfHkY39_sNEl!7RA!b3oITY73 zv~0XWUitjtWZTtOUO|@_OTVsUTm`fkEBd4dSp}Adb(x@r>dVc`Aj`?aTl8F4rxlX5 zqJpaNSi+}zdwAaKojG9fs@&3^6)VUVBRR7BcuK&cty$LA3U76xMr(vUp0iJhF-@S@ z!Jg>}%dTOLbh;|>FD+i$T?y=Ed&niv5r);^(xm!#b- zA`4**eNaerR;mxZz(;Ws-HmA*IfK1M4LaZAb6piuoQoPV* z_XMj9QgMgdb=reZ5oM%d=Tc&p&#b(C(?Kd(1c+OX-mWT(!Qwi%id18BJ!N<4!xh{iw0HOU z2Y>jd-~LSbuw$psPw#g|;k9i$d60sk5$0~3o9kUg>Su&+=` zj#0t~P(hZgQ_Mk&jVbYh39@i-7XV(KEGz1jYAgqGu$WSd6c4s?o-FP<9;fe^dhxv} zW;tPrEisdS0^X<_izRFP?Oj)A@1wy2S*+aQ80D8x(M!r=!{h?eC?vv+jI%suS#7ec39?wu zhUHIZWJxAVN{5BAf&82--e}5gRI#QolowN*=F)S}V>Mrh>9TcH8iD8<*1hLvbnKr%)E1c zOnYO5m%he|hxIugF6U5vy|#DRLM-_W7g9zH?lAVZ&lP=>g&S-b33W#Of(}W$Ht&Kg zF0jy+zgat)6d7%9xpqtmFgF*t_%H88#U@=rmU5STEJ2H+f>vfm=o8+jNMmR3YcG4< zXI6gl_M?Yy=X2#r#ViSX*DEf-U=k~~3AJ<3dIs!}bVN>wWnDSt^yiY;k_W#>=*n4slnzkTkp2hUHR*Z=FK zt5~w;7z>MkxFQsK0KXZ4iN0KElN&t7G-dDK;LqgjEM$4`{x9OMC9-@a(4wJyy!0Kk zY}bGHIO5w9pZd+eMHW;GS>pank|nzsJgHZZDCTzTp# zKobimIq}S-dc+`$(BeFd8pqWV(^pcbyR1Gp^KN|g=Je*@iy3v;bVkg#oYP206!E#P zLp3qXMA$SUu|;r!B`8*64MUZ+;f!o;K(&pIDM$&qb&J56Gi@nliJa)7J~CB$P7j}( zXVL_}>eO2XxJpvCmS2yYpQqy>-%f1NlVH`da?$*j8y=riRN~umqZdUi1`A~A2!UEu zMD57%RL-y+uwZ)QAjJ&1_g;Vj^{rWvKXK;72_c74JyLw4D~8H$wiDmWg5vSJDZb=H zSs+s-xRT3QL1s&?x;`;~!W90%mv4Uafu}KkaUq`~i+hT5u(;fUCA|%~+;l~EFOQJY zEW1fE+~@-J6y$LbCPEkTyxP#{Ki`y1qx ze|5~$+b92uW$%2aZsHGue^5nY>;4BG*1E3`Fy?ZzLadvYvGpFomb5}L%?;X}5K5>% z-Pfk^5>2sqV`N{E<#E8JrMry;y6r~#$j@-(X<%9DWQ14}L^#SVSTQ}{z_p-|lE>#7bYItjFGVdH6BWYG;HnQll z2rPgDUPCM&{)(qNHImZ+SBmT&rn;Y85GdqNm#3v6H6XX+t^)5#-#3(t?LrT40$}ne zEz)TL!su51ZU{s}+K&%%1qyx|)S5btk(jN$JcYbk@H7ZX~XHj^&m zNu1Y{h42Zoyl#Bp-YG{fvR`+|azbG7%1LGC$68^NMQCwa52|z^k;N`9QjIJ%t_1Ki z#_(yFTtpUX_^R4V^%<}_v{=`87yhvv9CbJekkoVKasH^v@&H(Qj1SIhh5Q;%Prma7pbCd&uj`2i+Xf-F>gKCnz+am?~6+wkEZk1s?bu^5x!eYLF&_O(k@9_ksAnDW<(D5V!0aZ(u-2{F36MM z@&tP#OVZm5@;%o5TZt-YTWS?q_B6J*s;)}C4)FPE7EWDfrx~q9wV(;RQ%37CF%D@X zLKbSK7=D8i!+mu#fYK8Bkz>CvJA}1WSzK`9cApg zY#Q?Teb!=k( z^w(W#dG3cto|4PU2vFT|y&^Z}czR2`B@qs(sxxJv!V zlO^&Jvs2VqJOE;%pg4D>g*kkJ7Hzj#3t!6l zIArOaGFdpei{3D&#yCe0nk*5ugebW%P5J2Vku$f>%ngBCY{k{oj_7k=y?OI$mrPh7 zT#N=Tp@ksDL+L>lo68qf-ME-6I($o$lof`ja>14l@zK$L8^>?H%bNc7AWQwS71vSa zDz;urv&d5sv9P4=JYX?dNUXsUbH#5Jh@UZd>2S-{Jj&t@i`STK`}a%pYva2rPVpF| zsy6_}=95XWo`ye(Jo!ohqOcx0bBZ-qb3Ium6Io8wDe{%kCO)NDF_C3p0a@g%5Eh#Kl@6KjIWAM+?Vkg!2|?LC{6(@mVtofxb%d zh4sN2#%E^n&i7q&%Qc`S$bvw_8{Y64oqm~*I`M#8tU!x{7O^KI5JWOrIEO5t1$_{* zJp8csLw=B3UN!OW_o)@ zmQL#3+DxTAjC{i)*)Dk1L`0&kFe-uMd*|gbLUDp~?V(b=g>T5qOT7Xd_#z!fod=uv zC`uC|rEQWrG#0!LKgcr32)Z{^@||GbW*bp%MlRMne`m1R?{ZY{+0*uA=klUipn-!w z+xD;5>UwXK_v}CU!zKa{y?@^{aM^2jHtdud@BtQDyxOw6+N8b#%It7ibC<0e8`%k1 zq-4&#+|m#W=EX>pkdOu0y^VuFBh2wYjm9TCHBFg(!MeTSK!Zqp7xG_nMnj6wM9ebB ze7cXzt%YpPhpo+$cDaETet2<(I+`a-mD@yeRp3^Q0Ig90{`e1{6I#B@5)#TM`;;9d zpV_u)t&TTZ2QWkYIohD18Uhw*Q`$M=4bX$2rA;l@&CRUO&;f~xcZyk%!D6yJM$n=f z{_F`gi8>=@u>7ZFS;&pW9b}8iQm@w>buR2(dKiGYY`}?_$cfz*jxQ#R$zrs)aD+TK zsd~%ZQ`0PI6ImJ^ju%?oFQUHP{-Ps~QlC0&tLrRtg9H0*L6#`oN8!AVETkAG)t9Fu zC&y0ySAO}+ZsP;6=$4vnCZ@4}Kv%#1 zznSZZ$gET&3p#O;h$St7MIae=Q6?NLGqPwX60$%SlcgRj*F-i9wiq3Y@&M65F27-s z4qGgu73-T1eDm=K2wC_LTE3bU@)fUyZ+=#C`H|6L2`y^B+IBYg6(c((v}|1VzSm!V z=UcA1G9@gO<7ufQ&3;!;*l@HqfGA#bBwCg=&wu z^0~_&_AEYRA!^xn2V}YOig#|L$YQYk)ng4h!US2Cd!CvmBs)-cSII-+i3n9-41W~7 zV?8`J!*GI9`PFh&D-1KkNBtjB=A@1+GR_a9;vh?ST|yR3?{{&7AdxC4eN9@k-|hcx zFedzA3fi=#o$y+#TV2Bgkm8u`=tARpw3$Vdnk*Ut7tXwSlcUJuZNwVA(eV+o*qBE3 z8js2}Av27ky=Z2#h!b`=Sx#mRb^$AU2pBDDXjVz26_ROO1hgn_62V}jM)S#FH4v_d zEJF=DmpeN1n|{sF0L50yR3eK^_`7z{qDvmkk%}S&FoYUf`%IRyrI{l2Q&g*S!by>P zOp>anT~wbR&wj4{u(i{4fQg&Lx%&UwrWRwhkkoo$xl+f zhb%nlWyCB#f+HQp>dA8dqasU|==0d5$%0PZJvC3`^$=zJ2`nB8LdzkOrCWTk!@a-~ zIEQ`q!Xn`!~zyWpDBF}A5#MTxP9j1v^gqCoBtRqX5@yoP=5N7V_<)G~> z)a2}XQel?j7ER$J!OKBNGj+mtuF=e_!A=Mf3bJ^llYE$eEG~L|rM`WQDWUixUS%u+ zGgx?%w9-B!i_oHB`DWkfTGFt9;bySKWI+LzDN}?;mS`2r!GccQbxE@1nJ`1-;yOzp z<&ssFj4L&L^l@K#=}W)yME-@R(M2%}{2*rG!)W;+^?ZT>KkTb_FpGaBx|}Nh`w+1T zr-2pzAPDi9HxjdmB~d*I!YCh>tDY<=s4{QcF8rYArinAg%*FUECi;^x#%SVy;N$sxzdrZrQE`5sPoVdu z*Y;ZA{kYe+=Zh&8*I5=H#5I4(yJhc!spVY>EH=E?;m?Rg0j{tj-CVKt5t+u0oAU4>f6J3-EvGC8=YaaRp-?uX-+-z4{@TPPXZvEwNP#J)4WCjTWY7!`F=DTGXfL7|l`>_?1AtnI zo`K%4XXS1y?c$l-d@no6>Zk= z-w3e~aSAYETT8?)o~O~zpXbOhBGxvnxaalSLZ+-eqeQ`{AQmdA@=i^fAr+Vi>ubcwLS9Zu}zb@YHigpM)WIb zzjC!QLf`T6UN|c&PYOc?j7pTUVPG=mKail}LcW5Q7pb%`(-LHX3!+9|X?b<3%zxb9 zCCf&FmRBXqqlhxg=kPI8AV`veq-GDN=+;S;mS z33+I=yW1NV*Bm_xTELQ0VvuDz$YQj}&rJSA?Ajg;vX~Kh)Dn{~e67S5Mqi?nP4{Mx z4zzH8RP{qVRuDuvS-MRYVqJ+;SY^~xELSH>6kGHt_mIUy-4PaK(agQFVOJ*$f-5m? zpZkI(-dr6ma7DiYE|*nl`Q|6Td6`0fSnKC?mWWx57Ebaw&`p!p=F^pJu7ow9G-QuTWu&8qluA!VP7>7Ze z#Rori=+lSpTmtrlmOmRTZ8|-Q)O1A_y|k~9D^k(8KJEp@UiU=VJQml=Xr3&+(K0zm zQiHge#!@F@bV5!DEhbA_%_=z?Hm4sfrt(TYyuAaaNm{`R8@B8i(gX+c z&R&WXvw2nBqmPM8jS-d@rCB>*X3(9hg`i+*<0+v#qEqN*o zu((ew#_j_x)LA6+Wgc0Y*RKRs@`-!y@8`k=NGEZ`4R*w-Y ze8e}dp{e(M?|Snm->!Z6BFi1A(g zPifd2@I(-cv60EB>FX8#>U%gg(Qskk>9ePIv|_)gW15&{BFrT1f#|N*d`U|xizBhd zGnkGFIGcU)RfU#_TQCQ^PiT3-ql%J&M&MHp^-1-5Z1NIAbQ+VO^0_?TQL^=akEUu6 zP(bcSlhWW|6+sqt=LE=<1#`8f7&ZYql^3F|@>V9=8j0 zco`VtWjkMGtasd0aW$M}&YL(@9dfZ&%*$82xzbak7}D5eSiS_ym0trLTHd0qE8V=n z1=^4$>LxC*NIg}7g~mDljLRXWSX6LC#3IKp>gN%+=(|z?XMZwf_`t00Fj(jacXUb| z1(_sO&HVH2bazKG6tzofp+VhGPUyNw%ljs;qblpHN?5d$sZQAumU<8t#nULW(weKC!ycp-h6 z{D8t*Uh~XB$KL}>w29e3SOX}s!a{av^hRFq`94CQF@L>U_&IuxlXDVr68}+qjrPx&~U1u)-ZSs+>=jOn;-@IFC9H>B+Z+STX!}ohH3Se1G%9+TllXz}&PnIRr~ZHAWXGqPAD#ZbDsIP^udSnDOF`@i_9 zL-<&MmP3ay8Z%h_u)rRXI-fnqGOqA~`G>va?ul9MGgYkH`*cnavuLtp5*P4}$;sjN zrRp7Rud2%IJb!W6@bKD|&Q^ygDHut_(53E4YaKm_?>QE~rgoS?SCbzohhezl#xTMX zO~Mljb@&yvQ*t~cq70t0Qfwkdflr}8;iF(~7MQKfHY=tc@1{sVS*2A!x+KmyDjeFdc9R7`b1d}$3-mK%) z6#$1CxtT`nNN&rFr1;=SF-wmk8Zow4eFA&3SjcYtdXio|sdHE^)1pc5#61&e?_RFE zB<7gK(#T4ynF3k(eq}sHT|F(p$;9(fDXmk_%B)FQ%JuLnv0HPKUg_+@5?gXgod#wG zf5=j4r$Tc4(obLc$YBp2wH3sEEz0J=N~@z0%*B>WIMw2*knQfE?NGqnB_gH;A61BTu-M-?Bb*s^{5mTl8=Qs6~Hzqo>r7-hb~Cv3Km#7ajZ$BMfbpmZr8W5_U&G~mY4WKODq|7UMinzY5r`S+f3iCiKUA> zXEsWNENes-Qdw>eL!RP{x{ODYD*b$HphTLBy^zrYS!D1`(vFbDC71j|cxS$?ILP9~ zkij$#-owuOL*Mw2$$}33 z$_rU`^YVH<;%K%#3u5vCb4X0$)pq1`7#&4Sp%<&^OfRnHnD=Z+5&Up?a7q*^1up~f zR%6N`8zL3uSqbF)7fMaS&PmypvJLz|7FQ^!OqV>d;bvla8hhIp*Dc?qk;|etOmoY7 zZKh}{bQF7$+=217B&0H0I1CN3+x=a+4a&nU$&E|qnTRjnIZnx8@9htWun4wDeC=Lu zHCZII2rPSIEOVpw@WRGtU95B zCq;-|+}rC}PsS-z!mX7@QD*V3`?6BUnb%uQj5IIXdUxKQxeW~a(Dotlc#&tsFw zVtAXXbQzSi3%?>Fkv)v2HzOK$+nKGe+Bu(53JE?w1U; zJaKV)mi=D$jq@zVc$v(q1$YQrgcRq#@Gx6C&`NAeE^PDWkuDhv;O3yA+o73V)3Yqa zceMqJN;VjqEi~tzdidOPFB&bU0n0{1V%~atl;8Rvkmc_8NVJ7HU~#^wqPW083)&)q z6`50>IeIjiA2-$Uv+m;~hquo-iMC}(4#dYH%SoARmlU(0v~SOB5n7Iejybzjn!u6+ z1|5%?dd^@~ya-@$l=PpLkDvz^VpWJ~7WLtZ77Yo?U)mCH<- z3i%FOLawzi)Q;>ROo7~C%M!;2kcA~FH)}cAwKp-%@~-{wi&4oe8D_EomY9Id3-qBN z3lC_HS!|vhXjzxY!tWpp-N&T7Bw;1UvKX?UM3xVlD=ho^#t#!%3Waof*b0(n9@XAS z*K;{u7g{(QCskA@v)|!rd0&xNrfx$fdf{xVx9YX1U!u0V(x9SrPYGp3;qW^QuK50# z3*n7cQfW_n@*Sy_y%br~E7fX;de7XCN$G|N29TtXrHtx;Mw__OgysaFdqXXJ=NGnV z8Kw8=Q@W7la_p#djYJ(+oeD1GoFcyyo3eP7mv<>T~}O z0XUY8`C`7M5d|6z&y`91wNgfn)%n~vpIpDZAl-X5R~bfJz6tX zlFN=-`1BKxUC{XS^azjP{uZwk5?|!DU!7XDZR+Aze((w=FXxUi)53tp@R-mtHny~@ z>`88Y9ga3}1$E(gHbt3b^IGobk*zJVLLOK(il?Q~azZ&VIf;3Gosi|BC!U5ZDz#|5 za3c?Qt>rZ)ON>g!O6Ce=8HgA8Kq9n7^AjfsT!hO&ORyy$$v=Glu)Zz(?&4=PHVa!G zAZF2MuwHr?E^1v7TZSP^WXt044zA2Y%LHuU+@~>IW^!I23F`ZcDen~aDnS-247?m9 z=-5t1^Sc1bPRjp|R5aBhu&ktr@0oj}WpcPXxgWRd#IHv`G!kNvIFqjD(UGnvl%Qmc z-|eCg_bNwclQ5yhPpLtc{&=gE_Cc1lK^6xep(wWqF(!+-0zPy{Kqt_$%Q9IW%-h1Q zQf6rwP&Vs*rpUaIW&i#!p!r3Xb1Jfcmi?E{gO7Fq6#&ZD|prmEz> zRwoB}Vg;)CZY3?#LwbCyoryp>y)d_Dva}Mxc*}=AxwHFOBFxJ_B&N`Hh2u;j;iDP` zhp=Oonqn5sw9rwe)?}Q9!3ctFsUZx(8`ZFHmpY=}ZbwL2T+xi+D8;+Il*3scWFaCO zSD%=uVxs{7le(jeseTX>qkhi9%Q&T{YrE+@i~a|uQ9_)@Y|hFnx&5ZLkl#Y{EY z0yIvFK|!W!P5b?!p-j-+{U%ND+^c1Hs@ahq54f`dl4uLh%9@{|;792s=I`4XHmFo5 zCp^oNNaHF-s0XmnQ?aSG-ef^MO?Mk0Hj+^>+GJn>yQ;~usdbM6xssrV1p!abqoVxC z><^l~Dll6JTaX;~d1`dmwQt*n_u}D~DB?eV?v%$RS5;hdTPue%Jwq4n`3JFdA8a9L zXF!l;_?RQ^>l%I^5xiA}0$+eL@N{SR5NnTf0EY zG({B!Dl1om6N@iN|JQ}?vyU^yqSoKr50GRt}CGRi0N!HQ?_zvcAT{a-wI@GeI! z@CCHEUrfU!1TFZAA;K2E#=Bw+A5?@~V##6_D+i0NI}OT*WGWV6_N*?Jy&H`e#ROqQL%d%!!I>987-b?DKXbK zncRLk(18wikjn1&$X7&U$(D$u7pc6Dm)}Tld$MCXTVAYJ>l{(FqQu#04}1>hVUwk* z_ZJgcID2Xg`7=5x8)lx7Yc6GrlUZ}+4uybX5Av&gmGC#n)5SepwWXVI1g zS!nZhpO=U0y*aV7Q_n=?D{e?L=SWk8a#&OaU!A}@t7BXc=_8Y0ndGK0{Q+9)Iv$i% zTyPXe;e&PsP^r3=QhJ^np-!T@MokeQAz&-XH9g;&%SA$hx8Cp*9oJt4Nilis@7&p5 zr*%S^rWj=nuB4!)P!L&|>m+`{?u+LQWMmiM@P*iAxtu%Os=aBwaB|@hRDZQFHm>d7Df@+Uue`NhM>$Y@c=Upu9+M7@RW{29}>NuCzY zlni!bsgKz?ReYKWNnuXZ+XsfaDpUlfXMfs^yRP>phe1a1G`Ex=G`LMGb z!7N(r@k)CiWal7j+DDh+M(Tz)?OiUgm>p?&1#~nAEDg>i1O-n* zx)G-ODQb~9m^%kVmL-5@9b^G4>j;}97xcYD613cU=bgK6{lj6Z(y2=lAyGz;qJNPvlUbj zAy3!4l`NaxaVWp=YO^k8=xEVwWSxnXy85p4g0!M~Myq{`JtxWM08Z~n8|>xQKdx^w z-HgR($UVoT>Ds_16&Ss?kXroeVjBa3{em5 zTGmZUOd5?05@b1y&Z~&;d>CW_EmBUFT>l%gELiZm_lPVHLKe%D9f>TU#ZK(fOs*5T zj!B^9YoH|x`48h_d5S;kP&l)Tl7`yrMV34CQfx47Vk;mzx2sj3-GP=2CXpcHw#b42 zkkl`-tf_e41^*ebXwXZc@ZH5OH0rioIlqo+g`Yh@yfmOOHc%$N%;v3U#QGm!~CHz_OEd3ONEbI$2bKHV#%^hmN`o(04_5BW6nqrm&79^Yi7G2NDGU^mpB8&bO zxHXNqodkO@pA4n>Bl2L5S>{z)=2u$Wbv)O{IAhCAfW>ch6Rt>(SmHO6ESD9!aPMW< zavrc)1TKw2{!@4bzg?0GBuugHKS=PxC5>W$1!;3JQH#+6SiT^zL=B&F-^kGQ7=~7GIA*C68MgC48m2DDBW%93jhMk!4-108DL0$L7I^xJE;DK21>o)zvM`lZ5ggv>+eROqJ z`&>D}F*)2NQPF1jI>=OWP&XAvsrVu)A>IjCN@J-c&B0tO4VHBX3oNpP62ie{wSEhB9SGs zQL%j{`Pmam6d_BSmskpkvi7nwis7QiIUdqZ8zayg_e~LLug>p|K|rFhe}!G^{lFbd zIl^nnf2@^G0T!Wk+UEtbC>(@tRPQDCRg71OhU5%tZw=cPi!1IdYfU~gVhJn86rFkb zK4d{g3{Ranh@Y{@<+d??OzU}K07ScRP&kH~EcShKCm&!*dv`<@mUXr&F>&JD^Z4n% z^5WCSF5yW&&3|$_i`}wjKQw`*gTFC(ZgV*Ap<7*U9C%!R<{5aq>Nb9 z@exjz5EfP*amK+f%DjI+#jXtt|jb}!ihS1_ETskjv zvc#uoCX1c-PmEq1r7dhH`AsxC%O?dZ2(x_jWp^kBvrdyXBEX5o4hd=f#q4R zd>YbVF#&zWO81yV@wgxh@?}mIYiukhi59`-WUplO?Wxow511$XduGw<#lfdONXyFY>u>Atd z5v0H++mZjPSkmIDd#Wv3dvezo4-&ITs<#laKpp&5u6Y+x%QMeB16@E%Ogow^mUpqB zdmp9W3s6PU^n^Ob z%5oyM$(I}^JJYPAz3>xRV$amp)(t+u6(%|)BH35 zOSQPyTaINnOh!zFiZ(|ZItvxEKncCvCi7OJO09^4;AYPTow}Mv+-mzrV`7hI899bI zitX$YQz~pXb0LKr9NF%a7HG6#EKQ)iBgm2(llAebF}DkVh#p0HkQr^1w0!IV`nS9M z9oVmohYoT(m8G=vi-?NCle?I`0~ryKs3MLu7}+JirkzU_vXtxNp2{zcON_Z}Nd0NB z6KeXK(ykhZEWp$$K!s?`9`*XWp)*ga(d6JQZ_)(JCa#J;WzcBZB!@UOvSIqE@gJJv z$P>68Gl~Dii4(XUdqw})XK&Xs8D5+K7Ukz!c;UPh4o;1=64SJ_cu|WhJp=8nvTSD7 zuF}mefKmA<_peGX@3j={6boF=L6#J>7%iv&56D89CDwr$EGEmEWL*{ahhbOflKz-1 z3RyA($;7ncnp`8}#7_+-dZ0e{kN%@yRu zbM5wzRJJS1^xieuM3%h75=-*aJrUxh_gqMZ#^D$C7R5-?6u-%}Hpn9TFR-xTL9$l`f>6a|(m$P)Tn+rFBnBuy2f6j$$W((hOzNn5c@^HJbM0xrZY z&zLL1%4zAW^wjT}07(=1*gM{0vM}8OS^&$zFN!O!=M%Nq+FrAg?_zTD86>n=GvBF>P>|(%TV851a*2D6qkO*@87$W$Zn9$1D_nTS@)&#bQ)z{y zg9w>~7%k-4si=A!qe6~L{YR)OvQ#uKPC^V(A#hD)u&m%l{<>W)Edq;j>6MYLBpyQL zVAEhdWqWE>Ps*#fP_xrlYH)R8ihfwyuCzU+Rq6~AWm>5qi_ik-1_^qYWK@>s0aXHc zF(<;AEsCbp(ZuJn#}>5&mpnG47^~(E0wl7)7hQMRy;olQA_HUrF^$*ra-a0FV=KlV zJAsMvT+zkWCf@*6VEi#EL9~$#vlRJ=OA48&iD>v|f}Y(8;RUo15FqkR@R{ddF{ArL zT^`vZI;HK8{v345NxgofR96^Kl7FDfDhxyM)$y{GVTT8HcX0{CyJ}1pa$=Ch5sSeB zTY(HQj`xIWCa2TMP$vpKQ{-fr=V0{1^VT-xdX}D}YxsK*{A;aj+ctgt;@6nOf93ge zPaLCE!hdvZ!9IIWwNj|cRF2*-n8H7jfu-s?#-p=!vuZ7hZ$%cR|HrCR?bMIDt27!d ztFET0>Eb1Hj9UIFTEz%jo_7)7m6jk&=s!djF8^_|D24KZZ<;zASfcNi1u8Q8BJ=w&-c6C!QYGDC`R@?KtLx7N{bw zI8te7TavG(JHpr5QqgNZS;FnbRJlS|lEpMZ@6@#bi>P9r_=?`Z6}KFp*YCqOi89>c zEzXnAh%1&WEKY}!3p;=I$YTWHYN7`%RyL7O%mO_=e9bKhEyOHFi=?+^3)wL5#owH-mOrI-bOoK1`uic*>5##tE1dA|&mBpH)L7)Y3@3nBn zyTPva+R2X)XT5o`Df84HexVhToND@q3tI4zuX5Ort1hgl8?ua#yMUr3zLFSv5v8#_ z`i?=y4t0e&2gC8EAvo1m&{&&~ik79QP#|AbQZ%7v<-R^@Ex^TI#hhH~|Fx&St$%%* z>f|oi8my+Lv78CzNu`B~Z~I#?cw=RN7Z%FBwpR!T>8x z1g6DSTI#-FL5sr`wfLq5$4Fy}icVr5iD(ydIqvi7v7fO9f3zc6UoUkstI$z!*D!)M z@^q}hzOvYjTqDxpCr`w-0tRSWP{0orH%KJkM}HC`CoMAY%%h%wuY;D>cKzJT{MgGN zzsz#^`nWf(@J{~9h^$H*!X(+SbRd>c>E1OPH=8oGDq)LTqKS$S(VTniV$Ps*tKnn4ko$hSKW5qJBF(5M7CZ6w$@UE zm|8t5i7ZrOSOegHYvlI^Z>+C$re60`^}SFqxrKuYKz?=}7#75tCg z4Oy7FH(A7z3?(})7(;$IP3|?wLJCF~21^QBxFWP5$fA0S$TG!YPTD8yQi+C2dqEI- z*dw-E45@pn@d~nZyPFC*W-(bP-CK-gwPa-Bh(~?3b4p7Yz|eL(PEA? zZTyOu#lLxDfbjMU&z|R8PL*{2WcQ0KPKlW?U$B%4BVc)K`*m7!in6ffd)Y+3JHxJ7 zatlYc$Z|hyAzndg8wvpnWfr03T75BcV#x5qQ*3b~9i~+*@41`ZkY^SVwX7RD6{C^R)!+X6?a#8pQJv`9eY(_R^P5-7>X=qA;or9 zdM%FD+hoyJUQ+TmMnwczQm0yp>cYb1%NHzIu)Iyxh~*3D{j$OE1}BYtESoGm6M!cq zsgP>2IOCL_+4fCZ&)gI1yx zwTBViY7T$16=tzEuX|rjJ?GQyl@9n#iO!DSkbE%Mtxg@EGAOA;H}A$+=Vs0xaP#@C}6o{woG3@ zTww#fQf0BdYg7e%=g5YS>!66{cbOiG6n+ko*8+lh)-58I<~8{yiM@b%t?B>h4qr41vQfe%_qyeY}mZoiYFl%TtRwsThdL5EQU<; zOv_~r-p7FCeo|qlH*UnhL1>Av<@8zXfwMwBMq#XI)D~dmaK(y7EjJun``sHx^Rf8? za>Aa)TfUSG12prqU?}d%=rU*FvA+!_W&jK0k$4#AU~x7q*E-DdKXv`h@BZFXw_K~e zU&`ox_0Po;rG{Wjj^i5k8kP zT<#wzIztc*nfIjW7VoukD{Q_4#_Nd36{dKfWst?eiqAx^3sCPB>%qJ`pL`f(;fjJ4 z6ejkP%=0xAAMKwyi$mP}ed~U@%ZVuDWcvC@1Zm-jl1j9aEFGKxQaBGY%1I7d?g>|u}RJ3%i|?> z;@g?)^#2E0?CUb4MJPL?xMHpZSlr+mmvZAx=iHg25wk!R)m$Eyl^8NwxDzhV(wvl85vU|z9-@Sx8Z%Hd8Yn*K|Y~(~XS!zh7dwV$*P}BypIH&7$!6g(>@GgLjL~;F7jR~l_s>Uq~Lms(Zan!p(H-uSun>kpv5~m zJK;p9YWPd{?eKCZsZVT;pvCJOb){Of=YY4b2@4v)^!H828l=FxnOcZDkj3*94=C3J zY!Gmfj215*^G1RoOPa!A$)>p(YLht4sr`8TUPhBK)~Xh9Ct*q{jhL0}GfRbrtEGMj zMhktgvj~@$AHV$a^FMm{#Plr9JDQZ_Id)NCu@82uMrq|i30Q(Gh}Y7*dQeznRgoJ+ zcpOK?33+aLVp3#zZq82p?XNLe?*7Eb9vlJ`NQN#mG1!d)FdCiY7MIS?#H;F*8nfFA z%#<$i>nn|oU^Iz+<;lk{PG8){neN?-*=7eXy>kSQf09mhFEe%$DHY$tX+D~%)Nf_+ zLJYdtQLd!_W&Eoz^cMN3hP<_&BD=Za#;_A63uxhz9h7T!&K#xZOJqT$*B}dD;(~bK zk^9M&{e#P>--|4a(4^<#BEA!1R#fnPEs>>LN^J*bR4C9A3bc6Ser-}|gcG25l3shn-W*lE0qSOyUiTUfFERB7caB=LE1 z2$Kf$qc<#+*I9D1$PngQsD<86y@#)vCh#>jNx#@)9QHkY&!5G&;&1$o1H0KFc`KW~ zAj@A0Yz|bDmRfhU=OZoT>aA**q%z-{qPGgMthib%@|Giq0G$apRw0&IJ*6qa_F)Pz zYJw%;7~ebIvs7yB?b>9pAX|UMG$7WGr8!F_!@Gp9>aoLU1nW_?vYj0s_Q;Jurc5?X z?aEF(Q*VJRaAdtdb&w@(7h4~j?mN9_Sg9(bh1-a?wmzo%?$eecOKaw#(nGn$fs9=s z{mejxB(P<#*WIe+IhMo}I0KJ*xFsf;Ean-t9%?R1ZfUkh_R#!R;{hU=De0QmK04gL6{ha6%1G9%p8V#z3d7@Q*t=(X+bf(3 zjrsMXkcFVdm6l|uukDhrWz6!iEe{SQMZU!fwx~ri)$%pOw=Jz+7g$Ue&~oC0!ZC|0 zPYNyHId|?m?h{i=?C}$vj+$&AtjdSgVhwnm>?i8(ch0GqEW{|1k8~1HAs^5BXXhVn zFQcss7j%)bLJ_wp-9(8+WC0jL3p4>NXcXZ=$?E*yesq-4_$c6GALcIs5V93ytiVL^ zd>lM2lWz2~ed8o+Do%(I&kPnTML)T0G{b$mj6w`(p|TQ+YQ9GCGqTJ`cAo(rO(r^(oWAF~Moqg1Gtan)= z4mT28n#pqSRmhT$N#RXiA>%)SygI*%cXoftiqp?plm6C7T(&DmPi zY{(#65w%>>`&vpoiO)(lq6~jB{M}Qn#lDlt^fGPhs#)TbU6z558oM9}r)#gLX>1Q3d zJVF04Y#|4=Y;dqrp3r|Fzv|EwK#WQ20hxUC`2F zv_u)-=eXzIMHVvwbX+8ET6WPBlb~hhqZo&IH+`VRVNn{!v~9l@5(5?^ug)_tS+by| zi7Y6-cK^Im{>rS1FRTP~tRTy(oGjf!OOPerk)x%FEcOSB(bcH3%p=P@&6~o%%}miB zP1mQ|3S=QVan$2!OFo^`VMp}QTvyQYEVGjYDp7%ncxAh=vXN9+2*5-}OkvCEypYd| zU?f9I!3C-`0vKWjJdeGZr2!VBMZigcj8Gw-xXcn{39ww9EM}1H^u6AT3O<38!Qy!q z#GPNv$il^~2XLT-EQdawHhpbv-Bd`2f*O6QZu?P{VuE96|SN@^XswxeP*xS(w+*WQ@9BORT0{)J1O@w|OLAA`M3fERbd2(m^sm z(W9j~y$B36Za6;fp}I;kLor!sDC%l0$v3`O?%R7`M-isn$CoeOaZlPjCbFPnI`cZc z(9w~~xQ{>B66VHm0Yxoe2)bP?@mD5eB(fl#y=luA;%!ZwaEZmAz~;xj77tWF09<;! zokg__HFY`238|{TfxXC#ibRQuJd>pw%W5$Nm0~$2XS#?|^Tx(bz@iQc;y@_IZcaM} zfGqXB6?8&Z)iaFKm^J}$nJW4Io?6`;ExTob#rFBOIZhHUBXYqPfbpf<`8o2_(AGDe zDX}c!pk-*+6hE3K#5LSw|2MCGmK!JIm3Y8B(82jMHGA>ccYgQEFX<0^^2C{$RnuLF znLnvTd+^mmXpsp+v>g{@Fh;G;V^B*MRn}{>F+3)ODYWbupx_Ev&SQ8QT*M;i5(aso>qDX}`^VVXRq+j{{^`{nNC z(|sihvM{b%jfh3@SIDmUw$0DV_MqkJWEpMBhN;hZh;}gMBDZ8r;pUmhhM~XBmBz0? z3p%X2{Iik*1potC$clapxol$^9Xay;?c0wyAI3v?q)IT>ki%(70`zok*;Z)KDAxlpev-1^YxF8E}C+n>H z!d*}g^nw(?qJCd@{b&fTQ16(SER!fx`!W`~>QNpWp15Ozo-=29bQpyvIFsgsRc!Wg z<9Ag!*$nr(5!UG*pOWl&(Xw2?qF1~pKr9CBI_z4xZD#@fn*emlnT}>_9AHyb9>J1jVlsRmn z%UBM|Y8QrV?#n{*iW%pLZ7QV9qxj)~MI8!k8q2EpCQCsx`Fe6rL1}`7jvK`yP@+>_ zG~%D@H?3r(+Et@`@K0a<m<( z=JRtA#NPKsd3QA_fdSwG&&iKNLoQBGa}9DN(Q!DYg+!?&6-PI_g6Xe{N%6p<}kH8pkdNo_8E`KO1EUAnk!SDk-1 ztg#*_02HE=y5d_GRMw7Q@B&&!l!Q$4G|KCFs%5OwGPGmG>-R0<1m?tsEQBlF8(8$OtLj^4|Uu@+5c!Mly z-EnMk zhU5$661@YmIP^(mS!uHHHnyTz)6?X_E-Xv=FYcU$EEj?-Uc--qD|NDAnuBrdbKypZ zCWu>h1ru37i}7c&G{q?SWhf_0h88ZSt|UvK1pt~X)Vur`r!{5a``05Dai5$&?3LEU`v37!IZco zBTFu$CGME-P#I(i&q=wrsLG<5|C}swpKJhbhAf9}J@n~seEL@gOE0Zc8(KKBDTGYg z3?GtcT3+jY3x(8dT(y%3eW{EYXq=@e|J%B*6bh>zhIq`LW5#Wc%h9-v175qDrIUT{m6z3`VV@AWQw;8vn+fs&P`x8K)`-UFvOAHGWW z*zDA$ul(qhpTF|bxhF49Z+m<=W>W-{YW;Y!d2xgKX3)YhpfJl)3br!Ru15Dt%K{mT ztr%Lhc2`E0G%yKSjy-w!IR!0;x7$qk-zCdN{rWe_V&!B(Mho0DSk@{&<18lwrRW9m zXl^)$@p#KIbczmS_aCREn76lhB7fVIf)*h1CdhJf(sudBCx%_s;3ThSqmJeY2XG*U zlRd}))<7x0!e+{4JJ%@H)n8Ty0LY;sOms+OH!2$<3y*OfMN3g;k=P<1`w(0SvRu4y zA;U_}h5oWo$K?gcGMOqXIa#<+(1PX^PnyYsf-9kToaB(jWQjt($wH7!^~H+vipk;& z&$1w|Ee0%TZheJ61`89Cgc`3Fv$!j{5tbZ*`bUm%pU`rXs`Xcp1)u;H$g*)G*Uk$* zaK&UXS{TGqX%4nrN6^wBi{x?EeZ(zCU{hYme>dACH6WQv`Jm-jzxv*{X-a;dWh2T! z3$u;f16i75mK-8M7AwEz7$(DtWw0P(6UJ&p5tAjf1hTx_E0ovWDjj0emv$3>kTo18 zivkr6FgXgzcz0rNN!9u?Mw4~V;g#j@!YCc}7FC*8E5V-Coa>zM*|5u?q*+Qi4_7&| z)XnNa`7|3iY3KWD)!|E>I<>qki74E+#r(TBY7GOKk(QD6Ds>i0_IOr77SMv!PJk;G zK2`-@=resU>B$sS6);(nD;NM!VMKiZHJzApkExj_kRiyTYD>)p^O9`_cnjU2nWGiA zT1T2FI**+`lVZxUChy_pJ>Ff(uqE+9tVedmrbf)d13_TWgs<4r_}@6 z+cgOcC7FxK3_%l<)#TFY@2CjbDRJW^ZBNYQfMxmeP2ydre(nU5GNDiP?vlF=+>@H- zS-cB@&mD^ifs0Ia=8|R5ew6ybdc>!ewwYyQiO9*_#Ua(2{2<=NqpLREt@m}RMz4;t zIy?mF7Jv$x975&NRLkPHsm22_yTM4Y$#x>q& zMKKHSs%Ss4M<+F{6QeC@BtN7={?SWV4SS!~>i3?URCJ&}^|!1ct6;LI!-_*1mV}3x zWe?#LC$PD34q0}J==^T4nk<%q)O|rr3bK5FW8P>{$dZGFdk}Gq$&ygeXD+y%fQr7! z!h1y)%Vgo%sF@(hVl@@+QAU=4N)uKP!O48GpfJ}DxELwA91YocGRTs1#cUB-&KNDZ znw!G_N&_rs9t=kqcDQT@A7r{dA#U7u_BMR%8e};_@m{*^JUY8w-SMQwfRDJeCBz`s z#vupfsmij{U_m=ItYjA+0+`b=k?&=bA92sI$zpw5%krNxS^!Fr1&JhvjeEx4#V?Q4 z=VWOFCiBP=?|3X@i<4nCGZtBHdAs5!YCG1!b!tPlJ=LFDz}NB*vg}qXLe$(vLUDBDD0jtXQ#h1YY%2nb_x2&X$M?4rQry_SWbOn<#qL zkUr@i{1ORO><$)Wp$}GIA;~jdE6Jtbo5qX zd=2?PmXbS9-jW)p;=dbCp4iX_pbQi1w@XU!?I%)`Y@Qjn6PrL!kx6y1LftgskSJ_d4m zuof$8%|~ARI+d1JetP%>afZ7J`34lHaFA)36S7E}zhCQ40@KAY%Semr5z3KGVS#MV z!GYv~eo1u}m++q?XrVpK`LLWUuSv|3*55j*g&wrMp|a`LBJMI-5I7m)sezUetA$-* z#QDoxcD6WqWA_@!0zeyGVy?DO&VTywLo*kr`+aJ!UVUR(=XAHEf;k)HQ|~TkaCC(k zE!>*Bh~9as8#UC@j+iu*G=LUl@n=_I9U3LFfC3EjK}%>l$dYc+ip(R-0fPk*E}_G0X;y#S-);F3af?#DY)(;-CBl~OB%@_?6tJMcij`&~4Hhme z=ftcgs63>%56zESXTsEj&_ZNMtJ=2f$|t}@s@}&8{#i-uPkFE^F1jAecO0}p z7W*~`Es9fM2^Yza8Wmb)&boup9DlDu>ri|~)GWU z9t_t54psuO0NCjj4gv4Rt$IB!sBso&FdQH?m?5d}xHw7omuLS<_}r_UqPT?5!OWtQ zVS;**qrg(8a``k7I8$5WdQL(j3dwXC53j-$O`*OLMVmJdt7QY;SJ5x9)gKN+`8 zops10l5|E*o&(R_$5JxoXRdsM20^^NOSKXy9hRC9r9`ShgXP1+csm*@5crcizp)%LV#gEa0LAnA%Ar`Th!tR32fn z%w%Lap|MGsy}%ZU0hebFpE_}IdfL%s$=P7>B=7oymI(H3}Ad8i+$j!MDxf3 zLr_z5m@$bGmi%2M87zR33K>>1+v`Fp`#2gKNiv9c)=LUdFIHxl~L-#$nE^8-VgUIge;9V zhZ5>bYY$R?oh8&c6K1z#m|rTYyHs3>0o0y$xsqJG^tB(q^b$eKbRtVRHug|GmTf70 zuQKfkv@kqGY{y%el5$0IKyHOl$HxYCt(^+Ah%84Ti~RH-PUDj2kG#e)%i{)%$)e+n z6#RCPC1vC9zD^+FdqJwT47j|Z?~$X8rDwR+Ev5gBGQUeLL@hxUm+>F6Nu@>5a_qz| z+jrTtcn7V$fMsH0rArsd)1_SQ4zx&iNQow~+$i4+L9-@G&Vw+uw0WdUEI0D!18;W>kFAFH6f&msSKqn1%pNy08KmqDZMJxj*3s+QSxsog&Bc-)X5?P!M`-I7oz!KL8S|AHxiQh;I zb3B8jzj2er^C%foA`Ve%45lF0ShRQ=i7W<S0%-` zn)jO03YvjM*S$Hj)_+QZEDl(H_-%{*U)1p57YQ+;MJAF6!f0;tTJBC=#<_wqO=O8Z z`Ez5IJ2ebR%%ajgNVyBPEV=)#*Ua(>z+ zNTgX6ZQ2@_Auz9uU9L`4@D4CLN4EJDf2XNqZxWl+mwWX5YIZdnM#LjVudgQNbt3yV z@kj7VmiDgJd(#OB0bC5VgB0p31!sYW+JP!mGlAsH410t583Nf--yIqEd z*V1do^tya%sk10%ksf9zzTLylVvX@y)>#;njF`o#FtY3#ypD0XcZw|0cdTLyM0o^( z6<@S0f;(N&DK>*}r8imRHgG1^wm4|{&etA((vzYx!rG$biC*WeK6!FdoiR7QH7Xha zA;^Nw4g?V@q}(ys91vNgvEhcRu%xRQSx9G@F8vBwrcIMkWU_GS8<3@erJ_D5Wa&3q zK!wP%>`go`f)+;g1rK+LNuE=gON{<`WC$U@jcGE8J~86WRS zMKkRAx_QY{Y13C{TW6b^n((RBDtgK!N|{LbwLlM*_5_xRaiuZp+C*AW$yq5Joq>FS zCR5^+a<;dhf9QJ=sW0W{2j$i~Si@`tvXK8_T|Ni5>n^GwsD!<#ro+o#_O+}sv30W+ zLHgWLdW88qktNxcxFgu-d9SRK%3Mpvi9$>AYl$8s(8A4D9z(^2wO6i{_>(ws#UE@a zd)n**+*woOS53=-I|+bz(yhIy6`5qVd&$0XpI~Gs%T#%&);dX+d2A6Eeb2JkBBl+@ ziFTqB-w*~e_&E3Sy$lmz6nnM3v8$JD(2%7lc_l%Ck1fz`g;T)wHiEcV?Ti8u1G6CPAqRKPOPxxwc8MMd?0g|E#L#j_iyBvy^*N z_nPrs!mP#CGG$e*l8XRYI5;9@@tz*dl|B_(^mB<43}1Ye9N=e9oO|V$&!0PWX$(=r zm%6Nq9O#G&BWCd+kX}{LOtN6}@HjLXVDdvX*tLA9ZJ`vjoNxs{k>xNRFOY?q7X9!3 zU&SnF{tP}t_`7zIUE$Eu(enQ728-9;ZY0O9;>)5(9!&``r@@Ss_efwTw9A7ntox$> zm_L^uf1E>3TU*2y&$fJ>zA?{>&TJ$UMn zurQg7fqMhP>YuCZj>cqU_RR!XTvJKXm4@+VaHX5)#;Lz6)$fgf*juc+N|1#MWwjoK zET5P!E%bypT!yQQ-dZ@1MhEk@M3%F>sv$UqDv~@A5NLW#%16#}$z+w#~4Y|pqh5r|}FI+x?N$%$5EiF{&9#bLzb1LLR7FHF*6|J58 zzTslFEDpWl`ZwH0*g`_g<$URVH}Q)L6f6n4%#*{Okinv@Ug-W@idI0$%~koLyrd?7uY-h>i|#M6q*d-y(gd$$Cn&d8`&H-buB>5vqDb#C zy<}7iw6qG9SJo@?)9$7r(jB#)!dHo!xolO_RX~2gDXLTHrbqq9wIx*c9Bjj_KybG*7ro<-?OyB#H$O2SWm4~6g* z3)Cnq14_N0SrJA?WuH=$MT-8kIt54616ULUxMr;-~2^(+=MYEvk+$#cv*;m1AM zK?K1!N%;t=+K-nQC4N0~a*J)7w{AvT`D()x!UXknoHdiZ4!K0~gNma}%80~ZL47qj zGjR>b@>7!2iY8hdp8%;Ib;2nif<`K$1CUJ>^->7^s*J%F1O!|nQvpkep>G3+9&v>n zoeeZyN*Y&aRN7-Rw;EDc0Kp_JX=zQ1`l*E#G02}3Is8j^c7ioJnXu`7`jwym`uX#x z#>PAn<$*~J=rDbu^jWdF_T3;TiaY|=46=`TGV!|Lbu$*o;d$v zW_cV{{EcD%u^@rAXMk4mY&@`%a8 z!i@JkVyI-|^n+25g|wf@;)P(&hy_~ELl2#q*|-Ixm=Q*h$C*8L3i`btf1~<^@$<^b zf?TheL61wUHRxo;qG0c}7>zFKy(pH~vDjk3zYVvsG zLm&E(Tyj73A?TvrQS=pFcbY=J!nzQWmaTQHfy|o3nnWc(&~kOM z+?1omK9+Yx0iMev{`gPad{AS3qn@uclUb6dBpW1!b+tUh3zxFg)IG^x$ z@u{0UK{QB`dFGCL59ILJ+DgSK@AfqVWN=mwR$MP}9a@W_CRe{jsZ_{v60$g!aiwKb zkOhdORZ$)G7Do3dy??tbM2KT_j@EP_+u3W}ue?#pKsjGUU`X>77l4p^V^J_~4TV_1 z((o7dj$!KdTPx1IY}y*G@!Th{AZ~44uwun>yXNb)foA^!SC5VFJ0WKmQkSn?>J7cmmrp_bE7rYIP&BgA`_KynfkPGqryr{qqhN4T+q6&voPMc~otF&;6i30aG>^*hy{1A2 zzD|)>-U{Vh?mkxfjkg+DvHxYsO#{iNOyrR4AK)CNE&y1|a>5oDo%V=+(IDpTF=QCh z3qhK5FnJ!Idj8kH{LKsJMV4L_R??n0THqYG#D112t~I74nsU7%&{)a>x= zH2d&PmSceBm?rVPr-gLbX`@BHex90aCX387=IJUvWB(Fa-kHdfyx7wygW7~16j(lC z=I}nqf_T#;!18Ev*U#$0ULJBn$Kj>N&mglU(DJpfeH}5|^7xruQ*_nQz+Gi_Ozx&{ zeeZkU_EwKE-iXM9%_0SRSE3_}1Li9p)&Pr5z&NO<5#ISTXeVfK7EEZFnZfgT7P2%c zI)<&hEH7OZEAx?K#X{o#3sd}>?VklK)1hVjBAD{t;%2hwA*$J{yaHH)ELI+~plCl9 z6e1TEI%BSE^N-(T35hU}We!-j?IOXYlDyKNHgZ8G3%$mdksFRT?!fWQWC1N+fyzI} zEQ99tLR;dM1!R#PU3A@J=!VZ9IPgKyWn}AzKDgq*2S-Sx0-e)y3i(e7Es#ZQ5oEk` z@{5QtgZW00We!rpr!qw^0Tz>GzRvQY1{1Ahd@9HiV1XnPRMdI>tD3< zYxkYIci*-67V1E(ko34<+AO6FQ;Jziyll6PI#eM6goGDOb@#5V4DH)e=^utLYbtd) zgQPE|eGB8z4s`5MC3?GC)$c;JhY2Ie`7-DYezVfNEc)7 z(6tywL9G#irHv42>t>pkOZ3~N#ZE{d0@bBRHYraCTm5cS3@c=w1%1|{%2s&Agv+LA z6DDGT)Ief#b^kIu1NQ5sXIZ9%wwDekOltDcs;6G@bUWYXMW?j(VHzxLF2^xzI*wPv zzNI}zjoBjpIi%#-#C1RE{)pi^ljK7Gg7XXw9a^7czu_@9!6{VWn#k=%gl z4phiO=#t0+MRIv>zQl#evaLxRha6!FS{_#&|H(j$M)JvxK^ET4ENUx1(ZaqRkcBNp z@BR44-+QBrZF)L^waKs|0_*V$F$fRG&l3~W6m4$&>p{1EDmdY&hTA8ae0t>HS zwh=OJ7g_FA?LNrzXy9Kk7}%vw;v-47A@_ZmFBDodyrP#FTc{EQS!4<(q{Kyx;crZ6 z5nU2l-jm33!{&wu_sE$aSQ^!n{bo|#j~ca6D0bG20Fn+mavisD+sb^O$kdREyqKe znD-idLKFK}G0Xy4hz_s_;B)JTq24loziHP%AMk{pa`~e2;cb(4mM^LH&KpyOZ?Wht z`MA4~ZzHZOW z$Pxm`y)y0Gv}ox<^>AxH8!l>wP+GF4JZBWS2%6Lf(Z|$9e>ZuQqiW#NGW;pj8kxB= zDC^@N81V`tE#$G|L4Tv-2A6~&AB9>eyxOkmlmIE91JWHC{6 zR8CKuEX!tB23h9oZ%0H@x(I|_^#k(s7Rs*8S3EG3#WXos)W;PC{9GAbw#eidl;m(Z zqZ*8i##TX=joTw=;T=JiNA(%EAf>QG7MJADN?-(Sr0&AMM8~c8DU;(`V;nQkYHhI$ zmK|vYM3ne>qrdtGUw`*?H++7@qDLP2;DH-%*!}qrp$~q8_@xC=gW&`6LOxr~P z<$E7d&=P2gsD5f&~5XTZ=19)WpZ{ASC&X0rZMawAq!x+`3=_#E70#l z-#B#ePX-GqD7)4+Y_#^o#zg0WdOYtYSCa~JifXZH-?{I|=>a@nP7b$M>T(;lVR5HU zR?Q~jPBMwvg#MDtbb&LJdQM(mB`YV!#5|JA3+E)K zjIl=O0w0{s0xGJK^FGy0B;~KXY!_VUOjB>M@ev-7qdnB*1j7!kv!d`0BbgA82ofw|CH8=AoH7pD1;Tap4fCNGFBK;@S?K)NR@& z6XIFBvLAZ@+W5gpdSq(tuGw}?S8K@Y^I@qh&n72vBbhyU{KVzwf3tnd)bZIdW~aN0 ztBZAG^mfsfiTpjZY7nzfiE_7u_EHxHYze#y6xm#G6ta+)8AU#6HA#XO-{FM*S|7Cs<;VGLMQvnNy$S#G%DhPw|qXc-wXS#q!- zh~o}ZhF zgC7epUTPDWC<8Ww=zU?e}gPW%dTcU9%xC3nSm-& z1TMJ*7N@)*izXpKOHLNmSsou^=n;XIE6F0P5qym*R6PDgd`ZT$_)nq3){5NqDLstEqc8wGfy=N`5$3(b{HQ_C!8hP!R$$L@_NJ=)>u(515D^w}c=!<1Z(cVl2T?%hM3%GLXH;`QmI$YOWA zGXEm`RIYhGA6cv3uG}&MHa{^Uc)7Uv31dPD;6yrS%@3p z!qz>|gUDmUJ@h=t`;nh7oN`J@Kb`e_wgy=`_)4CnS2d=nHZY&|9#k|*_axJ=8lJ&+ zrXJQfTsKewFLZ=g>v+V#dU>?f<$f@s=dH9_mbuU|O7E46s_4^KW|#{qRX4D&U{ zP^*XV-G?`(By8)5?6-!txg|{h$)`mY9~UAE^OCOOgO(FVwW#IADB=^dycT4+_x<@S z9Y<4Y5<)>1pI30?5ld{j_ud=sR?zaHh*>hM;PWAh}>i4F0S9m*J^{_dPCY86lNJrU&0D7~txiP?ha z_#*-pSIiBMsF*CFM2H}Z+2fjwxEy3*yvLVmGE#(b%(5~2ln?TSA601kNXy7O5OAS> zPe5=3xv}>wz(Vx8>rAxAvO@kxKKaZizwm`;zWsfuqF+CB&_XLPd+I^U^^nDAu~=uH zz@nH%WSIvSuEG^0vUp(MU?Ceu$O2dp6?{)g(q+8l4cCAE8z$eOPbILVLi1b|IS+J3 zbC8E8V=Ig)dD5_e1IfU3XD^=}s*5aB>~oNJSlvCc1qX4b|nX?DR}p!r}MREbAl(C z8qOSrfYXxyRNGbI=2&Y}zci7h3RO{vnV?0ZC(l`EOzn>~K= zv(wN2`sL@(KfX#WAS-d7gPxuCcd-X{LEq7p$p}dQI?6Y&cUtV3WT4sqlNL=%|-#%)v zEDMx?6v#5|)(pxX>BEB;^RDG!xe8hAq3P)t^eSXQS0#(?ZyiYP9~WRjcEfl1jE+B1!}6{KjK6pQQHQiKWwo+-Nrf!-HgmW3nj}Xr zqXVoMm3BfF5haD&LW^ob1CKtk2(oMrKM#@RhTXew_&m`|3uJkOc%G-074m=h%rl?- z9=E4TLH}+TgCsZzbdtG@MGcQ4wj?aGffzqG~2l47Q;|n(o z8U26INc(z|Wj&=1tEV+OzzSNBvX!I{ag5I&cN~j5G2+4p==*^L1W_IvA<<;AP}S!h zNXtrkJ-tG4Mchft>R}CJ;oMXpMDU_{^)8L9vwMUCpP(d}p?DFE$+AbJ(0pd6$`y8X z)VQV%1(3MoP^?4KEotn-yNr23PM4fmxM%r_75j8l2`uA+kQ#-_oZSIe5?0nD|EL@S zAy>xbE6u&*G=_Vfw70Xxk#C~9y5!P%kxth@BRppr*iG^g3A7}t3)Gu2SBqKQCQeBgmea-tKH$5&5$w*SRn z|MHa=j+~e}esW^Cy?cUOsCJr(EM0QcS~aqEY>&x8*+6#4)z(!5ujfD7z*@)xSH{u{ zQ->_b=3(LrWEnk5=W)!mxE%T#kR{m_x-S(q%-A1N+TO_)r^C47%DvHYgUEuSlHVYU z=J5Rj+ptMwIm2d}Cy~)&vS^p_vxlE}=>6M|vL`=HEcP2M_pC0`ZeB^0xD5SWviSb?X}SyoEg|Jl zle7RQlvP}2nq;zse21EVp@wW&$Z%0>;cduFLD_aU52i@EPphdRQb_6CRc?~b&@w8; zrSL+#oe_kBEPM}TO^kU*L3wrMb9hlMb@dd-ORbS^K@)X`aY|^fy&VpkH z&0!`>p<;&+Vix;S_Q{HnM3}a%m^eDUsMQww)FH(+zj{wL_nNjZM%1F$>}jV8@>*e= zQt}hkF{98$4P%_k^eVX&!h3wsp;&9rBUQexrS4u8n*|KN?B-VLSJIc+(CU}q0L5h% zWx(8Q>^|pSPmgqZov%BF6&c8%Gi|Lejq7Xr;8w>2)a>HkYBkX{*rorYzPu z%5=Wwz8A0TQ(`PXEn8>dbv7GC5CZW zW>HEQv3ag@1D_2vrJr#T>8%5jH0xr1BEGP%>YYZC4Gp-=rt_(`;61u>^?je+d-CM6 z=brz`FJF4@6uYY?S614`$$zHVnNk~b`NS;L_j?to^k{2H7moVewdFcIl?GNRV3|@5 zMkxizGNbihYCL{YjmJP{=Io1_mbAqSWfmEdD{%RrlO^(DaZO-JWO+Q$q6=^mr53J9 z2kyQ*ne8WzsJId-n;6H?o$Ne2CMC2yEwcRJ9B?`OFy{J4g<5|=_wa<)N|&?{8}T1d z^O4zf$=@W)6u+)c7P4XOoQfRuFa$M`1qE*YX|nV;+$QZWRu5f;Eay&_AK z(lFzwesLutmqsh{knxd6FF97ScZe*A<6eJqDdnYySUYF%XOTOLKTKR1C7=j#v$9Ih zEM%MnS>oEz9I|AylS4%C1CP81vpLYB|JAgHu}tgGA+?Fc92Eb=36mOy{O^BTEn;dy z{^3(^rwRgCZqdRN7{UU3QH6*_>xMx_P8QTeme@~BHq2z1ixy9_Ko;xmZ@>SpYi_xD z@qtet*nKVIEV~(H`J=${`{f*kZtA;W#UP;&fnW~UU7owuAbVb*eeHb*h; z8jI%^mCk3Jki->{3O*p3Olh;^o}&0_+%k(ePd!#4vP35WT!AdAp`-?6@>?g1M`0yod7-?@G=NssN zS;R+etYMM+Q~Ojkmf&Nd#dB|;S~Vn#@h!WyK^C$b{ts!ih%ByZV|8M)lOt)jq--`o zh{%Her)2pnacBEm^<9SXKx+?Yr{~EDvvT^7wx=M_R%BT{AT(BJVTE8(p|Oc%6Ld_F z=zPKE$eeS@h6u6@m_}!j93Bx|sMQ4g0zq*-b2c%Swn@ z_*0@!J&L>jxd)#(g*c+7%M%Qr5f2hj=jhHEN=t!R7<>c8AmU=pn@fp1IR7QZp&xO} zjXwCsA_2BQZepv=lONXN8h-PwP;0J5vy;|*t^gLvb1i<&AIqir)Z**gf-Rwupt^21 zaD46`kFmy-9U}pmoMVt`CVMHLgj(3}tKL$yMEA~4VgLxM=_q1=_<|QgOA(6#w;eVMSXA6u& zpWr6Q5_*}7{%{4bh%A1o`TN(PAPaf6H^2F|+irUaYl%0#?4`Hd!i-A-OIxbk7Ykd7 zowYw$#RPe6*iE=1yeM+9Dvn=lOEt!LK?$mGUiDULMI8YMfDE{}EcbOEw)Q`^m5BOs zUA*^PIVX_M!Z@_GpUXtyjH&u4@`ie6!Z;h1+qs<)hxYazAZ3(%)dAA|oSg=NNAIU7VhV17(1%?pxZ*3L=&K4z^Rm$l3~?J+MYKbaD75pNbS*S?k3ZKnNiWF z@#0@KW2LP;-LZ*GYat~*421)*k6H`?995;|U;gCk4s!vB*SvCBgAkGlm;|S^3O}{Y zMV-dW%5a-0k)}IEpoGGwr!g&O-#D&GKDQU`5!};f#~yHBru^t#J{Z@ zO)t9O<@^|s_&3PXs^rWIk8Vts(BB|S$q@@G`M@?=;>O|mWZ4Z(Oae>!sdzJP^I9F4 zVyXmvdQ;c(27(g)Mu@R&m2a<>XlaNfmyyw$AzkQXc56~^D4Yy@-+g9Rpk-Nt*RuMs z&?0F}QdGHJWI;y=T11v*%hXUN&|S_7`QNyB@qq_eVjO$w-y+DEEXImcV$@p*Qc`=^ z$D}4-T7`U(<(8Kvv;Y=lu!L?7z4;}ty6vXdXyN^xx7>1P2A0S8k@L!`yvZ`-#Vhcj zRPqw41QgA)02e?rs!b(c0WvpSE|XJ%&t+{2@m6|8-0osk-pG@MVw6kT>$O1r5S5Ck z7rRHw*X>4&%fEV|9@SL$QFmIWO7kE^RTBB%sE!@NO( zP=+kwa!zo#VnvN1?-CLr0QgAbFJ=i~5&QCn9xgM~7|5%oF;KaF^-%_?6>3H?cXWr9 zi~pA9eSAIO8CKA;mG+73$alrV!BK>39gVez4|jLesF&A<>*a&BT1f&ZC^qf*U$C4k zN4?RR2a9;T`b0sNyY-Kg6WI7NWazXL-?5Zw)+(+b(=!(>3%Q&WMRu<+J3QZmS19$*LyWX(F<8D&kr)q zg6IzWyhbIH$=@>TUnL9r&&fhAEWl#6g!vR$LBdMt9VoGdKkqmVTHf)-I|y2&GcB@= z&Dpd!mh8@|``DFy;+9q^-!C5hH0i;)x!tqO|MaKbsouawdb%hdvB81GjIex$FD6TN zw*PIkh%EGuH(^yWd$EVAhQ;zgO=SEJsG?k$pBUQ-Xo_~z0jyu0fpS-3xxDRV?|B4)GbUAg4d zi)a2;R)1-FlD}Hd=+^ofo3D6_y3;>>-sh+ep)B9hDIv;b2%8nxM7VH;<4q{H$SuK|<5=6c0}nc9rVGBrgfU%52M z#3cVQ0PTn@a(|u5&x9b&b&oHXH`xr#oiXiS#W(-PbZPc z(Q#H%9^Jb)%}}`E_-hJVC~C6~pT1-AV`o4Q34+Yx@1G@$@Auy#OMvAQ21}rY-mvI9 zHc&FKsOi|ENer?mBbLAdS%w7`lci@)wRw|eL}US{h?H0}DHeeF!Y4(RYYewEI=E(0 zZr4Fe=374ysjbBTF+&!s2Q4OxZ&;i~yD?c7dy)lNnjObI3&~>r3uFl`0!t*sf-I`- zyA+d&^J~7wBZl!OiEphZlRxn=GU7Fevd_sZea2u1uFf7IvKBL?2gTnkfJ-9FVQTRv zOQ7Y_@{wWCVzwY}6ND@u6j@d&f@v@U_0~P7Pl6UF=N`xk`JlyuEP%!PQf?9l5?Nj~ zpDeGQPZotP0T$-%iCJFq%5-0ICEO@8@%hrb@BhFD30f$%yygY(CjMeolXZQZB~>Tb z2P-|sN`==tx#INc>+3&6UBUzSTG3MAH-4_XPir%Uma;yim;6Mo<|Z*6zyv6q$s$W0 zus{~gy2Ow^lP>$?9IB>R#jAduzDi|<=u6rncE~>;vJkgS_^X>Ou7^}zeV3~+WXW|T zpG4=Pb*RhYvht1CIM=#{fQ9_cUyT~bi* z+6r2-B*GP|;3CEoGG1as{9h*YHhn(hH7Mn>ySNC$!X6XBh)6XYqUMPIn&WD8Ti+rQzad2plUOLVDri$}!lo)&FkDf3qdL4!mz5 z0Vl2^Bwaf%RS^8s?>$ec32?I6Q-iO8ZKK4i8iCDz#O-pWLlgV&nV zdE@dr{u+ECH>7R&PduUN7BWY(+xD0&8fIzx-;)KID=B38g!sZu5858rjmIRg?|Mfl zMJk$?)M$%imPKT7Hf-FIU191z7FMH_k3Q>{@~PBDm)*0Je}xt|$7}h4PP;^wb!ahJ zf-MU{5ecb)!r}?axJ$t2MtE6m%_oa1_N_{b`@-lB2=D%RTHI!k5oO`)&~PhaS=dDe z3Yx&ktSU3#}Mzf8}<6)Cf3UZbaC4uN@n@+hE~EWB@U6jxit9@=7i3>c{xw+TD* zYc04#XWpJBi?&K;WJ&Ar+q~F%EKKxOX*tk}St#n`0RQmv(>P%Q7JJLgo5*((Ol0A0 z-U2O6vIs2%BdN@i$l`g)_rCgpH;F7BkrYW@rh!V6h4(C25+RIteZ7VkaODxma^!=z zJe$Bm4n}F63a3|*U*-*91cd9#Az~NvMX}1;4vltrfupwg61|+IU6g6btC!ddu>lnI zlx5C7>J^e2wNUD0po_zHXoaq8xn0(S1TdZqzHk8_7qTT@Ig+;CIws&xKDkb9VUN8W z?bFIyxqtDN(4roKuw&tnw(PT8@wIZAzi?^~A9%WG@$IiDmPxrVQAdZL@8!uGcg0bk zjv2pnK6Yh|y~l(W(r!^bkf-s08g4cdHbsXo>gaH?VY{+?Hl-h`P^@yz!I7BX>XfsY zl6vi{(rCZ(Kgwt+%UFPnJiAPH_C+kC{89xnEAwQu=|$?FD%i}vFj||iU1MJdUu-D6 z!%Q(fQhl{mh&iB6O|h5iEBEdzjfyPw-txYEWkUoMYBK_zZTnV|$Sdc_Z?2RBq+z1c zPefXtmWkERT^0mDc6UyX4pgJ?XA>o>Vv@bYf-9+zvK?=(bQpacghcnb?x@U?sB!cNdZmDxE?We%I3_;x%Nhz!zP@6SE*(Di6+Go6g9x z{C`ds2Q1WBK7mXYzY+BoEGZE|iy88|Ad8eD7uixZXIn&;K#M^t)n{XIizh^l7Ujf{ z(Gu?ZSc%=c?BNFKW3^8zF|aX@4gP=*IGK`)EdNX$-*;<~WpTx&;v4)yf5ic_WWg%0 z+F$==4J{zc;3Bl#c(P><#vJ6&LbM1DR`bTd2+v_qAUwr5(?dGw=Tj%c3jSrW%SKBC z{6_RI#N%kiB-!#9DR!!b_<>&dHegv?#Yc`=9Auj-sBL<>O`EK}z8j`M7hZa#<%>$( zr1gd-Ti)=Rn{R%@rY}Bn-zMmC-`BnA>jPU|`=(yo-K~nf=BW}{YBmA^F1f7IDgts@l7fLE{VKAF7&1go0Yg|whUSOQlT`GDoD&8eWEzhf~ zE`aYcKm#2l`;!0T0mmI2eV#&*Ke25A3Y+OjOR;9o0xYYREXCp22cZxFPIE3m^%)`J{S&B;|HB*q|t2jF|W z2;N&MW($LT0DF6~13i1~o8No>`R`pndFtr!=vn!>D1YWAgj{cL8Hp_Atk^e}$O2kU zvHblCilOgoa772~l`A@7!3uE;M=nDh+vNUtG{r0nIUz5x8AH_^QGFoK!@}Rl} zPBbV^V(eMfB>>vL6StRQ8Ga9NWETyPMVenPU-(vQ{3KIFYQ2%gBlBs}!yJwFe;FDz zj#b@?0z08v+}~umAzUIG=GSvcx*<3djmPtGvhdBwlQmOPR!UX1N+ec*1%<~m(#tjL zfQ`XorB4zc7n`96wRw5tx{X1XQ1%XYk1rfwa6VShsl$i8Qc}C{_X;Z`X-hX%W<*lV zbrzGwHY$-0US_uNK4>}6mjSRu4T3BMJ#ypkJu%|;i; zEHBYLt(%x#VU?sJA9IDzC0Ap}a?7Si?juX~hE4CWZ~nU(Rq>`}N*nf-l|qYT8onWuI%Q-xmiZlOnlB9z zdirlCN2G$5YBsc;`BNtEb_8lV(?Uj|0<4AY2|3MRysiaTYT-(ijy_67+wD%1s^V@j z6Io=}sQD7MYi*X%3mo!rA0w1vhYT{4yZ#+$49`fNa@V(jXInSh|<{Vuy3RTHUDD2{@qhk~xxhvW^Hy7F=qw`K%0z+xm zo(G-Pp_FEt<*aV?(;iL!8Vlks<^dJKUBqo9p4`+e0lPP6#lw!O6T0V8!r zY8#5}n9bdeT7LZF?|uH%?t?be2d;V&U1&za9(5K}Zm6DwWB5^5H&4x8BO;j_ z#6=xZ%ctx3YuDJ;LeN5`MX~_TKrp|5*fv(do}3<8<|=;M+GU}PEdOe6*gp>z$datW zM3(n1AWH-;GTDy?G0@U1wIGuvhFs(;;_Xk+rCH?V0P->@KNao}i)xF}BCPPA%J`rq zS^4W!@=x2b_uYN>``&kK|N7Nw+BX1DSyU9s$YSw2G;hUYK&7Q7Vq#h*p(4oA!)=Ky zwR99OCd-2A%|fzRi|Z^w7GAY(Fg-#GXDZ{pQh?>g>S-wh3;lF6>yy^O3@c-cSP_T< zD=DslC>yOcAu+`-+7frq2>t+ELwXiIkYhvdUw)_q) z{c*aOMzNN)K4cMC>`Mt-Bp2Sn1#AE?Zx6OS@Hy#$HyJH#$!8PgOZfjaIK!aW6{)~S z?aTgP#v|GDb?0lS+1$D5kxc;RC65~{?@^7w&S3pyw=|NnAtTGUK?+-3#n*OXD$Z^I z4YF+2V)$B}m_^wz?bF=XJE)i#Ln;u%Tg9TQhGdAk%oBS7Ymg>i0 zMa5s=h&tT*^;Xpfv%3x4n+8;PBO^=9I@%vhjBa5!AcxQIUQ!2 zdGsGDyBp7B>9d=FCUrFA+Mg)OOK$7jwcRUlt`KB=_j|wmZu$G3| zY8&2I!I#BVeY52T5zF7z+VF0w$xy+9zrFjQ2CJG^|)$bi0+2rSYyKgf5zBS*DFZ zb}3uVIeCw9J?cQ(eW2#nR#$iD(wxSj;9gB$*-q5S|V;^Z; zGmkOMQYXQ}Gr%=4cp3EeVo%=<_Ar94BXtPLL%HZUBsLlQ%(jtBtGE$^ldikC)Day~ z99r^PS+&XsPdi%K-N;q#`n5_KF>3i;@~N*>ZR+KMyc`pcVb{p2m>MyQI)ceLvAt1# zSBhAW;Np0y>GL(9A_>ZCo<1#JkGeb*w0>O+&t0GceKh~%AR!c*Qi*^!cmQmHDg!cWp)6{fih zYp5a`JJ?IzVI1%J$FlF%s2j!W?aa59GpTl8^Ms^oHOhn0N$!gVz*6fVS`at2xjMCL zXN-eyUSU?~8jx(8pl&(7q~k>mw^rTjx|!@B8v%f?o;Q!d(p*OQr>`H8zqiYkgMr3BCZj*_lw<~ka_RA=HDdG)*esv>Cd`D#(cXA=F~xs#Wl zl9#?Vf4zugS@O63gDgm7FwYYj{9vNFjA+N&EL7TTvu;s~$$3n=L-{pc|6KS^$#y zNSY584q1mPttG^&E2uKhdZ4{@j$}&oL4Tv=Y!O)gF=UE95^bvdG*E$KyZ?NRVXj zqR8Z>Cd);y4Ex3dZ=bK1W_d6PvLHysl6&21L}`!Yoy_0k?UFWqJBRTnZOOUY*5fEveZbMSIF1X6o4w> zCgwxjGFgTSsX;b|xOvfxS<)?CSxrwK9H;}=tsix*Pl!Qi~G%&|0W9`076WbFafA`#&EuG zwW>0dj0eoSc2kK8Jzpe8;ax7&HVJiRFI?DM7}B)q_LZx=Tfhf&!B_sY?oy&hy(Jnh zQaOc(U2@Q(`K1zl8A$7Qh`*_+t5TD`MGyI;sTFEih(_Vof9>K^7L~^rQ1%BWSt$qvt`(<>}p8yrL_ziAqU5g#1gE!seJ@%bHN!T330& z8@^ZtvQKDXUi^y|}~{v^FpT)m%r6g_nEQIX{`j+Bt4?ZqL>k{iV=5Cde~^*R)F ze2q7^z~UTOkVRtbp1KM$R@xgD`_D77@Ec~b)XUQDMr6aLoes+qVu2Qu#b`l16DLP@ z*BirgHH;1%$McV{qNr|~GLGaSF<}uwnr|;=OXR*ADJDlUPR zRCMyI42FLNmUy#SYzfV0%c7}#mig~^D#*VfwrE#6?8tpbgcjnKhaYYu z8@7$01=IZ#b;xr1^65*vRAR)I~qIA9x zK%m4zgqJZ&?M4scU0iS_SPA#3PxVo&nYX18FmtD-qWRRkLL3kP=^WA zA7kuf?ku7iq#2PImK>n10EBMO)yRbP^N-^-nJHo!(4F|20&;=0QX|I|0CMP(nyreE zMq_Q{H&c)TM`}e?SzN_0t5-w5$gX(s^!me1M9q2nAF1FPmK_1eJ;o@$-j9DpKYpQQ zvz{z%&CFSSo+6s8Vx^Nb{0bWW*o~Xlag3 zK5Cu3_skiBLc&pl<&Xl-n!9Oi8y68npk;2+#CyCMx={mJ_V%KH#Ny~w0I-_M!G>D} zh`7t*-sc;WC4!5E8k|oSXWkZ~CO$M%7K|)Voby4JXy9^}aFAtZCddL?EQ4jCmjFty z7Dg;m6D+>nFM==e)vN_ia%GN!s4fMG;zgE5kY$W>&}d;}F?v_ZhrM;}+P5;YkLkXC zJlfYTzjSFiKcaVLg?yt0|1gPVkY)?P1`=7|N|5CzFMRtO_q<7D`MAQEo08tc|3JlP zu@thr<_&MSQ=9M6OW(2Su}!zU?B=xTtD08#_7_A8l}})cO+x26Jew?os>)Zm;+ZPa!zbtofHLRVTmMr7fDYQb){`HGEQ?&X^v^FoD^A7mZ+M| z5;mpVbQzq|K%MH=Rgu6=YMS^%D~TsGR_}fF96GZ17g>BopO;tiR-M2F1s%?6IndIo z5DnBjca-C5SIC9SnC-T3Y&zOj$wG0|kh&Ss9NDg=n+DZ&0iJjV)#u7_H z5YcR_Cv7}xSa7uE+*^vpa5yHpt$T|te54kdr0+Js!uR4XEDOdui0SvjX5uon9>jL} z0fjY?C7&$5lnv{u#B-Qe!YOZLJFNs*7)F9BdL6c4#iH<`z{F^Ywf@}hni`)IRn*Sx z^#S&l?$FD=tfSk(n4e0=eo9%QsNl!UJ$qX$^&}9q_`#^8w%M)#GVHmgI{f*kXg&Vr z_ntb=*1p~K-8%jz`7WlW3I+=gqtVU4l6P4W?Tr~NBFp(%Z!pAPun88>!W4(hw1k$2 zPMyMdgE{=^k)v&YMV4j%9kMLBam+%(+i0;~_X*H~7LdiSkHeLST^3@+qj3PFeFW8s zS-7a8&{7XI81C^%i+1QX*`i7dXc1fjEn*8EmB*i)9i~g-tW%xqXEbRxpd4{IN6xW{ zme9naY}n%W7Q-eK$S^kME7@PJR+&YwQHpAUEWr#tha)BH)O z1*gBp3PcICApXAC`b!an(YyWg$>I;NT1*MpWN!pnnuj+3O>>g255;@Eus4!TekM$hqVHXRWhW{+V}xo($3WW+EyW-43;*jfR~R8 zEhY;lm9HYH6|KkjeB%WLEf-%+&_c{|6WkG7ZUZRqafRja*IT#2l{dei#rJpK$#_2H z`jI%RJD#c+}P*p%d3-QY_+46GXtpP=s5!KOEEyRvnw~0jo-j~G% zb*rl9*!^G);+E7rr0EUy9IJ-!(`%G40fxDcOT~L~Vd@j`m*vg^Vx>ANJI8Kyk-@n5 zN;)8ACr^Dj^OWQdy=_2{N3e6C2wS+P6L)+eR}YpRUcUTr8!rAD;`Bs)fy0)drJuZ$ z$da7Cl3#OF={aASEFn_S5$SGVPJ27FxSyI@J6sWD#2cT^s_9pkl5y+PN0~Q}8s=3~ zPlU-tlma7JrH$4uJ~<=d=OVr0d9l z@s)9v?n~n-#4I9Nv+qu}MBfaY(HkzH6Fxfh-3Paw^WAy8h$m ze*VX2uI|wy3f8sYgv=l=pUYP~s=VaX3)7K0&#`^kJ))`lqg3!QS;AjlsW7)1Bjv-+ z$G*jL=dWSELC>)apahn+prxf3Ic7QG0{mO=z2n~F_rB2slW*rgDUl_n@?E`$ERwDB zPc%TwFvo|~NYb$~JZ!dPYV1aJz~b%fDRA)$V`REyVG9yko}A_RnxovN2(`AJHjVWI z^noBHMi*_x|JTT}_#WoQLbMnzQEyqa{-tIuTHVr&VHRp0T~dR<0<|XQ{fX8rlF={b{ynO;+yq=i7L>^H z>X#<85TZC8M$qzr-H&h5T>h)E9mCfWoIFkv?D5y%Ca~ZWX0XV}C3#e`L-`iI5c<mz2ilcmi;vDjjBGQpfFH$Z}A= zr)Nj=NM}t&y-ZydHZ1D$KXVA-Gsq2|NkP?P3I)vv`t%Ne63}9@l&394_1}p?Tnr>gwBnz11ymnU;cQ2=biXr8| zR6IE5<-Ll2G@R&p!N~)COLej+SEL;-?j?5Vo1?m;;?sGcma5ry)l6jJUYxdKM69tS z*~IRbrGz93WOfKFmMc17f9Wocb*d#)h-}v!?Q8?25>1#IUiUcZPf9$xDMt=5d*d>a zwzYY4e?PgcGGNKiXj7Q}VJ2yg)^k)VrWWz!oB(6;m6Gc(faTCu+ue{oWF*Ot-9DY} zgBCzinaJ;;Y6=2F-o&;`>pA&&w);R9n-i$mqRD=lOKTK`Y}U4Ce*E+2e)P=e&v9MN zwidfyn&O2@XVmm=mmrJiGB>PJ%c=8eIWFuFSqv9nv41km5B(fL^ z^SH9?MUPpKb`h(y_#LXXpk~-Y#L{xA6j?$MwCpfhT58l&a;#idR!rI*WQmn6kVWI7 zPKQ1C;HULWJVe-HdE4Z9L7cTyBpXLNN=4W*#YO{#^u5t>bK|b#MYZ!q0n37$7Eat- z3Qn?nxwNvt0l;T!^M*xaS*+FnNcx-#iCk1S39Keu{Gz2GODe%wX|Pc*p}|fu>g)G!YlZ==@d<3P5e9*$4F2M5cm+=41gd?i7c&3HTEpK|@ z8{bAE%T222--8HK?&0H%md77|k7cl+I}y&ur(c0KZTgeJ;tPL~WiJ9R&p4&YZO$d*Ov}orC56T(zd;%!yt=7IrWsmg|uhV zS*K_QPHZXk#Ufz!)`!I*$D;0Lz$9&gMpx4c115Ett0%frsA#)yn)Y}6(Vy&=Q3q0tLaxcRnjEo-=Qw4x z<(qSQV#tDN&5!P`8EUFA?y9bU46$y7_OZBfrHXrs8sxH>)?9XqPFQrQd4cCkd)DHv zv7j=KW)5-bS`1$r9&{1%%;-Wu|8M|6_np+b=qmH7cznj{7rTLxv=al}osf*e`Za*$ zvCh0GEwacbLAfyfhPa2rPo>}tC;LlWfS}<$&piKgs`y`e@N0nO(1#J3w&a^bHZ1L$ zmb@{6Wk8U{F-vdiJ-+62SOSWajdnb7jZZ!?OoRhkz=WwVpByi8%wn_A)*B%0o5U#E=S;CCIYS){Au5jq5C-8)w1>LryzoZ>H+IyPPeZqP%?rvb5R?{yny| z$QEEpx>4|w!UnKn1zP}%UqKc^7G<-{B%{R>`4V72@$g$IviWccWZ7g|nKh9`g_wwc znt@D(gszf-FMHKVbABu4leL#(h?jcIK`biMpiz{^2D8&|)FXy;) z6#%*W)ivz_7x~PQ!Sj@TG_fJqVEWXV7k&yvEP9@_0WVil=G3_t3@1lLXNpLbni@SA zNO|-}&p-G4kDht-%oWH2TJ8oaMhkQK^T@(WjmFG59mcezhOXF5d+^$MmX#nCv0G$$ z2(oA?op!n$g)E5*^J11|FM7;kvP2~xnI~XHi81|;qZltB%N@;4Euh6@S*XZ~wbv6` zsIgdS4`Pa2^zv&exttMNOjzIwTI{VatCx>H`Q-HdBQl_(cfYKt#WDF*URR7Q4T7G< zlae=3hJi(7X`v5QY}l>t zg>~Z?FET+EnHH!uc(w5ou?Alg1-};9dwN(hWCA5ptywpNOcv85E8FOutb;j&3uz!! zv9F)9{|$}|)mz4P`04_(47(cVz828J&tW?_XddTatd`?o4rovk47(F|vR%N^?uWB%DkAoJWg*GwO z2z6P_PqAGKtCAN5i!1~tZg$d2#@OJ&t!g0Fk>+GReDS!6{Ie>PgiGDq3%=S~Pl&;j zs?%2`A8k-4(UT|JLPJ=B3XWfiEowtk{h64B3vwoFRwS|j1Sgn~LKnDZC;B0GMGqD9 zy-poF=8ZC4jyqy^mw5(ac4<$(&T$4&Ml1Se<+GTx$z!pi^r&fp^wMFAoxGNUBYa*2 z7SF?^bdT?4^;zk|`_o=X2|y*!86FPLsp!fhtqdqGv>~#p_yz7IQmJN6H3@aO*}E%x zlGU4F0<$`@JT%4GvSP@KY=bPC@vMa}=(c^^kC z-UG0U=SgVf#|5kxa~}Bj+!3AY#G3r;bGF@m_R5v>pa0%->}vV`xoc+;`v3qBSx)8A zSm%#|D+W65d#TVe3syAGBC#`5Qer!QT-yiM7#|3l2;T8oM;6jOpN z2`?6i39?vkM4%<5!$M=hm8j(d2FTI^OIn9J?)O~GH(CfuZu1=s7G%4yW--1N^zrRC zB+DYS1SDGGtKJYSR_kN@*OXTxWO0zOfGmV8K^DI+t^`>^s|N;a1B1Gy;vCwVR(foW zOH0(}nTctl#c@iYMQJr+Cab2h4$||Vtbud7#Sg53j9#EqF%^HT&oDyAIT%EhpsIyErmmFICuL}W2hM3${7<>ggo z#4H6=sn9e_Hf$#xnG`U*eXNSG{F*B836kGSZHie-W!Cf_kB^huzGJD{AP?rHyA-Z) za4I8L={`&})F&_y2`Xkm0Tzy4PwJ}%t)OIkPGpf~{L)mtUqxbc2lvZh6mDWxKWZ^2 zCq)v>Q<(#@+ILA`$O&T=bqn;R376z%KpO)07gvhvRw(E#$TB0c6g5Zc-mRha>>mVJ zX3vTOWa0ac3X?Z+x_{YE*seZ#)cC={mK3zeWgz?lbT3bH0T$1r^t0vGDK~9n$Dg@F zlSSymht6J^+x^k&80tU&z0V()MGFzLkwk!`g_wOASrpHiEN%}AvT*FoCkt||K{|D6 zmY>4-MDH;!2zhAP(mxV6}0(rgi3K2F>szyw;}7z(naX%-pUFx^;E zk)@uIg*S$s6w5*uZOK&}Be0k(!`IF{c^tB^wpnP2LOyt5DcCvC!eCE3KWXl%pYeFh zp{bcsPqT!0^Y4>oaFJ?P7R)ko3TJ3(71)C;+~%p0CYHSNIJ4ba9k)as-yiz7=<<)a z(&R`$#V_BUuB6U_;+`Jl!g!sgR z(ZZIE@dsM+8$)Zt7hO`WKp*AjAF_ZJWyRZ-*`WF$Q(3P(c1jdAqTJG<+y-;xXpAcl z$b!AT43v23YUhr&<*&{r@}E@zf^K@#d%Ol;hAk+$AagTO%S|@{7zp$F*9Te{;I}fc zm@Md)J0BBR9!X&Nb$b!Aa88aUy_a`Ms~nX@_3h+50ulb0cjcYV%|)660&d3SNmM;u9;ErN?2v{ZaZIWe}M$2vkc zu(~*673`qrW-pNi-e>_9m)Y1%?%a9o?zbIabunj6r_OA?fRjTya+C5gaT&D$AE z)mV>WRsWXJ%F0WZd5YvupanIEzK$IZJrsDj*;tjAaD&l|2ceqn|LMKrh-&Zy!v6*f zv5Xxzn`{wm6x@VkBjJhKi{U3&$+ldA4=tqCv#~{08}K}JY%BZ`atmb21fpVkl4{%= z+RQ+bmMy}{a{iE77Wgy-Zc|e&FE_tdjD@@{r&Ebv{Xk3A41j=E%2y2_klPO5g zo?K@+wSX)Ji%ecl%?=NboP3Jyl9#4Mmj7+c@^Djfm_+Y@E$9s&GGF{hgD!T`7gqEF zvY@(DwrN@^E3(8O_Hcv4g}bl||BSL>K4(l8H;V1veMV@(?xtl@N!0RP^vy@_!ck`W z;S)RNCe#M#;9r+%>K1FU#a+iYAd9iHSRzJj!fg_&G zpNAI5H9hfx{}fr)ER<;xuYxQ(!8g7WtZaN|j4d|7;wZsnK@nPr2(8{Qhb+CTH&VwJ zS*!t_Xic;jF37)G>uTw9SbFdCCHD?Y9T9DlumvZG< zX5JaH?1L=!D6LC!ePOu>VBuW0I}#2^QDoU=wD6i!Wyg}W%U|(_&%{JNTa4fHCP9OO z3TSz?gvlgbW7vwBEFPTH%Y>H4JqZI@_#>$|%s$7Mg)vccYQ5V|s?ee! zofy6DIZJ$W9Z6J+_El{57BQ_Tq6jlii50|v7Fzr!N@OW`jGqIQO}Dn046-a)vdb>} zo&hPkq@YT?<#4At8&Xu^8{d@~9kc#XClIZGK$!ro!zwm)Zd^pc<1S*nViZQX{k))CX0Gg21 zD78zcMmj;26Wi6kvW+wuH@GXxXyNWAi_=zwBi@eB;}c0eM>4fpo-|Zw{3ZQG3bG&& zSr~y?afoJw*yjmk#Unn0pN?V@)g|twW!1K~%ujKDlZCiNDN09o`hgW+lf^TNh{}y) zhJ}4bxwpyUO3^5y$%Ef9ex3M-6j{`KrWFLFR7*$C;~(}TcD4NStDprMH1JkP3`2SX zLVhYb#$<)=iX9=({&|$LRwm&>_`T8@@Jau{5Uw4OXJN)9tER6+ZF;c`9 z!-dc!Z8C-|xRq1J=Qa&h?tv_4PMon*R5!gqpk-`912V4(*p^{b30K%?h#a!ueJs@Q z$1-VA6k9@HqWk#%6Qok+YFz!OQ4l$skQZ8R>>IW~f5Ra%$YM;Sk%iuQtBZ{n?(fAU z5iK;wQ6d>O&nehe%WC!!?!SQc z&qU$FQ<59?_%`mp`+d%eAzi=j+}ZqfLKW)C&P+p&km(ZJ%=E2mj0dMSqh$>r*_(En z-^$6hff^*R5>yoO%=5yudz03FH<-oGx$%6w9NyQy$Y9ANNimp057B`GbB#7OM&N~P zr069zd^zto+L_URwz(t!;@7`^kv1?*u25=`!s9t+p(V(yUGJmIGZ-i~pYU?~c7-Y1IVKCX z(JvIDSIa<%DoYdxhPETV@=%`nNgA4{(QB6e_CyvP+f@PuADN+o#Fq-6U{YY4X`mwG z#iQXT$X+g0*9SxeRPTl9@WtUY04$g zLMN8VBAF~gf%>_oJV%0~X1)toN0P5G zH!yWfuum4DY$Mx3Y~s(G+}G62ma0Q~lrYjZ`=rD2zIIRr-_nP4PE?S7@A3mii_>bG zu~Eo%mrBE0F!FiO^79}6@beFzp|^#rF2Jn;$=lN`tURrw$$_&~V=7n~YZrO&gJF+Dqc^r@%6`posK%iC1L{~yLIjrNFIB4%kxkqL5LAGELr1Hl_FZgKzd zh-K&Wv7}P4MMnf@ht@)YpjqUiejSM_mhxmz+D$C;Kc0t{C(rE09#{ua|ERkJr}XRO z`rF@e(dR`i{9ESv8K+u6A`5SXNB-bJ8AC0^k*g|$Zjj1q9AAzYVX$Qs+^l~ODhL=< zI!aN}{8*)lDu0dzOtB&jwxEgETmdojl#wNUAZNYMLh5T>0?XZZn=M9*$g)l$%TAId z1TDQtz9Kuxr*Di6e}NWBk;#0rtQT4A+0Vn~EC4A~Z2 zq?&iCqB>H%lF))h11(_`S19faFZ~_u%jiE|`>s_>nV#hApf79{KQ!gK+#Hr)dReoO z|LixO{q}cWpy+~=ixifVGRT*S3p*zLLSTtx*vDZCXwm=g&d3tUu&)~|Z`FxvhpbT? zCDR4T9AFtE@CdYEgtk(x$Ym}*%oP5C?eJo-cr6q=<24xyMJX?^P6{gFpkLD38g^|i zpB|Aze5Ie?9YUs~YEV8t#~=Bun@_GJ1Y z-MymeL&d6vY6@BOdAw>rwv1_zUMH+N8anAdZsc5_hAaZhlwDr7ZXI=fpT+|QBl}!& zF_L#Fw0)SEUsX%l=oqeVhYO7lEo1AElev0TZgtIo;feW{Hv#9*q~ z^r>+yWx6z@O8mz&FrbnXywyaDqxsgek@G$MN_%>`yQX9@NnqnJgvfFWPj0_qN!Z5F z$tcIX>FBkUkt6Mrbm`#L(E7IMh2susY)0Xyhh}y8rH*X8_)B9_3}goW`VcRZq%k*Nnv-N>(-C&0p%e8l%9c|bDc-eW|S zb{Xqy?Xt-|BoDUmQbbWKLsHC~&Cmi{%oSN66SbWA+T0wUO)~@4E?dzlaqQHN^Iq=0 zX_3Wmm3nI7Tv_oUAqwb>%-3{1rx7?D&TV2Wf^a3O6VpjCvj*}|dsxGTf6(B|(!6Ex z_FFLz5_mkRT;sC7m!IcsNnU=c1M0rqz6es4{b5YW+IZ zO!x+YuY)%JK1cfmxESo+H+`5hwk#(&mc8<4X&SI3}mb%mFpw= zsgGid3XU2ftn=GG=EH)Ntsh2W-+uPn*iT{- zb`jTnk4c&3I6e}>q=zPx;(PM`J>V=kwY34N!#0PLz$Pj5zKHC3@S{mD0Zc) zbs;P(6>%u!`((YTUF`BMQNBeL z^-e-g%?HLrdtub`=hfyCFh3?P$5TZ?mc>ec;>_>qi^-0ahuiSGgc&<>70NUe4@4H4 zj6qNeNz^vTpHznDZS5Q3{dD?TychEe!?+LPo8#x3c5L4XKYW#gSa9YaO@59ESrqSi zKRqswUDQ?l$k?UAJz+n4(1wtsoIWOiJPRr*MdxZ)4ZmsvA1wf-n8Z~;LDl^2U3_M? z`4`>5hv<#qtKi8qIjYzYRwjc4jqxBG2Xyfu!E>imX6$ld{>IScJC{3+`xZlUZG*_B6|EIy6EkHWS+kS zwa6l?VvE%oV#*`@(JNEN<&^u0Wms68MCfwY@h1s6gccc{B~zCWr-%zKWY)R%v`m)J ziF%ObOd^Zf(lXa4BPOySOe$HBe~nK#Cg+?!n~8^mHDu9%p~jpC=LVY+8x*sk0ek)+ zuG*3N-_=V=62~VlNig4ASEJ*}8A|qzkY!Df<<@NXRiGuvVz9Kv83#O?j7K?HqRN2( zBGlY;LgGl;xKJjG?`Eth7~ws|4lZuc<>h=?A`9C1^8K&f=t)Sb_D}?-@DbeEXc1A0 z1AGU5y_4NG#|TG8xh0?6+Fp8bSOq3Zc2{xfV6h9C5~Cn|Ka>R1 z_)4D(;uL^=<*p11cWRQQ8upY#H#v3*A1lz^%vbsnp%!Mzu)avyQ-Bns?+N#hitwxF6HQEbW<1d1A;^{p)zXkU@+$;cu&PAE8Uf^rg$R)!94_3Q z-deR}$x>~V?y^BM;x#){Hg6GHHg~E)PV@dep_(^QL$G5#C-d0qsXdg=QW4B3Ub>wR zR#3)IK`}394wOc`0e@fm9sMkuYT|O=YIL4>vx?|evcdf-G#%pQDelM&;lN)j}8vdWm|db+|}z(KYbnRA;r^j ziC8P2mlvHZ4U@%udDvu;j!18n~`Dm@jbX0t5#{G;A?Ct83tSA z_DyC_S&%y7Ymj#f1f`7FY(y=s7VL+Znha?{{@2db=}r|{`aH>Nah$7Y{^f%Qzx?H9 z0Y!D^vr~*9DB|?>hvzGZnx(ETTQ(^zF;q^YAZe$)Qeq<``^Eu{(n0p>T2D?XBMJ93 zSa_KX#4J<6%DX)7@EmTn?6{&H4>t0W1D2Pgd1$c!i*ORfc-~35t#vzT{b6DAfcWH( zeeM4JFDLvEaa4VE!3C^2DF$SSM|@vI@Uoxrubr!Vd)I8tn=Bg(g^f)=F;BQC$|CaF z=?Va!ujU$&E&b<8rCZalEh-T-?w%bH99$%`{QlS+8awC-5P_u}dyv&k$M=6_4*ozE zxwsfDb@}Yq=}smY=2GOU`&jUJ+ih=VNB-?nhpoq`ebs@|wmp2HCh~10CbU@J_#AL? zQH3bQ)tBUTtQ*7?y}XSC*v;6yFo!R)fEI=%0n00HGgxje5Iy9%%y7L{WI%`3c~ZNw;WPwVlmN?$iYCkGM2^amjdW!##scHsOV_zXEZ@pDbyrXdwAbde zr8bC=ZQd>9#RgT-9l`W_BCik*l}3y|s!K!NnG?&gWH~vIT9sU*@UltlbK2XMc5=w7 z-)n_6nuicb$tlkI`pWv~Jp zwo)fnxlHjz9x0Fe zEH-W1OGh4Ux_k_GBrp?MY~7q3D0nhOW=?kP+2MrOh&;gper!s(B@a-$6;OkxZ%mKU z(GOn{F_o{s^`_>j!cZ5TVQJ! zC=}#7Rf&ZgAxg9*Yp@c7Hm&zpk2J9j*-q?57H_|hZ2w}#-c`)>PaYOn zEa>pRh*?}_0WE$b&|+`eBM+lCvU5(6!4{JRC9>=WE!z@W)cBRooe>l(IzX$x3hyI0 z`|ya!5^^Cw$YOz(U`voCEy%BXt$J(@LW=U;hxKKlrIiVz;H)#Y)>|GbkW;`V2(-9M z-SKcvd;Rp=3R%j4Lz|q`096}f5+Onu6|Q@VYu0bfR$Q4ulEGrd>D`m{)Sn538H47UN4oyWK{(2CNG$bx``BM(p86lKJsuQ0Wr zWR_E1WVn>?0xfsny?@=U#hu4Cnk)cD0}h7}({bzc1Uh{-wSOmhAvwfEFN7eW%@y3_ zjZd`Q8z}07RE7fSatX4O30cr^Z%?>4@+9f`;z2TqeW~{C)hoJh3d-MPg`V2O3LQdwx(P^uBf_4Jn3 z@vqYKV!-!PGxlKhYt-dfBI)nU0R(V((Xy^dt|cC^_8kp zV!VKhLSvn|4uwjZLmVrsm zJTz&KMOcyAE3mUHk51J(xBdg@2k2Yhv$nskR7A?Wp(LdGevrk%i<4%iE}z0=3AAANl5H}!Sdf35?fAG}mdi^KKL)<^8;BNP z@>CvfjO*kn6|~n4bu&7w>knm-k^UjO91h#auFCC>V|Y)8#o0m5L%YW4uq|o?o!(t| z5+@~4nNJoCpafbHStzn7U#+SxrIuO*Gop$mvXG^naoWrIEhJL7dJcZp@4v8re~`tQ zFW+x~$b?5rGA!L2ut+-vmQ=?dbp5*N|LCg5a-szFvG4<$ncF6vCE#{E#zjG5i!FB~%I!e+({Py@T2D$dUE-U0a zV)@AnKM`ECr1+-SLl$C|dt`B(%wG~#-mHyb@4hYl?d$P{QOEHs?z``c@ApEMuUFG( zcg|$dxl>V59_0izGGnMm?qK8?d&Ya$&A4T*B)NtUS;|2cJZwtZf=jkmfAED;rKLDZ zc4OaDPd{~d=I%V7%=-ZQY$Y{X$aC(| zF4YyxSKuYa+p&>8yjD0{?UjQ1fR|)@tAf8bdccbvJa#asdlm;|7t)ZF*P84^EW8oC3RVd00@hC_V5Nr|V*zbnGg1MH?_O&a^6aD2rc8YM@c9uiCX8{ZAm+sGQ~T5aAiPq^!gnXV?}13 z!D=5^MM4X~fxL#_P_2l0?XA(W`ecRp4X1g%%#2PR6msRyIV6wm+WxI=R z_r}l@x>yw;k*0I1{E@lyq^jIaw)<&PqG2ei`2=CjRu9vWd zQp;D}d;Iwi9p`YI8+CV_o}=yH7$OpK;SYhX%*{^oOL9NSA_@j)r zGu&ILH418bmH*Vn2^YwNEh38t1x=Pi>p3a&S{UY8r!?Y-xQi>9+=48!B#V|n2*uK(s)(Ak?k#Ez#y5u?TyWKsQeB!gOr%hU zFj%phFu<5`a6=uQ2LYZu>+W6Yi7GEweZ^oAno|BO21%NpnJT&q3gf0BoCSNZcFMKK z=&aLB5HsH^GNnbfDOs<4Yd$6|3ZVLBvb7f8LQ#rl~wZ=BfMY z^{1AP$~B^2j)I=rP?pKZaaURZ=9E@{)nKWr!a`Eatz*!HilSHIA_xO+@|tiNICd;n z@fs{9OVyQ(L>9DtyG}Mq=PSn^9ONGk@v=w=<8OE0%AiO=m);zpyE@Du?}0C}S^&Jk z1NWS92={5uzMAt!XFfZm!8Of$Gd0@J0g0o&x2SZsx3!ZcBm|AI5;}=B%>)yy z)J&!CHHs@9X|j^5Z5x-VyLXQ>v5|IS=VaTkl)qWk&b*YGyp-0JYE?d$pI<5v*dd1w zC`!~iw7v?%o*WA+H0z=oi(1l`Z7UZ z4(!5>3^SEP_^SJnqlrt!r7eypb9N;#qQ%pt-WyHsToI~V+E&s(*duFg{y%u_=u@uZ z|M2r4dh*2XxwBJ~`VU=KR>%}oPH(%Jf#^D8M!Bu5WIj6I9Ay{dHu=->noZlZ*Kfq|syJM?W6=VY_c27UH zb?Y%iZj40PlwuxuP?LAOoJ=Bp2rV_#AyiR$86+qvyJ3phokF|c8Xq4nm0ZM^6^@u< zv?%+PlB2G)xZ}RQcY535vSOCG9Sxj~kKA`(tOH9|tR2W_JlQZUxITIE^vONPkH5E7 z$TwSF_zq;DpV&2(d%lrc#_Y5&ftEMl40K-j9eRPNMPrp%ySyf?kaU@Vc!OVd=G45C zMCWd>A{Gr!P06|G!qhrQSxQ^L3{=oUS3ONjSxrU{IERP@f-D@baoR~qJB5y=#%gYZdT{ICp1Mj9V`CKXIYo97{!(|yM#!`yj?>OLS#qu?Hsy%dA z>WT8_^O;ulU9Zrnd-FRsq3TN?n9KyAO1{(Kjm0z*9Sp2ubP@cFCH{OHHO zWUS?(GuI{n29^~x{(1DDUP1^(tIIG7dlTY2_UE(Bl+KLa!Lw)Q#+h@`4zN#qwdAMM zSpK!6vK>0?mU#5PAq$TWvIr*OA109w3&d#oENHp!G1-sb;gnbci&A3uo(Qx+me-wR zd=hQjb_WBJvCr5sixhjoPVgVvEeSTNwg8sdAPZ>8W?McLXz`*odIQ?j*;(EEHc#VU zSZ`mIXzh)&ej|lz?3AY1{mpVa?J^<|j(x9~nmWJWC9G+fS(#Ta{-&7imL$mH*n$45 zR+(LR$;i^{^RtM;&t5#sS4dxz2cgbVLkr0=sNZMPz+~Z1#48GYJo0XUxfTgm5b;7U z%oBnDA$`Wmm8nX2a2X_}WgkQ?nr;{lXWZ}o``0?X+{Qc2a=qddr(&|T#Z|rQqB6$E_Os{asIzPjTTQ;E6Z{AI zb8)h{7mJR{enMt_!D6YasEA~!B-fP~)GI5;qt-Ni8;P)<5VVc6d%Co@KBwg=M#FD)bikNoQi3%b8*V0 zC;@7fx=sAsb&wXCI(vLIC%E_0$;-=o*Il?k*YP~Ed>XQ#*=w_VSn;qN6T8FKvMAuc zxMUfIEEHOHpLqC=JD^KzARn!5OJq56pTM%|zWGy>cinaJF5(twB(&V6!TjTIJdWs9 zPFBdkN@zjt&W&ZA$JU6Y&TRFFVXlAvNe|@5ME*k&wLExSk&!xG+shRt4YnTQhh-)| zhzqd~=vZ|KSu~Z*-yOq4Tt6j+e41wRPSKh-B2D=!-A(RY$^wO9iGKNI95{d--6858 zC=0g*5KAG8BnqUF7FA^i))k6;=t>>JgAs*f>*sl|XM=q1Xf-lgb{;x3Gqcl^?W^az zN)iG%YBE?9fUVicH)FE607GlSp$k*|;VPN~?pDq1kX)_N2V3hY&w`U_Wux_a@7`@K zvYf3@FK0ECCI?XL0`E-I6KPr^7JAI&J(JI-3J_BCadaMj$xWz^9 z-jpcfk4c04x~{7#Yxl^A`;NzlQ+pVXvW^j@H%TgF`J$3xa0RJwQMbwfY1tlTLOeM2 z#=E}r8^EH8e3Ru{AA5UdfK1v8BmL$!Ng#q@*jtndd-k5kzy2(N3mLK7Fd0i=QO^}S zHV7k#GE5dO-zAf!*y9RI55DHuaHx7@Vvq1`)i>~}u5I`t?>+}DmOjK@Fk@_Nc3R9H z19& z2~Li>S*XFM)q+x!rNejdS~h8mWK*$D<>>Ue`Fc!WI-5{+TR^eoN?6a_6=k|k{`k4) zfBeHQJvoQ?ky1EBRVa12@I+43u1w4w)LpfEWrVZz@bXI->-5YVx^VX3>_cMjl zVH&R){EvS02@+!0#*b3Nr^~K=?_ojWMr7gD0{us1nFawEd?|)l7G!CmW!YMS7M7Pg zWRWyS=?#>S<#lAhRLO@dUiLl&tW2`nbd0;(LfsQU{nh(gOLVwN-H#4>Ar zMkcjo^31HK_Z#%t*meAE$&FM2h7(LqTbV5HJ4V>zinYwhc>!6FoHI-o(8CMIEjDb> z#8QlIsG5rdA58!|_iG@8sz$VL#b#i$z|CUW9{OUh9VS!-MBOTSq{4pFm!7`Ua+x@F zUr{%}Eif^ok2FX8$)X3%XR>l(18Y_fP^qUwZFSM#A|hm&(n~V`1Pzdbz8SS^&5g~K zv;)XGJS~xNs+Z`ip&JpSJ5IGmUCQk!H)z!<>v9csNuAi{Dkta}aV91BB9O)XW@*S< z^Mv|eb03<5uyUSPmRyICOcsGH;--0Qsn;`KpMx&7EWdPkgtSJxe*BaT`=H4ZV1X5b)lq_ zt;U;aUkZIpw{O>5eO!od?`N<6)-4_6gZ!||rjpn~eaB=`#A4~|QV*b|xT5D_=`LWQ z2B!{7uM<@|T(c<@l(kdLlE|XiHIapmLQhOhOpFZ&S@^Pul})VGc%Ph%uwTh|d z9naLOmB>=e`MN>a;jLZ1d^6!iPT6-NF%&88vva77MfJcGvGQ@k9nU{_nV1-5rR25m zJx8tOr;ncTIA3ZPK>gt&LxS^4BFmLA{dTFZMs?4gvr{uy4$iWvg^3nd@XtN?(NpKn zL6&Qf<@)8rBl}F2!`hMbqLbzFp8FG9LJ!YJ3!lr03%WM%L!gCn4EJ%L*q%M6$^G{~ zdHgO?7bkh!rZ4vb7zZ;b&9~HpEFsPLSb!xADw&C-;F31igg}di@$Y)@N!WrrOv6`9 zL?X~bJ})y|#glB6+?)$pBudu0^YcUIDRo)0j`>mgNY zWRG&U$wK0al1MB?$>sr76!FGIT{I0r3~eI{8x?ojDAc(cV(V;apRd@us6$m|2#Yk#Pkn~;7%j>$IA2J)nT-Rv zl?2j;ubwX}A{fgf>+_Y_GPp(tSdhtb>E!agJ1}_h;(Pr_HOaConRYzk zL!bE4mwx*hqvbch{mFNJ@VSqPER5pgfDB~3Qt~1aTF~P(BtI*%yyxqbTVDA3yFZY? zQYe@#>@}yAQ;ku1Eh2GoJ4Bfb=X^xa2SGfkr=pSa{nOKX>%)xY>ZUCD2b0|NkZLe! zOy{g8Tz0fCTYh@&7#lW2IZEb{rPn!x1B&*wP~#U@6m}?zGHohQLr=5&WSt>%5aY!y z?j&NW(Y?v8v@nk|Fi^5jrncM*En%{yL%PaE`&5Dai~HcZd>w(YjYq(9Zf>#TNTsNK z0uWU$1FjXQ5RV}X;fp;W`wr+DZA%|#sgq#Yuvi~xB(hQdC;6|$PB29~JP&02Hvw9}p|gS7^(j?szFASmP2kj!3r1g_d@)y|SInPVWweU-8n}7eXi=$- zyyP5f@UJ}mIYA&5ENcJUsEw!mH<0UXd zIeC?EXg8pmG8n7o4Hoxs#Xx4fQX>Lsxb=MPG~chp8bqO*%#l{BQB(ma<7GELBtKo% zF)Sz@WC1P1BxvXA{A!Ni+D50IcN>^6W1fHauv$hI(}j&kD&#v7wEd^kik>~zY>lVY z71Sw7r@MQAUG>!#S}b0fEF+00Vau?HEDbJD34{%ncX{Hm^X7!NM!uFrL~POcrVcW22L25A0}v z>toB;Hf|paw~`L`C-X&3mRz67!gDOtl$~lc8w!P#E#s#u69)+r}_<&hHKE*IzUCB0U-B(iGAvyv8Rda9G&Ws_y8XECdk z@D;Ogi5(JJx*>}=9St?9 zl9%5jGj(M%nAG)l(jARt6PjZ@cuK$e?|V57Ey_*MIPL1WfIy#g7XzNEuy8ZCrR%=! zau1UOVcHT*2Uqw?GOy?=eV12mc8M;DEZQlJds-j2@ff{=a#C&!!fEhv7b4~>mO5&l zqJ#?cZSnndM#gQ+*3H`E;}&Ggn=U((QB|R+uiU3WQ`K&~oKkC^>%$XMA3l5XtIyGU z{JrasPS-VIKWeg=hPxUb)RosOQ;|e>Y~MY5A@v;7TSmIVqvveBLTWlDd^!5HYv=bo zh2Qa|y&L|AWO*7(88(j9BWwXJQF|9zh*uyBgJw>O#|UNW9iup7BV>c+z5MdOmrG20 zSaJhOaSLRzV2Z&4Y81SUB(98@D@;Wtv`9QFK^CnshAg0k4PiPjl@CKxw4P(5I;C#H z_Z@>Rl8k=sHK*KbwWuC@?PJ5;LZ!JwUQaz#R1p+-m@Gazg`$F%opO^;QT|T7WrsZW zk;pRR@FWW=fQJ=R@DwFtkPh)GwweT3NYOXSNY!DF#}sw5bM>CiTn|xV)$nT9@og2R z`aPeX?}pM%4|hAej`5IT`>NRG(U^9y0!~_t_MW*tXnJ;n-P%W|XJ;vQNj%H$0@n&I z|Fm-Y#|4sc|{X%BKkF^ef?9BIEm1^2?zxMX_&XeS_na zOk?Pvl3|eLFy>*6wA6alkw>x`K8bk#1A98>%6Pl%kxswvF1RAFpl^P&S;z-1UwPnj zj81<0SzM5xg(=kQ7%^OmnR0Ntht|6f@ndV* zFqG}_E@NK zNG?mvP%XW~73!v03a9Nr4Y0US=3#Usmwm~7%ghNY@}eS_`j8{HC7vko@JxSbGo}8R zLa*pyn=ITPhpq$iRB`8YlrRL51EUje9`W#x@_wEM$=T|JdpUR!SpbW*V-z z9q9CFwVvL8FY&kX;Er4fXuETEPCKTnMeW4oThNBDROrcAtX%|onK2ifEsrEVT8(8~a2Q+u+X7(yvNNinaT(7sl~BSF7uTa-jhzA)YOG0ozC>BpE;QpG>1 zSxCv9XuglCdEU?>agf%>MrmoFz{07L7EGoo{D@gjJ@Lf(uZ^F&eEq9m{U4L%I%v6m z^(6LQZR~MWyKqtyEo+qtqd%0rNsoLHu<#nL$PMOxD1tJwXzgUuha~06oDK`LNa9HI zY|Jif0j;lYp-bu!lZ+PG-`Jwyp}QCgVi6(Fa=%Pe$vI5%v-P&SLCgOA??cCS+GPbf zIE`9kClTq_KJ2=t5Pae-MLl)$j7%h!nQ7a|~a)U=!j#6(Z=GYTZ0xTLCPH3qs zp5ZYlFUJu6yVP`SDHY;02-Skp$g-1{Po4%X0Tz+vD_{A_=YJA~{NEC`eB(QE5))MP zhw=-UQ98_mI7rQQv7a+oG|WHRwd{fjJ>V%oEtLKior4H(e zVivWG*`x7oB1>Fd8!GlIuxmjKlhQgck1Sn4QpE3Y!(KaXP9iml`%0?a4V-B{tnt|MIA{zx4 zQ-vUlC+81M*3^C7Cs1y8zOtGl7bssarOgW!V>n+edf%9~qeY!4*`Q&_TpOK{EnCSx zK}C}#&LA><;N3LNWm{_Gzg$_twQ)f%qeWfTc>S7M5c>E_Dssarpq%>QFP|f5dFH8; z_uJ%GX+^$XhwS)K?EX@0Plm$tES|+b=mvnfYuC;{DY85PSxAkYXUIi<$0o~kMu``l zEUdD8`WeCH(lW+wOqOY+zy;~9rU}a}zQ{%92N{`0nsRYd7$S5bW$|A0i3R%58_g#r zVUTHJkR-OWNE0_@WLe0Thaih|a?ibIPNd08e!3egyDOXd*&=FT(u0D#N-4!|a7;Db zJ7^i=(wUFDt4v;LkWtbn4@Z)8B_f>Y$C?<0PvkfT9g^=~x*t(+D&m_g=+?BzG1`Ph z0D3wV&Q3PL5WQWQyZ?b7{6RjNw6)Znw~o(2n@+OxaQOm91WugG#ny5G~REb45q zPAxq_Up7Olg77O+5;UpLgPfpfa2S*Ws1==(3qF}EaDq#``& z0TUZasgjTTF{!R}(Ib8!YWf~-X=z^)fT8tztX5Mi*b?=;K$au#(%%1+f>fC1R3vkS z&WcSCweY77Qk0(irfBRhq>B?(^m}cGOajeSQ>04g; zUe> z`}x&1;l6J@-x@d3Y8l9)Z#^efw#r*`vejbRo&546lclTy z13LXgX9u79d&~Z1iYKe4DYG;BIt6~WG){-roC88~cn1`J@%w{!%lSv2VPNu?U%h^H z&lyh3xFR&24E5w6uHW`)ovOZa9p8r|C5<>j3!^MgSdfK1E|BFqJ6cXEW^r?vMBwtG zl4WdmPeKa|yaC_{WXUA3aDDl%cELn3%LniKAYf^{tKpDEXhGCfgcjH$Ie0$B<)|847Ik$r4@1>|-RqVzN{m@s#Np7LL3mB_&}v zrR9=8K#l0->KK#H-kLS|+ppIqVQMUcwz{a-O_r#nh!G+`X=qTx^A;&Zf)B9y{sKy5B@)L-v=LoEX{>+Whxc*ZM5D) zmg7Mdg)HCt)(?KbvQY~8$y)y>GN(*>z3cbv{L+p|$O2bLhh2R9ab7-~!1C~fmO9F- z%ZGx}RV-o}Qli@p#{m|kZ>A?|_=-`}P9^jg=Fasu%CrpQfz}zuVNNQzmFXdEr>M}W z2(cE0hDs@AAeCZhV-pQZg|2AhArTZ}2r;opz#5BzxGEUIh>%8DV~o0JOw_E#tR@~l z`N|UP{YF!Z5qi3~W!;-T z^rrW}15)|y;A%AVO>^b(Kp^I-ia%HkUjjV^f?IP}C5waZi zxGnd+j2 zc5Y>Bda8U3x8=CzuVjk-)OHfj`t)~y_LHCd@XMrH78hAT<@6=8SQItLa{IQ(l7yCu zj79CASyBL(x%d#_VJC=bqF3Mo3$)05(+QcgN~CB7^U%rbq6+_i;uD_`S{x8NdF-qsY>~OQIR+L1 z0+VJ!7G&WXo~&4iyz<^1 z&-XI74=ScLFtBytuoB=-e;;rrLWd>#wwokH2&1`0;msm|2gYrBzl-k)+xv{lfS5kia|n zk&_=;{sfV*XP$mWPRpHVRulOTKd9>Ccct1eR4VaRK#R!oy3c&@Yv23c_rCVQ&wTB- zy6>;wKQf}ys9l~T+r6GwyD!5cr;=)C7i509CJLA4i<~jyUmVt9kF`%|>68UgZ2lfo z4yNj=FeN5gBj562USGz<)XQ=)vV4P@ypnSFh?5YtniJEluK!K(BT3n}75j9J28~T4 z-=j_}cF_DHi|yc3=?ZpL;*Mz?}QzQ7PeyQvaDs$$(P_6zgDwFB&+STI0r#r zj9y%=B#7b}h)2Yn@Ml<|V`?T#^DZgFwANZ%UUK^tuXyDvU-7aRG4=7{Eij%HDdBC(d`j-f{uyllQUE9 zW#=|L@6p&biII~oqY-OhxHj8MTJW0t@R1B-{k)OTGCee+XNXW~YYbV878zs#Ed~pI z3$2vqN|P-q#ZvP&u0**~&9=Hma?M0%J1i?`Nq!5Bn6`EGnUV3@RB3?s57m4!<5Hts zl72oAm(&6E?`)O1?04K7MruU1?uv&1jOf^1=TqCT;+aXJ#m!b026p}0R z+w$o#%XjQNO`_=c^CjRS$aE&rV8<}1+#Lnp<=A8R$l2=*dlTW3zts1M(-Bo z+PBUxEMsDes=`yG6Sio@rxI#J5py{q5S!`LCbHg zl>GdOnGVvk<+my?w->U|8lPb=t+&_3z>&ZYBlRMmq-e6>i}<(OAV?aeK9dN+?+k9bJ}N>{eNlg%&`I$-=8`+a;BX(?J$z z^riMz>@_r`pbt{Wu6UKh32}Z!l(96LDl@qf{U8QUnC}H6c%q#-f4f=KOIsh2ILzKG zl?nbgScwe2rk%yl1*j5$+GUsH@@-4SHAI;FL?2ZV~U00vyjQZa&rSYYHUXD zk-%b8Q%EAqZb`vO>oHB|?D9l{if7uW3QK4q?hDUTTTxaqJWp>@6|y5)L4u@MQzq$S zH8vT~jvuJz!G~4@BjpBWq)k8oFc48KH0$cr%FX^Ia#C%26lI;nDw)6ns8xHZ3spjM ze2CG~K)FwWK^;dv7z#k#y?^za&;8^lKl|ag7S1&m2jyoI$905l1S2KbS%WN>ZjRQe z6s3c#xWvgigWM7mz*6Dy4UvT_lVx~f{?da7w>M1v_sGI~rX6N~gH{@%Vov6-Q%}Um zU7UM%ll+^e<6^G7bHZf7Jmem-G|_@3vMgVhfto#&XX+Mm!J0ypn8P1{#a3HgBokVa zJ>s^UzhE<4Mq7sP1DPS^vYPFf%D8C@92w-XsZvC~{p?v+Lvfp$MLIrQ*V8$h=HROv zik4!Lg}K(UoWIj>v7A*Q)bC94I-89Fi~@@Mh^>MQV1W)?q;5yHdlCl|Su{#sVwH-T zt@NVFV`A8c$R~$H9V(tQgh%5^GSpZRfFo)wBiSO6F#1=7r)@~lTOTEiP#8J+V95$l zR&OUed*sprc1el|?D`j$?_iJxG*i9ZIF~Avb(}`nau%K01T9KvJIO0nw7bfyG+gT# zdvb1{1B=#ScZNVAA63|DcvNv@q@#p0#xg^aLPZMJrtQ~(cj`W}_>R>{MjyC97Jb57 zTi3m5=)llB5k6I9RlPRkDQjHv{vA27QV8P8u%~4Y0SjH+u0!7U$lqXp;)cIFnE&+3=EN?|%ocMtww@1i`ToWrz*6%RN(}6Sp^U zyGfQ}BFoCK{i${Z81;^@PodwQvf(ydN?VfbW~*eA+~~$?nM4_ZmsE6YDKhPWy}^(2 zzCsU-ktLBviUUfhL-2-|504QCE9ONB)$HzKnX~P4v6rFZIbIn($!tka*06E=Va$Yq zFH)7aVoQ@OF`NK@%x0%TWWfLePMB{H3mcMb!7JY=d%=shTVU=BOLAfj4?nW@l&aU%sPw*mK`~aOu{Bm*~jj%QW>A z?QqCqPe3DH%S%eJRA<>w6AYWz3QF!i@-6r*)0}tTym#|dM8p0IWGVKiH*HXU3vSB; zLJ_wwty3NK*wP@&zy8rhp#@caJ1lS|zyevgP=VM=y0z)F_@>Zuwx*7~vr^@p2(%3S z30YPbNkzp1Ex{I&E=G&?+~KsS<+QG)k5$YmY&h+dF<9b3E}lJi&V>c$%XG?4=uX%y zWurwtkTgC)73($S)hpns8Hp@dA7>zFp@UFlQT!{3-oIQ?G3^nZvFRjp0$H?sC{~vM z4`gxWmz1?oy$!45E|mcjMA^Rmr92QCmL+9XixfGk91T<3rs~_2G&=p%9Av5XLL)+H ze)=oc(CcIWwn~#&wQVM};$aK-?%jLY?Mtl90hUiIn&?5G_$&!6b|!dxYiZ;J;pY^$ zXKiy+c|YsrR1shl5}T8!T^h{h%s*fmun48lGN#|qVhu`OPwQ89F+7`aa@i_`&4Tk|A&2g zyTV`)rp`C*HH*w(;juuLY)MXWk0xy+vcHA=n1jkIJLm2lLo-9n{{RXUB@ z5*$brL^YU;>wRk%AGKZ5Bc-Z5*VEa_M{|HB@i0pvo~cww^so0~o|w4)&>?3C2AmmU zy0ge4e}$hA^Movz3yyb*Ea9_cG~=>Wudp=8N5u{f%b|i%RtkUvn0IjyL8@C)EqK8< z-uT83zVVGOBN8?=gwXo?U;LsMU76fK970N0-Eu zC*)eF6O+qAAY;$yMJbcjm2eS5LaKq!ic0()T@T<8;+dYuLZLD&k>%=1o3qds%9$qe zx_!gV$!q`f{+Rdd5BWiA<5#OB># zkps}Xb&Lng^2mn?fb~fEXsq0)y^u>l#{?G%8jCT~a@h)50Q*SIuF9lerX>qN%PNP3 znb|=;gl5eI#wB2#-1D+~*zE-(VFHUJawKG6sRItOL?QvY7JZI?5`tG0y$p1v3Q0c- z;F+DJ>pT)BG6fbr4Z>L($GXT_4>lCsLRf;Q%{ftJe{!2odotfY*n-Q#^RMBwkf9e@ zK6G(>+&h$u7-j5Mvvr(qP`d+z#U`>m1T3IMw*2X4NB+;hpm^BZ-uCVfszyw1i)4`B z{k88wmH^9dA80NG??8b-pN5!Iv_$om`YV)E(|$TlXGz^GNK(QW3%0liAF8+sKa8J9 zXnz|nWziGTR=MIvo|>b1EgP;}q2yR{u8_ruE%sYojDT&@g-=F?L%1o`ScL7pD4$>S zb4t=HrBt`YTB0zIio@3XLeuSYA|Z9@#I~G>ZcAOSy5k|D_O9tdZ9*DHN-Fkw;J2kH zY;rSPHjcki)r#4#Iwf)Ldf6t8z2&zul%%!1Z`} zAF{;ieSjwFu`jdR4YB|hZR9mmh}r?!j^4wdMYCfPvxrAf(JpTuJ!TeU5|SHtK0&wV zMv+Cc3wx!YJ?IV<46r~I+2i>Yd^Ovkei)2q$A4tc%P`=w;8s(+D_@~P!gqJy3w)l& zycSBN-2FeUXOwmNftj%q9@2{1o0rMt?g$uo-h5!F{5aZsc+M4i15-Cu*`*BthQDgC zP+P?pWC64Y((nntvZeLn(BPod9L_4Fu4G=*@iHFIpZv%LN6$cI-r(<~x9_0YZ|^+##=Xh9hemR+yE9UEXFtOg8(OT`2O?sHA@4*$ zOk~k!p``a#Gjnap@tXCJe`nUTLFpsQm$c;EnO|$?MbIzPLU!OKI$K(Kg+qE*EWQs} z7+@M;QIdw+Q8pH65m^%J#1(uPmjrW*=NG+;lA>pMCqux-R^r4tTowiU*~qsQgdGAy zn-3sBVOb-m;FBzjvWt70RkZn}tOuTo9ZQEHDvyZxvN|m*&b9292s1YjsBGoQ)f6J& zEA^+8cqv+)rDRiO^N;9@H5d7cVfP6vdOaR#L&FW{0tStMNYTB}cgS9P? z!j9mdD@8 zj6LZjiw^_$HCeC>rmF041T~=t|I-l>dh7K7kV=bBnrFRFQLQDRW&Ylmg_iGr^WG#; z>~$@AC-iA>q_n6^U`TEZ3N5gOH{~t`Go@M;DnhivL9t7t4Z3Q$(33c};h51Puf;Blt)AK?lIP;)d!Z%BBDQ?u8%nj9 zK(@M!eR4#^440U#j#1kr;bZeeF)?NfP=~A})cJGRdFDCagDrMkSfxA)_ZD_8ECA$6 zvJ1{!-&?qJ{`?JR9yrPzV9g5QkF(i!Tv%l3j&e>SVwD^xp`u}G*hme}Qj!=`Ot&C4 zRMix}l;pkm;t3^EE#!tp8JXsxO$MG6}04gRR8I^5KL=9IdA!> z(+a)vM;R+THV0Y82Ji_a%%?yqU@=#`#e;jVxc z3|{c4*8B5AlF7Hb3R#>&$z%#FnBs=L5)kB~G|(WD%O-f=BF0s>20(*qM%;pW)w7}* z(W!2fd!S`>UjLH&>%HYqP0`9C#ek#JrP?TH+3+DWR%Rx&Be|Gd*_sP4ybD>pWtXMd zD*5z7$YQi0CHKrj(6Stf{NH`;6P9|R8J{xb_fU!aiBEj+3t#wpfaN!L?hpVV$EoQR zCCbf9*>35nNC>be;$Tjiv%d6NKA)Hvu7K5DN_44OxiTVBT7@Nz$@*s7*YP*Af!)YD>pud8_MI*hcY#=!G3fuQv-LG#>`C zbSvPWaVJcEzys}vHeo|vgcXQM)omoyM{1>RbjJMj+T3;Txt0tc)*|g_p9osR+A+=F z&kR5}>HDg)k!K~xOmPC_)YpkD@1^8;55omt%#;Mi>OdB20kwP3TuBpZ01E(>waI~F z9$D%dIqngVX$ZkyB|xlBl;^{30e%}`G(kLv#z(qD)LP0qUH-9tt@ON(p{PYqkIN-P zRfnRsY*)%(9Z%Am1i&!oXhas?6jEC<(F8tuR7(=e+?~{MfgX;dM~U^(uQcZApJI#H zuO+5Jf!UZO{Ce;9-oNp{sTQF{WT}noJ>b!-&n+j}y1uo+8SN@v@=2Ci>%cGpnrm9` zJ_%WDEF$%p*-^X}$O2kSmd1acESx7JSXnE|VC^QWh0`sxta%l;=OnKs0I|{}x!C+J zycXK=U-n*EkOkwDa>Ny49x>LEdM7cZ@m+ho3YM@S3y0+6BFi;ffg1 zIfJF?)0{L{7F0>LAhIlwx~7Alea8=MwUP(1(g(18{0-OT7v9M;vzyU zUu8^lMGyBBk{G5oSfo?&jr{k3%fT@j$$OQBxrW$aQ7a_IIwdn$a4HCet&%0gAN39I zhbHA5Iieug;NoF8THx7WQ zy-C#6bB8Mn*RPu_O0$?O4u}Dk?~rT3gbug1JpG9`$V&k&TtxTe_tS5Guf4^kMqO{w zl#~apR1aD-%UmP}=#GI|MSj4=>rUijhKm#TY#&%2`OjH;&J&SGH(*Pl;6m{NKhoLG zIy^Wo1^p`<*kH1GTG6+0@N5uRq_H-DMVC|BUxn)~mmnjWIK@&*6S~}(DgPHx$Z*ejrs)Dfu%4nceXwWV2N2Tn(eNzSkhbc0xZ605Q7$3`ab}R z`ZOvmfqN;}YH3-k{u)(ui4*d@odB|uJ>H1BK8po@Vr5FL_T*27Hj8{1K!ib-;I;G( zU?KR|O{~XaDawcBM3$@*Fie0t_Tu-x@|CO>d-lATwwC9=;uSA=(Tm^mk}czWENfE) z0pzl5JMA_cQANU=SVmJ>DxOG|t7!J7kAcZTKnw)%&qLG51>YE?j`F)8i>K10XCemB zLa8D!$=rAdno#V@JjmIV*$uKoVN%6oD2RHdn<|T4l|0~)lKc*9l7)xrGFfbTN7|&e zg90;938Q0Xe<80(U$($fL0u>XA=4M0{UHsL&wcsMpl?M)H{8DW4e+8m z4vMDO^7meI8@7PrK)05mn4@0rVehzq1V7mtI_ABH^HVe7i1y$rdl5-?~T-fi1oYE{?u-Rd< zj*9C+7A?L6!XOJxQO2R}S+6NqCa%B)qva#`y`L~y_`+?W6QBR0BR|c^r(guK#57~R zxDjAkkd5}w)~KS`s!qYSv7NAw@?T3^hrc7Rkz~Kbp6O>00kvjD8yjH zt#rEk_q+D7uii)Rx_obH){1O7vdAEczPvuixZn$y&Li_wU2|K3LTsjoHsgFHlLp*T z%VNM%hXLEOdCkG_bHayW0zZJlN__OTyoBT+V0rNg!1AIOyx;}Td)|v){o*SkOVLCq zDQYk_ru;YVLm1U+>*Zmn0vK$n=5wQ+7Ce@N473?QG$x6B;}vacIoe9WL~Ye4#C%Jy zm3P$n7)TOLpUvbA?o~zLBu7+nl;e0B80q5Tyt?8oZs~X+mU6i3u`bKEaYOAu?zHF2 zPGp${rLU4hKiP~56+6wd(4I6$2XZG*Y-aZ3%fEb1Dld0#%`*GJaRuH7wF)RACfz5> zBZ4eCds396G3;2{B8|KrgxVb^K|T_Owbv}#F@QYl8t z#d4Ko$nBLdnFW5>Qz39At2gazvSTG9PC$bvrBH}2iIeBML}o&-_?CiYT9n8z)Ze<+pUKs8RCp z9Jx4WN8Mg&k^d)8@61IYtWV~uNOqmM)b{TRQB+@)Vwt$;XkQcw+eHa;GGc`>MFs!4 z-IVDPS+I1gX^^FEvdAnwMp+5-fJe`|yrMRUNH4TUmkqMay8T4%^o^vR9GM=F5Mup) zVh}{;{wJ2-S?b?J7Vb1DufUwDW)*YXgiJo_wPy7Gze)FSbPQ(1+8CR+=ju3b5 zeCboXbL#Kplb%<#Y*l-PCRqRjrW}g{@X>`YharKbXyG^S+BJy9i19YqlV@XOO_39c zRj@_aq+y`mg4JCX*B>BA$$o~Ry0T39e=rr*7vU3VxpP6YZ>presCXSKzt;V(&=%?9 zcb%P1`DmM*Kfci*;nI~2TBbZn)}qn-w|l(?II$vXmB*tsH~4xrVXFXRz6IRESq zf5NDi2j^y%Mx>`dz;kqekXTrzew6*1c8j%%q@Gphq#T{<*FFxP1zRP{3d~^BC7*Y8(8>kz;2sY9m95razmRLs^%pZ&d$MrEJx4tr(#X zoAvGd7`jt1drOMnVipYES^kyeu{vLs928M?gw&0v^amwtCD&e#l_ z+M}>x`ZH*e=WymMpRoEMK~PvfIHD+=yNXg25~7g$6NGL~22^~hN=I7Lp%wMZw5sqd zhan49DXKgJEf#1wOV^A=ULXsTOlBcV%>ac!dcVF;;}X9YTKFs_Q|N30Rx!|lB+ExA zX?r@z0$4SHJqxU;p7Z2`s<6^J$kZ z^iwRu8vt3cf+;&=zp_^X{HbVJ?J!se=2)a*Z>5NcIB`=UGi!PcCnaLkwlwiR z=86;zLX6D&Zc@wmAx1@>2$+nWim?(3V+?gi@|XN}{4{D-G&Hw}Nkx$rR1#cVZO-sp ze7maW#+2+;_yxO-y{0x#?LXQ37t5J6w7R1gAhYi`Y{E?8&X9q27Sc0dJk;O*O16zM z0Tqv=nw~dpxUvURm*j~TE1^cI z;xWU3+AwSo1q5URXv)!36P7h#9#n=R%6Q9KIuUVM-a~;N)_m(rqXN|tw`v4Fin~*2hlmtAnWR4 z%+gmrZE4DHEzB(41ucPDOy!JK&5)eYX&w8;`UL0K6k7UxYVQw|XmM@Wjmwbb2Itn4 zr{PE4aYGTY|1en$7L&yhXvi`+SgwxD49!#bgTWS`@hfD}axkA%D_b5V3ne`k(Z^Dw zo5_Mf78%RA?v|$Fa}{85S)pK~bn$SICD4M2ETeAsIY(a$&da3*k>%>0I}2Bdc~MqN zAu7Ol21}j_;?Wndt6a&xh?y+r%d!J4drp8B3057*NU4>&{UK{04M^9t$7Jb~K8tsw zQUi86e-5%}G|N_}?~jTuqmAK?YH!h%M9Q`nI|}iSI2Ec)Q!l3R`gE#5mYh}05yM0Q zld9JW$J!OYx%8(zGBvF?HNbKLZxNdiSnzLqXC5UBw*;0QJDe1-i5yr|2AeD+GH&^2 zw()dhh*;Ydpg(zJ^2%hxas@-Gi66mtP$dP0cJx>|mu0v>6Xbs3f~`(AJDI(w;dxNg zarf@lt-ZtZf{y}XDn6bV#6U|-j@Uj7gXFWzAr@JPaJr;V`W5~4Nl-V*56+!zlI5hy z@^FkHY=FJP#T3Qj0cmt~JGe@c6|r$$6k##9uSie6;=Vz} zogCHicYJG0K7%*yocL?^cbhDmyV}wOm8v`?ueMPKtz3&QA&bPg6ek167)MR}{vZqY z3gfpXbKI#|uB6s`g_rc4_e&p?y|z4x57BRb;>4a8Qz-Nr$YQp0nKRm|pJWUo+vzThC%bpn4 zZLt*>54*Hk2iUzrZ4d&0m@B*=7PYUG*NYr@IWbjCrZ#?@7K25AbH9ow7mF;)x$29s z31rz{vH;wU>PzLzdcdCWn;9Rxd;gQ)k<;?s2aBAc@j5Kb42_Undh*Go-qKVg)x{8wOUe|14Q}1)5V+5n;m0A=F&#pT4Zle9P=xiwd$} zgfLQsqybpgtdOM!Suour_>%C#0uh9PEqrohEd-%khiu`yI8f-FxXe_U_DwYlUY3zn zQFQCxz2$ovXmjt*0xk&)4QR15BCve^0<+Ybb1BgrT<#11onAE1WqnE_Bi-tP9Cb19pB_ii#mf8+! zaNx6$Wg!-31h{1wcdKc?-n#GPv z2UbX-8f=9gtI{g!p7*Jh%Dq&N7dHnvr_X2x3e!L*>)bUnlhn9p>3F$yS=lR&a>IIA z^Kf*UHDcD**~tyhSA_mDn1QaAwgkPsYy%qHvNooLSSg8g7e`$IId!!w@U;%|Ae67^ zKB=~^K{HcB`I*TxpoVZ5?ZA19@Wee4MLsUeSlffr0U_ditR(%w7XGKXz?P+3TU$M0!;ufjO@#kx`;%Z%E-=Y zQzWoB$qQH@i<0i>Z4>^fE4@%7n&Ea!Xcgv%OPVl+4pGJx-JsSMmA$$QL&KDREsQ8j zt%*7wBd?AOD)Fi$AogplaF@Fo+sKNuz&^?9>hcg`t%69K3?GG?zQzJ9UDD&Ux0cy0 zHDglYhcdf-K|Iau7+!T{$5&&(}+s@)a+9^-JEdX0xU=<}uH7us~-;WZ`8e zmmp)S<@zuecavwymbGI@nV+d}$ee1n6f)0IeCT$f9>p5W zwbArox}))c<8V}^p_GPcLmsn_b!iub2FVyD5b-+e^0>RwXu(^NaK4gWxm1;$bwE{P z(0#PpB{a1g&X4!s#cBEFb3Y-6zp$vf&rGU70WG|9poRKmlO@pN!1KUT?=VRfcIR?h zqT~GXBxGqcF5MnITIYoWmH!S|01K80lgntf^!CzoGkK3ZzLbzJAzd8YkT?}alq|^7 zf}}BMF0#nwXO5vSav*cSS^T8QqYSS;#nnQ4 z7MNHz4$CF=aq3Mxr$ntxmJZvY<+YbU54IJGlx2Omsh*xuZc}WSUs_J=poG8k7J=g7 z)Gvck?bF(h&( z9-^($@9S++9&)%7ig3wPSc)zPicy#=1!TzLzJFX3lSQHs2`4Ff(<|$c#f@3AF{#{w z_lF$eJeoxcjLjk~8jAk)36Z7IP$$cPWW5T!D!)AS&>)>n_!kHz(P;nQ`^eSXlH-T zkHbjLE0Z1hh&}-0mGMzuWtA)ZxX{IGRb*chlwD+U_8;mdGTiRj)H)1y_`A`56i zuR+wPSplr5CuvWtD7^B;g}}o7oWwUyMAfA8-(Ey?jwy}$yG9*33>*TT_!eupSU-au zIY#H~hfhfJ_*JiX-b>!mI<99KwQO$LDO4~m*=fY_0nHNApt4kxp#BpN$LPb;0FYZ+ zhUkve41+`##15wHmU3tTOD!A204!hRc^KAdAf#oXn-ojrIfDkb?ARemAuNaDbj)0D zy<1rozQ^QR9*;X8$3zxT<^D<$2zPnc81Ziz4=1HJ&8_G~-JH1_D2$fK?Ylf}ydOFI z&ys1OUGmQ8qR28L_Ia3rqG6n`RmYpzfVy-?^ie-cYVz^Z0TSx}00Ivu0D*fs-B!fC+z-TWO~39_Vi+@{$#kF@WBap?}}gDGu9 z5M%sIpPf{`1+QgB-@4X$v~i2$jVvgYc^#f5WTxCD3*WoS6}V=`4P&e#4GSGi*PRst zE%R12f-L>cw5SJ7 z)?58qb`uFLy7=_MZ$BrpI1GlRo4pY<)>rAe5 zy2|JBrP5=-qI5?zEOkO9>-D-wmMZOTiH3OIGl}pBt7Y4d-rO)%B;Mj#jV1bFWY*-z zR2J47<4MybN&;UPi$cesvBFmkL3AsEiga>$^kWTQNqyn`!NR~^Rn@9Qnr{!K0f}Oq z0irB+8o9%Z1vOZLONxuhScFsSWKJU`_?M+N<{uKAIe)70z1csk7PfMX3>sWVo$=QTQR)u!U! zjr2P!_m0o9X6OJLs9Mqv67$@97MY(8iLGYcg~W>OHCuMvGRIhjQZ_*4S!=s7IVMsl zh(H%4Ih0|h3R5+eqdK&?E9OETYKzKaiXrw%5ys@PE~Q4a6qLg6Q$2G5^ne_I#7HyN z5>G}iXqp8aV%qZ1;=mL1LfLw(ikD0x|l|e5-oD>xMyz9nrS`?u>$rOlG z^;xs>euhY_MVIKz&!tAQT-q>2Z<)cOF_t(jov9aJrw%Ju4?c_H_F8Ikd*|?W(g2N( zsO#r)U_}xU7N$s7JzR+_UNAi4slbLy@_CSj;J_I|Mbt(&J0WG@MUG0bzY}A*B+nwW zq-c$-^Kr7^oj4t7u(&r`4UrfjIIWEskg16Pw~c_90Rtj#SqDMsu3pHZj^IR=tso`H zGOI0kC*X6>2c0V9V$g9rIz4Rak*yh(H`IuVv`!~3P<~cJWUaxJ`zt5+@F{xs*$1Fy znOon)*fF>Ofn!}|P>*9WNbz8;7VMZ&;clBii zD>q1}sAKzJb)Z*wwa39@G$TSni#?%|!6LHoP#PyBk0s4OHd#~_RCbGuCW`5=YvEQN z*}jH_4{5hOjN(`3kTm4^u_8Zey|8MQ$Ak40y0VZZjfgN=5?CUsPx}c%^hlwmta>q8RJF!z+TyV_$MY==R1ZKBK*2lYutSY)y7#7p;%H$wU&V5L*%|{I|PxsWgl9CU@^v^@GH}6qCeAhlwO9nNPi#d_huJj)`SFuU|e` zx#ZFhK!sYfs*?G9nk-5Omh%D7!Npr&xwY^t@?p;VCTjVWo8SgvesF;I}}QG(ym1+3+7F%lb!5Tn+z)SfV6$QteEU<~I6U zA}B@&iGxs(r70tp5{ymE+GgdH|7{rasK|yn~uHaHOEjgWg9DHAl)NP-RDvb zFSv8+)7R%xBL}9Z(0UPnCChSIl429rMhV7a^mr4@Cpv}+EOPnGl#kC}vw3M;Rkq}~ z%EjUSn6|{O9K&(psYW^U_>3nYWV9P%&ygCZ znaUlW3V9GEv33VWdekYg5=WC0ZyoMj+|H4TEGcJ4N4{Iev>vGLMLsZ9VYC;z!ClWx zyV*zJ0_j8cku#HJ$0lBcR;J8`%xUzjGUy`1iiP1#{Cu-i>Os8R2JzpycC*K zH1>@@OU0Nw=rtlDN}W@5P2VYRY)eUl4jEe{cZ*7jl1DjJ=UELqnbMF19>Fbg9aJQ2 znvy7164x3!v**3vc<;+Tay^lSaz4O9iTksNXGWR$bvu`~r;|OSUPWS^P@Qu+zmL+AL zBZcoAnw4-OH|QhGj#r{u1+18zvZjyvJIJ}a|GZ>^m@UKU!J0m%zbj3tQQf`mn66#j z%d;9R^AOu*fgtHkI+YC>^M}b+k8Q(CCT|2;6k5`}cM6L|lGGfDIrGxo5UJ8P0%N;$ z7k=TcJxH{1H<#W+vHZD(1M^b^kMdMZ;6f%KlJ&2-Qx@YST zpY%bu(*AL;!p?$tc!G>ePJLQ{Xajl^E8P`7JFig9F$1~uI`acOLo`tGsrV|AEQi?l z_bJmA0+su_JiSW+LH^)=y7I12ND&UY>DS+Hc2lKhdAL+&WhtF5!No=7U7^GbZms#O z<`ztYTl|*~kcGh)In;{yC&9xkuGd=rc^iXb#Aa|VpUS#oyM!Z?6nKa&x|@$8-(kwT zm^#phG*8vJzifeDTBCBHpJJNxcfS1G&(NhD#r>wTib$wXrxwj>cdw;$oY>NQLrs7< zH9G1~OiGIulbTZ^3$;&Ir~3&_`%HJAWJn(WZLWj`S^gSbng&_^f+P6 zp0W}$0Sn?4DO|CvM2pN|k)4AqLW{{_OJ2+|qvaT;%MV}dKLAC@hY>L^Tby2OwpYw6<$L2QcEe!7BDu)CvJx$_`9I87_*Q{4mIp z7^A%1u+3y)p_9NpSDCIL3tUkILf6dhwg$R&NXev`EwoO81>Q_I(3>p7As&-rw-Clk z(ZQ8Rj3z*>L1|VU55iVg&#i-*VAG13UO0bwQGvF0Liakk_HPzhj_rB+3!i`u%Z_V7 zlRMOVVK^c#@*`FM>FZoBOGMvP;Yw&(zHmXlO2p8XeRcJB=8C`g|EKa>ex*_}9Mg02 zR6djG!aP?p?>#(-L1Z-7rxVhFC|xDf%fUavLTu9M_Ea%OBE78Cy^{l;J}mzwo7k=F zy1V|5Tn#j!zD<1W5?GWscE*A@U0$m3^aO^#!E0-)0RJ8FbC^y{; zSb868pj>EYvYw zL047pPeO~mmh8}4WD-5JEm~NdAd0Pzwj3H|S4AAU$DC_(TZaVDOst{SWVOIct4p<8 zOcp+d8|rkOb5`(&9R%8CAxNh$Ad9;FdBuGtlSMDjqG1+xVGBqCY17TyH@CFPBedVe z!PVPb^k6rUg*Dlw)TTN$an3nWWUQHRn#S3qL*&jDnH7ogToi`mMXU#H<4}$spjM4{ zhDRa?bg{~f=0*FZI>l1)Kx)fpy3507CC(w3G-uuRQYlMOP5Xl`3B{?{Y=$)9{KB_> z_}p_}esG?qHpr5b9u&Wle^pL#*OkGfn&URg?go$ZecQiuckA6^2}yD)H-ju!Aa$>7I-o-9pkemq&KO6*EgzJ-v5giF~bb7C`s(GHg;C<_+*Jc z{L+@fj5eslWuPdAAV=SeQZCGlml(6Vbq~0N&=V&pI}}k+_0c=7T&)x;55kitp4j#T z^HjKgdCyK8KW0xEqUA9cBemm6%O%wnm!r_tlLJxnwl5T9QPsD#D2NuF9i7By;bl;O z1SF^li4x_MPqz+0&#n6yRTbh}t=V;;lt%+I4qUMM; z&9xoEK6K(`kcE(>HYmVE&WBqdAYgE641~Oo*Z2`*s1^&A>&@hx|T&O8aGQ%55X#Yz!PAQqf}qN;soBbIaY?WODemr zmfPAnX-S`YqNS_a1Z+O>dX9EZry#rGqS|2&q!I06KU-Tx9jGRYkRr0U1D{A7Mg~6( z;mi;Lqh7$FN)MocESp=`j(2+~nq%uuvzR*U@C+8Urk7xd6EpkQ?%#hXD-TS9ZLamE znrw`+3T^u)zxmzg&Mpe#*~Z_qV8o*~oX>T{`^mig-5UCEx>unF7WMY#81vNwO= z%^(K4K$e3|+qiRQQq(X_HmY+)Xz@>6SS*?PLfMlTnU<>9agfEcYSRcp%dbo}AdB{b zM6P5$Wt*vb83Bj>j*kA}+OT|yS>mfIyGr~~;fQKTxGAzIXq(U?Hztj3D$8a<0&8T( zY*|&4QR-MT2P|nE&QTH0(46rYS;CStvd z0?O}xZKnmW{LU`SM?{w8lMVE1yd1i9xuU?My+_Y0uNoy04fE2UF14+-92mnxLzz-{ z)Y+TJ(ptl~rV*WRgJO=(8_>zJDI0a?-b3tw9;HarxNMof#I5u-NM1LC zx2(SB=Q>pgS%j7qwwQWymN0d_m13_y-gN*ce{&)WuS1UYpfZ8B+0K~gtodbnDnXWA zL6!l?Qrn!+qMjCdtkyvmo#k5U2xM6op`20_yPefOa0veZwm_K8Yvo=!On?*K#iz$Gor=vSdq8665vxf{a<_5EVU&hmuX> z(KXO;V)Vh6pL>qklJ}RMS{k6^Zp;xn$YLKdbsca^-1i(0475z`*!t91v3)JX?`L}* zb6P0MnQpikbRGgV{%2%qYg#B)s+%qR7KVOkRGA8b33!pxkI{waMHZvwO~+1LL9C&P zmH>-*!!^^-HGn}KE~NWo<}u=gK^Dx37LmmYSb>&l%%42p5;U4B(YhGD9AJ5L)M9Gt zmq94H`4N@|F|g&l(GtUa(IXRFlA@?<5cQGa^E@z+rSrLM|Aq~l)`~0@kdfOausr$X z2j2X|6R&-OXxPpVJo$msX@J*3?GAk&`}&~fnQpX^q;DeN!YW(zX68P8?4Y0?w9J!#nTi``-CR}0Hs`o}4z zWs~nh;Y(Wm>YxehP_0)WFue-8*=ix&lUDqS)Wq61z-?33#ObQ>oxR@NjMNu)BLNv^?CBt38s6QY5%Ke{; zEWi5|Zi~V4J6%i160)3`9=yAxsm!>2eMyQ%Rw#FCEJwz?F3F6Rj>z6C$xhavtdhu5 zO0U{&UOaun-^O0Oy<-Hvs?i`~VLHXV3PYA`cynfh+ETcyeIE>pVJX_qK`HRR)yK+# zmYOVPi|r_wD~gKobiDA90HsD<`i%KGjkf1Pedo>M^l0IBwsMx7IwcT ziwhhyzf#XT$nvGxOq_7@Avd=Gde@s-Z7dH`+?Nhu^xNi?XWfJRwn0;pOIRJi zdH?NJF!#P(O2Xoqd~iE6n(>lZDs0ik52i?#zU0kl8ERZyCjZkexe83fAR1+os#Gt?gCmwnP%B>%_BXggDj~$Osn2>lPt!Ku_EKT0apM^ zkR`2&NRh#nW=H=tUZJ)5L5o@eo6Fj#lbYBO@7OIzjVYGYJvK1j$~m)k%a*S7YpK5B zkn|yUk5&uYy*I!1wXb~w)I9M4Iv+)rx6U1;rkH*e(Zpz(Q+p*n;LhHcm7+V^US$aI zfR`6rrb;4eMobLQ{IaFl8;Db1 zo>ro!Om(PsW|ZhKU+&I>?>__&k?eBPKFFdkHAK4X7_wY|EBgP_pha-`j`An8$SxzX zY>E8E`?C&zK@^(rb>(kyS-9h#a}zUe{~Y090~Sr3N|79|>#nV zlO-Ba?C6EeRW$b!#VL>U;wR3i`QEXxvY6o_W_hPU7Oa$9mC(Kvezc=bncOIZ=GWo1 zq|`XScT=TPK52;-YP{}YRkXB8*`?}uT;r5l5vn+6#ShOuG+CNpvA^OtSo|VYk_jy3 zLS9oH3>J~)FIxs{Ch0|4 z!mxvOFbuHxEFAQ)%4E_fm$h6@3kF#{pQ|s(lEjm>{3Ar5Z{eSFjG1view{8)r|zBn z(%UYwa3iFeNuTTRfD;QbtC}Vax=3`+iH9P~q2#UbG6Wcq03$_~(3@02gec+U37#AW z$3@{4afOTBGRUI$$PwuT9suROeg)k4sei9e3C3Be0rubhAybRb&)(Gt7WtNBt$5G@ zI<(UmGvW|Z-P=+JDDD6aZb7> zvX~UQOiqiu5UyfM*u1%7u-IQQSRVITVh66CKKU-VIo3~hG4f|!E7sJn)G!lu_ca#v z_Yo$cdvM>}QfW=A^z07Nr%cs{A___FUX7CnpLng3E;uVp?Rw%gWH~KE)0kUhB8xWf zl!}EwpvuD9i~GY2b9H7&Qb@Qz_KDT8O9GxnE)p{VRd05|L#F_ zRXN8Y+dHN~T%Mz490S$KVlI zj27mU+GjzM^5ODHst}JjZZ~b2o8PPC_;+Ey`kj22-zyjff<`Ai#kE>xCT&}kJ&7#k zjML?cImK|cNUaM1Hd;?`S$25y&1w%>!a&N3m};rt_lBFT9@?BW9-Nj?TfPmd#6_B# zrEIv@W@0%};a>nPylv(V*CLCbkJXNa6(w7Y75tYdaPzeHGSXig6&&H?r8U(tFq;*7 zt#)FUC6w!>suEKdH&&QGg-E4Mt%degbP;J49gIISe~OfQ<}L)26a{OAEy)Sagmdju z1<*3PLltpJ<(NMmeT1ydEXJjva{`MqS00RBPhd2C1jw;0;tv(I6x;Wc{L6<}pt6g5YfT%JP+%y9evM@4uylx$u^?TpyKraWQfJr3Ze#&bP z%E;v#Fmu>j)vqs{#PqP_vDorGoV(S%s*H4~s>=pgEGt0+yvd@mEVSH0#iqt&SWJ-& zvZ(%siDH@*_7s?7bj-j2-8BZwJ}OA~nf^$sqc_2f7VnHZAPfA!v@l{q3UgU(2Fqh; zDR=Nip>feGZ4paknO!l**7f;zAnfo!Rn{?mc|oej!_@c`Sco_)GlM97FWmY5v(G*x z6>rTqlSMi`(N_;rl(DxXDX^F=WbpOh!|#9R>Fek4=(UNMa5QjY_F)ThA%CugjcY>x(Ia9vWz{+|a&-KBthL_+i_6<_R#G&} z)o#oUBE6tZY{5B{3TD?O=CR}=&60|8vnj)(8e@?~9Wd#!)D2>p!{*?zWF*jyI$vgW zkz69HBBr)T$kMvjWxaCfl*13XX3%0Aw)zX%aCZFI+D$E6*07l$Dh&Z^E7I71JLggVmNtLr^mw26Bq360enH#ko5__~CcI zb!U=gkGEek}c>0RAv;e z80KLB3w3);f)`h!Lmx|M!KilwEf=^3FjtlAVr8eZu-}D18BKstR=>gyBhUGnbR-~) z{S~|zK9V~T1j97WE}3JsIn39)RAyh!@#d2^-KSy>JP39By8jmd4a}%*vo6hFdRah+ z8(Ctk*Xro5U<_p0-ns3mC!c&X`EqYmh(hIDm8u7u!#8Fyy=AwxqPUL>xOnLk1DwEC z7SJ=_u)qqY(3Z%u!)=k?z{?7R`=c!*RZt}*-=sVPj+o1sd?kiEYi*vrf9)!&#-qbC zRWjOk8IXuVAPlnn*hv*9>pvgamh=(Q7l?88i}bw=vQRLFJ^T()w3C3vzNi{^ChBY{ zer>dvEWh&YU*C~)16d{;1Ow=R(~O+9v@2Knj>>{9^Ii+GG@XRR&G5-EDMyw)Mee3=$^ME4GQbo}xn{g)5uvZZOLK{oun~Qb`!xRM#c9o^*0rACqCw4s1d3Tz93QRM5UWjVzoUT~0G?L@KjVF_g1Qwk@vpSF=8^#>b-9fT5%ES&C_JvdJQwQVv3)Fi-BH6pUA^4~b)8xGa2*IblO{ z&2w!OUIZ$lo8n;ti+bNk)9=Gy5!q;f*+us=URjqEZe0bmU$ZG?Au;AORmu8w6^y85 zE~acUyR4_mo6*J^F_tgL%bj7rcXvWg%a^~oz&f|RQ$byk#V$+9^U_O@r3%)q{G(8` zmm$K@Xr>QwhTc!ABp-(?(omwo{U`<58|v*Y4h#DqkR_AIQpPv|`Z*y9nDq85CKi6n z=;#gDVpC8FI>=|iK+Bb;ffn#WK+F;_E*wiUD3{X+$~`uDEn-W}LvkM>OVA~igz3tp zX_{g5sD+3!E-|G+GbK7Nw+k)(R3c9R7Ra)SmM>nwtc?t1e1os^l#qEQ6@(*=J~H4E zkEGb($$UbKsG=%laxGRy_6W+DKHTh*ETr16GWQ>od^>x3)_rpLMfN61QzC4MA{Jh> zvn*1e*V-BLBGWX-36lk+7@PK4wvpm_>dkK!tawUkQ=s`Q7pPdPy7yf zEa9?*X*H}X3Y0{;XUkMSpcB?;w~Br#(l{8r7%ZvTNFudt%IUS20we#_Sq0#t)ss)C z$L`tF0Zm*vHxoEnh#8!aCE{nSOawJtO zt}ktU@)Y8dF2yF=DWVcA>~XR<2b9nfKFcOIxT`WuuQ@DymMIUHk=t9ARV;`?W!IW5 z7~bnzF^uZC7>!bEr3s^z!D$h%vX!*z(+lDcaGO*pGq$d10P>I%k26Dv#cMtbzOpca zk>qzEx&^iBN2TLtk+Yhfn&uREYFUyu9>By`jDrf1l_}MjPG;`+SqvvBN$+xhi`ySl zswHF1Ff8>0@q6tVNtXbfm`TN0Tc)Ki0shXe#m(gvt1 zs(k*zcX3+o5lLa#O`qfEB2?66rgx_3_-a-aVyd9QZ82F`NL3RHSkh#Ck7%j4tB|q1 z^gktw6-oIjhuP)T$;z8_iU}_ETPEdbX>GtRouoH}q`ZVD*9k4AiUbx(yIfJJn16lD zaxX%Q28E?@E(m72`EO1uvF0-oPpmntG? zF{KYMKz*1r z!Px5HuDCbS?JU|@vIWvwP|of0q}FYFi52yF(_Aci@E4Tnj&^vk!n^1CYw2yxm@IbQ z;!yOj=;+&R+40hYDjqof6qkII=F((k&;qdjge+Ew<=Shi63X6{`!nfXv;MpShq4ak zvE7E=hwYHT7A%~WAPc?LDS1DmlG?3HONW*3**nGoP+K3~{LJk9aSZCl`)RL5&2ebDvxLV}2%tP}_$=gpB-wA8xTz6bm@ArB z*M92M{)!qpa$V7r?@*X5q>gh=zU0EO!Al_slxm?W#*3`DYUOeOrI5ZwK0n-rlK;GN zEK>hNTYm*D!9|m$Q=gb+vAE-Ck6jetpHQSW}rwuIDvvM(Al+)&EJa4}h; zk_E+a2Ud}qkYIOi=Mx8aLYAF7==W|?EOs$(w|R#mw;5>KXmdcdlO%7RjN zY_dptLX(@(S#ebu7Sp@zvcN=JH0s!Q^YM7;);E73nZcr>f}F;b@xcNu%H~wd`UE<` zVwH&~YPDFRE@cJKGC)i$60j+GfZ?hLEnp?gdWt?ZF+WOkc5(;$VuxK2woOeDkhY2s zM|yvnY6Oubk{7CVnZ9)%vOG&9437o4-{N>f7KOqL1TFy!V?*(P$*(BmLi%2EEhfwP zMaZ&f4WJmkFmksVXbG^KcR@)~iKvat)IIMrTfo?w%R(!x6fHuJgC)o!_~Pj#?<}TB zhP+FSn9e%TVv%BGSZXL7myiSG1do-Hq^~Su^C6AmcS*Ol z8!a-2<5H%@&60E+Y6bG5EVjT)l~J>5IV@CY->{)wWSPsUOVCB~cAX_8X5*%1#Ui6` zvShvaflH-qfMwOn1z$c&7NJG5@+HV3w2*CT1ubqFwYiWxk#RT;wgC^2MZJZ`)#<^i zvsr7a`Q#M(2xJkbpo^vuAW$Sf5enect4$FnK&B{|dsy0|mamXy1T(&crZaoQe79n5 z`x9B#O9oJ9j>wYGqCOUk=a=M{RW`xvQ9ld7fXp6!uX8ta0(<&`EUvUk%4>O?l+c&~ zE<7{x_t2)P$+pkvNod*3$_-e$Fp4O8pDdNv%?Fq2BmBMP8(cCQ-d=#Pj{wOFm{< zmn%_&Z0I~X#^t2#BR0y!aClq+K<30&vzZ+d{B1U=xNlM>viwD`V6AM9GW(ow7+^dX z`;^GWT;q}hZL)+yGK2vpffi9l@qbuJMS|u>DWczK(UQPn@iqmtcqq|9r&&_Zy@p0Q zMNAqdPF{9`w5w=_x0CyO$B?MC99xz?t&Ap+F2TJZOUo#8xYk`cbuxeVplB9ruy_Vv5^mgFW7%B2r zUjFizIv*L#THKYX%n_|C@PX_Ur4{ z&Rw7$fPX;oVtr<5pmY@5)FJ)SXkKuUX@%u=;7YCb=~MY^6?%)0$zws? z(d)le6#L3;>J*e{Ggp!z>ceNrYu8Mq3v=s=M;J3|YM0D=xz!nP!7jj-$1~SkY{I*G>%<8D?5cf@B(bOtTWU1Hc zTTX2ml8b}=@5sVQ5@M#wlk0PrFlL<+V$AGHLu7y9{JHa3Oijo9R6h2xj~#pev1Y=> zU|B`WImjZj@Gy2Hfo0lcfdZ>!!7mY6lH=0vI+3HK#gq9TL@sgf3~If(SAmN_5JVOqPKrS$N!w;j)Mxz91ro1xp?? z)mIO9Y^yvM+s>E26qAq5kJ2_C6YBls@an2dj4K}K?XX+VG++ilZv!oKeKw{n(`3(mWL9L6 zLiL3UatoE`VhX5&VPx>50TQxYIx{_eW)j@kX(7Ral0G^4XCTYO{r>5i;<3hxc&J2q z{pY{`75yx~|K1E?PW~NaflrNof}vG+E#OHili)PD;VD%KThjgH+ZEhI`Ehgy`JcGl zHog1cp{^4$?T1krTIXd;Mpj$>5ou_8rsyY#0D)*CwAeQ5mRi@>tP%0N1rKs*Zyk}i zlE ze3d=C)rr>&Fz#RXo+q2cx22yf6ItxD^lG%((g>PiyOkbi2A4Yj4`C$w)te$sBQ&Lz z`*wE@{)5bd#QdpS);Z214Aml9Y1XCzSd(OH(nWSZ_jCp#ngp-{)up23`ni zyAFp2X$2EamM+VmC$eA`$M4!tQcGk>IS^GD$Zgq7oxMla^7BYnv!2?F7t042U9w!B zK^kK$B8tRW)s{a!Fh?SFY4O2#pZnpx*{7bmJ6kH|_|e`0&Hu6n(5AvhbvexKTc4GF z3|7uFTmVRKP}`}&0$DI>ok%>^sFnbw^lW2PdjBuTVhuwpsD%}5lGO3Acl=9ic6g=1 z1-O6a? zdd>dODL%IKVl+{P@DRD90eqQA7n9F=H|qfjRkLJ9MtM1&fvwtWKppUPKzamLLW=Z zioUhFl9Ezf6=iZuEpGx?aE2(b-um*F_lPc!l11K%%>l9MRy@NF9?=^0}XQFeLABWW4ILtl(sx{{_*)YSUeU+6To57z*D&2Rj|W9q^?)dXKr!OOfir_ zVRAne?zt{kC5R{(WO0jpCW39PH7j(Y}-I(>UQ zY@u0)6MaE3HjOZ&8|&TOsM1Rx9e&EcwbEEOg2xU)A6MRMH~gV^O+OuwN%KqRzT^~y zvFQ8nQP5mKvDuGlD;u)+?|k=X&)u0=dg?AQ!k%1Gr0mXYXPPI|Z^x)L$axL|f0C*= ziCLC$S_siB-oj^zN~Ig0yzDOXTFv#^Qon39S%Mt@Rk9@Qu)vC0+eSoz6_rD6v~(yW zn*0_|c_)~zQ=+2!4RmK+v~1HzYm11ul_M%7^UTgbGK-%uNiQygivY6Mth zi;K+`e77SCEKytlr9fK09c1a0&w{gJvark9dwLGC@R_3O#nwR%Ph@diMg@=XrHVPf zr*K!FbA1lvumTo6a1s{9VrsJNJoo_|azxTJJOZp}t=kcDh1&&|=thl+&511eZ5qQl zclfT!(kNCBFO@q*BDVOD1p$N$O^{33ShZp5vAs39u&n9W-~7hp^dKXf6Irl_-+z{B zGRCy1o5kSeDUuX-BX_+;D@FnfhR@=x4QZBhddJ+C$}BgnscbqO4dFumnT~FNrAl$S z$da6ev^JKSRA~+&Arl|22ivAC8coEjqspeiv@5}_lvN`n=7qPbeapJm^aNY@R}l~+ z3MR53zqsXNYK5k8-(V@(VVSb6=#`<) z^5j#|ek&?y=SO70{p(#CQz(~Z zm|k|OtV9-9Tn!OBbjKq{et2eJZdaGXQ^zY1B}9;M6~^_6r}l2DNfs1b<)!c?u;3YK zD0v(gx&UkHpwW{8<0B zqN*`9#^X~t%a8BnIR1#$SE)g|oy@-Kh(+=E+pDIXQ-X?M{o zQdPfGd#Orz0HjelmnNW8Bq-gDE2gE6y0F#J?blTG#J;$w=+l0^cFg`g<2!FJ9z4&iJ!tfgc#3KI`1gOu`aXLa1M8VfU=`y;nSwCCuG?3<;P; zglfbUTrI8iNX66@2OQiLnO6=jr-YnyEC7X#N<}Sd^xo#}04FW>V!0c#Oi4V+>Oe^6 zUp#A9FNMM`rpcU%EEG(|YS^Rczr6Gv@on`RB zg6OQ06kg^I&r(D!pG6uJEC}<%6N~e=&VBMcE5DDh>WKl1w01~nozu)>%>lYyA0*d* z#?@g@Yw*{@XMgkqq2(cH5zE+dl*AQ0mKHYt(%kmERv(_k7T&Yb>Dhrfb&e4$C}=Lc zYC84IhaXX3^FSLRMPDHyh8dm?E83v1$Wp7f%2SbGvxnX>r*Cq@I{VkG?A*boFn$4S}qID^iiRxifel@`c<~TZ!DkO zo3!~0p&O6@Bcvp1DvRw};?y~lytgeO$;t7|#xWr}G=7L2KCx-$ zEJ6#y9x8kymQc>>6N`m2QR>iYiY5h3h0@=mzm|VZ>&)hHPlZwNlbL|i!@YBF&3km- zAuLIH$t5~8B!vLT;{E6_r@I`=Vbw(lONh2JM+nX+_6FE9c`fyVf@f^@xdJ<_@*z(E zpvM$Y-}|Iyzr^gDHoGI7-j(Cl`b?qkl=q3sWaKwpi7eDuPAsG2R$et&)YHaW!J0wd zOO)ZS>#ydO*J<1Q3oNj2-beUk7M#oVargAWM*QSUgqe&U<#z$zfUsYsh_bki633U0}^>q=%0(mE8jg>+A3t_|~LY8Jz%GRC7Gt-M-35_f#aa%0I})0-5EO1yLl=Gi!;ymvQ-jkSIpr)*<*9rO!P%;Zg z8=-kMp!3&6@l9RQIp!5A)Wrc);;ApLoh`-JWo&^3n>WdmKBLpkaJ|ioboJ+&)jEctXJ3z1zKKaGkUU6oSpbT*cu?i+*#?P($Og*SJ`qg!1AHgA3pYe?y!mW_z z%Vs6G&F3MNhLAE0n<502v4k`S23vO)_^y)0w^{hi9=j=ZgC)qK6uzpCaaj&hSZY6s zR^)s}Wbx>E>4Q0OlBR*BwlM7|p^A6F9nl9FU~%cI&1tkgk>%x2y!lDYxtymoLbJ0J zT3Q`QOW?C=gbRzb2vagya9hYk9;S7NQvBZGVPfLk(L)j;3(x!VRaFIBFFz>)xdxAT zBhD_Lkx>mfcE$C?If}?!944~-=tn>P{`dJJ(=vUL{=-Z=O^0h*lHNM+X|t)8R@lW) zsz_jYp)oNF)0P}t;Vg8QjhqpQ(qTZ`Rl!lh)jOh|NK*NcMY7gcEVt?KjN70KpDvB# zt~YLKkVr#};`cHSzD><6S)yUYWF0sIf>_4chC@SWXSJ#s{U+MJt>kTLHI~zbyNTn#EgvWw=rnJj0DZIGW+LAn-zmhPp$B-&e7&QRP{r+Ny3al6{ zDf%QuG8K_Y?4jjUOY2}#b>h4MESQ>XN_JWlgq(`WELQ5`bqUK9YD3_B#hL_O0zWil&J4!h+7Q-DCA>(=s`xPO3Jfwdyb5X~;E z8edtw1z1uBzeyI2lg;zSm6!|yfbFyR;vXW*8vgrpThsjSUnL7~1ExTNr9q^G{D`0! z%P%IkBgmq1u`> zF@&9nKdi?qb%udmRX)YTbk7y8G)?m-CyW=+a$f2D$H5}BP$LV2?yJ6_k=T;SYd%l8 zFD7l##=vgJMLFE!{cX=CDZ6fhVU-y3YEw*ks+4ttWgMk2#79S!W4ZXK&*JZ#Vis6< z=@_s0et(dqzJ15brQA=gvvPeV8VY`yp>~}?!$B4?r5WqeW=WmM&A}Oj!$Kr0d33cP zi`$kQDuFBtwI#!8*;ajNADd?ikhk`hws-WBo}enWj)TL`t|WoJ+*X5 z7G&X^=5q}vRgh5EU{3oi_F7yQZgU!+7$#YKRvf$$KQGU%f*AHlBpM-Py7%BI>Cl}b{^G_?t!U?z+{Dv2yh`1yDs z_#^UJOcrJNIYg8j4nr1dyAa;$I^?w!uJEO5?$Qt){T$c+!L%JyG0?ExR7J&?#y}Pwm*GeY&y-be!zLDeOmZn3N_`RcZw{TD~%SH|?cV=?z(qrj1XK<-g~% z{B5}O^_eUgk%g-DyHJv3KFyO#xDXS=ZLvja-F6mhU|<9plT;a&Qu>~tZ?vow0T?a3 zc<%p5F5h&~<)bMUTm3^=U1YI+sC68$VC(IvkCbXnn@*oOfVRq(iB+_CFqqpVgDi=dVJjK9#p$PggOhu>vD~uugG)$!hA3Z{vZJn{r^W;I1-&H2RBo!; zI9}1kWI+}d9fKv(OkoO+P49U5VanfKONv1kDNbfA!5*o9k6tlZn#%Eg63<;Fixt6G zZlfJNHRT6cgcjIkve@1VTDJ9+$UEk6N{S_g)-*-QIp=0IrytoO`&EP~n5H~BI@ReF zo;hU_Q8>52?jw{ZWt!^=SI&<%)caa@dwueQYv=Z$61I5my2$dQAOBci&py0<^48)- z{P+zwuiVCnMn#Ym1H5jSu~W2wVwsA*I^qR6O{(Wx8y2r;#eM})>*k2PS+K(j2J6HmX?;A*cFq} z!lR|SBLAbwXGvtShQ4A}pxk8H(c|oj+FDp-kFv?O*p-7hIi-~LhVnz|xSNA4tU-P{ z<$NsVS*=MK92dyKu@OmA#Z;PD(yW1w!ooDCN@lKD{7P)WKk05-IoWFcC`)4%x5g|Eupj~h z7J@9>IiIou%NoF9vRKpK`fRKj^?G!@&1)6cz;7}uC@DhMMA>d~^Uzv_VKF_;v9kTrL|!kjbbESODqmAEnG^Vt zxstqS8Qmw#-=_qPJkliH>|%i~$TB)ldgPNoc4>U-pBp z$|xdC=aiJjVNr$-bj(F$+Tu^HErS-UTf4Hdf1tnYuh`@He7`Q2?EBVsY_B%COH3|z zpZk2?kN4}_^EJ2>nlEBY)qYC@F960nej9<0ae)P*h%35ht>gFs$YOto3NZ_7YuIAA zEh2*f!vbS7Rfr`SUl;3SArwwPEQ8?zYKh%ImSz1N`38a=h{0!Bw!%J~r*;X0EE~~s zPH&J${ij(jO+`D?R8;APB6m)oj+k!LA?-@cy}Aa=X5!!8EM}bdM8g5HC}%V7HkKmY zE3yV#bT2q!rsA<|B#T7!-HZUw8oElHS2_Qr$x_P@+_$BQ;*buJj2i0-U`b-e^#xVZ zE}AP9>QuYO7-l{E;YEpN^xAyQuP5#YBlLIcrR&h1_$ep7}ARA*Lb=X+M-ni8fJ= z*sID~2r(qZx;DwjCADWcLs1|cWC10D3FexGND2fy#1n(X+K?toRMFPaV;LcLC3yU= zq)*2*bF;=_;pceyn`pDx)11o^nKN1F&5_A9w3#fFA+l!~X3-~+W1mrg*G-V+@QA}( zhr4?54IB%@%oUSGB{3xr_`uXnO%6-dd%Pb~C7V-2=8jxas&M@-62t1cT*UbhTErE_ znD8mARRmec;H$>FZRmv;I1DN`wpWtsXFHX_SK1}!7SPd2@4d(}<>Li?tO>)~piF+0 zhh;LFiG#Z#{eLN>0~X^1+rk>+s!}N}%&)FYJb3?iAAS1vy(*%+xv>ez!kgN~xiI{l z)Mr4~rKaCXZzhdHS45mP$smi-qMmQSf)VZ<;amePN?H8dWclazImsf0zjQiz1#@7b z0T<{(P)y1Eh#jS6vl!rDF+U@=oK>BzYQ|)Ab41^UEkQ~9zN*PG2wMVCUTH6`Gad}I zl*E@n%SEDN+GW~!ax8u6*HTm-vN$rwuNW;DN8W`+nBh_g z{p+(ysmr25%Gs%+UHYd8K3kj%d|JKoCSnRfFZ7H~;ei5oZK z|20`^((rA`aUlQ}53g_tW3rNdM~|pJy<9fPl5#2XDQqSS58>4}xPrMS!LfIlqy;7v zV@?6FQ;WlrYm)p#f%3-QxcAE?{l#oNcJ5W{Kt?6c2)Lto2XDvy`(^JJRZ-^wp}1m_^8G#EYp z>b7(=tXs2DlJcUKi#$(P`wI*3`xl~HDj9feprzodT8o%~31X`<7A#Jf@hexx&+y7< z{-wA}pkNE6V{ft-cjy@4=jhodAc>Qi%to?oYKAP2u{+~SMd#B7=QNpe_C(6y>kaDH zTuUJ!8DuddV=`tmi(9WsYZF+39W#XPcj6Q9Z9pQjWDFL?Y_+Hf815(OA*3m-9~*4x zYKe}}hDc!gvM*VkEHC{fS;Bd#lLbrKpE}>&2c)pCyfziewQf?0ah95C(k!gj(VGrC zT(Qk-rpkI)vk?ug3_gvmnIK(|<;2pcESFdECWEiin^9p{Z+*ytcO~;4zn#bu!4r~x zhf8zL)g0FJ_(shnPo4w`i@RXw7nc=i4VAAR(@hvRI7 zxcu~TbmlacA#zmW6PGk{g z5`X3~rB@79|2kyiIu%*;C?%PZGJmlcWC0U0J1x^XfT}{Ke!xal7K}%0jL9O|%&LBT zIqXc3#TBr4E<#I~(UL}qz!e)6ZWp~lf-Q1dR3l=QiD(M`_K$z8x^|OALa(GD*(|zO z3bL^2R5YyEI?K*M#YMGbMvJXZlw#bm4neXY4Z}ysi&K4j(Ah$dBNj#1lcgM!WHHCh zd%{8@p1%5LO%`RXH4>vHvZSenh6{IHSiMi_OOxdpw*EU+ZZ*7R_?hA1b!ZV;*1FIX zfk+|8@#O=HWQ(Oaa{U@iN*|+#`rN;F?;akD5^eh7aU!UC!FuLQF;KDv^@G>W zL6#>X3lXs=@>$NXY;e+}N~Wy8<_>Tk`MBV+9KX+KF~~yffSDX5!@UlJU|vk209oeU zb_-dImWD?ypfu(er{+JQg=^Is$NU7{tT@~JU2celUD>vW^HH^%B|Mi@w_J2}23Axh zp*M+sD-49FMy1+pvPVA|MPObWXLA>ur~=zpH}_?3S(7&&iM<9`1im^Db(UX; zmhf4)6FaH~T1*x#2)(jhy+T5+w>Qi7%VqTyo33AW)Lr@E85{xf81Npm&m#WIIg@c# zx_=d)1zj>`4geN>L8YQ71Q{jWIGUx;5(TZzn^Aw%0Ab=2DGLT#sJC1)S>TFI^Uonm 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%0D`Gd_KH={XHU7p9&hQ4)+tEHxipJ*Xr)2 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 N002ovPDHLkV1iBrq8$JL literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/rulers.png b/mapping/src/main/resources/leaflet/images/rulers.png new file mode 100755 index 0000000000000000000000000000000000000000..5d6339d9d69f24a7cfcf9ee3b7b1c1421fa59e9e GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m=r^PZ!4!i{9jfganJT2M&CY=QK7jFtBkJKHO?=xPa5ccmmr$W2Kv1 z%sopa4zwJZs2FH`$86P3hG$)k#RoZfo85VMo-B8=aPYrxU|5;-^99?9$%l@Mv8gbs gv9YyH7I|UM#4zEtW%wM+Xpn6Tp00i_>zopr05 + + + + \ No newline at end of file diff --git a/mapping/src/main/resources/leaflet/images/rulers_@2X.png b/mapping/src/main/resources/leaflet/images/rulers_@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..7247a0c9d16b7b6bbf8a272614eb56089823dc46 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`tYCPZ!6Kh}O5$9k~uU@VL%j+}+P2sx($4>T3%sbg! literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/start.png b/mapping/src/main/resources/leaflet/images/start.png new file mode 100755 index 0000000000000000000000000000000000000000..b8ca942b5d4c953be6afbed03e750a8d53909588 GIT binary patch literal 491 zcmVskiSn80UX8O_siwlUc3qk zn=#_z(1`>QWOJ06ffVDJi_{>Mq<@LS5i#f>dL8(&GqRBK!!}GEoE&s>FeL5S#@_on z)Jq!&KjX`LFYo&m{AH!qD0m%r6F`~95&$UBHkG>eJ8$;(9`yh~0H7SU?l?|*Ou|*s z$V4uOHMStY7J;NuTF55CDttx@p0P7B1B#2=K8UN8N^7?n!X>w)`(-kr)7=hW-C znHoS`m6q9^Ok!?joE#o@7Xq12M%KZqFr)f@%d23r7dmWd?$DpLFOZhmKE}k7MRAJoN#oLL`+&I~AT&}-g{4QBj5S--Ay|FQTotB2GwILGU h%opEA(Y-zZ`~laIr}6x~ZR7v|002ovPDHLkV1jU2-Bthq literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/start.svg b/mapping/src/main/resources/leaflet/images/start.svg new file mode 100755 index 00000000..36a391c4 --- /dev/null +++ b/mapping/src/main/resources/leaflet/images/start.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/mapping/src/main/resources/leaflet/images/start_@2X.png b/mapping/src/main/resources/leaflet/images/start_@2X.png new file mode 100755 index 0000000000000000000000000000000000000000..01da494c809064869254a0eb0ec9789b19563964 GIT binary patch literal 1003 zcmV%o}=4 zVA2%b7#rFBTRje|wb<43U^^C{Bltl{YE*=~yUBh`$~rZ1rRC|W0-4@ICIp5hZKx8I zWV#z*8u$aij3%Jn-8&?us#0&v)jxJQeZ8(gci+ruu&)3d-dYIX#O3JX)vJ5vYo2sq zZnMe@Cml{oS`QFH7|iEdzy6;&-pmIS(b9&86al(ZpucoO2&-tpmGuhv4oh@&T_w|FVKXGSybe+Ox2el-0|08%_8 zX@kRCkD>!B$+OwnCI~efVi9AP+Fu6gAov2(MuQ;$J9fO#Tq^NIl0pb)^SRbDE0Z&Q zGXq9AP(ocdM$>;a66)?LTtNEV-Q7KER+6YwlH9!%m!pgIQ}t2gVeUvz@xw*}wk})% z5=n|^Rm4dWGi}t5#qP4WqD%7JdMe-+1Vy@ev*`Oc%9&<0R%8{rRAx)`T@*n_EL1OtN+*c z8WFCnyc{R@LE8Wf>%D&Y{TG$@W$5lL4q}|IeE9;-ceXBEsM^0~)ulKL2KP^wCR+%f zUCXt8yBJerWX>G65Jr$TR+kcBs$%~|hlZ^lXs>ol1mN)6u-^P=%dO>nH7~48U-2D- zA$LEt+Rz6Q+;1tx7e9R8_I%}L!y$4wJG(88z0*DHm$U=C>Jz;Jf8@a?&Fp4=H2tg| Z$G;w}gww(;|K0!q002ovPDHLkV1hTc*t`G$ literal 0 HcmV?d00001 diff --git a/mapping/src/main/resources/leaflet/images/trash.png b/mapping/src/main/resources/leaflet/images/trash.png new file mode 100755 index 0000000000000000000000000000000000000000..7ff478a456103bbf4b4d6334c8a63a5012172b51 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^+(693!3HF^taP6Tq*#ibJVQ8upoSx*1IXtr@Q5r1 zsuKobMuu5)B!GfDJzX3_G$tmeI4~7vE`M%pV4!y3$N&F-XK$|Pi`42lpAo-*ersc6 zqvJcy`C7`4?>pbG_%T+JjAI859AIG3tg#ok Tr1ob$&=U-vu6{1-oD!M + + + + \ No newline at end of file diff --git a/mapping/src/main/resources/leaflet/images/trash_@2X.png b/mapping/src/main/resources/leaflet/images/trash_@2X.png new file mode 100755 index 0000000000000000000000000000000000000000..fea11a8c45611873f568e4ec76ddabc2983a87f3 GIT binary patch literal 460 zcmV;-0WKmAgsdtwaR{ z8xcgXi~0f)LF<6Ux=k*vrD$m-q_#0uNg>);so)C;W=WYwEVQujf}ln)ml=yBve}F5 zCSsM-of+nv`G;Xw!9(kbtMM>}@=zQDNVR8K09;l<`q4r3*{zimr`5E303nE)$z>OAt$8C=n1+%YW>i!}CiDACFAi`#exg0jjkYzIdKlVP zO6@{$p36qp+?pFH^9%~B5bWGdyl1SrvC@+$BWZquFyQs1&ctOBLIptmFR=ou{TL%{ zijg*@Q<%Np^D4U4|AY19by-iFZ+^X9eV!eO27`Ft6L+f~xCeI1^Nzv%Aw+fG-Y+(xeNdsiQ;TftdS_rHxT^ViZxfEgr#sw3cAvyWTefY z6E`t*Yy$%ku5Ny5;Sn&$h$zstFf%Kn3+}INwPN4M=!UE@YX5ft0000-1&&e%1==0&&e<=n}var n=9007199254740991;e.exports=r},function(e,t){function r(e,t){var r=typeof e;return!!(t=null==t?n:t)&&("number"==r||"symbol"!=r&&o.test(e))&&e>-1&&e%1==0&&e/g;e.exports=r},function(e,t,r){function n(e){return null==e?"":o(e)}var o=r(75);e.exports=n},function(e,t,r){"use strict";function n(e,t,r){if(null!==e)for(var o,i,s,a,u,l,c,f,p=0,h=0,d=e.type,m="FeatureCollection"===d,y="Feature"===d,v=m?e.features.length:1,g=0;g2&&e.push(e[0]);var n=(0,l.default)(e);1===e.length?(t=L.circleMarker(e[0],this._symbols.getSymbol("resultPoint")),r=b({model:n})):2===e.length?(t=L.polyline(e,this._symbols.getSymbol("resultLine")),r=_({model:L.extend({},n,this._getMeasurementDisplayStrings(n))})):(t=L.polygon(e,this._symbols.getSymbol("resultArea")),r=j({model:L.extend({},n,this._getMeasurementDisplayStrings(n))}));var o=L.DomUtil.create("div","");o.innerHTML=r;var i=(0,c.selectOne)(".js-zoomto",o);i&&(L.DomEvent.on(i,"click",L.DomEvent.stop),L.DomEvent.on(i,"click",function(){t.getBounds?this._map.fitBounds(t.getBounds(),{padding:[20,20],maxZoom:17}):t.getLatLng&&this._map.panTo(t.getLatLng())},this));var s=(0,c.selectOne)(".js-deletemarkup",o);s&&(L.DomEvent.on(s,"click",L.DomEvent.stop),L.DomEvent.on(s,"click",function(){this._layer.removeLayer(t)},this)),t.addTo(this._layer),t.bindPopup(o,this.options.popupOptions),t.getBounds?t.openPopup(t.getBounds().getCenter()):t.getLatLng&&t.openPopup(t.getLatLng())}},_handleMeasureClick:function(e){var t=this._map.mouseEventToLatLng(e.originalEvent),r=this._latlngs[this._latlngs.length-1],n=this._symbols.getSymbol("measureVertex");r&&t.equals(r)||(this._latlngs.push(t),this._addMeasureArea(this._latlngs),this._addMeasureBoundary(this._latlngs),this._measureVertexes.eachLayer(function(e){e.setStyle(n),e._path.setAttribute("class",n.className)}),this._addNewVertex(t),this._measureBoundary&&this._measureBoundary.bringToFront(),this._measureVertexes.bringToFront()),this._updateResults(),this._updateMeasureStartedWithPoints()},_handleMapMouseOut:function(){this._measureDrag&&(this._layer.removeLayer(this._measureDrag),this._measureDrag=null)},_addNewVertex:function(e){L.circleMarker(e,this._symbols.getSymbol("measureVertexActive")).addTo(this._measureVertexes)},_addMeasureArea:function(e){if(e.length<3)return void(this._measureArea&&(this._layer.removeLayer(this._measureArea),this._measureArea=null));this._measureArea?this._measureArea.setLatLngs(e):this._measureArea=L.polygon(e,this._symbols.getSymbol("measureArea")).addTo(this._layer)},_addMeasureBoundary:function(e){if(e.length<2)return void(this._measureBoundary&&(this._layer.removeLayer(this._measureBoundary),this._measureBoundary=null));this._measureBoundary?this._measureBoundary.setLatLngs(e):this._measureBoundary=L.polyline(e,this._symbols.getSymbol("measureBoundary")).addTo(this._layer)}}),L.Map.mergeOptions({measureControl:!1}),L.Map.addInitHook(function(){this.options.measureControl&&(this.measureControl=(new L.Control.Measure).addTo(this))}),L.control.measure=function(e){return new L.Control.Measure(e)}},function(e,t){},function(e,t,r){function n(e,t,r){var n=h.imports._.templateSettings||h;r&&c(e,t,r)&&(t=void 0),e=d(e),t=o({},t,n,a);var j,x,M=o({},t.imports,n.imports,a),w=f(M),L=s(M,w),O=0,P=t.interpolate||b,k="__p += '",C=RegExp((t.escape||b).source+"|"+P.source+"|"+(P===p?g:b).source+"|"+(t.evaluate||b).source+"|$","g"),E="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";e.replace(C,function(t,r,n,o,i,s){return n||(n=o),k+=e.slice(O,s).replace(_,u),r&&(j=!0,k+="' +\n__e("+r+") +\n'"),i&&(x=!0,k+="';\n"+i+";\n__p += '"),n&&(k+="' +\n((__t = ("+n+")) == null ? '' : __t) +\n'"),O=s+t.length,t}),k+="';\n";var S=t.variable;S||(k="with (obj) {\n"+k+"\n}\n"),k=(x?k.replace(m,""):k).replace(y,"$1").replace(v,"$1;"),k="function("+(S||"obj")+") {\n"+(S?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(j?", __e = _.escape":"")+(x?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+k+"return __p\n}";var A=i(function(){return Function(w,E+"return "+k).apply(void 0,L)});if(A.source=k,l(A))throw A;return A}var o=r(32),i=r(62),s=r(65),a=r(66),u=r(67),l=r(22),c=r(15),f=r(68),p=r(25),h=r(71),d=r(26),m=/\b__p \+= '';/g,y=/\b(__p \+=) '' \+/g,v=/(__e\(.*?\)|\b__t\)) \+\n'';/g,g=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,b=/($^)/,_=/['\n\r\u2028\u2029\\]/g;e.exports=n},function(e,t,r){var n=r(33),o=r(44),i=r(50),s=o(function(e,t,r,o){n(t,i(t),e,o)});e.exports=s},function(e,t,r){function n(e,t,r,n){var s=!r;r||(r={});for(var a=-1,u=t.length;++a1?r[o-1]:void 0,a=o>2?r[2]:void 0;for(s=e.length>3&&"function"==typeof s?(o--,s):void 0,a&&i(r[0],r[1],a)&&(s=o<3?void 0:s,o=1),t=Object(t);++n0){if(++t>=n)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var n=800,o=16,i=Date.now;e.exports=r},function(e,t,r){function n(e){return s(e)?o(e,!0):i(e)}var o=r(18),i=r(60),s=r(7);e.exports=n},function(e,t){function r(e,t){for(var r=-1,n=Array(e);++r"']/g,a=RegExp(s.source);e.exports=n},function(e,t,r){var n=r(74),o={"&":"&","<":"<",">":">",'"':""","'":"'"},i=n(o);e.exports=i},function(e,t){function r(e){return function(t){return null==e?void 0:e[t]}}e.exports=r},function(e,t,r){function n(e){if("string"==typeof e)return e;if(s(e))return i(e,n)+"";if(a(e))return c?c.call(e):"";var t=e+"";return"0"==t&&1/e==-u?"-0":t}var o=r(4),i=r(24),s=r(19),a=r(76),u=1/0,l=o?o.prototype:void 0,c=l?l.toString:void 0;e.exports=n},function(e,t,r){function n(e){return"symbol"==typeof e||i(e)&&o(e)==s}var o=r(0),i=r(1),s="[object Symbol]";e.exports=n},function(e,t){var r=/<%-([\s\S]+?)%>/g;e.exports=r},function(e,t){var r=/<%([\s\S]+?)%>/g;e.exports=r},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={acres:{factor:24711e-8,display:"acres",decimals:2},feet:{factor:3.2808,display:"feet",decimals:0},kilometers:{factor:.001,display:"kilometers",decimals:2},hectares:{factor:1e-4,display:"hectares",decimals:2},meters:{factor:1,display:"meters",decimals:0},miles:{factor:3.2808/5280,display:"miles",decimals:2},sqfeet:{factor:10.7639,display:"sqfeet",decimals:0},sqmeters:{factor:1,display:"sqmeters",decimals:0},sqmiles:{factor:3.86102e-7,display:"sqmiles",decimals:2}}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e){return e<10?"0"+e.toString():e.toString()}function i(e,t,r){var n=Math.abs(e),i=Math.floor(n),s=Math.floor(60*(n-i)),a=Math.round(3600*(n-i-s/60)*100)/100,u=n===e?t:r;return o(i)+"° "+o(s)+"' "+o(a)+'" '+u}function s(e){var t=e[e.length-1],r=e.map(function(e){return[e.lat,e.lng]}),n=L.polyline(r),o=L.polygon(r),s=1e3*(0,u.default)(n.toGeoJSON(),{units:"kilometers"}),a=(0,c.default)(o.toGeoJSON());return{lastCoord:{dd:{x:t.lng,y:t.lat},dms:{x:i(t.lng,"E","W"),y:i(t.lat,"N","S")}},length:s,area:a}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=s;var a=r(81),u=n(a),l=r(84),c=n(l)},function(e,t,r){"use strict";function n(e,t){if(t=t||{},!Object(s.d)(t))throw new Error("options is invalid");if(!e)throw new Error("geojson is required");return Object(i.b)(e,function(e,r){var n=r.geometry.coordinates;return e+Object(o.a)(n[0],n[1],t)},0)}Object.defineProperty(t,"__esModule",{value:!0});var o=r(82),i=r(27),s=r(3);t.default=n},function(e,t,r){"use strict";function n(e,t,r){if(r=r||{},!Object(i.d)(r))throw new Error("options is invalid");var n=r.units,s=Object(o.a)(e),a=Object(o.a)(t),u=Object(i.a)(a[1]-s[1]),l=Object(i.a)(a[0]-s[0]),c=Object(i.a)(s[1]),f=Object(i.a)(a[1]),p=Math.pow(Math.sin(u/2),2)+Math.pow(Math.sin(l/2),2)*Math.cos(c)*Math.cos(f);return Object(i.g)(2*Math.atan2(Math.sqrt(p),Math.sqrt(1-p)),n)}var o=r(83),i=r(3);t.a=n},function(e,t,r){"use strict";function n(e){if(!e)throw new Error("coord is required");if("Feature"===e.type&&null!==e.geometry&&"Point"===e.geometry.type)return e.geometry.coordinates;if("Point"===e.type)return e.coordinates;if(Array.isArray(e)&&e.length>=2&&void 0===e[0].length&&void 0===e[1].length)return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}r.d(t,"a",function(){return n});r(3)},function(e,t,r){"use strict";function n(e){return Object(u.a)(e,function(e,t){return e+o(t)},0)}function o(e){var t,r=0;switch(e.type){case"Polygon":return i(e.coordinates);case"MultiPolygon":for(t=0;t0){t+=Math.abs(s(e[0]));for(var r=1;r2){for(u=0;u1&&void 0!==arguments[1]?arguments[1]:2,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:".",n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:",",o=e<0?"-":"",i=Math.abs(+e||0),s=parseInt(i.toFixed(t),10)+"",a=s.length>3?s.length%3:0;return[o,a?s.substr(0,a)+n:"",s.substr(a).replace(/(\d{3})(?=\d)/g,"$1"+n),t?""+r+Math.abs(i-s).toFixed(t).slice(2):""].join("")}Object.defineProperty(t,"__esModule",{value:!0}),t.numberFormat=n},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(89);Object.defineProperty(t,"controlTemplate",{enumerable:!0,get:function(){return n(o).default}});var i=r(90);Object.defineProperty(t,"resultsTemplate",{enumerable:!0,get:function(){return n(i).default}});var s=r(91);Object.defineProperty(t,"pointPopupTemplate",{enumerable:!0,get:function(){return n(s).default}});var a=r(92);Object.defineProperty(t,"linePopupTemplate",{enumerable:!0,get:function(){return n(a).default}});var u=r(93);Object.defineProperty(t,"areaPopupTemplate",{enumerable:!0,get:function(){return n(u).default}})},function(e,t,r){e.exports='Measure

Measure distances and areas

Measure distances and areas

Start creating a measurement by adding points to the map

'},function(e,t,r){e.exports='

Last point

{{ model.lastCoord.dms.y }} / {{ model.lastCoord.dms.x }}

{{ numberFormat(model.lastCoord.dd.y, 6) }} / {{ numberFormat(model.lastCoord.dd.x, 6) }}

<% if (model.pointCount > 1) { %>

Path distance {{ model.lengthDisplay }}

<% } %> <% if (model.pointCount > 2) { %>

Area {{ model.areaDisplay }}

<% } %> '},function(e,t,r){e.exports='

Point location

{{ model.lastCoord.dms.y }} / {{ model.lastCoord.dms.x }}

{{ numberFormat(model.lastCoord.dd.y, 6) }} / {{ numberFormat(model.lastCoord.dd.x, 6) }}

'},function(e,t,r){e.exports='

Linear measurement

{{ model.lengthDisplay }}

'},function(e,t,r){e.exports='

Area measurement

{{ model.areaDisplay }}

{{ model.lengthDisplay }} Perimeter

'}]); \ No newline at end of file diff --git a/mapping/src/main/resources/leaflet/leaflet.html b/mapping/src/main/resources/leaflet/leaflet.html index 643d5f23..492c654a 100644 --- a/mapping/src/main/resources/leaflet/leaflet.html +++ b/mapping/src/main/resources/leaflet/leaflet.html @@ -3,9 +3,11 @@ + - + + @@ -34,7 +36,20 @@ var map = L.map('map', { attributionControl: false - }).setView([0, 0], 2); + }).setView([0, 0], 2); + + //Path measurement library controls + var measureControl = L.control.measure({ + position: 'topleft', primaryLengthUnit: 'kilometers', + primaryAreaUnit: 'sqmeters', secondaryAreaUnit: 'sqmiles', + captureZIndex: 2000000, + activeColor: '#086972', + completedColor: '#342b38' + }); + measureControl.addTo(map); + + //Add the scale bar to the bottom right + L.control.scale({position: 'bottomright'}).addTo(map); var countriesLayer = L.geoJson(countryData, { style: { diff --git a/pom.xml b/pom.xml index a25da873..e4cc1907 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,12 @@ - + 4.0.0 gov.llnl.gnem.apps.coda.calibration coda-calibration - 1.0.8.1 + 1.0.9 coda-calibration pom @@ -61,7 +61,7 @@ spring-milestones - http://repo.spring.io/milestone + https://repo.spring.io/milestone @@ -73,34 +73,33 @@ 1.8 1.8 3.8.1 - 3.1.1 + 3.2.0 3.0.0-M4 - 3.2.1 + 3.2.2 3.2.0 - 15-ea+1 + 15-ea+2 2.4.0-b180830.0359 - 1.2.0.RELEASE - 2.2.4.RELEASE - Dysprosium-SR4 + 2.3.0.M3 + Dysprosium-SR6 2.2.1 1.12 1.3.04 1.50 - 10.1.0 + 10.2.0 - 1.15 - 1.19 + 1.16 + 1.20 3.6.1 28.2-jre - 2.3.1 + 2.3.4 - 5.2.3.RELEASE - 5.6.0 - 3.2.4 + 5.2.5.RELEASE + 5.6.1 + 3.3.3 1.3.2 @@ -295,22 +294,7 @@ ${spring.boot.version} pom import -

9eJlopEw&hJ9U0lwK>s?`@dq`j#ebh(7>aqcq$gW4{^6e+WVsGi zf`X3YS<}f9L3HsVYWLbrjH$~^u=IbV7vI_?y(4gevr#R_b(yVUHl9$Sm&LKb5|3DI zML?PA6|Pd(lYs^8M(jZbA2y@XxjIp`Agh8b%#w;^BW{HUlq#~BNmp)(*sfy~rC}_> zBWmZQ-RRgtwI!zKjb{yT^rrTCIjVq{!#EIIX=OW^Fv1nepon;7&6@k}SGO^SE`H)( z^%bz9rIBNs4=G5oLFf~2-ph4?#R3+JtB^%damvon()SK3BaE7$CDmq?S+(4TAgida zw4q4U&E4m?3|QP=JOU+Iyt%l3MwFT=V!V^6;Nk+n`~jw)`v>ak`gwD-;PrMnuv}BJ zG@|MGFn{wkCyUoM-hu;5t9+-67n2Mtp0{Vp1Yy?wV7cP?9SN1*mmv2A&tcor8HY2e`+co(~eRluDL@sb_)H;wM3qL?F zy?@Nn^fYeVlL!!7Pu-E5nru_Q%-k>*8~am6oaIcimwbRNv@ z_M#zdY}fWf$Br3Tl!{N2#Z~VQBFKW9i?6?AuJ3TNDMlI`APcHOMwTL3%ePgCEcRIu zp^3->KEMjfXBj7VPIhSyKgK%=^L4(YJ(v_tC-dVm3&<+vL9fm88?G%`Hq0c;wT)P2 z&hguRNWD=YLjM5m}TWTO67@*EJtol1Jviid!Iy>hP|u z*pr14i@>5ARec#_Y{i^ikPck-6H6isa$QieWpVMzwB9gmwj5bRlfcYg@>7$3GmAnN zPnLskMCt(ZID#ssyDYPYd>!6}CXi(>znu`D?6`-2D&~L`p~X07kFAk-n`cDCZq~>} zj_Mx1i7&u~mI)f_hQ}>xF|_DMp?9h^1EW(rYj_i?>;t-7lf8N^eU|h_kk%Ua@GZns ze9jLb*q?TLp9@+H;=YuRn^-Pr>F)1dx2HWeklH!etXj)7xbW9mirt7=UP8K(EQ#rmaQ&SyXa)yRuR)esAzC4_wzJSN@YJ|-&4RNr}0CjA{*HJR!x}_?XR97u4)%IZyS9t(bP)4axA6TN(*5Ol{(BlD> zRaU<#if9mobK5q4bg_>GcllVq98mVnB+FqWvN*#qU%cOS|C;+Ac_h8#o_Hl_2>awG z9-*<*MJ!%#mRyNNsW8OK_Uyv#h1=I{z4urvV95)I1%jBeVAZ6U#+S%VN=_Gnyu3Np>Zh^Ope@8Yf1`8eVI#AjlHv z`IF=2Gyh1=@c7E@VYW%Xl4XS~nw(`pi@-83!@0VsFLwuEQKuLIi@L(JD^ewBhFAiw zNIFf8EM69$h%5?Iq@gkHYG6^vGP14p&b85-7zgYCEy#ajkZ?DJMy*Z)0US`2N#m+* zWpvG7h>e&#V2zh``Q8p$1S>9t4a)rH14hzImS6-eR#7RCIV5Cp0wp2IQek=?wIg%e zT!J@UWtj0Et)0ZzjQb1?jem)uNhVvπv-e$fn^V6bMYMeQ!h(?wC4krNSunVWNH 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

- - io.springlets - springlets-data-jpa - ${springlets.version} - - - io.springlets - springlets-data-commons - ${springlets.version} - - - io.springlets - springlets-context - ${springlets.version} - +
org.springframework.boot spring-boot-loader @@ -444,7 +428,6 @@ javax.annotation-api ${javax.annotation.version} -
diff --git a/schema/calibration-input-params.json.example b/schema/calibration-input-params.json.example index 72271c7e..ef3cb014 100644 --- a/schema/calibration-input-params.json.example +++ b/schema/calibration-input-params.json.example @@ -1,97 +1,102 @@ { "schemaVersion": 1, "type": "llnl/coda-calibration-tool", - "bands":[ - {"lowFreqHz":0.02 ,"highFreqHz":0.03,"minWindowLengthSec":100,"maxWindowLengthSec":1000,"snrThresholdAboveNoiseLog10":0.5,"measurementTimeSec":100.0,"velocity0":0,"velocity1":0,"velocity2":0,"beta0":0,"beta1":0,"beta2":0,"gamma0":0,"gamma1":0,"gamma2":0,"p1":0,"p2":0,"xc":0,"xt":0,"q":0}, - {"lowFreqHz":0.03 ,"highFreqHz":0.05,"minWindowLengthSec":100,"maxWindowLengthSec":800, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":0.05 ,"highFreqHz":0.1, "minWindowLengthSec":75, "maxWindowLengthSec":600, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":0.1, "highFreqHz":0.2, "minWindowLengthSec":75, "maxWindowLengthSec":550, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":0.2, "highFreqHz":0.3, "minWindowLengthSec":50, "maxWindowLengthSec":550, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":0.3, "highFreqHz":0.5, "minWindowLengthSec":50, "maxWindowLengthSec":500, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":0.5, "highFreqHz":0.7, "minWindowLengthSec":50, "maxWindowLengthSec":500, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":0.7, "highFreqHz":1.0, "minWindowLengthSec":40, "maxWindowLengthSec":450, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":1.0, "highFreqHz":1.5, "minWindowLengthSec":40, "maxWindowLengthSec":450, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":1.5, "highFreqHz":2.0, "minWindowLengthSec":40, "maxWindowLengthSec":400, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":2.0, "highFreqHz":3.0, "minWindowLengthSec":40, "maxWindowLengthSec":400, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":3.0, "highFreqHz":4.0, "minWindowLengthSec":40, "maxWindowLengthSec":400, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":4.0, "highFreqHz":6.0, "minWindowLengthSec":40, "maxWindowLengthSec":400, "snrThresholdAboveNoiseLog10":0.5}, - {"lowFreqHz":6.0, "highFreqHz":8.0, "minWindowLengthSec":40, "maxWindowLengthSec":350, "snrThresholdAboveNoiseLog10":0.5} + "bands": [ + { "lowFreqHz": 0.02, "highFreqHz": 0.03, "minWindowLengthSec": 100, "maxWindowLengthSec": 1000, "snrThresholdAboveNoiseLog10": 0.5, "measurementTimeSec": 100.0, "velocity0": 0, "velocity1": 0, "velocity2": 0, "beta0": 0, "beta1": 0, "beta2": 0, "gamma0": 0, "gamma1": 0, "gamma2": 0, "p1": 0, "p2": 0, "xc": 0, "xt": 0, "q": 0 }, + { "lowFreqHz": 0.03, "highFreqHz": 0.05, "minWindowLengthSec": 100, "maxWindowLengthSec": 800, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 0.05, "highFreqHz": 0.1, "minWindowLengthSec": 75, "maxWindowLengthSec": 600, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 0.1, "highFreqHz": 0.2, "minWindowLengthSec": 75, "maxWindowLengthSec": 550, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 0.2, "highFreqHz": 0.3, "minWindowLengthSec": 50, "maxWindowLengthSec": 550, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 0.3, "highFreqHz": 0.5, "minWindowLengthSec": 50, "maxWindowLengthSec": 500, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 0.5, "highFreqHz": 0.7, "minWindowLengthSec": 50, "maxWindowLengthSec": 500, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 0.7, "highFreqHz": 1.0, "minWindowLengthSec": 40, "maxWindowLengthSec": 450, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 1.0, "highFreqHz": 1.5, "minWindowLengthSec": 40, "maxWindowLengthSec": 450, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 1.5, "highFreqHz": 2.0, "minWindowLengthSec": 40, "maxWindowLengthSec": 400, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 2.0, "highFreqHz": 3.0, "minWindowLengthSec": 40, "maxWindowLengthSec": 400, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 3.0, "highFreqHz": 4.0, "minWindowLengthSec": 40, "maxWindowLengthSec": 400, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 4.0, "highFreqHz": 6.0, "minWindowLengthSec": 40, "maxWindowLengthSec": 400, "snrThresholdAboveNoiseLog10": 0.5 }, + { "lowFreqHz": 6.0, "highFreqHz": 8.0, "minWindowLengthSec": 40, "maxWindowLengthSec": 350, "snrThresholdAboveNoiseLog10": 0.5 } ], "mdac-fi": { - "alphaR": 5000, - "alphas": 6000, - "betas": 3500, - "betaR": 2900, - "sigma": 0.3, - "delSigma": 0.0, - "psi": 0.25, - "delPsi": 0.0, - "zeta": 1.0, - "m0ref": 10000000000000000, - "radPatP": 0.44, - "radPatS": 0.6, - "rhor": 2500, - "rhos": 2700 + "alphaR": 5000, + "alphas": 6000, + "betas": 3500, + "betaR": 2900, + "sigma": 0.3, + "delSigma": 0.0, + "psi": 0.25, + "delPsi": 0.0, + "zeta": 1.0, + "m0ref": 10000000000000000, + "radPatP": 0.44, + "radPatS": 0.6, + "rhor": 2500, + "rhos": 2700 }, "mdac-ps": [ - {"phase":"Pn","q0":210,"delQ0":0,"gamma0":0.65,"delGamma0":0,"u0":7900,"eta":1.1,"delEta":0,"distCrit":0.001,"snr":2}, - {"phase":"Pg","q0":190,"delQ0":0,"gamma0":0.45,"delGamma0":0,"u0":6000,"eta":0.5,"delEta":0,"distCrit":100, "snr":2}, - {"phase":"Sn","q0":590,"delQ0":0,"gamma0":0.55,"delGamma0":0,"u0":4500,"eta":1.1,"delEta":0,"distCrit":0.001,"snr":2}, - {"phase":"Lg","q0":200,"delQ0":0,"gamma0":0.54,"delGamma0":0,"u0":3500,"eta":0.5,"delEta":0,"distCrit":100, "snr":2} + { "phase": "Pn", "q0": 210, "delQ0": 0, "gamma0": 0.65, "delGamma0": 0, "u0": 7900, "eta": 1.1, "delEta": 0, "distCrit": 0.001, "snr": 2 }, + { "phase": "Pg", "q0": 190, "delQ0": 0, "gamma0": 0.45, "delGamma0": 0, "u0": 6000, "eta": 0.5, "delEta": 0, "distCrit": 100, "snr": 2 }, + { "phase": "Sn", "q0": 590, "delQ0": 0, "gamma0": 0.55, "delGamma0": 0, "u0": 4500, "eta": 1.1, "delEta": 0, "distCrit": 0.001, "snr": 2 }, + { "phase": "Lg", "q0": 200, "delQ0": 0, "gamma0": 0.54, "delGamma0": 0, "u0": 3500, "eta": 0.5, "delEta": 0, "distCrit": 100, "snr": 2 } ], "reference-events": [ - { "eventId" : "0331199924", "refMw" : 3.0 }, - { "eventId" : "0401199924", "refMw" : 5.0, "refApparentStressInMpa": 0.7 } + { "eventId": "0331199924", "refMw": 3.0 }, + { "eventId": "0401199924", "refMw": 5.0, "refApparentStressInMpa": 0.7 } ], - "velocity-configuration": { - "phaseVelocityInKms" : 3.5, - "groupVelocity1InKmsGtDistance" : 4.7, - "groupVelocity2InKmsGtDistance" : 2.3, - "groupVelocity1InKmsLtDistance" : 3.9, - "groupVelocity2InKmsLtDistance" : 1.9, - "distanceThresholdInKm" : 300.0, + "validation-events": [{ + "eventId": "0331199924", + "mw": 3.1, + "apparentStressInMpa": 0.5 + }], + "velocity-configuration": { + "phaseVelocityInKms": 3.5, + "groupVelocity1InKmsGtDistance": 4.7, + "groupVelocity2InKmsGtDistance": 2.3, + "groupVelocity1InKmsLtDistance": 3.9, + "groupVelocity2InKmsLtDistance": 1.9, + "distanceThresholdInKm": 300.0 }, - "shape-constraints" : { - "maxVP1" : 600.0, - "minVP1" : 50.0, - "v0reg" : 100.0, - "maxVP2" : 5000.0, - "minVP2" : 1.0, - "maxVP3" : 5000.0, - "minVP3" : 1.0, - "maxBP1" : 1000.0, - "minBP1" : -500.0, - "b0reg" : 10000.0, - "maxBP2" : 20.0, - "minBP2" : 0.1, - "maxBP3" : 1500.0, - "minBP3" : 1.0E-4, - "maxGP1" : 100.0, - "minGP1" : 0.0, - "g0reg" : 100.0, - "maxGP2" : 101.0, - "minGP2" : 0.0, - "g1reg" : -1.0, - "maxGP3" : 101.0, - "minGP3" : 1.0, - "yvvMin" : 0.5, - "yvvMax" : 6.01, - "vDistMax" : 1600.0, - "vDistMin" : 0.0, - "ybbMin" : -0.12, - "ybbMax" : 5.0E-4, - "bDistMax" : 1550.0, - "bDistMin" : 0.0, - "yggMin" : 0.01, - "yggMax" : 100.0, - "gDistMin" : 600.0, - "gDistMax" : 0.0, - "minIntercept" : 0.001, - "maxIntercept" : 20.0, - "minBeta" : -4.0, - "maxBeta" : -1.0E-4, - "minGamma" : 0.001, - "maxGamma" : 4.0, - "iterations" : 10 - } + "shape-constraints": { + "maxVP1": 600.0, + "minVP1": 50.0, + "v0reg": 100.0, + "maxVP2": 5000.0, + "minVP2": 1.0, + "maxVP3": 5000.0, + "minVP3": 1.0, + "maxBP1": 1000.0, + "minBP1": -500.0, + "b0reg": 10000.0, + "maxBP2": 20.0, + "minBP2": 0.1, + "maxBP3": 1500.0, + "minBP3": 1.0E-4, + "maxGP1": 100.0, + "minGP1": 0.0, + "g0reg": 100.0, + "maxGP2": 101.0, + "minGP2": 0.0, + "g1reg": -1.0, + "maxGP3": 101.0, + "minGP3": 1.0, + "yvvMin": 0.5, + "yvvMax": 6.01, + "vDistMax": 1600.0, + "vDistMin": 0.0, + "ybbMin": -0.12, + "ybbMax": 5.0E-4, + "bDistMax": 1550.0, + "bDistMin": 0.0, + "yggMin": 0.01, + "yggMax": 100.0, + "gDistMin": 600.0, + "gDistMax": 0.0, + "minIntercept": 0.001, + "maxIntercept": 20.0, + "minBeta": -4.0, + "maxBeta": -1.0E-4, + "minGamma": 0.001, + "maxGamma": 4.0, + "iterations": 10 + } } \ No newline at end of file diff --git a/schema/calibration-input-params.jsonschema b/schema/calibration-input-params.jsonschema index 5513ef1d..957483e3 100644 --- a/schema/calibration-input-params.jsonschema +++ b/schema/calibration-input-params.jsonschema @@ -589,6 +589,50 @@ } } }, + "validation-events": { + "$id": "#/properties/validation-events", + "type": "array", + "title": "Array of known validation events; not used in calibration but displayed in the GUI for verification.", + "items": { + "$id": "#/properties/validation-events/entry", + "type": "object", + "title": "A specific validation event entry.", + "required": [ + "eventId", + "mw" + ], + "properties": { + "eventId": { + "$id": "#/properties/validation-events/entry/properties/eventId", + "type": "string", + "title": "Specific event id, needs to match an event id in the calibration to display on plots.", + "default": false, + "examples": [ + "0101190012" + ] + }, + "mw": { + "$id": "#/properties/validation-events/entry/properties/mw", + "type": "number", + "title": "The Mw value for the validation event.", + "default": 0, + "examples": [ + 5.0 + ] + }, + "apparentStressInMpa": { + "$id": "#/properties/validation-events/entry/properties/apparentStressInMpa", + "type": "number", + "title": "An optional measure of the apparent stress term for this specific validation event.", + "default": false, + "examples": [ + 0.0, + 0.5 + ] + } + } + } + }, "velocity-configuration": { "$id": "#/properties/velocity-configuration", "type": "object",