From e4e6558ba4fbf50bd4a1172d25254db574db5da6 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 16 Aug 2024 13:06:10 -0700 Subject: [PATCH 01/28] Add humidistat control zone getters and setters. --- src/model/ControllerOutdoorAir.cpp | 42 +++++++++++++++++++++++++ src/model/ControllerOutdoorAir.hpp | 7 +++-- src/model/ControllerOutdoorAir_Impl.hpp | 7 +++-- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 284665f9e1c..48782db5ae6 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -17,6 +17,8 @@ #include "AirflowNetworkOutdoorAirflow_Impl.hpp" #include "AirflowNetworkCrack.hpp" #include "AirflowNetworkCrack_Impl.hpp" +#include "ThermalZone.hpp" +#include "ThermalZone_Impl.hpp" #include "Model.hpp" #include "Model_Impl.hpp" @@ -337,6 +339,30 @@ namespace model { } } + boost::optional ControllerOutdoorAir_Impl::getHumidistatControlZone() const { + return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::HumidistatControlZoneName); + } + + boost::optional ControllerOutdoorAir_Impl::humidistatControlZone() const { + return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::HumidistatControlZoneName); + } + + bool ControllerOutdoorAir_Impl::setHumidistatControlZone(const boost::optional& thermalZone) { + bool result(false); + if (thermalZone) { + result = setPointer(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, thermalZone.get().handle()); + } else { + resetHumidistatControlZone(); + result = true; + } + return result; + } + + void ControllerOutdoorAir_Impl::resetHumidistatControlZone() { + bool result = setString(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, ""); + OS_ASSERT(result); + } + OptionalDouble ControllerOutdoorAir_Impl::getHighHumidityOutdoorAirFlowRatio() const { return getDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio); } @@ -728,6 +754,22 @@ namespace model { return getImpl()->setHighHumidityControl(val); } + boost::optional ControllerOutdoorAir::getHumidistatControlZone() const { + return getImpl()->getHumidistatControlZone(); + } + + boost::optional ControllerOutdoorAir::humidistatControlZone() const { + return getImpl()->humidistatControlZone(); + } + + bool ControllerOutdoorAir::setHumidistatControlZone(const ThermalZone& thermalZone) { + return getImpl()->setHumidistatControlZone(thermalZone); + } + + void ControllerOutdoorAir::resetHumidistatControlZone() { + getImpl()->resetHumidistatControlZone(); + } + boost::optional ControllerOutdoorAir::getHighHumidityOutdoorAirFlowRatio() const { return getImpl()->getHighHumidityOutdoorAirFlowRatio(); } diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index 125b29b2dcb..f9d25de35af 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -25,6 +25,7 @@ namespace model { class AirLoopHVACOutdoorAirSystem; class AirflowNetworkOutdoorAirflow; class AirflowNetworkCrack; + class ThermalZone; class MODEL_API ControllerOutdoorAir : public ParentObject { @@ -107,8 +108,10 @@ namespace model { boost::optional getHighHumidityControl() const; bool setHighHumidityControl(bool val); - //Zone getHumidistatControlZone() const; - //bool setHumidistatControlZone(Zone z) + boost::optional getHumidistatControlZone() const; + boost::optional humidistatControlZone() const; + bool setHumidistatControlZone(const ThermalZone& thermalZone); + void resetHumidistatControlZone(); boost::optional getHighHumidityOutdoorAirFlowRatio() const; bool setHighHumidityOutdoorAirFlowRatio(double v); diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index c496e4095d7..d9cd6972476 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -16,6 +16,7 @@ namespace model { class AirLoopHVACOutdoorAirSystem; class ControllerMechanicalVentilation; class AirflowNetworkOutdoorAirflow; + class ThermalZone; namespace detail { @@ -83,8 +84,10 @@ namespace model { boost::optional getHighHumidityControl() const; bool setHighHumidityControl(bool val); - //Zone getHumidistatControlZone() const; - //bool setHumidistatControlZone(Zone z) + boost::optional getHumidistatControlZone() const; + boost::optional humidistatControlZone() const; + bool setHumidistatControlZone(const boost::optional& thermalZone); + void resetHumidistatControlZone(); OptionalDouble getHighHumidityOutdoorAirFlowRatio() const; bool setHighHumidityOutdoorAirFlowRatio(double v); From b9a8c142f739f9ac1f5df7656c7b24daad936496 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 16 Aug 2024 13:06:24 -0700 Subject: [PATCH 02/28] Update ft and rt for humidistat control zone. --- .../ForwardTranslateControllerOutdoorAir.cpp | 6 ++++++ .../ReverseTranslateControllerOutdoorAir.cpp | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp index 989cd310e08..08cc1af4f24 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp @@ -9,6 +9,7 @@ #include "../../model/ControllerMechanicalVentilation.hpp" #include "../../model/Node.hpp" #include "../../model/Schedule.hpp" +#include "../../model/ThermalZone.hpp" #include #include @@ -151,6 +152,11 @@ namespace energyplus { } } + // HumidistatControlZoneName + if (auto zone_ = modelObject.humidistatControlZone()) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::HumidistatControlZoneName, zone_->nameString()); + } + // HighHumidityOutdoorAirFlowRatio d = modelObject.getHighHumidityOutdoorAirFlowRatio(); if (d) { diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp index 4fb7d3fe808..1572247e4c6 100644 --- a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp @@ -6,6 +6,10 @@ #include "../ReverseTranslator.hpp" #include "../../model/ControllerOutdoorAir.hpp" #include "../../model/ControllerOutdoorAir_Impl.hpp" +#include "../../model/ThermalZone.hpp" +#include "../../model/ThermalZone_Impl.hpp" +#include "../../model/Space.hpp" +#include "../../model/Space_Impl.hpp" #include #include "../../utilities/idd/IddEnums.hpp" #include @@ -123,9 +127,17 @@ namespace energyplus { } } - s = workspaceObject.getString(Controller_OutdoorAirFields::HumidistatControlZoneName); - if (s) { - LOG(Warn, "ControllerOutdoorAir " << workspaceObject.briefDescription() << " references a high humidity control zone, which is not supported"); + if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::HumidistatControlZoneName))) { + if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { + // Zone is translated, and a Space is returned instead + if (boost::optional space_ = _mo->optionalCast()) { + if (auto z_ = space_->thermalZone()) { + modelObject.setHumidistatControlZone(z_.get()); + } + } else { + LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Humidistat Control Zone Name'"); + } + } } value = workspaceObject.getDouble(Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio); From 7f2a3791f36b99e47642889b524fd4f36963bd0c Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 16 Aug 2024 13:15:55 -0700 Subject: [PATCH 03/28] Add a model test. --- src/model/ControllerOutdoorAir_Impl.hpp | 4 +--- src/model/test/ControllerOutdoorAir_GTest.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index d9cd6972476..64e0ee9759e 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -68,7 +68,7 @@ namespace model { boost::optional getEconomizerMaximumLimitDewpointTemperature() const; bool setEconomizerMaximumLimitDewpointTemperature(boost::optional value); - //QuadraticCurve getElectronicEnthalpyLimitCurve() const; + CurveQuadratic getElectronicEnthalpyLimitCurve() const; //bool setElectronicEnthalpyLimitCurve(QuadraticCurve c); //get needs to return a boost optional double since "" is a valid input @@ -101,8 +101,6 @@ namespace model { std::string economizerOperationStaging() const; bool setEconomizerOperationStaging(const std::string& v); - CurveQuadratic getElectronicEnthalpyLimitCurve() const; - ScheduleCompact getMinimumOutdoorAirSchedule() const; ScheduleCompact getMinimumFractionOfOutdoorAirSchedule() const; diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 6062f9af7a6..17b724b2af9 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -15,6 +15,7 @@ #include "../AirflowNetworkCrack_Impl.hpp" #include "../AirflowNetworkReferenceCrackConditions.hpp" #include "../AirflowNetworkReferenceCrackConditions_Impl.hpp" +#include "../ThermalZone.hpp" #include #include @@ -76,4 +77,10 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { // Economizer Operation Staging EXPECT_TRUE(controller.setEconomizerOperationStaging("EconomizerFirst")); EXPECT_EQ("EconomizerFirst", controller.economizerOperationStaging()); + + // Humidistat Control Zone + ThermalZone humidistatControlZone(m); + EXPECT_TRUE(controller.setHumidistatControlZone(humidistatControlZone)); + ASSERT_TRUE(controller.humidistatControlZone()); + EXPECT_EQ(humidistatControlZone, controller.humidistatControlZone().get()); } From 07f5034b639262ebbf9c27b197832b2655515479 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 16 Aug 2024 13:16:14 -0700 Subject: [PATCH 04/28] Formatting. --- src/model/test/ControllerOutdoorAir_GTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 17b724b2af9..1efb691dba1 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -77,7 +77,7 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { // Economizer Operation Staging EXPECT_TRUE(controller.setEconomizerOperationStaging("EconomizerFirst")); EXPECT_EQ("EconomizerFirst", controller.economizerOperationStaging()); - + // Humidistat Control Zone ThermalZone humidistatControlZone(m); EXPECT_TRUE(controller.setHumidistatControlZone(humidistatControlZone)); From ba9bc103bb3bbdcbe116492286a3524edcba8700 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 16 Aug 2024 14:05:33 -0700 Subject: [PATCH 05/28] Add electronic enthalpy limit curve getters and setters. --- src/model/ControllerOutdoorAir.cpp | 50 ++++++++++++++++++++----- src/model/ControllerOutdoorAir.hpp | 12 +++--- src/model/ControllerOutdoorAir_Impl.hpp | 8 ++-- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 48782db5ae6..aeb2933802e 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -11,8 +11,8 @@ #include "ControllerMechanicalVentilation_Impl.hpp" #include "ScheduleCompact.hpp" #include "ScheduleCompact_Impl.hpp" -#include "CurveQuadratic.hpp" -#include "CurveQuadratic_Impl.hpp" +#include "Curve.hpp" +#include "Curve_Impl.hpp" #include "AirflowNetworkOutdoorAirflow.hpp" #include "AirflowNetworkOutdoorAirflow_Impl.hpp" #include "AirflowNetworkCrack.hpp" @@ -99,15 +99,29 @@ namespace model { return result; } - CurveQuadratic ControllerOutdoorAir_Impl::getElectronicEnthalpyLimitCurve() const { - try { - OptionalWorkspaceObject wo = this->getTarget(openstudio::OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); - OptionalCurveQuadratic curveQuadratic = wo->optionalCast(); - return *curveQuadratic; - } catch (...) { - LOG(Error, "Failed to retrieve electronic enthalpy limit curve") - throw; + + boost::optional ControllerOutdoorAir_Impl::getElectronicEnthalpyLimitCurve() const { + return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); + } + + boost::optional ControllerOutdoorAir_Impl::electronicEnthalpyLimitCurve() const { + return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); + } + + bool ControllerOutdoorAir_Impl::setElectronicEnthalpyLimitCurve(const boost::optional& curve) { + bool result(false); + if (curve) { + result = setPointer(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, curve.get().handle()); + } else { + resetElectronicEnthalpyLimitCurve(); + result = true; } + return result; + } + + void ControllerOutdoorAir_Impl::resetElectronicEnthalpyLimitCurve(){ + bool result = setString(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, ""); + OS_ASSERT(result); } ScheduleCompact ControllerOutdoorAir_Impl::getMinimumOutdoorAirSchedule() const { @@ -642,6 +656,22 @@ namespace model { return getImpl()->getElectronicEnthalpyLimitCurve(); } + boost::optional ControllerOutdoorAir::getElectronicEnthalpyLimitCurve() const { + return getImpl()->getElectronicEnthalpyLimitCurve(); + } + + boost::optional ControllerOutdoorAir::electronicEnthalpyLimitCurve() const { + return getImpl()->electronicEnthalpyLimitCurve(); + } + + bool ControllerOutdoorAir::setElectronicEnthalpyLimitCurve(const Curve& curve) { + return getImpl()->setElectronicEnthalpyLimitCurve(curve); + } + + void ControllerOutdoorAir::resetElectronicEnthalpyLimitCurve() { + getImpl()->resetElectronicEnthalpyLimitCurve(); + } + ScheduleCompact ControllerOutdoorAir::getMinimumOutdoorAirSchedule() const { return getImpl()->getMinimumOutdoorAirSchedule(); } diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index f9d25de35af..1a9002ff39d 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -19,7 +19,7 @@ namespace model { } // namespace detail - class CurveQuadratic; + class Curve; class ScheduleCompact; class ControllerMechanicalVentilation; class AirLoopHVACOutdoorAirSystem; @@ -91,8 +91,10 @@ namespace model { bool setEconomizerMaximumLimitDewpointTemperature(double value); void resetEconomizerMaximumLimitDewpointTemperature(); - //QuadraticCurve getElectronicEnthalpyLimitCurve() const; - //bool setElectronicEnthalpyLimitCurve(QuadraticCurve c); + boost::optional getElectronicEnthalpyLimitCurve() const; + boost::optional electronicEnthalpyLimitCurve() const; + bool setElectronicEnthalpyLimitCurve(const Curve& curve); + void resetElectronicEnthalpyLimitCurve(); //get needs to return a boost optional double since "" is a valid input boost::optional getEconomizerMinimumLimitDryBulbTemperature() const; @@ -150,16 +152,12 @@ namespace model { explicit ControllerOutdoorAir(std::shared_ptr impl); private: - CurveQuadratic getElectronicEnthalpyLimitCurve() const; - ScheduleCompact getMinimumOutdoorAirSchedule() const; ScheduleCompact getMinimumFractionOfOutdoorAirSchedule() const; ScheduleCompact getMaximumFractionOfOutdoorAirSchedule() const; - //Controller:MechanicalVentilation getMechanicalVentilationController() const; - ScheduleCompact getTimeOfDayEconomizerControlSchedule() const; ControllerOutdoorAir(const Handle& handle, const Model& model); diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index 64e0ee9759e..5b9434579e3 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -11,7 +11,7 @@ namespace openstudio { namespace model { - class CurveQuadratic; + class Curve; class ScheduleCompact; class AirLoopHVACOutdoorAirSystem; class ControllerMechanicalVentilation; @@ -68,8 +68,10 @@ namespace model { boost::optional getEconomizerMaximumLimitDewpointTemperature() const; bool setEconomizerMaximumLimitDewpointTemperature(boost::optional value); - CurveQuadratic getElectronicEnthalpyLimitCurve() const; - //bool setElectronicEnthalpyLimitCurve(QuadraticCurve c); + boost::optional getElectronicEnthalpyLimitCurve() const; + boost::optional electronicEnthalpyLimitCurve() const; + bool setElectronicEnthalpyLimitCurve(const boost::optional& curve); + void resetElectronicEnthalpyLimitCurve(); //get needs to return a boost optional double since "" is a valid input boost::optional getEconomizerMinimumLimitDryBulbTemperature() const; From 6f7f67b9a8ca4e728cd9e6c74a40b01c18864c48 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 16 Aug 2024 14:05:46 -0700 Subject: [PATCH 06/28] Update ft and rt for curves and schedules. --- .../ForwardTranslateControllerOutdoorAir.cpp | 7 ++- .../ReverseTranslateControllerOutdoorAir.cpp | 63 +++++++++++++------ .../ReverseTranslateFanSystemModel.cpp | 1 + 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp index 08cc1af4f24..7adadeb6186 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp @@ -10,6 +10,7 @@ #include "../../model/Node.hpp" #include "../../model/Schedule.hpp" #include "../../model/ThermalZone.hpp" +#include "../../model/Curve.hpp" #include #include @@ -122,7 +123,11 @@ namespace energyplus { } /////////////////////////////////////////////////////////////////////////// // Field: Electronic Enthalpy Limit Curve Name //////////////////////////// - idfObject.setString(openstudio::Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, ""); + if (boost::optional curve = modelObject.electronicEnthalpyLimitCurve()) { + if (boost::optional _curve = translateAndMapModelObject(curve.get())) { + idfObject.setString(Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, _curve->name().get()); + } + } /////////////////////////////////////////////////////////////////////////// // Field: Economizer Minimum Limit DryBulb Temperature //////////////////// diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp index 1572247e4c6..5eda7f585c8 100644 --- a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp @@ -10,6 +10,10 @@ #include "../../model/ThermalZone_Impl.hpp" #include "../../model/Space.hpp" #include "../../model/Space_Impl.hpp" +#include "../../model/Curve.hpp" +#include "../../model/Curve_Impl.hpp" +#include "../../model/Schedule.hpp" +#include "../../model/Schedule_Impl.hpp" #include #include "../../utilities/idd/IddEnums.hpp" #include @@ -68,9 +72,14 @@ namespace energyplus { mo.setEconomizerMaximumLimitDewpointTemperature(value.get()); } - s = workspaceObject.getString(Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); - if (s) { - LOG(Error, "ControllerOutdoorAir " << workspaceObject.briefDescription() << " references a curve that is not supported"); + if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName))) { + if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { + if (boost::optional _curve = _mo->optionalCast()) { + modelObject.setElectronicEnthalpyLimitCurve(_curve.get()); + } else { + LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Electronic Enthalpy Limit Curve Name'"); + } + } } value = workspaceObject.getDouble(Controller_OutdoorAirFields::EconomizerMinimumLimitDryBulbTemperature); @@ -88,22 +97,34 @@ namespace energyplus { mo.setMinimumLimitType(s.get()); } - s = workspaceObject.getString(Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName); - if (s) { - LOG(Warn, - "ControllerOutdoorAir " << workspaceObject.briefDescription() << " references a minimum outdoor air schedule, which is not supported"); + if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName))) { + if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { + if (boost::optional _schedule = _mo->optionalCast()) { + modelObject.setMinimumOutdoorAirSchedule(_schedule.get()); + } else { + LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Minimum Outdoor Air Schedule Name'"); + } + } } - s = workspaceObject.getString(Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName); - if (s) { - LOG(Warn, "ControllerOutdoorAir " << workspaceObject.briefDescription() - << " references a minimum fraction of outdoor air schedule, which is not supported"); + if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName))) { + if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { + if (boost::optional _schedule = _mo->optionalCast()) { + modelObject.setMinimumFractionofOutdoorAirSchedule(_schedule.get()); + } else { + LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Minimum Fraction of Outdoor Air Schedule Name'"); + } + } } - s = workspaceObject.getString(Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName); - if (s) { - LOG(Warn, "ControllerOutdoorAir " << workspaceObject.briefDescription() - << " references a maximum fraction of outdoor air schedule, which is not supported"); + if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName))) { + if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { + if (boost::optional _schedule = _mo->optionalCast()) { + modelObject.setMaximumFractionofOutdoorAirSchedule(_schedule.get()); + } else { + LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Maximum Fraction of Outdoor Air Schedule Name'"); + } + } } s = workspaceObject.getString(Controller_OutdoorAirFields::MechanicalVentilationControllerName); @@ -112,10 +133,14 @@ namespace energyplus { "ControllerOutdoorAir " << workspaceObject.briefDescription() << " references a mechanical ventilation controller, which is not supported"); } - s = workspaceObject.getString(Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName); - if (s) { - LOG(Warn, "ControllerOutdoorAir " << workspaceObject.briefDescription() - << " references a time of day economizer control schedule, which is not supported"); + if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName))) { + if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { + if (boost::optional _schedule = _mo->optionalCast()) { + modelObject.setTimeofDayEconomizerControlSchedule(_schedule.get()); + } else { + LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Time of Day Economizer Control Schedule Name'"); + } + } } s = workspaceObject.getString(Controller_OutdoorAirFields::HighHumidityControl); diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateFanSystemModel.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateFanSystemModel.cpp index 7d6229fbaa1..95f3b3dd148 100644 --- a/src/energyplus/ReverseTranslator/ReverseTranslateFanSystemModel.cpp +++ b/src/energyplus/ReverseTranslator/ReverseTranslateFanSystemModel.cpp @@ -133,6 +133,7 @@ namespace energyplus { } } } + // Night Ventilation Mode Pressure Rise: Optional Double if (boost::optional _nightVentilationModePressureRise = workspaceObject.getDouble(Fan_SystemModelFields::NightVentilationModePressureRise)) { From 3f249dc06c166c3dccf104ab86ef85466fa8b802 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 16 Aug 2024 14:06:03 -0700 Subject: [PATCH 07/28] Formatting. --- src/model/ControllerOutdoorAir.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index aeb2933802e..1cc16cb9d74 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -99,15 +99,14 @@ namespace model { return result; } - boost::optional ControllerOutdoorAir_Impl::getElectronicEnthalpyLimitCurve() const { return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); } - + boost::optional ControllerOutdoorAir_Impl::electronicEnthalpyLimitCurve() const { return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); } - + bool ControllerOutdoorAir_Impl::setElectronicEnthalpyLimitCurve(const boost::optional& curve) { bool result(false); if (curve) { @@ -118,8 +117,8 @@ namespace model { } return result; } - - void ControllerOutdoorAir_Impl::resetElectronicEnthalpyLimitCurve(){ + + void ControllerOutdoorAir_Impl::resetElectronicEnthalpyLimitCurve() { bool result = setString(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, ""); OS_ASSERT(result); } @@ -659,15 +658,15 @@ namespace model { boost::optional ControllerOutdoorAir::getElectronicEnthalpyLimitCurve() const { return getImpl()->getElectronicEnthalpyLimitCurve(); } - + boost::optional ControllerOutdoorAir::electronicEnthalpyLimitCurve() const { return getImpl()->electronicEnthalpyLimitCurve(); } - + bool ControllerOutdoorAir::setElectronicEnthalpyLimitCurve(const Curve& curve) { return getImpl()->setElectronicEnthalpyLimitCurve(curve); } - + void ControllerOutdoorAir::resetElectronicEnthalpyLimitCurve() { getImpl()->resetElectronicEnthalpyLimitCurve(); } From 4c5813118e104787c081fd942a6249496ed3d0a9 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Mon, 19 Aug 2024 07:05:06 -0700 Subject: [PATCH 08/28] Clean up. --- src/model/ControllerOutdoorAir.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 1cc16cb9d74..f65878fec24 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -651,10 +651,6 @@ namespace model { ControllerOutdoorAir::ControllerOutdoorAir(std::shared_ptr impl) : ParentObject(std::move(impl)) {} - CurveQuadratic ControllerOutdoorAir::getElectronicEnthalpyLimitCurve() const { - return getImpl()->getElectronicEnthalpyLimitCurve(); - } - boost::optional ControllerOutdoorAir::getElectronicEnthalpyLimitCurve() const { return getImpl()->getElectronicEnthalpyLimitCurve(); } @@ -788,15 +784,15 @@ namespace model { } boost::optional ControllerOutdoorAir::humidistatControlZone() const { - return getImpl()->humidistatControlZone(); + return getImpl()->humidistatControlZone(); } bool ControllerOutdoorAir::setHumidistatControlZone(const ThermalZone& thermalZone) { - return getImpl()->setHumidistatControlZone(thermalZone); + return getImpl()->setHumidistatControlZone(thermalZone); } void ControllerOutdoorAir::resetHumidistatControlZone() { - getImpl()->resetHumidistatControlZone(); + getImpl()->resetHumidistatControlZone(); } boost::optional ControllerOutdoorAir::getHighHumidityOutdoorAirFlowRatio() const { From f1c89439f5b426b92378db39cc6926b652a66de6 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Mon, 19 Aug 2024 11:16:35 -0700 Subject: [PATCH 09/28] Deprecate setHighHumidityControl and instead use setHumidistatControlZone. --- src/model/ControllerOutdoorAir.cpp | 18 +++++++----------- src/model/ControllerOutdoorAir.hpp | 4 ++-- src/model/ControllerOutdoorAir_Impl.hpp | 13 ++++--------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index f65878fec24..65f801e4957 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -344,14 +344,6 @@ namespace model { return retVal; } - bool ControllerOutdoorAir_Impl::setHighHumidityControl(bool val) { - if (val) { - return setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); - } else { - return setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); - } - } - boost::optional ControllerOutdoorAir_Impl::getHumidistatControlZone() const { return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::HumidistatControlZoneName); } @@ -364,24 +356,27 @@ namespace model { bool result(false); if (thermalZone) { result = setPointer(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, thermalZone.get().handle()); + result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); } else { resetHumidistatControlZone(); result = true; + result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); } return result; } void ControllerOutdoorAir_Impl::resetHumidistatControlZone() { bool result = setString(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, ""); + result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); OS_ASSERT(result); } OptionalDouble ControllerOutdoorAir_Impl::getHighHumidityOutdoorAirFlowRatio() const { return getDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio); } + bool ControllerOutdoorAir_Impl::setHighHumidityOutdoorAirFlowRatio(double v) { return setDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, v); - ; } boost::optional ControllerOutdoorAir_Impl::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { @@ -638,7 +633,7 @@ namespace model { setString(OS_Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName, ""); setString(OS_Controller_OutdoorAirFields::ControllerMechanicalVentilation, ""); setString(OS_Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName, ""); - setHighHumidityControl(false); + setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); setString(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, ""); setString(OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, ""); setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, ""); @@ -776,7 +771,8 @@ namespace model { } bool ControllerOutdoorAir::setHighHumidityControl(bool val) { - return getImpl()->setHighHumidityControl(val); + DEPRECATED_AT_MSG(3, 8, 0, "Use setHumidistatControlZone instead."); + return false; } boost::optional ControllerOutdoorAir::getHumidistatControlZone() const { diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index 1a9002ff39d..a4b46ea59a6 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -8,6 +8,7 @@ #include "ModelAPI.hpp" #include "ParentObject.hpp" +#include "../utilities/core/Deprecated.hpp" namespace openstudio { @@ -91,7 +92,6 @@ namespace model { bool setEconomizerMaximumLimitDewpointTemperature(double value); void resetEconomizerMaximumLimitDewpointTemperature(); - boost::optional getElectronicEnthalpyLimitCurve() const; boost::optional electronicEnthalpyLimitCurve() const; bool setElectronicEnthalpyLimitCurve(const Curve& curve); void resetElectronicEnthalpyLimitCurve(); @@ -108,7 +108,7 @@ namespace model { bool setMinimumLimitType(const std::string& value); boost::optional getHighHumidityControl() const; - bool setHighHumidityControl(bool val); + OS_DEPRECATED(3, 8, 0) bool setHighHumidityControl(bool val); boost::optional getHumidistatControlZone() const; boost::optional humidistatControlZone() const; diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index 5b9434579e3..dc23a016e6f 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -84,7 +84,6 @@ namespace model { bool setMinimumLimitType(const std::string& value); boost::optional getHighHumidityControl() const; - bool setHighHumidityControl(bool val); boost::optional getHumidistatControlZone() const; boost::optional humidistatControlZone() const; @@ -103,14 +102,6 @@ namespace model { std::string economizerOperationStaging() const; bool setEconomizerOperationStaging(const std::string& v); - ScheduleCompact getMinimumOutdoorAirSchedule() const; - - ScheduleCompact getMinimumFractionOfOutdoorAirSchedule() const; - - ScheduleCompact getMaximumFractionOfOutdoorAirSchedule() const; - - ScheduleCompact getTimeOfDayEconomizerControlSchedule() const; - boost::optional airLoopHVACOutdoorAirSystem() const; boost::optional minimumOutdoorAirFlowRate() const; @@ -133,18 +124,22 @@ namespace model { bool setControllerMechanicalVentilation(const ControllerMechanicalVentilation& controllerMechanicalVentilation); + ScheduleCompact getMinimumOutdoorAirSchedule() const; boost::optional minimumOutdoorAirSchedule() const; bool setMinimumOutdoorAirSchedule(Schedule& schedule); void resetMinimumOutdoorAirSchedule(); + ScheduleCompact getMinimumFractionOfOutdoorAirSchedule() const; boost::optional minimumFractionofOutdoorAirSchedule() const; bool setMinimumFractionofOutdoorAirSchedule(Schedule& schedule); void resetMinimumFractionofOutdoorAirSchedule(); + ScheduleCompact getMaximumFractionOfOutdoorAirSchedule() const; boost::optional maximumFractionofOutdoorAirSchedule() const; bool setMaximumFractionofOutdoorAirSchedule(Schedule& schedule); void resetMaximumFractionofOutdoorAirSchedule(); + ScheduleCompact getTimeOfDayEconomizerControlSchedule() const; boost::optional timeofDayEconomizerControlSchedule() const; bool setTimeofDayEconomizerControlSchedule(Schedule& schedule); void resetTimeofDayEconomizerControlSchedule(); From 5d7a6bfa7a814bd0ad5bd0d7c63cfa92c57dc04a Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Mon, 19 Aug 2024 11:17:41 -0700 Subject: [PATCH 10/28] Update ft for checking that humidistat control zone has a zone control humidistat. --- .../ForwardTranslateControllerOutdoorAir.cpp | 111 ++++++++++-------- 1 file changed, 59 insertions(+), 52 deletions(-) diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp index 7adadeb6186..c4bd76863a0 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp @@ -11,6 +11,7 @@ #include "../../model/Schedule.hpp" #include "../../model/ThermalZone.hpp" #include "../../model/Curve.hpp" +#include "../../model/ZoneControlHumidistat.hpp" #include #include @@ -159,78 +160,84 @@ namespace energyplus { // HumidistatControlZoneName if (auto zone_ = modelObject.humidistatControlZone()) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::HumidistatControlZoneName, zone_->nameString()); - } + if (boost::optional humidistat = zone_->zoneControlHumidistat()) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::HumidistatControlZoneName, zone_->nameString()); + else { + LOG(Warn, modelObject.briefDescription() << " has a humidistat control zone " << zone_->nameString() + << " without a zone control humidistat; humidistat control zone field will not be translated"); + idfObject.setString(openstudio::Controller_OutdoorAirFields::HighHumidityControl, "No"); + } + } - // HighHumidityOutdoorAirFlowRatio - d = modelObject.getHighHumidityOutdoorAirFlowRatio(); - if (d) { - idfObject.setDouble(openstudio::Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, *d); - } + // HighHumidityOutdoorAirFlowRatio + d = modelObject.getHighHumidityOutdoorAirFlowRatio(); + if (d) { + idfObject.setDouble(openstudio::Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, *d); + } - // ControlHighIndoorHumidityBasedonOutdoorHumidityRatio - ob = modelObject.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(); - if (ob) { - if (*ob) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); - } else { - idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); + // ControlHighIndoorHumidityBasedonOutdoorHumidityRatio + ob = modelObject.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(); + if (ob) { + if (*ob) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); + } else { + idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); + } } - } - // HeatRecoveryBypassControlType - s = modelObject.getHeatRecoveryBypassControlType(); - if (s) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::HeatRecoveryBypassControlType, *s); - } + // HeatRecoveryBypassControlType + s = modelObject.getHeatRecoveryBypassControlType(); + if (s) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::HeatRecoveryBypassControlType, *s); + } - // EconomizerOperationStaging - idfObject.setString(openstudio::Controller_OutdoorAirFields::EconomizerOperationStaging, modelObject.economizerOperationStaging()); + // EconomizerOperationStaging + idfObject.setString(openstudio::Controller_OutdoorAirFields::EconomizerOperationStaging, modelObject.economizerOperationStaging()); - // Controller Mechanical Ventilation - model::ControllerMechanicalVentilation controllerMechanicalVentilation = modelObject.controllerMechanicalVentilation(); + // Controller Mechanical Ventilation + model::ControllerMechanicalVentilation controllerMechanicalVentilation = modelObject.controllerMechanicalVentilation(); - boost::optional controllerMechanicalVentilationIdf = translateAndMapModelObject(controllerMechanicalVentilation); - if (controllerMechanicalVentilationIdf) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MechanicalVentilationControllerName, - controllerMechanicalVentilationIdf->name().get()); - } + boost::optional controllerMechanicalVentilationIdf = translateAndMapModelObject(controllerMechanicalVentilation); + if (controllerMechanicalVentilationIdf) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MechanicalVentilationControllerName, + controllerMechanicalVentilationIdf->name().get()); + } - // MinimumOutdoorAirSchedule + // MinimumOutdoorAirSchedule - if (boost::optional s = modelObject.minimumOutdoorAirSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName, _s->name().get()); + if (boost::optional s = modelObject.minimumOutdoorAirSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName, _s->name().get()); + } } - } - // MinimumFractionofOutdoorAirSchedule + // MinimumFractionofOutdoorAirSchedule - if (boost::optional s = modelObject.minimumFractionofOutdoorAirSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName, _s->name().get()); + if (boost::optional s = modelObject.minimumFractionofOutdoorAirSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName, _s->name().get()); + } } - } - // MaximumFractionofOutdoorAirSchedule + // MaximumFractionofOutdoorAirSchedule - if (boost::optional s = modelObject.maximumFractionofOutdoorAirSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName, _s->name().get()); + if (boost::optional s = modelObject.maximumFractionofOutdoorAirSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName, _s->name().get()); + } } - } - // TimeofDayEconomizerControlSchedule + // TimeofDayEconomizerControlSchedule - if (boost::optional s = modelObject.timeofDayEconomizerControlSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName, _s->name().get()); + if (boost::optional s = modelObject.timeofDayEconomizerControlSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName, _s->name().get()); + } } - } - return boost::optional(idfObject); - } + return boost::optional(idfObject); + } -} // namespace energyplus + } // namespace energyplus } // namespace openstudio From 5d20d045f2f692e387faf64618eccd390e22e0d6 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 4 Oct 2024 09:32:32 -0700 Subject: [PATCH 11/28] Clean up getters, ft, and model tests. --- .../ForwardTranslateControllerOutdoorAir.cpp | 102 +++++++++--------- src/model/ControllerOutdoorAir.cpp | 20 +--- src/model/ControllerOutdoorAir.hpp | 1 - src/model/ControllerOutdoorAir_Impl.hpp | 6 +- src/model/test/ControllerOutdoorAir_GTest.cpp | 14 +++ 5 files changed, 70 insertions(+), 73 deletions(-) diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp index c4bd76863a0..51fd49cc95c 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp @@ -122,6 +122,7 @@ namespace energyplus { } else { idfObject.setString(openstudio::Controller_OutdoorAirFields::EconomizerMaximumLimitDewpointTemperature, ""); } + /////////////////////////////////////////////////////////////////////////// // Field: Electronic Enthalpy Limit Curve Name //////////////////////////// if (boost::optional curve = modelObject.electronicEnthalpyLimitCurve()) { @@ -168,76 +169,77 @@ namespace energyplus { idfObject.setString(openstudio::Controller_OutdoorAirFields::HighHumidityControl, "No"); } } + } - // HighHumidityOutdoorAirFlowRatio - d = modelObject.getHighHumidityOutdoorAirFlowRatio(); - if (d) { - idfObject.setDouble(openstudio::Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, *d); - } + // HighHumidityOutdoorAirFlowRatio + d = modelObject.getHighHumidityOutdoorAirFlowRatio(); + if (d) { + idfObject.setDouble(openstudio::Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, *d); + } - // ControlHighIndoorHumidityBasedonOutdoorHumidityRatio - ob = modelObject.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(); - if (ob) { - if (*ob) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); - } else { - idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); - } + // ControlHighIndoorHumidityBasedonOutdoorHumidityRatio + ob = modelObject.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(); + if (ob) { + if (*ob) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); + } else { + idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); } + } - // HeatRecoveryBypassControlType - s = modelObject.getHeatRecoveryBypassControlType(); - if (s) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::HeatRecoveryBypassControlType, *s); - } + // HeatRecoveryBypassControlType + s = modelObject.getHeatRecoveryBypassControlType(); + if (s) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::HeatRecoveryBypassControlType, *s); + } - // EconomizerOperationStaging - idfObject.setString(openstudio::Controller_OutdoorAirFields::EconomizerOperationStaging, modelObject.economizerOperationStaging()); + // EconomizerOperationStaging + idfObject.setString(openstudio::Controller_OutdoorAirFields::EconomizerOperationStaging, modelObject.economizerOperationStaging()); - // Controller Mechanical Ventilation - model::ControllerMechanicalVentilation controllerMechanicalVentilation = modelObject.controllerMechanicalVentilation(); + // Controller Mechanical Ventilation + model::ControllerMechanicalVentilation controllerMechanicalVentilation = modelObject.controllerMechanicalVentilation(); - boost::optional controllerMechanicalVentilationIdf = translateAndMapModelObject(controllerMechanicalVentilation); - if (controllerMechanicalVentilationIdf) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MechanicalVentilationControllerName, - controllerMechanicalVentilationIdf->name().get()); - } + boost::optional controllerMechanicalVentilationIdf = translateAndMapModelObject(controllerMechanicalVentilation); + if (controllerMechanicalVentilationIdf) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MechanicalVentilationControllerName, + controllerMechanicalVentilationIdf->name().get()); + } - // MinimumOutdoorAirSchedule + // MinimumOutdoorAirSchedule - if (boost::optional s = modelObject.minimumOutdoorAirSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName, _s->name().get()); - } + if (boost::optional s = modelObject.minimumOutdoorAirSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName, _s->name().get()); } + } - // MinimumFractionofOutdoorAirSchedule + // MinimumFractionofOutdoorAirSchedule - if (boost::optional s = modelObject.minimumFractionofOutdoorAirSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName, _s->name().get()); - } + if (boost::optional s = modelObject.minimumFractionofOutdoorAirSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName, _s->name().get()); } + } - // MaximumFractionofOutdoorAirSchedule + // MaximumFractionofOutdoorAirSchedule - if (boost::optional s = modelObject.maximumFractionofOutdoorAirSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName, _s->name().get()); - } + if (boost::optional s = modelObject.maximumFractionofOutdoorAirSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName, _s->name().get()); } + } - // TimeofDayEconomizerControlSchedule + // TimeofDayEconomizerControlSchedule - if (boost::optional s = modelObject.timeofDayEconomizerControlSchedule()) { - if (boost::optional _s = translateAndMapModelObject(s.get())) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName, _s->name().get()); - } + if (boost::optional s = modelObject.timeofDayEconomizerControlSchedule()) { + if (boost::optional _s = translateAndMapModelObject(s.get())) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName, _s->name().get()); } - - return boost::optional(idfObject); } - } // namespace energyplus + return boost::optional(idfObject); + } + +} // namespace energyplus } // namespace openstudio diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 65f801e4957..763a1d3a3d1 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -99,15 +99,11 @@ namespace model { return result; } - boost::optional ControllerOutdoorAir_Impl::getElectronicEnthalpyLimitCurve() const { - return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); - } - boost::optional ControllerOutdoorAir_Impl::electronicEnthalpyLimitCurve() const { return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName); } - bool ControllerOutdoorAir_Impl::setElectronicEnthalpyLimitCurve(const boost::optional& curve) { + bool ControllerOutdoorAir_Impl::setElectronicEnthalpyLimitCurve(const Curve& curve) { bool result(false); if (curve) { result = setPointer(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, curve.get().handle()); @@ -344,15 +340,11 @@ namespace model { return retVal; } - boost::optional ControllerOutdoorAir_Impl::getHumidistatControlZone() const { - return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::HumidistatControlZoneName); - } - boost::optional ControllerOutdoorAir_Impl::humidistatControlZone() const { return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::HumidistatControlZoneName); } - bool ControllerOutdoorAir_Impl::setHumidistatControlZone(const boost::optional& thermalZone) { + bool ControllerOutdoorAir_Impl::setHumidistatControlZone(const ThermalZone& thermalZone) { bool result(false); if (thermalZone) { result = setPointer(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, thermalZone.get().handle()); @@ -646,10 +638,6 @@ namespace model { ControllerOutdoorAir::ControllerOutdoorAir(std::shared_ptr impl) : ParentObject(std::move(impl)) {} - boost::optional ControllerOutdoorAir::getElectronicEnthalpyLimitCurve() const { - return getImpl()->getElectronicEnthalpyLimitCurve(); - } - boost::optional ControllerOutdoorAir::electronicEnthalpyLimitCurve() const { return getImpl()->electronicEnthalpyLimitCurve(); } @@ -775,10 +763,6 @@ namespace model { return false; } - boost::optional ControllerOutdoorAir::getHumidistatControlZone() const { - return getImpl()->getHumidistatControlZone(); - } - boost::optional ControllerOutdoorAir::humidistatControlZone() const { return getImpl()->humidistatControlZone(); } diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index a4b46ea59a6..c830f761ba8 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -110,7 +110,6 @@ namespace model { boost::optional getHighHumidityControl() const; OS_DEPRECATED(3, 8, 0) bool setHighHumidityControl(bool val); - boost::optional getHumidistatControlZone() const; boost::optional humidistatControlZone() const; bool setHumidistatControlZone(const ThermalZone& thermalZone); void resetHumidistatControlZone(); diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index dc23a016e6f..5f9cf4d667f 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -68,9 +68,8 @@ namespace model { boost::optional getEconomizerMaximumLimitDewpointTemperature() const; bool setEconomizerMaximumLimitDewpointTemperature(boost::optional value); - boost::optional getElectronicEnthalpyLimitCurve() const; boost::optional electronicEnthalpyLimitCurve() const; - bool setElectronicEnthalpyLimitCurve(const boost::optional& curve); + bool setElectronicEnthalpyLimitCurve(const Curve& curve); void resetElectronicEnthalpyLimitCurve(); //get needs to return a boost optional double since "" is a valid input @@ -85,9 +84,8 @@ namespace model { boost::optional getHighHumidityControl() const; - boost::optional getHumidistatControlZone() const; boost::optional humidistatControlZone() const; - bool setHumidistatControlZone(const boost::optional& thermalZone); + bool setHumidistatControlZone(const ThermalZone& thermalZone); void resetHumidistatControlZone(); OptionalDouble getHighHumidityOutdoorAirFlowRatio() const; diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 1efb691dba1..fae576adc82 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -16,6 +16,7 @@ #include "../AirflowNetworkReferenceCrackConditions.hpp" #include "../AirflowNetworkReferenceCrackConditions_Impl.hpp" #include "../ThermalZone.hpp" +#include "../CurveQuadratic.hpp" #include #include @@ -78,9 +79,22 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { EXPECT_TRUE(controller.setEconomizerOperationStaging("EconomizerFirst")); EXPECT_EQ("EconomizerFirst", controller.economizerOperationStaging()); + // Electronic Enthalpy Limit Curve + CurveQuadratic electronicEnthalpyLimitCurve(m); + EXPECT_TRUE(controller.setElectronicEnthalpyLimitCurve(electronicEnthalpyLimitCurve)); + ASSERT_TRUE(controller.electronicEnthalpyLimitCurve()); + EXPECT_EQ(electronicEnthalpyLimitCurve, controller.electronicEnthalpyLimitCurve().get()); + controller.resetElectronicEnthalpyLimitCurve(); + EXPECT_FALSE(controller.electronicEnthalpyLimitCurve()); + // Humidistat Control Zone + EXPECT_FALSE(controller.getHighHumidityControl()); ThermalZone humidistatControlZone(m); EXPECT_TRUE(controller.setHumidistatControlZone(humidistatControlZone)); ASSERT_TRUE(controller.humidistatControlZone()); EXPECT_EQ(humidistatControlZone, controller.humidistatControlZone().get()); + EXPECT_TRUE(controller.getHighHumidityControl()); + controller.resetHumidistatControlZone(); + EXPECT_FALSE(controller.humidistatControlZone()); + EXPECT_FALSE(controller.getHighHumidityControl()); } From 4293bd4a6992ba425aa94ca90212fea76b278b27 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 4 Oct 2024 10:30:56 -0700 Subject: [PATCH 12/28] Remove remaining extra getXXX methods. --- src/model/ControllerOutdoorAir.cpp | 65 ------------------------- src/model/ControllerOutdoorAir.hpp | 8 --- src/model/ControllerOutdoorAir_Impl.hpp | 4 -- 3 files changed, 77 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 763a1d3a3d1..5beba32b19c 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -88,11 +88,6 @@ namespace model { // return any children objects in the hierarchy std::vector ControllerOutdoorAir_Impl::children() const { std::vector result; - //result.push_back(this->getElectronicEnthalpyLimitCurve()); - //result.push_back(this->getMinimumOutdoorAirSchedule()); - //result.push_back(this->getMinimumFractionOfOutdoorAirSchedule()); - //result.push_back(this->getMaximumFractionOfOutdoorAirSchedule()); - //result.push_back(this->getTimeOfDayEconomizerControlSchedule()); std::vector myAFNItems = getObject().getModelObjectSources(AirflowNetworkOutdoorAirflow::iddObjectType()); result.insert(result.end(), myAFNItems.begin(), myAFNItems.end()); @@ -119,50 +114,6 @@ namespace model { OS_ASSERT(result); } - ScheduleCompact ControllerOutdoorAir_Impl::getMinimumOutdoorAirSchedule() const { - try { - OptionalWorkspaceObject wo = this->getTarget(openstudio::OS_Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName); - OptionalScheduleCompact schedule = wo->optionalCast(); - return *schedule; - } catch (...) { - LOG(Error, "Failed to retrieve minimum outdoor air schedule") - throw; - } - } - - ScheduleCompact ControllerOutdoorAir_Impl::getMinimumFractionOfOutdoorAirSchedule() const { - try { - OptionalWorkspaceObject wo = this->getTarget(openstudio::OS_Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName); - OptionalScheduleCompact schedule = wo->optionalCast(); - return *schedule; - } catch (...) { - LOG(Error, "Failed to retrieve minimum fraciton of outdoor air schedule") - throw; - } - } - - ScheduleCompact ControllerOutdoorAir_Impl::getMaximumFractionOfOutdoorAirSchedule() const { - try { - OptionalWorkspaceObject wo = this->getTarget(openstudio::OS_Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName); - OptionalScheduleCompact schedule = wo->optionalCast(); - return *schedule; - } catch (...) { - LOG(Error, "Failed to retrieve maximum fraction of outdoor air schedule") - throw; - } - } - - ScheduleCompact ControllerOutdoorAir_Impl::getTimeOfDayEconomizerControlSchedule() const { - try { - OptionalWorkspaceObject wo = this->getTarget(openstudio::OS_Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName); - OptionalScheduleCompact schedule = wo->optionalCast(); - return *schedule; - } catch (...) { - LOG(Error, "Failed to retrieve time of day economizer control schedule") - throw; - } - } - OptionalAirLoopHVACOutdoorAirSystem ControllerOutdoorAir_Impl::airLoopHVACOutdoorAirSystem() const { AirLoopHVACOutdoorAirSystemVector oaSystems; oaSystems = this->model().getConcreteModelObjects(); @@ -650,22 +601,6 @@ namespace model { getImpl()->resetElectronicEnthalpyLimitCurve(); } - ScheduleCompact ControllerOutdoorAir::getMinimumOutdoorAirSchedule() const { - return getImpl()->getMinimumOutdoorAirSchedule(); - } - - ScheduleCompact ControllerOutdoorAir::getMinimumFractionOfOutdoorAirSchedule() const { - return getImpl()->getMinimumFractionOfOutdoorAirSchedule(); - } - - ScheduleCompact ControllerOutdoorAir::getMaximumFractionOfOutdoorAirSchedule() const { - return getImpl()->getMaximumFractionOfOutdoorAirSchedule(); - } - - ScheduleCompact ControllerOutdoorAir::getTimeOfDayEconomizerControlSchedule() const { - return getImpl()->getTimeOfDayEconomizerControlSchedule(); - } - boost::optional ControllerOutdoorAir::airLoopHVACOutdoorAirSystem() const { return getImpl()->airLoopHVACOutdoorAirSystem(); } diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index c830f761ba8..5a9fc154a2c 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -151,14 +151,6 @@ namespace model { explicit ControllerOutdoorAir(std::shared_ptr impl); private: - ScheduleCompact getMinimumOutdoorAirSchedule() const; - - ScheduleCompact getMinimumFractionOfOutdoorAirSchedule() const; - - ScheduleCompact getMaximumFractionOfOutdoorAirSchedule() const; - - ScheduleCompact getTimeOfDayEconomizerControlSchedule() const; - ControllerOutdoorAir(const Handle& handle, const Model& model); REGISTER_LOGGER("openstudio.model.ControllerOutdoorAir"); diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index 5f9cf4d667f..49b83e562fd 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -122,22 +122,18 @@ namespace model { bool setControllerMechanicalVentilation(const ControllerMechanicalVentilation& controllerMechanicalVentilation); - ScheduleCompact getMinimumOutdoorAirSchedule() const; boost::optional minimumOutdoorAirSchedule() const; bool setMinimumOutdoorAirSchedule(Schedule& schedule); void resetMinimumOutdoorAirSchedule(); - ScheduleCompact getMinimumFractionOfOutdoorAirSchedule() const; boost::optional minimumFractionofOutdoorAirSchedule() const; bool setMinimumFractionofOutdoorAirSchedule(Schedule& schedule); void resetMinimumFractionofOutdoorAirSchedule(); - ScheduleCompact getMaximumFractionOfOutdoorAirSchedule() const; boost::optional maximumFractionofOutdoorAirSchedule() const; bool setMaximumFractionofOutdoorAirSchedule(Schedule& schedule); void resetMaximumFractionofOutdoorAirSchedule(); - ScheduleCompact getTimeOfDayEconomizerControlSchedule() const; boost::optional timeofDayEconomizerControlSchedule() const; bool setTimeofDayEconomizerControlSchedule(Schedule& schedule); void resetTimeofDayEconomizerControlSchedule(); From 96e3ca80b11a3fa76a62e58684ff90bea75b7a8d Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 4 Oct 2024 10:46:47 -0700 Subject: [PATCH 13/28] Clean up cpp file. --- src/model/ControllerOutdoorAir.cpp | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 5beba32b19c..7321597ea02 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -27,6 +27,7 @@ #include #include "../utilities/core/Compare.hpp" #include "../utilities/core/Assert.hpp" +#include "../utilities/core/DeprecatedHelpers.hpp" using openstudio::Handle; using openstudio::OptionalHandle; @@ -99,13 +100,7 @@ namespace model { } bool ControllerOutdoorAir_Impl::setElectronicEnthalpyLimitCurve(const Curve& curve) { - bool result(false); - if (curve) { - result = setPointer(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, curve.get().handle()); - } else { - resetElectronicEnthalpyLimitCurve(); - result = true; - } + bool result = setPointer(OS_Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName, curve.handle()); return result; } @@ -296,15 +291,8 @@ namespace model { } bool ControllerOutdoorAir_Impl::setHumidistatControlZone(const ThermalZone& thermalZone) { - bool result(false); - if (thermalZone) { - result = setPointer(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, thermalZone.get().handle()); - result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); - } else { - resetHumidistatControlZone(); - result = true; - result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); - } + bool result = setPointer(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, thermalZone.handle()); + result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); return result; } From 936ae1f4b6b9ca1214a9a0534a978bcc620b9b34 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 4 Oct 2024 12:11:49 -0700 Subject: [PATCH 14/28] Fix typos in rt file. --- .../ReverseTranslateControllerOutdoorAir.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp index 5eda7f585c8..6567de624e5 100644 --- a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp @@ -30,6 +30,9 @@ namespace energyplus { return boost::none; } + boost::optional _wo; + boost::optional _mo; + ControllerOutdoorAir mo(m_model); boost::optional s = workspaceObject.getString(Controller_OutdoorAirFields::Name); @@ -75,7 +78,7 @@ namespace energyplus { if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::ElectronicEnthalpyLimitCurveName))) { if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { if (boost::optional _curve = _mo->optionalCast()) { - modelObject.setElectronicEnthalpyLimitCurve(_curve.get()); + mo.setElectronicEnthalpyLimitCurve(_curve.get()); } else { LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Electronic Enthalpy Limit Curve Name'"); } @@ -100,7 +103,7 @@ namespace energyplus { if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::MinimumOutdoorAirScheduleName))) { if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { if (boost::optional _schedule = _mo->optionalCast()) { - modelObject.setMinimumOutdoorAirSchedule(_schedule.get()); + mo.setMinimumOutdoorAirSchedule(_schedule.get()); } else { LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Minimum Outdoor Air Schedule Name'"); } @@ -110,7 +113,7 @@ namespace energyplus { if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::MinimumFractionofOutdoorAirScheduleName))) { if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { if (boost::optional _schedule = _mo->optionalCast()) { - modelObject.setMinimumFractionofOutdoorAirSchedule(_schedule.get()); + mo.setMinimumFractionofOutdoorAirSchedule(_schedule.get()); } else { LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Minimum Fraction of Outdoor Air Schedule Name'"); } @@ -120,7 +123,7 @@ namespace energyplus { if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName))) { if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { if (boost::optional _schedule = _mo->optionalCast()) { - modelObject.setMaximumFractionofOutdoorAirSchedule(_schedule.get()); + mo.setMaximumFractionofOutdoorAirSchedule(_schedule.get()); } else { LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Maximum Fraction of Outdoor Air Schedule Name'"); } @@ -136,7 +139,7 @@ namespace energyplus { if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName))) { if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { if (boost::optional _schedule = _mo->optionalCast()) { - modelObject.setTimeofDayEconomizerControlSchedule(_schedule.get()); + mo.setTimeofDayEconomizerControlSchedule(_schedule.get()); } else { LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Time of Day Economizer Control Schedule Name'"); } @@ -157,7 +160,7 @@ namespace energyplus { // Zone is translated, and a Space is returned instead if (boost::optional space_ = _mo->optionalCast()) { if (auto z_ = space_->thermalZone()) { - modelObject.setHumidistatControlZone(z_.get()); + mo.setHumidistatControlZone(z_.get()); } } else { LOG(Warn, workspaceObject.briefDescription() << " has a wrong type for 'Humidistat Control Zone Name'"); From 009e0039d2690c4292d0cf766e3520511aed9728 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 4 Oct 2024 14:18:40 -0700 Subject: [PATCH 15/28] More typos, and update rt. --- .../ForwardTranslateControllerOutdoorAir.cpp | 9 ++++----- .../ReverseTranslateControllerOutdoorAir.cpp | 9 --------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp index 51fd49cc95c..fb1b561809a 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp @@ -163,11 +163,10 @@ namespace energyplus { if (auto zone_ = modelObject.humidistatControlZone()) { if (boost::optional humidistat = zone_->zoneControlHumidistat()) { idfObject.setString(openstudio::Controller_OutdoorAirFields::HumidistatControlZoneName, zone_->nameString()); - else { - LOG(Warn, modelObject.briefDescription() << " has a humidistat control zone " << zone_->nameString() - << " without a zone control humidistat; humidistat control zone field will not be translated"); - idfObject.setString(openstudio::Controller_OutdoorAirFields::HighHumidityControl, "No"); - } + } else { + LOG(Warn, modelObject.briefDescription() << " has a humidistat control zone " << zone_->nameString() + << " without a zone control humidistat; humidistat control zone field will not be translated"); + idfObject.setString(openstudio::Controller_OutdoorAirFields::HighHumidityControl, "No"); } } diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp index 6567de624e5..3b7450b05ee 100644 --- a/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ReverseTranslator/ReverseTranslateControllerOutdoorAir.cpp @@ -146,15 +146,6 @@ namespace energyplus { } } - s = workspaceObject.getString(Controller_OutdoorAirFields::HighHumidityControl); - if (s) { - if (istringEqual("Yes", s.get())) { - mo.setHighHumidityControl(true); - } else { - mo.setHighHumidityControl(false); - } - } - if ((_wo = workspaceObject.getTarget(Controller_OutdoorAirFields::HumidistatControlZoneName))) { if ((_mo = translateAndMapWorkspaceObject(_wo.get()))) { // Zone is translated, and a Space is returned instead From 4e54e88d4ac5f50d37b9f098d448de8d030f8074 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Fri, 4 Oct 2024 15:14:48 -0700 Subject: [PATCH 16/28] Typos in model test. --- src/model/test/ControllerOutdoorAir_GTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index fae576adc82..459f9db4f84 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -80,7 +80,7 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { EXPECT_EQ("EconomizerFirst", controller.economizerOperationStaging()); // Electronic Enthalpy Limit Curve - CurveQuadratic electronicEnthalpyLimitCurve(m); + CurveQuadratic electronicEnthalpyLimitCurve(model); EXPECT_TRUE(controller.setElectronicEnthalpyLimitCurve(electronicEnthalpyLimitCurve)); ASSERT_TRUE(controller.electronicEnthalpyLimitCurve()); EXPECT_EQ(electronicEnthalpyLimitCurve, controller.electronicEnthalpyLimitCurve().get()); @@ -89,7 +89,7 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { // Humidistat Control Zone EXPECT_FALSE(controller.getHighHumidityControl()); - ThermalZone humidistatControlZone(m); + ThermalZone humidistatControlZone(model); EXPECT_TRUE(controller.setHumidistatControlZone(humidistatControlZone)); ASSERT_TRUE(controller.humidistatControlZone()); EXPECT_EQ(humidistatControlZone, controller.humidistatControlZone().get()); From 34fdbb3525861a6686e38d52de96a085a397d7a4 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Mon, 7 Oct 2024 08:15:58 -0700 Subject: [PATCH 17/28] Clean up old bool get methods. --- src/model/ControllerOutdoorAir.cpp | 31 +++++++----------------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 7321597ea02..a6faab95764 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -273,17 +273,9 @@ namespace model { } boost::optional ControllerOutdoorAir_Impl::getHighHumidityControl() const { - boost::optional retVal; - - if (OptionalString s = getString(OS_Controller_OutdoorAirFields::HighHumidityControl)) { - if (istringEqual(s.get(), "yes")) { - retVal = true; - } else { - retVal = false; - } - } - - return retVal; + boost::optional value = getString(OS_Controller_OutdoorAirFields::HighHumidityControl, true); + OS_ASSERT(value); + return openstudio::istringEqual(value.get(), "Yes"); } boost::optional ControllerOutdoorAir_Impl::humidistatControlZone() const { @@ -311,20 +303,11 @@ namespace model { } boost::optional ControllerOutdoorAir_Impl::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { - boost::optional retVal; - OptionalString s = getString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio); - if (!s) { - return retVal; - } - std::string temp = *s; - boost::to_lower(temp); - if (temp == "no") { - retVal = false; - } else { - retVal = true; - } - return retVal; + boost::optional value = getString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, true); + OS_ASSERT(value); + return openstudio::istringEqual(value.get(), "Yes"); } + bool ControllerOutdoorAir_Impl::setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(bool v) { if (v) { return setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); From 199d8ee25916c0913ae6c9c4ac19bd142e14f028 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Mon, 7 Oct 2024 09:19:21 -0700 Subject: [PATCH 18/28] Fix setting high humidity control to Yes or No based on other fields. --- src/model/ControllerOutdoorAir.cpp | 26 +++++++++++++------ src/model/ControllerOutdoorAir.hpp | 3 +-- src/model/ControllerOutdoorAir_Impl.hpp | 1 + src/model/test/ControllerOutdoorAir_GTest.cpp | 11 +++++--- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index a6faab95764..dc4a1c8e7c1 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -27,7 +27,6 @@ #include #include "../utilities/core/Compare.hpp" #include "../utilities/core/Assert.hpp" -#include "../utilities/core/DeprecatedHelpers.hpp" using openstudio::Handle; using openstudio::OptionalHandle; @@ -278,6 +277,14 @@ namespace model { return openstudio::istringEqual(value.get(), "Yes"); } + bool ControllerOutdoorAir_Impl::setHighHumidityControl(bool val) { + if (val) { + return setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); + } else { + return setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); + } + } + boost::optional ControllerOutdoorAir_Impl::humidistatControlZone() const { return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::HumidistatControlZoneName); } @@ -290,7 +297,6 @@ namespace model { void ControllerOutdoorAir_Impl::resetHumidistatControlZone() { bool result = setString(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, ""); - result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); OS_ASSERT(result); } @@ -299,7 +305,9 @@ namespace model { } bool ControllerOutdoorAir_Impl::setHighHumidityOutdoorAirFlowRatio(double v) { - return setDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, v); + bool result = setDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, v); + result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); + return result; } boost::optional ControllerOutdoorAir_Impl::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { @@ -309,11 +317,14 @@ namespace model { } bool ControllerOutdoorAir_Impl::setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(bool v) { + bool result; if (v) { - return setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); + result = setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); } else { - return setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); + result = setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); } + result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); + return result; } OptionalString ControllerOutdoorAir_Impl::getHeatRecoveryBypassControlType() const { @@ -547,7 +558,7 @@ namespace model { setString(OS_Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName, ""); setString(OS_Controller_OutdoorAirFields::ControllerMechanicalVentilation, ""); setString(OS_Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName, ""); - setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); + setHighHumidityControl(false); setString(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, ""); setString(OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, ""); setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, ""); @@ -665,8 +676,7 @@ namespace model { } bool ControllerOutdoorAir::setHighHumidityControl(bool val) { - DEPRECATED_AT_MSG(3, 8, 0, "Use setHumidistatControlZone instead."); - return false; + return getImpl()->setHighHumidityControl(val); } boost::optional ControllerOutdoorAir::humidistatControlZone() const { diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index 5a9fc154a2c..96c513bca31 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -8,7 +8,6 @@ #include "ModelAPI.hpp" #include "ParentObject.hpp" -#include "../utilities/core/Deprecated.hpp" namespace openstudio { @@ -108,7 +107,7 @@ namespace model { bool setMinimumLimitType(const std::string& value); boost::optional getHighHumidityControl() const; - OS_DEPRECATED(3, 8, 0) bool setHighHumidityControl(bool val); + bool setHighHumidityControl(bool val); boost::optional humidistatControlZone() const; bool setHumidistatControlZone(const ThermalZone& thermalZone); diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index 49b83e562fd..95f28b11579 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -83,6 +83,7 @@ namespace model { bool setMinimumLimitType(const std::string& value); boost::optional getHighHumidityControl() const; + bool setHighHumidityControl(bool val); boost::optional humidistatControlZone() const; bool setHumidistatControlZone(const ThermalZone& thermalZone); diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 459f9db4f84..3b215528130 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -88,13 +88,18 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { EXPECT_FALSE(controller.electronicEnthalpyLimitCurve()); // Humidistat Control Zone - EXPECT_FALSE(controller.getHighHumidityControl()); + ASSERT_TRUE(controller.getHighHumidityControl()); + EXPECT_FALSE(controller.getHighHumidityControl().get()); ThermalZone humidistatControlZone(model); EXPECT_TRUE(controller.setHumidistatControlZone(humidistatControlZone)); ASSERT_TRUE(controller.humidistatControlZone()); EXPECT_EQ(humidistatControlZone, controller.humidistatControlZone().get()); - EXPECT_TRUE(controller.getHighHumidityControl()); + ASSERT_TRUE(controller.getHighHumidityControl()); + EXPECT_TRUE(controller.getHighHumidityControl().get()); controller.resetHumidistatControlZone(); EXPECT_FALSE(controller.humidistatControlZone()); - EXPECT_FALSE(controller.getHighHumidityControl()); + ASSERT_TRUE(controller.getHighHumidityControl()); + EXPECT_TRUE( + controller.getHighHumidityControl() + .get()); // still true because High Humidity Outdoor Air Flow Ratio or Control High Indoor Humidity Based on Outdoor Humidity Ratio may be set } From 325ef2d30a3dfaf389272e677581e8dbf1a0ff19 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 8 Oct 2024 12:35:58 -0700 Subject: [PATCH 19/28] Make other humidity fields required, add vt, and deprecate humidity control setter. --- resources/model/OpenStudio.idd | 4 +- .../AirConditionerVariableRefrigerantFlow.cpp | 1 - src/model/ControllerOutdoorAir.cpp | 33 +++-------- src/model/ControllerOutdoorAir.hpp | 3 +- src/model/ControllerOutdoorAir_Impl.hpp | 1 - src/model/test/ControllerOutdoorAir_GTest.cpp | 18 +++++- src/osversion/VersionTranslator.cpp | 54 +++++++++++++++++- src/osversion/VersionTranslator.hpp | 1 + .../3_9_0/test_vt_ControllerOutdoorAir.osm | 56 +++++++++++++++++++ .../3_9_0/test_vt_ControllerOutdoorAir.rb | 9 +++ .../test/VersionTranslator_GTest.cpp | 42 ++++++++++++++ 11 files changed, 187 insertions(+), 35 deletions(-) create mode 100644 src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.osm create mode 100644 src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.rb diff --git a/resources/model/OpenStudio.idd b/resources/model/OpenStudio.idd index 105e0d2169f..95d26f8ffdc 100644 --- a/resources/model/OpenStudio.idd +++ b/resources/model/OpenStudio.idd @@ -22427,7 +22427,7 @@ OS:Controller:OutdoorAir, \note This field is only used when the field High Humidity Control = Yes. \type real \minimum> 0 - \default 1.0 + \required-field A19, \field Control High Indoor Humidity Based on Outdoor Humidity Ratio \note If No is selected, the outdoor air flow rate is modified any time indoor relative \note humidity is above the humidistat setpoint. If Yes is selected, the outdoor air @@ -22435,7 +22435,7 @@ OS:Controller:OutdoorAir, \note setpoint and the outdoor humidity ratio is less than the indoor humidity ratio. \note This field is only used when the field High Humidity Control = Yes. \type choice - \default Yes + \required-field \key Yes \key No A20, \field Heat Recovery Bypass Control Type diff --git a/src/model/AirConditionerVariableRefrigerantFlow.cpp b/src/model/AirConditionerVariableRefrigerantFlow.cpp index b91756d0af8..10160f2ceb4 100644 --- a/src/model/AirConditionerVariableRefrigerantFlow.cpp +++ b/src/model/AirConditionerVariableRefrigerantFlow.cpp @@ -1064,7 +1064,6 @@ namespace model { bool AirConditionerVariableRefrigerantFlow_Impl::setHeatPumpWasteHeatRecovery(bool heatPumpWasteHeatRecovery) { return setBooleanFieldValue(OS_AirConditioner_VariableRefrigerantFlowFields::HeatPumpWasteHeatRecovery, heatPumpWasteHeatRecovery); - ; } bool AirConditionerVariableRefrigerantFlow_Impl::setEquivalentPipingLengthusedforPipingCorrectionFactorinCoolingMode( diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index dc4a1c8e7c1..c5e42d6f9ee 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -27,6 +27,7 @@ #include #include "../utilities/core/Compare.hpp" #include "../utilities/core/Assert.hpp" +#include "../utilities/core/DeprecatedHelpers.hpp" using openstudio::Handle; using openstudio::OptionalHandle; @@ -277,14 +278,6 @@ namespace model { return openstudio::istringEqual(value.get(), "Yes"); } - bool ControllerOutdoorAir_Impl::setHighHumidityControl(bool val) { - if (val) { - return setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); - } else { - return setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); - } - } - boost::optional ControllerOutdoorAir_Impl::humidistatControlZone() const { return getObject().getModelObjectTarget(OS_Controller_OutdoorAirFields::HumidistatControlZoneName); } @@ -297,6 +290,7 @@ namespace model { void ControllerOutdoorAir_Impl::resetHumidistatControlZone() { bool result = setString(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, ""); + result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); OS_ASSERT(result); } @@ -306,25 +300,15 @@ namespace model { bool ControllerOutdoorAir_Impl::setHighHumidityOutdoorAirFlowRatio(double v) { bool result = setDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, v); - result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); return result; } boost::optional ControllerOutdoorAir_Impl::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { - boost::optional value = getString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, true); - OS_ASSERT(value); - return openstudio::istringEqual(value.get(), "Yes"); + return getBooleanFieldValue(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio); } bool ControllerOutdoorAir_Impl::setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(bool v) { - bool result; - if (v) { - result = setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); - } else { - result = setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); - } - result = result && setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "Yes"); - return result; + return setBooleanFieldValue(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, v); } OptionalString ControllerOutdoorAir_Impl::getHeatRecoveryBypassControlType() const { @@ -558,9 +542,9 @@ namespace model { setString(OS_Controller_OutdoorAirFields::MaximumFractionofOutdoorAirScheduleName, ""); setString(OS_Controller_OutdoorAirFields::ControllerMechanicalVentilation, ""); setString(OS_Controller_OutdoorAirFields::TimeofDayEconomizerControlScheduleName, ""); - setHighHumidityControl(false); - setString(OS_Controller_OutdoorAirFields::HumidistatControlZoneName, ""); - setString(OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, ""); + setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); + setHighHumidityOutdoorAirFlowRatio(1.0); + setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(true); setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, ""); setHeatRecoveryBypassControlType("BypassWhenWithinEconomizerLimits"); setEconomizerOperationStaging("InterlockedWithMechanicalCooling"); @@ -676,7 +660,8 @@ namespace model { } bool ControllerOutdoorAir::setHighHumidityControl(bool val) { - return getImpl()->setHighHumidityControl(val); + DEPRECATED_AT_MSG(3, 8, 0, "Use setHumidistatControlZone instead."); + return false; } boost::optional ControllerOutdoorAir::humidistatControlZone() const { diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index 96c513bca31..5a9fc154a2c 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -8,6 +8,7 @@ #include "ModelAPI.hpp" #include "ParentObject.hpp" +#include "../utilities/core/Deprecated.hpp" namespace openstudio { @@ -107,7 +108,7 @@ namespace model { bool setMinimumLimitType(const std::string& value); boost::optional getHighHumidityControl() const; - bool setHighHumidityControl(bool val); + OS_DEPRECATED(3, 8, 0) bool setHighHumidityControl(bool val); boost::optional humidistatControlZone() const; bool setHumidistatControlZone(const ThermalZone& thermalZone); diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index 95f28b11579..49b83e562fd 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -83,7 +83,6 @@ namespace model { bool setMinimumLimitType(const std::string& value); boost::optional getHighHumidityControl() const; - bool setHighHumidityControl(bool val); boost::optional humidistatControlZone() const; bool setHumidistatControlZone(const ThermalZone& thermalZone); diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 3b215528130..8e0633294cd 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -99,7 +99,19 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { controller.resetHumidistatControlZone(); EXPECT_FALSE(controller.humidistatControlZone()); ASSERT_TRUE(controller.getHighHumidityControl()); - EXPECT_TRUE( - controller.getHighHumidityControl() - .get()); // still true because High Humidity Outdoor Air Flow Ratio or Control High Indoor Humidity Based on Outdoor Humidity Ratio may be set + EXPECT_FALSE(controller.getHighHumidityControl().get()); + + // High Humidity Outdoor Air Flow Ratio + ASSERT_TRUE(controller.getHighHumidityOutdoorAirFlowRatio()); + EXPECT_EQ(1.0, controller.getHighHumidityOutdoorAirFlowRatio().get()); + EXPEC_TRUE(controller.setHighHumidityOutdoorAirFlowRatio(2.0)); + ASSERT_TRUE(controller.getHighHumidityOutdoorAirFlowRatio()); + EXPECT_EQ(2.0, controller.getHighHumidityOutdoorAirFlowRatio().get()); + + // Control High Indoor Humidity Based on Outdoor Humidity Ratio + ASSERT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); + EXPECT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio().get()); + EXPEC_TRUE(controller.setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(false)); + ASSERT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); + EXPECT_FALSE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio().get()); } diff --git a/src/osversion/VersionTranslator.cpp b/src/osversion/VersionTranslator.cpp index b4c7b138e15..30ab7f476c1 100644 --- a/src/osversion/VersionTranslator.cpp +++ b/src/osversion/VersionTranslator.cpp @@ -144,7 +144,8 @@ namespace osversion { m_updateMethods[VersionString("3.6.0")] = &VersionTranslator::update_3_5_1_to_3_6_0; m_updateMethods[VersionString("3.7.0")] = &VersionTranslator::update_3_6_1_to_3_7_0; m_updateMethods[VersionString("3.8.0")] = &VersionTranslator::update_3_7_0_to_3_8_0; - // m_updateMethods[VersionString("3.8.0")] = &VersionTranslator::defaultUpdate; + m_updateMethods[VersionString("3.9.0")] = &VersionTranslator::update_3_8_0_to_3_9_0; + // m_updateMethods[VersionString("3.9.0")] = &VersionTranslator::defaultUpdate; // List of previous versions that may be updated to this one. // - To increment the translator, add an entry for the version just released (branched for @@ -181,9 +182,9 @@ namespace osversion { VersionString("2.7.1"), VersionString("2.7.2"), VersionString("2.8.0"), VersionString("2.8.1"), VersionString("2.9.0"), VersionString("2.9.1"), VersionString("3.0.0"), VersionString("3.0.1"), VersionString("3.1.0"), VersionString("3.2.0"), VersionString("3.2.1"), VersionString("3.3.0"), VersionString("3.4.0"), VersionString("3.5.0"), VersionString("3.5.1"), - VersionString("3.6.0"), VersionString("3.6.1"), VersionString("3.7.0"), + VersionString("3.6.0"), VersionString("3.6.1"), VersionString("3.7.0"), VersionString("3.8.0"), // Note: do **not** include the **current** version in m_startVersions, stop at the previous release - //VersionString("3.8.0"), + //VersionString("3.9.0"), }; } @@ -9196,5 +9197,52 @@ namespace osversion { } // end update_3_7_0_to_3_8_0 + std::string VersionTranslator::update_3_8_0_to_3_9_0(const IdfFile& idf_3_8_0, const IddFileAndFactoryWrapper& idd_3_9_0) { + std::stringstream ss; + boost::optional value; + + ss << idf_3_8_0.header() << '\n' << '\n'; + IdfFile targetIdf(idd_3_9_0.iddFile()); + ss << targetIdf.versionObject().get(); + + for (const IdfObject& object : idf_3_8_0.objects()) { + auto iddname = object.iddObject().name(); + + if (iddname == "OS:Controller:OutdoorAir") { + + // 2 Fields have been made required from 3.8.0 to 3.9.0: + // ---------------------------------------------- + // * High Humidity Outdoor Air Flow Ratio * 24 + // * Control High Indoor Humidity Based on Outdoor Humidity Ratio * 25 + + auto iddObject = idd_3_9_0.getObject(iddname); + IdfObject newObject(iddObject.get()); + + for (size_t i = 0; i < object.numFields(); ++i) { + if ((value = object.getString(i))) { + newObject.setString(i, value.get()); + } + } + + if (newObject.isEmpty(24)) { + newObject.setDouble(24, 1.0); + } + if (newObject.isEmpty(25)) { + newObject.setString(25, "Yes"); + } + + ss << newObject; + m_refactored.emplace_back(std::move(object), std::move(newObject)); + + // No-op + } else { + ss << object; + } + } + + return ss.str(); + + } // end update_3_8_0_to_3_9_0 + } // namespace osversion } // namespace openstudio diff --git a/src/osversion/VersionTranslator.hpp b/src/osversion/VersionTranslator.hpp index b5a93555c6f..4600c2faa75 100644 --- a/src/osversion/VersionTranslator.hpp +++ b/src/osversion/VersionTranslator.hpp @@ -236,6 +236,7 @@ namespace osversion { std::string update_3_5_1_to_3_6_0(const IdfFile& idf_3_5_1, const IddFileAndFactoryWrapper& idd_3_6_0); std::string update_3_6_1_to_3_7_0(const IdfFile& idf_3_6_1, const IddFileAndFactoryWrapper& idd_3_7_0); std::string update_3_7_0_to_3_8_0(const IdfFile& idf_3_7_0, const IddFileAndFactoryWrapper& idd_3_8_0); + std::string update_3_8_0_to_3_9_0(const IdfFile& idf_3_8_0, const IddFileAndFactoryWrapper& idd_3_9_0); IdfObject updateUrlField_0_7_1_to_0_7_2(const IdfObject& object, unsigned index); diff --git a/src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.osm b/src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.osm new file mode 100644 index 00000000000..9884e2629ce --- /dev/null +++ b/src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.osm @@ -0,0 +1,56 @@ + +OS:Version, + {ff5269f8-4354-477b-aa90-d656733b4909}, !- Handle + 3.8.0; !- Version Identifier + +OS:Controller:OutdoorAir, + {2b51de85-c6f1-42e2-be76-53aabac1dd57}, !- Handle + Controller Outdoor Air 1, !- Name + , !- Relief Air Outlet Node Name + , !- Return Air Node Name + , !- Mixed Air Node Name + , !- Actuator Node Name + 0, !- Minimum Outdoor Air Flow Rate {m3/s} + Autosize, !- Maximum Outdoor Air Flow Rate {m3/s} + NoEconomizer, !- Economizer Control Type + ModulateFlow, !- Economizer Control Action Type + 28, !- Economizer Maximum Limit Dry-Bulb Temperature {C} + 64000, !- Economizer Maximum Limit Enthalpy {J/kg} + , !- Economizer Maximum Limit Dewpoint Temperature {C} + , !- Electronic Enthalpy Limit Curve Name + -100, !- Economizer Minimum Limit Dry-Bulb Temperature {C} + NoLockout, !- Lockout Type + FixedMinimum, !- Minimum Limit Type + , !- Minimum Outdoor Air Schedule Name + , !- Minimum Fraction of Outdoor Air Schedule Name + , !- Maximum Fraction of Outdoor Air Schedule Name + {1a10e873-d7f2-412b-96c4-81731937086b}, !- Controller Mechanical Ventilation + , !- Time of Day Economizer Control Schedule Name + No, !- High Humidity Control + , !- Humidistat Control Zone Name + , !- High Humidity Outdoor Air Flow Ratio + , !- Control High Indoor Humidity Based on Outdoor Humidity Ratio + BypassWhenWithinEconomizerLimits, !- Heat Recovery Bypass Control Type + InterlockedWithMechanicalCooling; !- Economizer Operation Staging + +OS:Controller:MechanicalVentilation, + {1a10e873-d7f2-412b-96c4-81731937086b}, !- Handle + Controller Mechanical Ventilation 1, !- Name + {68a1d80e-6ef4-49d0-ad28-8dbf399ebd36}, !- Availability Schedule + , !- Demand Controlled Ventilation + ; !- System Outdoor Air Method + +OS:Schedule:Constant, + {68a1d80e-6ef4-49d0-ad28-8dbf399ebd36}, !- Handle + Always On Discrete, !- Name + {bc7824f2-a62d-4a3b-914b-8a1b3eb143da}, !- Schedule Type Limits Name + 1; !- Value + +OS:ScheduleTypeLimits, + {bc7824f2-a62d-4a3b-914b-8a1b3eb143da}, !- Handle + OnOff, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Discrete, !- Numeric Type + Availability; !- Unit Type + diff --git a/src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.rb b/src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.rb new file mode 100644 index 00000000000..8b50085a61a --- /dev/null +++ b/src/osversion/test/3_9_0/test_vt_ControllerOutdoorAir.rb @@ -0,0 +1,9 @@ +#require '/usr/local/openstudio-3.8.0/Ruby/openstudio' + +include OpenStudio::Model + +m = Model.new + +controller = ControllerOutdoorAir.new(m) + +m.save('test_vt_ControllerOutdoorAir.osm', true) diff --git a/src/osversion/test/VersionTranslator_GTest.cpp b/src/osversion/test/VersionTranslator_GTest.cpp index d7d81842494..49625bb8d58 100644 --- a/src/osversion/test/VersionTranslator_GTest.cpp +++ b/src/osversion/test/VersionTranslator_GTest.cpp @@ -4207,3 +4207,45 @@ TEST_F(OSVersionFixture, update_3_7_0_to_3_8_0_ScheduleDay) { EXPECT_EQ(0, sch_day.getInt(5).get()); // Minute 1 EXPECT_EQ(0, sch_day.getDouble(6).get()); // Value Until Time 1 } + +TEST_F(OSVersionFixture, update_3_8_0_to_3_9_0_ControllerOutdoorAir) { + openstudio::path path = resourcesPath() / toPath("osversion/3_9_0/test_vt_ControllerOutdoorAir.osm"); + osversion::VersionTranslator vt; + boost::optional model = vt.loadModel(path); + ASSERT_TRUE(model) << "Failed to load " << path; + + openstudio::path outPath = resourcesPath() / toPath("osversion/3_9_0/test_vt_ControllerOutdoorAir_updated.osm"); + model->save(outPath, true); + + std::vector controllers = model->getObjectsByType("OS:Controller:OutdoorAir"); + ASSERT_EQ(1u, controllers.size()); + WorkspaceObject controller = controllers[0]; + + EXPECT_EQ("Controller Outdoor Air 1", controller.getString(1).get()); // Name + EXPECT_TRUE(controller.isEmpty(2)); // Relief Air Outlet Node Name + EXPECT_TRUE(controller.isEmpty(3)); // Return Air Node Name + EXPECT_TRUE(controller.isEmpty(4)); // Mixed Air Node Name + EXPECT_TRUE(controller.isEmpty(5)); // Actuator Node Name + EXPECT_EQ(0.0, controller.getDouble(6).get()); // Minimum Outdoor Air Flow Rate {m3/s} + EXPECT_EQ("Autosize", controller.getString(7).get()); // Maximum Outdoor Air Flow Rate {m3/s} + EXPECT_EQ("NoEconomizer", controller.getString(8).get()); // Economizer Control Type + EXPECT_EQ("ModulateFlow", controller.getString(9).get()); // Economizer Control Action Type + EXPECT_EQ(28.0, controller.getDouble(10).get()); // Economizer Maximum Limit Dry-Bulb Temperature {C} + EXPECT_EQ(64000.0, controller.getDouble(11).get()); // Economizer Maximum Limit Enthalpy {J/kg} + EXPECT_TRUE(controller.isEmpty(12)); // Economizer Maximum Limit Dewpoint Temperature {C} + EXPECT_TRUE(controller.isEmpty(13)); // Electronic Enthalpy Limit Curve Name + EXPECT_EQ(-100.0, controller.getDouble(14).get()); // Economizer Minimum Limit Dry-Bulb Temperature {C} + EXPECT_EQ("NoLockout", controller.getString(15).get()); // Lockout Type + EXPECT_EQ("FixedMinimum", controller.getString(16).get()); // Minimum Limit Type + EXPECT_TRUE(controller.isEmpty(17)); // Minimum Outdoor Air Schedule Name + EXPECT_TRUE(controller.isEmpty(18)); // Minimum Fraction of Outdoor Air Schedule Name + EXPECT_TRUE(controller.isEmpty(19)); // Maximum Fraction of Outdoor Air Schedule Name + ASSERT_TRUE(controller.getTarget(15)); // Controller Mechanical Ventilation + EXPECT_TRUE(controller.isEmpty(21)); // Time of Day Economizer Control Schedule Name + EXPECT_EQ("No", controller.getString(22).get()); // High Humidity Control + EXPECT_TRUE(controller.isEmpty(23)); // Humidistat Control Zone Name + EXPECT_EQ(1.0, controller.getDouble(24)); // High Humidity Outdoor Air Flow Ratio + EXPECT_EQ("Yes", controller.getString(25)); // Control High Indoor Humidity Based on Outdoor Humidity Ratio + EXPECT_EQ("BypassWhenWithinEconomizerLimits", controller.getString(26).get()); // Heat Recovery Bypass Control Type + EXPECT_EQ("InterlockedWithMechanicalCooling", controller.getString(27).get()); // Economizer Operation Staging +} From 12023928f9086d16a82d57aed6b81f0433d9d92a Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 8 Oct 2024 12:36:16 -0700 Subject: [PATCH 20/28] Formatting. --- src/model/test/ControllerOutdoorAir_GTest.cpp | 2 +- src/osversion/VersionTranslator.cpp | 6 +-- .../test/VersionTranslator_GTest.cpp | 54 +++++++++---------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 8e0633294cd..0bf53d2cf14 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -107,7 +107,7 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { EXPEC_TRUE(controller.setHighHumidityOutdoorAirFlowRatio(2.0)); ASSERT_TRUE(controller.getHighHumidityOutdoorAirFlowRatio()); EXPECT_EQ(2.0, controller.getHighHumidityOutdoorAirFlowRatio().get()); - + // Control High Indoor Humidity Based on Outdoor Humidity Ratio ASSERT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); EXPECT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio().get()); diff --git a/src/osversion/VersionTranslator.cpp b/src/osversion/VersionTranslator.cpp index 30ab7f476c1..97bb0906262 100644 --- a/src/osversion/VersionTranslator.cpp +++ b/src/osversion/VersionTranslator.cpp @@ -182,7 +182,7 @@ namespace osversion { VersionString("2.7.1"), VersionString("2.7.2"), VersionString("2.8.0"), VersionString("2.8.1"), VersionString("2.9.0"), VersionString("2.9.1"), VersionString("3.0.0"), VersionString("3.0.1"), VersionString("3.1.0"), VersionString("3.2.0"), VersionString("3.2.1"), VersionString("3.3.0"), VersionString("3.4.0"), VersionString("3.5.0"), VersionString("3.5.1"), - VersionString("3.6.0"), VersionString("3.6.1"), VersionString("3.7.0"), VersionString("3.8.0"), + VersionString("3.6.0"), VersionString("3.6.1"), VersionString("3.7.0"), VersionString("3.8.0"), // Note: do **not** include the **current** version in m_startVersions, stop at the previous release //VersionString("3.9.0"), }; @@ -9209,7 +9209,7 @@ namespace osversion { auto iddname = object.iddObject().name(); if (iddname == "OS:Controller:OutdoorAir") { - + // 2 Fields have been made required from 3.8.0 to 3.9.0: // ---------------------------------------------- // * High Humidity Outdoor Air Flow Ratio * 24 @@ -9242,7 +9242,7 @@ namespace osversion { return ss.str(); - } // end update_3_8_0_to_3_9_0 + } // end update_3_8_0_to_3_9_0 } // namespace osversion } // namespace openstudio diff --git a/src/osversion/test/VersionTranslator_GTest.cpp b/src/osversion/test/VersionTranslator_GTest.cpp index 49625bb8d58..2180afae4fb 100644 --- a/src/osversion/test/VersionTranslator_GTest.cpp +++ b/src/osversion/test/VersionTranslator_GTest.cpp @@ -4221,31 +4221,31 @@ TEST_F(OSVersionFixture, update_3_8_0_to_3_9_0_ControllerOutdoorAir) { ASSERT_EQ(1u, controllers.size()); WorkspaceObject controller = controllers[0]; - EXPECT_EQ("Controller Outdoor Air 1", controller.getString(1).get()); // Name - EXPECT_TRUE(controller.isEmpty(2)); // Relief Air Outlet Node Name - EXPECT_TRUE(controller.isEmpty(3)); // Return Air Node Name - EXPECT_TRUE(controller.isEmpty(4)); // Mixed Air Node Name - EXPECT_TRUE(controller.isEmpty(5)); // Actuator Node Name - EXPECT_EQ(0.0, controller.getDouble(6).get()); // Minimum Outdoor Air Flow Rate {m3/s} - EXPECT_EQ("Autosize", controller.getString(7).get()); // Maximum Outdoor Air Flow Rate {m3/s} - EXPECT_EQ("NoEconomizer", controller.getString(8).get()); // Economizer Control Type - EXPECT_EQ("ModulateFlow", controller.getString(9).get()); // Economizer Control Action Type - EXPECT_EQ(28.0, controller.getDouble(10).get()); // Economizer Maximum Limit Dry-Bulb Temperature {C} - EXPECT_EQ(64000.0, controller.getDouble(11).get()); // Economizer Maximum Limit Enthalpy {J/kg} - EXPECT_TRUE(controller.isEmpty(12)); // Economizer Maximum Limit Dewpoint Temperature {C} - EXPECT_TRUE(controller.isEmpty(13)); // Electronic Enthalpy Limit Curve Name - EXPECT_EQ(-100.0, controller.getDouble(14).get()); // Economizer Minimum Limit Dry-Bulb Temperature {C} - EXPECT_EQ("NoLockout", controller.getString(15).get()); // Lockout Type - EXPECT_EQ("FixedMinimum", controller.getString(16).get()); // Minimum Limit Type - EXPECT_TRUE(controller.isEmpty(17)); // Minimum Outdoor Air Schedule Name - EXPECT_TRUE(controller.isEmpty(18)); // Minimum Fraction of Outdoor Air Schedule Name - EXPECT_TRUE(controller.isEmpty(19)); // Maximum Fraction of Outdoor Air Schedule Name - ASSERT_TRUE(controller.getTarget(15)); // Controller Mechanical Ventilation - EXPECT_TRUE(controller.isEmpty(21)); // Time of Day Economizer Control Schedule Name - EXPECT_EQ("No", controller.getString(22).get()); // High Humidity Control - EXPECT_TRUE(controller.isEmpty(23)); // Humidistat Control Zone Name - EXPECT_EQ(1.0, controller.getDouble(24)); // High Humidity Outdoor Air Flow Ratio - EXPECT_EQ("Yes", controller.getString(25)); // Control High Indoor Humidity Based on Outdoor Humidity Ratio - EXPECT_EQ("BypassWhenWithinEconomizerLimits", controller.getString(26).get()); // Heat Recovery Bypass Control Type - EXPECT_EQ("InterlockedWithMechanicalCooling", controller.getString(27).get()); // Economizer Operation Staging + EXPECT_EQ("Controller Outdoor Air 1", controller.getString(1).get()); // Name + EXPECT_TRUE(controller.isEmpty(2)); // Relief Air Outlet Node Name + EXPECT_TRUE(controller.isEmpty(3)); // Return Air Node Name + EXPECT_TRUE(controller.isEmpty(4)); // Mixed Air Node Name + EXPECT_TRUE(controller.isEmpty(5)); // Actuator Node Name + EXPECT_EQ(0.0, controller.getDouble(6).get()); // Minimum Outdoor Air Flow Rate {m3/s} + EXPECT_EQ("Autosize", controller.getString(7).get()); // Maximum Outdoor Air Flow Rate {m3/s} + EXPECT_EQ("NoEconomizer", controller.getString(8).get()); // Economizer Control Type + EXPECT_EQ("ModulateFlow", controller.getString(9).get()); // Economizer Control Action Type + EXPECT_EQ(28.0, controller.getDouble(10).get()); // Economizer Maximum Limit Dry-Bulb Temperature {C} + EXPECT_EQ(64000.0, controller.getDouble(11).get()); // Economizer Maximum Limit Enthalpy {J/kg} + EXPECT_TRUE(controller.isEmpty(12)); // Economizer Maximum Limit Dewpoint Temperature {C} + EXPECT_TRUE(controller.isEmpty(13)); // Electronic Enthalpy Limit Curve Name + EXPECT_EQ(-100.0, controller.getDouble(14).get()); // Economizer Minimum Limit Dry-Bulb Temperature {C} + EXPECT_EQ("NoLockout", controller.getString(15).get()); // Lockout Type + EXPECT_EQ("FixedMinimum", controller.getString(16).get()); // Minimum Limit Type + EXPECT_TRUE(controller.isEmpty(17)); // Minimum Outdoor Air Schedule Name + EXPECT_TRUE(controller.isEmpty(18)); // Minimum Fraction of Outdoor Air Schedule Name + EXPECT_TRUE(controller.isEmpty(19)); // Maximum Fraction of Outdoor Air Schedule Name + ASSERT_TRUE(controller.getTarget(15)); // Controller Mechanical Ventilation + EXPECT_TRUE(controller.isEmpty(21)); // Time of Day Economizer Control Schedule Name + EXPECT_EQ("No", controller.getString(22).get()); // High Humidity Control + EXPECT_TRUE(controller.isEmpty(23)); // Humidistat Control Zone Name + EXPECT_EQ(1.0, controller.getDouble(24)); // High Humidity Outdoor Air Flow Ratio + EXPECT_EQ("Yes", controller.getString(25)); // Control High Indoor Humidity Based on Outdoor Humidity Ratio + EXPECT_EQ("BypassWhenWithinEconomizerLimits", controller.getString(26).get()); // Heat Recovery Bypass Control Type + EXPECT_EQ("InterlockedWithMechanicalCooling", controller.getString(27).get()); // Economizer Operation Staging } From 457dae18261dd0f492635ba96662a5c6ac52dae8 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 8 Oct 2024 13:39:30 -0700 Subject: [PATCH 21/28] Typos in model test file. --- src/model/test/ControllerOutdoorAir_GTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 0bf53d2cf14..30ee68dbe1b 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -104,14 +104,14 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { // High Humidity Outdoor Air Flow Ratio ASSERT_TRUE(controller.getHighHumidityOutdoorAirFlowRatio()); EXPECT_EQ(1.0, controller.getHighHumidityOutdoorAirFlowRatio().get()); - EXPEC_TRUE(controller.setHighHumidityOutdoorAirFlowRatio(2.0)); + EXPECT_TRUE(controller.setHighHumidityOutdoorAirFlowRatio(2.0)); ASSERT_TRUE(controller.getHighHumidityOutdoorAirFlowRatio()); EXPECT_EQ(2.0, controller.getHighHumidityOutdoorAirFlowRatio().get()); // Control High Indoor Humidity Based on Outdoor Humidity Ratio ASSERT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); EXPECT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio().get()); - EXPEC_TRUE(controller.setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(false)); + EXPECT_TRUE(controller.setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(false)); ASSERT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); EXPECT_FALSE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio().get()); } From f3b874f5bf3c2a1b3b02d25da87978d5f13d46e8 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 8 Oct 2024 14:45:20 -0700 Subject: [PATCH 22/28] Update model and vt test files. --- src/model/test/ControllerOutdoorAir_GTest.cpp | 1 + src/osversion/test/VersionTranslator_GTest.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 30ee68dbe1b..86fcaae15df 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -80,6 +80,7 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { EXPECT_EQ("EconomizerFirst", controller.economizerOperationStaging()); // Electronic Enthalpy Limit Curve + EXPECT_FALSE(controller.electronicEnthalpyLimitCurve()); CurveQuadratic electronicEnthalpyLimitCurve(model); EXPECT_TRUE(controller.setElectronicEnthalpyLimitCurve(electronicEnthalpyLimitCurve)); ASSERT_TRUE(controller.electronicEnthalpyLimitCurve()); diff --git a/src/osversion/test/VersionTranslator_GTest.cpp b/src/osversion/test/VersionTranslator_GTest.cpp index 2180afae4fb..4e0b89e35f2 100644 --- a/src/osversion/test/VersionTranslator_GTest.cpp +++ b/src/osversion/test/VersionTranslator_GTest.cpp @@ -4244,8 +4244,8 @@ TEST_F(OSVersionFixture, update_3_8_0_to_3_9_0_ControllerOutdoorAir) { EXPECT_TRUE(controller.isEmpty(21)); // Time of Day Economizer Control Schedule Name EXPECT_EQ("No", controller.getString(22).get()); // High Humidity Control EXPECT_TRUE(controller.isEmpty(23)); // Humidistat Control Zone Name - EXPECT_EQ(1.0, controller.getDouble(24)); // High Humidity Outdoor Air Flow Ratio - EXPECT_EQ("Yes", controller.getString(25)); // Control High Indoor Humidity Based on Outdoor Humidity Ratio + EXPECT_EQ(1.0, controller.getDouble(24).get()); // High Humidity Outdoor Air Flow Ratio + EXPECT_EQ("Yes", controller.getString(25).get()); // Control High Indoor Humidity Based on Outdoor Humidity Ratio EXPECT_EQ("BypassWhenWithinEconomizerLimits", controller.getString(26).get()); // Heat Recovery Bypass Control Type EXPECT_EQ("InterlockedWithMechanicalCooling", controller.getString(27).get()); // Economizer Operation Staging } From 26520c982809101eba6837fc07a60f57768af819 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 8 Oct 2024 15:46:27 -0700 Subject: [PATCH 23/28] Remove optional from newly required fields and break getters. --- .../ForwardTranslateControllerOutdoorAir.cpp | 11 ++++------- src/model/ControllerOutdoorAir.cpp | 8 ++++---- src/model/ControllerOutdoorAir.hpp | 4 ++-- src/model/ControllerOutdoorAir_Impl.hpp | 4 ++-- src/model/test/ControllerOutdoorAir_GTest.cpp | 12 ++++-------- 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp index fb1b561809a..3b4ebd3b03c 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateControllerOutdoorAir.cpp @@ -177,13 +177,10 @@ namespace energyplus { } // ControlHighIndoorHumidityBasedonOutdoorHumidityRatio - ob = modelObject.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(); - if (ob) { - if (*ob) { - idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); - } else { - idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); - } + if (modelObject.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()) { + idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "Yes"); + } else { + idfObject.setString(openstudio::Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, "No"); } // HeatRecoveryBypassControlType diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index c5e42d6f9ee..afbb9ad5fde 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -294,7 +294,7 @@ namespace model { OS_ASSERT(result); } - OptionalDouble ControllerOutdoorAir_Impl::getHighHumidityOutdoorAirFlowRatio() const { + double ControllerOutdoorAir_Impl::getHighHumidityOutdoorAirFlowRatio() const { return getDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio); } @@ -303,7 +303,7 @@ namespace model { return result; } - boost::optional ControllerOutdoorAir_Impl::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { + bool ControllerOutdoorAir_Impl::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { return getBooleanFieldValue(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio); } @@ -676,7 +676,7 @@ namespace model { getImpl()->resetHumidistatControlZone(); } - boost::optional ControllerOutdoorAir::getHighHumidityOutdoorAirFlowRatio() const { + double ControllerOutdoorAir::getHighHumidityOutdoorAirFlowRatio() const { return getImpl()->getHighHumidityOutdoorAirFlowRatio(); } @@ -684,7 +684,7 @@ namespace model { return getImpl()->setHighHumidityOutdoorAirFlowRatio(v); } - boost::optional ControllerOutdoorAir::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { + bool ControllerOutdoorAir::getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const { return getImpl()->getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(); } diff --git a/src/model/ControllerOutdoorAir.hpp b/src/model/ControllerOutdoorAir.hpp index 5a9fc154a2c..aaf95cc0cb5 100644 --- a/src/model/ControllerOutdoorAir.hpp +++ b/src/model/ControllerOutdoorAir.hpp @@ -114,10 +114,10 @@ namespace model { bool setHumidistatControlZone(const ThermalZone& thermalZone); void resetHumidistatControlZone(); - boost::optional getHighHumidityOutdoorAirFlowRatio() const; + double getHighHumidityOutdoorAirFlowRatio() const; bool setHighHumidityOutdoorAirFlowRatio(double v); - boost::optional getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const; + bool getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const; bool setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(bool v); boost::optional getHeatRecoveryBypassControlType() const; diff --git a/src/model/ControllerOutdoorAir_Impl.hpp b/src/model/ControllerOutdoorAir_Impl.hpp index 49b83e562fd..04a4b4b0f7d 100644 --- a/src/model/ControllerOutdoorAir_Impl.hpp +++ b/src/model/ControllerOutdoorAir_Impl.hpp @@ -88,10 +88,10 @@ namespace model { bool setHumidistatControlZone(const ThermalZone& thermalZone); void resetHumidistatControlZone(); - OptionalDouble getHighHumidityOutdoorAirFlowRatio() const; + double getHighHumidityOutdoorAirFlowRatio() const; bool setHighHumidityOutdoorAirFlowRatio(double v); - boost::optional getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const; + bool getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio() const; bool setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(bool v); OptionalString getHeatRecoveryBypassControlType() const; diff --git a/src/model/test/ControllerOutdoorAir_GTest.cpp b/src/model/test/ControllerOutdoorAir_GTest.cpp index 86fcaae15df..dcb8b47e80f 100644 --- a/src/model/test/ControllerOutdoorAir_GTest.cpp +++ b/src/model/test/ControllerOutdoorAir_GTest.cpp @@ -103,16 +103,12 @@ TEST_F(ModelFixture, ControllerOutdoorAir_GettersSetters) { EXPECT_FALSE(controller.getHighHumidityControl().get()); // High Humidity Outdoor Air Flow Ratio - ASSERT_TRUE(controller.getHighHumidityOutdoorAirFlowRatio()); - EXPECT_EQ(1.0, controller.getHighHumidityOutdoorAirFlowRatio().get()); + EXPECT_EQ(1.0, controller.getHighHumidityOutdoorAirFlowRatio()); EXPECT_TRUE(controller.setHighHumidityOutdoorAirFlowRatio(2.0)); - ASSERT_TRUE(controller.getHighHumidityOutdoorAirFlowRatio()); - EXPECT_EQ(2.0, controller.getHighHumidityOutdoorAirFlowRatio().get()); + EXPECT_EQ(2.0, controller.getHighHumidityOutdoorAirFlowRatio()); // Control High Indoor Humidity Based on Outdoor Humidity Ratio - ASSERT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); - EXPECT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio().get()); + EXPECT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); EXPECT_TRUE(controller.setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(false)); - ASSERT_TRUE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); - EXPECT_FALSE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio().get()); + EXPECT_FALSE(controller.getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio()); } From 8790298c3c7f4e6639ff364352e71ca496db44dd Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Tue, 8 Oct 2024 15:56:49 -0700 Subject: [PATCH 24/28] Typo in cpp file. --- src/model/ControllerOutdoorAir.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index afbb9ad5fde..05645c4ee84 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -295,7 +295,9 @@ namespace model { } double ControllerOutdoorAir_Impl::getHighHumidityOutdoorAirFlowRatio() const { - return getDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio); + boost::optional value = getDouble(openstudio::OS_Controller_OutdoorAirFields::HighHumidityOutdoorAirFlowRatio, true); + OS_ASSERT(value); + return value.get(); } bool ControllerOutdoorAir_Impl::setHighHumidityOutdoorAirFlowRatio(double v) { From c36adbe1e4bc782a0585192db3ef92a841cf1a2f Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 9 Oct 2024 10:18:29 +0200 Subject: [PATCH 25/28] Make the 3.8.0 release notes + update template with YAML header for pandoc config --- ...penStudio_Release_Notes_3_8_0_20240508.md} | 46 +++++++++++------- ...penStudio_Release_Notes_3_8_0_20240508.pdf | Bin 0 -> 197266 bytes .../doc/ReleaseNotes/ReleaseNotes_template.md | 45 ++++++++++++----- 3 files changed, 61 insertions(+), 30 deletions(-) rename developer/doc/ReleaseNotes/{OpenStudio_Release_Notes_3_8_0_TBD.md => OpenStudio_Release_Notes_3_8_0_20240508.md} (80%) create mode 100644 developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_20240508.pdf diff --git a/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_TBD.md b/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_20240508.md similarity index 80% rename from developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_TBD.md rename to developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_20240508.md index 8a70cec5ba0..c55450476ea 100644 --- a/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_TBD.md +++ b/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_20240508.md @@ -1,6 +1,6 @@ # OpenStudio Version 3.8.0 -_Release Notes_ - _TBD_ +_Release Notes_ - 2024-05-08 These release notes describe version 3.8.0 of the OpenStudio SDK developed by the National Renewable Energy Laboratory (NREL), Buildings and Thermal Sciences Center, Commercial Buildings Research Group, Tools Development Section, and associated collaborators. The notes are organized into the following sections: @@ -28,9 +28,9 @@ __**OpenStudio SDK 3.8.0**__ # Where to Find OpenStudio SDK Documentation - OpenStudio SDK release documentation, including these release notes, tutorials, and other user documentation, is available at [https://www.openstudio.net/](https://www.openstudio.net/.) -- C++ API documentation is available at [https://openstudio-sdk-documentation.s3.amazonaws.com/index.html](https://openstudio-sdk-documentation.s3.amazonaws.com/index.html) -- Measure development documentation is available at [http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/](http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/ ) -- A roadmap for planned features is available at http://nrel.github.io/OpenStudio-user-documentation/getting_started/roadmap/. +- C++ API documentation is available at [OpenStudio SDK Documentation](https://openstudio-sdk-documentation.s3.amazonaws.com/index.html) +- Measure development documentation is available at [OpenStudio Measure Writer's Reference Guide](http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/ ) +- A roadmap for planned features is available at [Roadmap](http://nrel.github.io/OpenStudio-user-documentation/getting_started/roadmap/) # Installation Notes @@ -53,7 +53,7 @@ As usual, you can refer to the **[OpenStudio SDK Compatibility Matrix](https://g - Download and install [OpenStudio SDK](https://github.com/NREL/openstudio) and/or any third party tool that embeds the OpenStudio SDK into their software such as [openstudiocoalition/OpenStudioApplication](https://github.com/openstudiocoalition/OpenStudioApplication) depending on your needs. Select components for installation. Note that OpenStudio Application is a standalone app and does not require you to install OpenStudio SDK. - A BCL AUth Key is no longer needed to access content on [Building Component Library (BCL)](https://bcl.nrel.gov) BCL is typically accessed through third party OpenStudio applications to provide modelers access to building components and OpenStudio measures; however you an also browse it and download content using the BCL link above. -For help with common installation problems please visit, http://nrel.github.io/OpenStudio-user-documentation/getting_started/getting_started/. +For help with common installation problems please visit [Getting Started](http://nrel.github.io/OpenStudio-user-documentation/getting_started/getting_started/). # OpenStudio SDK: @@ -87,11 +87,12 @@ For a list of deprecated and removed methods, please refer to [deprecated_method * [#5037](https://github.com/NREL/OpenStudio/issues/5037) * [#4918](https://github.com/NREL/OpenStudio/issues/4918) -* [#TBD]() Refactoring and relocating model methods that has been in the openStudio-extension Gem to be in the openstudio-standards Gem or in OpenStudio C++ SDK. A few methods will be moved directly into measures. The result of this is that with OpenStudio 3.8.0 no measures should have to require 'openstudio-extension' within a measure's Ruby code. -* [#TBD]() Update to version 0.6.0 of the openstudio_standards Gem. In addition to some refactoring, this release also included conversion of 90.1 data to formal database. +* Refactoring and relocating model methods that has been in the openstudio-extensio-gem Gem to be in the openstudio-standards Gem or in OpenStudio C++ SDK. A few methods will be moved directly into measures. The result of this is that with OpenStudio 3.8.0 no measures should have to require 'openstudio-extension' within a measure's Ruby code. + * [#5142](https://github.com/NREL/OpenStudio/pull/5142) - Add native support for measure argument methods in OsLib_HelperMethods -* [#TBD]() Enhancements to the Building Component Library (BCL) +* Enhancements to the Building Component Library (BCL) + * [#5126](https://github.com/NREL/OpenStudio/pull/5126) - Add versionModified, repo, org, releaseTag to BCLSearchResult * Support for OpenStudio Python Measures * Updating Measure Details page to include measure language * Link to GitHub Repo from Measure Details page @@ -111,16 +112,27 @@ For a list of deprecated and removed methods, please refer to [deprecated_method ## Minor changes and bug fixes -* -* -* - -## Known Issues / Limitations - -* -* -* +Refer to the changelog on the release page at [v3.8.0](https://github.com/NREL/OpenStudio/releases/v3.8.0) **Full Changelog**: https://github.com/NREL/OpenStudio/compare/v3.7.0...v3.8.0 **New Contributors**: + +### OpenStudio Standards v0.6.1 + +Update the openstudio-standards gem to version [0.6.1](https://github.com/NREL/openstudio-standards/releases/tag/v0.6.1) +In addition to some refactoring, this release also included conversion of 90.1 data to formal database. + +--- +# This YAML header controls the pandoc (via TeX) to PDF settings +# To convert the markdown to pdf, do `pandoc release_notes.md -o release_notes.pdf` +title: 'OpenStudio Release Notes - 3.8.0' +author: +- National Renewable Energy Laboratory +colorlinks: true +linkcolor: blue +urlcolor: Mahogany +toccolor: gray +geometry: +- margin=1in +--- diff --git a/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_20240508.pdf b/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_8_0_20240508.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6bde86229b1d123e6fc7be8f3c04a65cabdfa684 GIT binary patch literal 197266 zcma&MQ;;sevaQ=TXWO=IW43MEcF(qL+qP}n#^1K>zUyK?trKx~J!L*-L`IEoR1Go( zQE@sZdNvrc`Q?#y7$z1%MnZcdD;Qp07zPni|`in8NV$!#KM*nHt){cx?7)XghC>BKXeL?P*t7HlOIVlYXCYTFS{Sks5bV zIG0|#SVW|9mPo)eIPU2C`Gczwla)9!KYJplb?E?o0>AmIqE-h|dVJG<3_gy`G&K=K z!}VNxT`FW?4~(8)?LED zgFk(XFF>ydH|yK^!eLDplu8(BaKdh8q=r7(3|}@Y-qYPplg&}DM|;vib9EF@mP`kz zfy?$(M!7xvACh`!0Rp)s*PA^7&4|S$iUF*`IF~NdC2GRhIMcG!N*Pyi1;=lglDI$S zsps_;JoEA>BtuD@uf+ z+RbFZ!+E~Kl${$&Nk}ay-u%9;80}r`o0!ufIO+PI|t?r>Pd0z6sLv) z$`kbWW4<#J_3yhA#+Cf^(1!P#NvF=LdE#&;@a5g{!zL)d*dmME)$4W#mHEqV_25if zXfIX&>K{EPo&dMG9aj6NU5arH5o&Ob8yqy2n^VJn7Me1p&6p`SM=jnOG}K$OWlhDG z=m#)7xCNYQE=^yyVzti2A&kbVBuEgUj3+d)BH(Zib`Gopgu~MLTy#@p zZ_1O2E&(jEA6vN+5N&;fsY{yGpOHbz@@2>fUEV|_&$3WFL8cfsh=Lx8_D-4iq|FK^ z>)4!w$Fn*wo$vn1Qz4jLNu1?Dm|sDX1G)Q#;|KN=s%9slrCoOG2?^H8IW;pAN7W+< zk^-rE0fi|o(U2O1-u{rsz|P8!S>AQ8x0;HHpc&p&hC5q$a&P&MG0kOg zq?)d^rT=RK6|p{&V>bnZBj-$>8FAB2fxV65gO733`Q3MUg@@s zl5oytQ%t^TB^2((nAc)2!W{C7%7YC~2MqWT;)Gj&B>XkW91X)_cOMa5WF}uB1}>xr z3RD%9ZPx1pJXq+=M8)IK-ALXrfXCc>iuU#(Nd5A|tA|`3S^a@c7)2XtcbmK1U|uN2 zr0jq`Gb&vVALo#hD8i7!Uy`;Y?yt%q6*u6Jv8tZ)WK0r^YGm@0vkp)>QevYeumI@d zv~U^g!fXuiHI|R%90-kQ*jxk}!4Pr!M?>hK!j1Y{>y!7L)@}mWK=YpRP%>3j??b1? zmq<*O}#u+QzJh6owR>3wwI-#0I8$6?_$(M{C=k2Lo@|fNopTRfKTaKNp z{Ee{NuS6NHblHoGY-T*{nXK5O+TlSvJu9T_!?pJ&eQ>UXsWLel7PyaxvAK5rkcmc} zi|x7&XTbD)4xX19kwsKr$lJ@_{E`F2~{fZ&**-w2W+;Ocy4akN|uMJ}ol2DTZv$ z$HmFUFOX_0tOty#oyq^F_5Z2Ewp3QHkYKczh5Dd@^@*w?tL~=C}F?^_Xa?vZ0tCU z9v@)`e(P%Wb#y9Cl0Ga+i)Nl@#NRBj`&k;G*&DWp1MWg1Io85v2zGDBt~+FSm3_`W zy35;6rABtc2ml9S2UG(0;4v-V38kyDYj(dr->|flU!=o%n7%6Q@7Z+z3iRK7KHE0CLoWG6}0>kpbIFohbY;u`xA)lXDt?R)zLg{^BS1+Y= zt{z~19hBg&-YTYA<4tvsvUbuqBI($Gi`PWSPNMW^0U`M*YqUt{pbs2)dgR!bLe^7<(3UfJ$in^8~&|QG2@DG+h=2`1$fc)6knszX}vi&%Tsk(NXKDTWSX?N zjJ1b6jG7Xag%Qa|6|E1>P(x-Fov<_^qaOnf(pw8NUPbEyk)e&UgJqF_I?`Qb8(G70 zW1x;l-DAM(46(CnJy1a5w_LYHf<1)PD6Fk+qNg8N651;>q*R2O1&x@1XdRbN3^wU0 zU~H%hDCd0QcR5+7Z;mM21Y1NrfMO@QXVO-jq`(R0n|UNYSL-4yBWFk9DlrO=D>M|#&vzM08Wu+)wmB!?Ob&(&_e5`S zYxdp!an;2`ZOYZ+gfU8Z38XT$gPm(qK*m^V>_{xlJS z`vV1=1Gq#}U>S(YVGzprjtxhJg_cQ+4!bpA$ zD#IL4SC(mCIIJG>qwbj_>N7^`?;DA=m%mfIRUpq&fYC4QCSs7BP_OeN!_zCgAc&Bq zyshD4ieySwkDeug&X>r4;K9ziPT*c#$8QC>%qoB@fEEGsWwG;5lz^wA6&kdLA*0Pt zJ%Sr-d9`k^PH&~YO@abXhx8i|@z2oEYX-H~6R!v2UFlv3X8jx9(8$Y#(K4C{OB}vX zdSic!`)07C172xC2Sp4gfzdDH$^%hoY~1iBoq+StA)j%E=rhx;a`LMu$2m)+0X*9B zO$;xjJ)6&O3Wm+AVI^|W>rudnSYiVKr3-2@`iM2A7Uj5@>PHnXhI zd3-KP*=d$qNfG0gflm;4-mvzD5o)W8W+njTnzK0`#;u#K^RzVT z!Ixc^!(=LqzG>TjAx!QqJQOpImH@e5qB!ruVlX%GJd_0E{r(zozB4vYj_@S`i34wd zMkAMNJ?0pe8V2B&=JKkKviF=B5wf_L3Uu0w>Y zUFYzXayOymwM{y*c5yk*IP_Lt_`I%EwWD&0VqQ*9Z%#5!LHDvp4H%$C#OwRm~74mjV%ID$c`vF>9jm@7C6S>MuBrY{Oyz zfz?Yt{h=6m`xe8g#&TaWJ`}RtoJnSZ4(@= z!vd_ctZP`!o}rR0*BE)=-O7aIaB)`fZ4$09r8GqJ%hWPrhqB2xw5{kxE1^G{ ztz~N(`i)qplAvhkwi9N*3Ka3p9ppsVK@}Q&nyK2(%SMf-jG**XW0%-up$C73jy1r)r-;AQm!GHX&LB#$GObo@W&s{CaKfF3ldgYR4;jIq5>;X zOIEKnKPx)HQPRb^HZ?;{sl$z^n>`x*{(;S`EMsGT{LBJqbAkD5*|_7dQ1mc;CW^P> znGlTvT%8(%q)d`SOjJ0DCSZbmvuF2>;v*)Mp-aW`1IK#TE3idgqYu(S^%11kRtl&|2FG2h$m+p{9aV zHl0-+K?yINxqc!nPSWMXgtA4bit5m&js1CKSO#_nIeJBv^3V}SDFK6Ga6zgLe|Ddi zVq&F`Ub*9N&{V74Wm8Gjtc|kV(&~eFRn$fp3omC%Y9l3VfMG0Rh%?>B@K^N01@7cT z8DuvW%U2jdxD~&wD$z}V>IS462INDIATs-0$u3pSj6rBi5+Z9YWB&;TBG1Ay9zJ>e zaLgyZaGqldOS&&tKY!)1lHgwz zP1Ovij%OhdGDb7e@t?RGlMylRWw2j%BEc9}^_Z~X7YA2PwE+}bke)_n#A%UV8vg~ef`1#k;mj~f%>?5VQKP7 zwr0vcR6AMPMwgrp9j<4}X6@nhg*X3aOAfUEGm@m$IBEw&s@=o$`NVrI{ffmCWh=Kv zZ0=&UT9rwt>|C;Q@x=UQIRDt0g1X*Hv6v#(VtN3Nf;5+hg$MI48a_DtLjXQjG~66+ zF=~!vPOe2U=T~O!;q^LA)8T7HJp}rSpVRegb&l1F2y2ez{cr*xoN&=%BS696U2Nm% z^X{?E>5YHVuKjsLFLv~|pKrF{?1C~M?bv2kevRP=Qksx=@xK9_o%z23oP~vn{eKJK zGg_DShoi{9xqZTdilX91nV$zF-!2V49oF9C`&Z3^NyH^3Dbx63)TE|)zn`;L(@Mqo zPh1$FA;8WZ+hbR}ek@fEjoHCT1idisxd4E->kGFWxn;aKbLKWJc?5zeuB;I+Tby1l&*5ejamDTvAUhfuZS&J{Q~~SeWcEX-pt%bX!)nK~f)P z!NCB1lD=HZ;?fd|NBa5PWs-7+%&Dfeyv}c7t=jU30|)_o8wGO?|Dplba6oaKt*cEu z4Cz-+wiQV!hr6f9q1ERndEIsPE;IIKcDQ9P?W4X(iMeKkbPH?0a9X96@02vQev3Qf z(CQO=n`jr^X>0Z|IzO9-(%!H?fnp|@A#ntOCl?L-W4F!$w$(qq6wP z#P!;XIM#3r5OL1La=t1H?;HFqt0foXhAsNb>KU5cH*1T*$F@8DyV^KeYxMy^H6AS& zYC#aGeij6!lGyTvB$z*BhJ-FsaGp7Sf!{6Z=qpZ=-T`Tw=;g>p+-0xbmh7#LN-?DZ zp1mA&^^JwdujL@Ec4yx61%c_Osc#iEhJ?JQSs6!WN|)!05K z)^TK_&D6O_asp_I>Ly&obe*;5^HXeZ+p7w4U+AqZuXIOsZ7xkXm_C(pEiDb$o|wyC zlwpkr#zed<)mhIVt%h;qI#thUs?T|akS246gn8Kwyl?8ei%RhhuVZDS#?Y6lbDdES zuMI4A;$$Lqh~;`-=#lwz{T|`jY8iatEVgM78fS}yhMcK$Kj`ou3iBI!iYQH(;5x_r z_```Uk(A7B?>(;48{nc9`5*R89+K;GXBa>1teiX|#KZpP!Jtx67YsK5a>SW9{~a*DndRXOK*>BF-RivmfwTvDq+< zajz#l&UHY&s8sK zKGMqxDX^^uLI%uLd#fg&NNRzs4!6`HF1!MP8T5?sLt>V5_EHeQ0e{$+fw9WD}ZKKWWt0zt;*f%Oo4^?kQ~;`+UG^{T5KdN0TAtZBtV6oAcHg9Ry`3P(eEVp) zr}nz~@fWomHKX zBo)!o(H@%G)4}8Ll>Hf%D^U5lwiGeJO?49G6DasTTaoPEz=l64r{8US?VF&ct@PB$ zN!@aQ4aB7Y4~3sL+8qcEl$;$CSLnFbX_GE$n7MRuu7yD&W3+vC6FuXB6&_DFs{1+R zi-(3!U_{F$aGahA{rM<|u=V=n8PnEsaGO6ow;50@fzFrlq|Vr4Yc09L~3oPgKhaiJ<7euub6;JQ2v9q5}N@+d{?WEZ1zTPq;ijro3FcESjUM;_W%nc=c z4+Ed(o0E84=tu9+&YWHu=%t}B>K_nxcEVyquXY{U?7bW_by#$I%<0R*f1HpYv^BiV zQ`b~6QXnW3`v-tng{20v2+#^m*!ma6R=@C6Jw6FZ{}XCFdOmSj4L`zomT&04oX&b& zvcKL|(FsC<+3z}5+_S^v@fFzn)5u!A)qkA6NO!3!B!mnOq^hUtOk`Ar=Z9K%4I*WI zlAjG>`&5@{sa+6)6 z>0>Ml{~+lu*tjEH78{7>duKe`!F~g23x}*RRq+A=;>8n+;}l4=fJT z(m*J=DcK@rc^UZX2y#aUGVT^^n6?UDbk^R@zrJsqZq6SLLhzcibqY|Y4AG#8)e8+8 z`jHp*Vh`s-P{TKyu+1Bfr6FthW6QNq^taYlUL2bFtT)-bO1tDQdT`<)iUmY9>SE;X zdFYt?uToo66)w>j;(F+JSwQj8YY9V&Nnd1biM0*{R!G<72jz1_KlBek%1##Si3nJX z>gnE#tRgi2Gs%j8_b9_$9~&&NfZ01#U^P8UU8@hOxT8gs-)C^>V*u_K99wkJ2v#)2 z#!PWrV=CAPGf5=O$ks#eC#)toZJGjbylKQSi)tNG76aDZFQ z)HXo)t~VboH~- zL~xbCN6EhmV_P{THEpL5zxOO5JFee3O2#W^$Ea?%uLJ^nwbnDgFGUeo)KV0Z;^x*1 z-GQ<|O?U7L{BiaDbECjNds0w%`~b@wa#aT8cz)Vp0=8>hvjM@QLII>EBCom1=+_t$v|}_RoXhd?01T#{ z%l2IE$ue*ufsjrC3~`J6bjV1&v+1oZlU$UPD3Xv27Oj7$m$y9pqLd(HEYqHTKES`I z@6x-X~{ZWQW z5R61J5@wxPpJNZ>wO{!Y2QV}%fA7SIORuv5JumC?x;7sFiRrnaU$>?=#pv;RvD)cm zp3Bn-UcYCCdKI(UYuXt6M#cb*oeAbqt~Jlai<5s#V+=;(&6at!ijNi9*;z7wkEESkFH4KgpD!nOG`$?=6b(2{vk>D{PNH)^q_ui0%`tHmWd^% z3tM$pMqca_T4;0g!5sApCS!aVs{rjSz+C>jP3Ie_oDb z%m7m){n@kZhNksr^9l^~>TZEJ`=a9&n}(?0T~y=exlrFoet*RHpsLvX?E9cUOLorx*v=wFDjF^ zd*joy!-c@t5d9Y(AdsT5_b%{qAiv9Mhz>Jp2c*7(1dna$+LqUr|4*a|loTWH7)ry) zqu^ii@L>ll2FLfU^;)X&?ct#gB+1`^ZJzpTDsD%{-U8=pWbI9-lYPWrh@!6E%$A?o z63`G$uCD>ZIfnHckabK7vD}51n;uk2MlR`_EF0Hnir-969G z!r=)K$XdfexuN6*58axIAv*o#Te(QV3_y?4$J>0u`ML)IX3$?E{L?+|qkAoEt3B9T zT{(~De&j}wFAH;;2;Ypbf#E<3kQk}8m9SQ&v|Kel&H}5xZX#uf~M5he)ZVu zQ!AOk<=li`>hJD!#vWI+?kyj3rYRPGlFGhkFDLPxa$@sNw^=G^(C`An#MJ9)-9#H~ zfn~(Z8#jZjISQrDlSyKgNu;BAIVDUtL<=}&N;D+4JBY=RP>4~A3}_a{BM(eHNdi@F z*-ibln-ijoN_NTx`600IS-$1$WF?f39`N)IDp>uRW?W1z_NgC>_pzSKz%Z!7fCo%E zF7z*mSg8i|GGzMKkXMmIkvXU_wZmgKzLbr~NVMHZF~S~@fk<%dD%^c6{QboYN77|K z1R<~&kdhNBDoaL@{#oC08s0x`250n+U)?;7H&zJF9aew9jPFP0xJsO5r;M@r=H0`njP3&9>mDh5Y@S!1+t#0q28fiSt*hSR92@3Pw)?Utsp;8TNRq% z#`N>f0#^U%;2^9#bUZ|$|Lm=lvwsDKAo7`2;r=m{3HW^a7q|+pjt-Wrtj_L=V0;N1 zl*H!^@y*`Zv5l?e@dpJ256NMkgkSeaI*=2&St|lQed{U^N<5cftYiXo{?Xn&eKW*7 zr$11sAPou+tbY)=AZR)0yh@siGNeQmm33wL5_1ovn!B@$i^Goq{lNux<{}&rv?3Y2 zB#=TBFkwwa?ft1PDAd1G`w1Y0MUS=LiATG)Fjd3Yc-f1de`kq`OJ z-+l4tS-3ln7I$@6bI8xWKR_1MI=Xo8=^1>yyy>(%IyxD+*>oAW*FOhkhNjmbcMcA% z;N5=Qpx6F>Y@_fdKf7}3G<$s@UtE9u16#0=jzGQ+NssRsO1`~l06DwIwZB9!yHINa zOxHiA2oAs?zceu^5mWlTFx1pAKwc=;@ia&#Ak1DIE^Lmj&cK+zWM03ZnaaOWgh+%p zCs$t-VF!Jxv%iv$_7_G7w<%cb?{66%U$+q%{@Xg;zYAHv^jp)wM@H8N7Y}veg8m^b zcz1|iX#(bE@E_8pl$E43WEHgo<#+rZgyLdhuQ&ebI()jnjXx;zD#8JX{X>J`2FJ%h z_1%aSq~ki<1G_&tEwEpCFOnL4uM;Z+8&U6mrJLwSd%zFx`V}E;+K=Vt}k?-=AedNb+>CbU*J>b6lu?Vq1uqZqj`FSni zci*79Vdf&YIuW zcU%Pf9inRHZ&*`HRB{W&yw1qx%JhZ4?suBb>dKMNnV3+jTmLJ{yL9pUDgH(e;??J3 z!%tHaP;@n}&To-do*0WZ()F-ZFXgb!f3V^}|l2e2C zqlkaW!*=S|?`}o!r~X;%((v*X_Q5v@C~@wkaBp#f_+i=iGT-?D23R}(LVBN`-gB6E z)g2QIZ0rtse#^e>tl*q|)gAnJk*fY&9rUTePXSmy{17Yp>N~5Ng6I^sHov}szY$Ty zP}I$><$Y3L`364d{rtW^1%`g51m9mHKf~J6(}T(oNgxq1{1al*Q2HlF2EX-?dAb08 z@0s71p7(39|MDXJ4h5#Lfx!NO%75TT18%U#71t3HFB;&+`qr0u`rAm89K$=40JF<`G_D7*Vlq7|K_Qc8!l@!dD|eM zJhsHe_v__A1ec#Bo|9qmo3LU8pWaE>>D0y=~(OZtEsK-E3zC zdUFc@1A+Ha{=}QcG<3CCv3nhKDVLi| z#9Mqwx`sScK)zQnA@oIreaVF`$JlZ@h!a}djGjLW@n>gKgae#0l70;PQ_nQVKv{|Z zveGxW16t+0SFf#|oCiA*b$~g(R%Z<(853vsPaUo4a%;{f3%nYP{eehx2q+N!m1Oq{ ze?(Yvc*Eqt=uz_^FZtSBucOwswK0wQX3pI%3-ooagF<94YY1o$JeNK1aLfX$h1hd~ z&O=7k!u%=wlb(DbULsb=jVUZx-v$&1!Ted>$0ve+QNl& zntiX}5f;LdN#JYSfCMpnLDrT69ITEfqI*0H!#pO-PNMgLp@j=yIL*@g71b>)ETu;R zl{tQ8ynNSW3ZlVH=5KX`P?fvP<#yyrS^G(c=;XIK7mM=GEz&JVPcm5!^HhJN>}a$X zO#2Kwq6$gLf1j99A${9&G}U0TV=(bA3#Jgq1;`Y?XYY}~9#G^WrGFbv9KC&q-M^5p zI;*h}v-rr+=3Wki8$~9)hx7C{OK{%f+S6t&XzNQb*ThDv%r%47iv1Ett;vOgouNA- zBWoZoG2~!pa?Z1oiUH)XbbW4SCEZqtWbYU5=vHZ{ao3`|QpU05t5^30Nwuo%sBmle ziz&*}o;%Yq-yvWnXQ*(ey!ygdyM(0-j$PLYJ8d_u`LxkDvI1++lU*Fr9P~t$W!IjX z@6)jF{~R=V6Yfab86cPc=W}j+Za|*ph5`~(a?(waNdefGS<4>A-9Gt%F09tRzzc-O z-h|Ti9(P_qu1=1B*8{2~wcn%cArxkc$zl|)o3u1K| zp=-WD6ID@mWmw=waOX3kcYgK3h4X18U=U#hHXEFDWf_uPC z-BwAOG)GAV)5E$Jz=@hG5H7N2d&cZE22xRJk~ zijiVKlxsN(=>ki2wVa+$5+>54tAt4S7Eo0uY|KTmGp6CmJ3NWd4ja9F&))Y{`fz5m zMDf7sxztg&1w>O&Djx*TMF_zMd15%wBakR#Tl|Nrh*VDvIau2KuFxtY&llnoJoxQC# z)P0Jwq&%bFMUBF@F`y}YZjh`n!` zGmMMKeQKyF!*4j7$8eg}6ygOEsBgtkxkYH^!?>TYscnX3@M;&VR%C^;Hm2_OwkTZ1 zrZUVm&zEr7g&aO5d{>_KDqSt`x0WQ?vE9DSfSAX7`{Ook+|$6d)ogag z74N$YI|(P$Q2U59OD%}tGJJ>v=$PqUg52IV5jVdeD+xOrBV#maBDNyc3{&6um@ZPYbs1wce2QkmQ$+xo*JmQn=77T~2@9v*Xq(jvqIu}lLZwwvLgCg za63@5#G4b#yzNOtQLRgMpMxD%=UkSkuooUeict=U;I4!{5Wz~Q@^viuSZRMXRN1g) zMxUIEt~4QrOv$4ru+3+F9y&X}C&F5?qGC&taNH*%l-tEQHx@3)v)AicRGAS;?Nd^8 zbl(u{#fg$n*JR}=-*WiNDXFW3tL&vSiFZ|aYw~RlA* zX`}$zbrEEWM${m2;6L0U4)(HPlVYxqE9f;Wgswjz7BtGJfbx~0 zQJn8(iP$=>f!rZf0FiO}?6{x0ACL&A3Pc+W>iP~|U z%o5$|?NE*wxDXt?(njMSy;a6nGcZ+7&SR}p`8`%*Y5ur_Hvgd92ZF`q!lbTiAe zXLWt)d;;C%CiTsAN^H)p=FMaWow^C*9f#?sf+zdBW$$uo4p2X;TbBGJU*D3HEuYI} zY7QpsToSE`r$4sdJI+JqEskQNmnrZFgnjUaV3m{hpj%&f4mMHlZ@Y)!@K#OuZm6#C z8rcno75t4^bfCrb)lU9OI%OPU)&SCU)fl3GE2(RUvzsbd*B%JC@74QAZlZ}~)=J^u zLFQ}r39f#qSKdwq1*=_u%f7D3$4LJ`PLQ%lnsrat2ZU(QnMcmN1oZjm5PljhNB_b( z$9H(ED@ZrnVXdOPmQi3Gw~Vpv)6yM(ODFOFd51}&VD7P&uz{1pGn*(ureh6w`$zQ* zAvLcM=c#f}=e|t`t1SaA&={?3749$ns`F;10fEV1U_Iv+`9~b2v&kGJ3?}5&4s9cz z$u0zqvZOqeZKb_4-#o-TJh<8^- z={5M1?>aRMoLbRbc1mB4dx}|HD(wm;T04aA#YiZ^M1FKJCze0@c z0K*S|(#<+l4n}&Zdfblr{=ts=x%)Om0u4cKP?Kn7@=}@G@mkHC(Aq%HPq~jsaPI$I z{oy^PS&@YFp!FhZ(K`F+X`tyP;oE$I)P&Q5T)>!aM$wlNcan?c;aJqI@|@IuJU-^2 z-2tYk<|R!^-MRMz%4CXtuaB)m>tA+k0o&vTSg z3}?`4Pa?t1W#VQ}uB`^9=GMJs;KrGfQo{Hs(d$k2VWI~z?vA0utbAfr$lPY(blK`d z0s1tYfwvyK!S3m!4O1jWLcNV_Y3M`s?(aut8bq2qH0Gqu#(cyoFoHY?gGYFE@=3aAga4x?PW#FaNr4t9vu(cP>e_qpkbOK|)cH?S?C=N?yJTI5D z=7K#{_&OA1veECn&;s*JY4@UGb9uY3VIcyuC_2G7d11QRQTByFb(&Oofk3Fyn6+p% zKqwNS!EN_>Eq2v|*~a9^Qi#$Ir2G~Y41u*7NI%6ZHPI>ctMgk*c{@b11?M!ZLo)%r zch2}xZ$6z9`47DmUY>=l8n>K@`Ni!jv(;&04NQP+n36{R!)EX zRg@`Lj7QB?wqQ0^vw&JcAG3iNnttto3$}co?fmB{wKaROb`c3E2>&AY=_vdTPfq5( zjXMX9j2I zJ-v(!`reRsIwKLZ;V^iVRWZHgS-n;Jmd~ZFV&uVGF2{nQbk+kLgg-vnmkE}r?MHo|{zzYf95u8w@*A#x@#s6o>FzA03itUwqvC*e>ZT>7 z0|m^cy8sIYABO)EB&~VXHE;#ZXAr~;!{Dqo_MV5WYN4d8Ii%wVRsDPlq&HdSoS)C1 z=+HCumvL2gyQp~^x9JKwpl__bowMsNtLBvZ-{^KKd=!sAu!$SRgsA=IHn;=Kk!}k} zPzuL|M_YxlRuyYu`u%n1$4;Oj3>iHuvaq~LbW@G)u{|r_IEPLB#N3^iwJ&ULGuNf$*#!Mwhg;h~4ew*a8411Duv5d(GIkJhozkzmYqA)FqZq7g%Io7_l)baaDZYj$))EQrV$hoBHgL~k zh>xzNfW$!PmUSq#H! z`6G?l@H*bjc9{o!M1XmuUkzwUM(j9(cjL@H*KFQIIHkTW)qa0h>@2HiH7fEWXm7LV z>cMFt3DOXI*isxC$1DW!Qdwv>JotfeSo@LwZPCZT0ICoUi2dRvds36W$|QM&0X@<> zxjhYx-P0?YmP0qt&x#PLUUaq0*a7%uLm=f86@Cic@JB>y*5bCO?t+3_NRIkg#9!336uRQR9S$kv0D1Wm&On)|ov1fc zWtY1f`V8XH3BqW8V3;|VZl~-B$xtQkn$RKG{)9@;kuO>%6A5C4%pEz({!DT5c(#9E z``5^EJ^sXV&Kzz@w1@Mj?~Anp1Hx*fI+2_Y861i=zAq;{uw0zKwZ^w;N-!4A94k8h zk*w!IQDo)^kU>9EJ!Y+x@bq*7S;V6}Jik195t>7FQD2@OkW`CZKOR^Zv{$;uui98< zW$;n7bl;-@0bMAD5<3xcn$MJMf67PZUVnUw&Gk6iyKbir(Z|jAieq$<<)TcU64YFN z`TUglVc@~+>~Mv(>l_M zm|t5lL~hlG#7-O2-31=?@Y*~=kn7PT;nHy5OMKGzU7T56U`fTDCgk7&ssUOrM|C7}|+wl(ig#?y0M$dCUZsImRyj*;#$ zCU&Me=^Plzab`Ble<fU<+5Y4kd=ygT6# zDyS~YPSlhcJv>%`slhXZDK?d_v{aC)38{)2dECi-(RitTfc z8YWp`XZNW;E&F!HsIw*UK${95agBDPZSW0Drm=633GUFEPV*p>iaf|5BjH-F8iTjd z=NI{9V9T1qD5;PGRG}=6D*Z%OJ{JyGf=iI|Zdtd1s3Xcl_Bv3DWHtGZhhH|(2PX*a zY&4FX{9l5*+1OTe!9xyRml$l*331HeV^xrpR*-y?0)fe>N2%648D(JLt1DdCH=*rrFOsypAFVd9=yWB$VI~Tx?(cd3A&BB zq?#9^4hQUM&3*mzBPX?IYJ!J+Tr+a0%0WkDq#=DBh?e;cU9)Mq19tD=qs-YYx+wt4 zY*CH>MaBatp(*6HZk^TRm0kL`wLp%N1ulPaG`%nkJxdFw4C8ez(a)|N;){2sRrcj_ zsfV%IaH6C>AYEqD7q5T}r7funcs&)TV^*`DzONR+R4_~!c(!BU*=!PA?`61Wg0CSF;AyStGfB5x*QCa%_R> zL+^c_Bu;OQ(_MH6Y|DqKovzift8D4~=C`8e**u(e0(IUyu&x9fYN;?~JJTFq*iIs` zF~T~2_^zx^u$c>f*MO@EW?O#ax_c)q9~?;6e+eyK&q6{Bd-ugqm>K{IDBiHGLuj97ujHfI9SCsBXc!2>xg2CUdg|23sP#x}CNpX9-u!S^x z)@z!kM3CF-HI>~y9OcsfhD=Dv*r-oe)0^(K5T&A%A4Z^Fy`;f*{in?|Qh*JkXG6;; z3D-T0l;k7BLy%mhaW!yh!YJa(x*Tz-Cl~oP`+9Ym{taTgDq?zxgOmdyLmX|jG6$Zu z{l3pb=2(orgR$j`f(n|KoqhK2zc2hB>21ytBv$kLZ^7j_L7OCqgrg2xnW}NWr(SBZ zRn>n{HA7KeL%C!!R$jP1kI|s|gW_gApL*pH zn96squZ1Jp?(AuTdT=;0pDwso@$mEXV~)g6{{9>b;CC|u2Zlb zwb8sIM3Y6vs(LqdR%L@RuK+Xm^{z&*P$WfW;KdqM)hbPNMo13)+xs3>v5;uAT5f!QO@i$2=krlawvPuUyV#+(euRyK?1?|O)kLuELkb6D+f7RaIQ&!@ ztBEr|*$#i^&@v;L>gaG}UAkfSuT*v<#U0z|YK#IKBeX=@wW}(Taa4#o=w4ef5aCyH z%?r@z(R}^Yn`S;|#-`>xLO+o4a=+T#p_ni=9!fcjkRiO)EVV7|gO(=sifK$V2JwDz5a2uNt zt&PTk<`OS9wA}&Hku+x?O6?Xedkos4PwRu28F0`vqT}D1c4?XA9C9L@J*Li{MPi0tFFX=;jyk$7mulvM2&U|`Djopvx*YT zSle8vDS^vcWg{P$T4z0Gp^2vArMGyj?3m~Tm9kOtvRri3@GBkN z*D{AwWU9ga)~=_V0v=Y3XtjiBe!%JOJHdx_K-^BWLiAReJ?`j(^=0|ppvTJy$&#K% z{AhyMO^8CvAtya}0p-?VB8zp~@`D)CC%P6l=9j6ZRRM$JD`>iJq-3uVWVdBAqF}JU zfTWkzPu)~Z4RWup*Ss37L5pCzex*$zhtDD!Q~oE(YYea9(Jhp<$HZt^0z?B5!)bRO zQEvkR2->aa_^WnW08{>SHzs_$rVi+Em2H17lPU;R6n)T+l4O&~Nrn>N`H!^9eb%zM zTK$Q`>}%xa)EhiDbbZflVYZEq6SKRg9XqcPLtJGpt85zJ@fC zYf++WvVl>T9_$pGf`MVUXSClB^9}2=gEF#ckBk@o!wG_MrLKf~8HAJv>T?ZVC;hj$P#N)4q7N`04>FO9*8)Fw?)2==r6{bb;SSF_=gu@6 z#5Q)DHXMk9({?)R%rCAHINN_|kNMYrE8Nvr_F-p=7qj?T@1^3FlXJbn`O|BEvuO4! zZw01gXX8&wn(S3$aMtYZYVF+Z(2%8X$ObG2#f3mw7)e)dKU*(w?Mxn@uoy)K(xSBI_C0RP>^yEmCzn26LWkh`yg(2j6- zd*sCOVQV~a*Oc1T!T!i*=yxObD+_J)%;E3f>D&CMwnx2p(dV83t^Ks+_Rl*YEM`AL^ zG(V+zD${PHBFyfG6EW}i-X%!d)X_deKi(L^Q97L5OCB=N^OC?Z4WHSgmefEb)oiT< z{1l1O!5rjjMU?cF6GDZvZ0P(Xh^K-I-M9V}opZ>(#IRcPw&t_y16bjlMrA-TE?<;? z!K{91Yfn_TJ;y?5!VxyFinB}gX#3flF;eBwLMZa|W2%UYGAn-;i)ccaRuzx#MM(eh zvrjUGM4CY)t1-@28!`T z6e)b?mXNC!GdY<2m3zHuPMKsq_X~vCb}07_S%TN8+}t=;Eqv|*$#$Y-scFP4ho%C* ziW58}DLiEYbB>RzdDhGr9Fk<9jWVOb8uGlW=qf2Gqa2!|^6E5Lnj|Afv| zej0T0<0>WcSG713&3g7}1?)o4G<0)e7x<^LN?x($k(N);Bk|F}99_!CVoN?yV#2fE z_{1-EMziC_K2>vqASPA(1IIU=Om27arA@q)m!^D^F};|dhGR{33sA0cJR3qy`bP6Ombz4$ zcc@wk!#(z)ryGojb9+_%@EDSX+7FezgWgVp*LuO(Y}#xC8x3~ z)&-l_L_?ADCxlp-{a)EB2i9aUZKvIHihFF?6I*2T3ar1+KVKJjIYmT8ouNC=B>;C; zq|VRf6Z-7Rt8v_NHQk^KxIm|Um`ot?qamc(uWZyqLQ%r$sPI-c-&_$TXD6_I&LXt0 z4`lp98cp!39rxH(`uJ2H=1|%AV<}Sl3V1l1BU*B_9B@W7hN7=M3{BAV6t^2L^pL(_ zs2sB8Dt}-AdtKr0wGZ7d{nEnF0i5HlsWN!NC=h6n$v(8u6x1z zj4z@B-oH>BJ>eBxzgB~n>g(-~bg_D7g!QRzKQ-OkFbP3Hs}#p(C9|jI->;o%U5)JJ z6b_TG3I+!j0*w)TiGbT2aEZF;u%SUx4oU&2pFgte*;VjUWk1b?zE$x^PxO)R6Uo|m z-p@2TlOwK!#c{vR>#7e(C!a9%++Eh$R=KB-)$oi##CRxDJ2@dorDf4}DkZVbggdYX zv-2?JBZ<jlasj55f=8f=7hx1e zW!4>G+PLAa8fzrk`CRqVv@s%F*V4Ejh5xE61Fs7Cy-I1Z%sG9~@UwBr*M%7uR)4G6 z8^yq}b4jD0Pct>Pok-qPlv{(N%~OUsUKE^eB@o7rTQX5))i`o{b&mVVLv0-Q3DZBF z)$K(RIsgs1F!5LS<{GV)*`2A^>PNY~p5^c-G`}Kng-MMs%1VYL*5xlUmOKt*A&v}2 z)^PZc!B0kQ&58MiiK0I+8Xue#MGKdp`zL!)>H3OR8US@%(M#)R6}gZvn8X#+{v-oi z+M-AWOpc$p`Zvj4Bo0#Wh{Y9uTqnMq=JKc|C3Qlbl>qxsQ?;~q6Gb!Zn2#}eVZ6MC zoS{EdG&iNteITrEX2FQbg1lgsOk7xqMJ+~5n&h>9!7^^NVinwsxEa(u0qlIVndSQ+ zc^p!{v41%dxnWw}N)NBur4?`ZqxCynCA!wx8B&&EC81v`L}2>%ip=N4Z^x;3VqIn< z3o`=2DNpShYphLWI5mw&2(cJGD>h1MC11qD$8NzdP|cthJwkyWlsRMl?am34_h$yc zP*Rv+ENYJTKGJ3=wfnqSxWHC6*jsCaH+1*b?-rfx

A~MTguh+9hB9~<&>GtaFt~_ELM^I-?OvMclx@d6 zHh#6eaxK5K$73Kp7!<$Z*FO&S&qrYC?fi6&f9Mh*6cZ}?n{)jpMO&$R87A}^xrTTV zdyvCY9S?w-*&py-A55!9x7O4YBvmdNy7DxbWea6ylv9*!FVohz z*v{=Gp*i;Dkm~nvE-F%` zgnyskQ7tnj zn=ZIE24s^imFnpZ)T%0rT`%aXNjoumUaqp+M*4Y!Iw1bu^f!GPc$z`=88%Jn$ zlU1AyTNq|O*|9Eg);pUtsCz8uH~oRI4hQG>TrKG0@tJ`N}D81f05fEGh8jxAA1<* zVNRq(VIS@;h6hZD7owMCSkNgpeePqm3^F2$njE>kIqlDFu2El5#;9dYMj-heYp&fb z36_n*au|7XYFD(=%9cFFha~dAMJp_oh6ikviYbN$IXJ_SzB;Yd@=gr93`Qrmk3r$E zdvbmsfIqU}9*DXh^^0bFC~CGMH0%6{iJ=}Ol|YW24pVj2HeIw$uDVfh7!OCgpFaQT zW9L!B@kkzAV9LT0up(~6u|Gmr1-ZR^^W<)NpS#o|gpjFej(j6W#8Na(^=^K#KP2n z-JuyiOGZ1+m*w8=HX9~5w^7xS0}JYFTB}M33=o&{@WyKp7$frH4Er%|H%Vfu-uC;;G)^tuL?80Fwy~XZr(3F2ws8jAK0$SAtoc*lqKhj#=Xr5V z6!Pog;+HfdZ`{|}Q-X6E<96#t<>yK$qIf(A_$0KZC$LPx{JduCbc|Hml*i;T(trLq z3Et0mW7l;jr!8~dI9HGg5rTOX<9Fd4$vT`lC_92krWGlBNU{3M6A73AA+D`A4(P4c z=aGsBd%Y#7$v$@E*2vG8Ct#=7x0NNHh2i(g-u@Ag^1^i{_68I((Sn#2F~X2GdU1^- zk+cO4v*i>rnKv4*n#xelnDz0COp^jZ-1$G7gKa8$eWrsnUnbpgmfLBL#&WB#dh3om zD{;Jycd9#RPON$8(M6m)kw{B2E}V+PevVJ5Iga$ zj@_)vB!1+_%2V@!O&A8w;C3!^HgdOYf}@($UFsM*#ozQRXJ%p~K$WKYq$*C{7?Q@T z=s_BDG7K}`ohXgP8ExF}LVIXsj;A@6*qh8R+{s8^+=%YyMquy$cHF%uf$)a;)D0vLzy7!(H7cSKx+o=J$H+v2?N9RtWz zc3Ou?p`%;9~dYgHssShFpMx@7y*+FS?W8t)sMNt0~g zR^;UeQDXUOQR-cPq6xCg+(!~Pl4F@<|A8T97=?Os6Z!3wKc|}XWRUg8N=P7GD*8eE z=PftWm_7A-1dsCdg8Wuc)RJvw1nl%^+2b_+oUHHOZinIiF`JHI1Gd0N3`5*TYYv=F zpNaCehVed2X==wtZucIJj{cu2DQn%G#Vj=ddv;564I9GQFziFu1bWKR*L5PPnlSp* z#8;DhydW*zV~sLFB?pLR)PrUt;>_FO`s=Cop^3(?N_q`|GNJpYQ;iUdFP71%I#1>a zLG6kwb0EWh-S77wSlZ@jztT+}peFV(w%;A1%Wuuf|FTGE2218_)izvj{hFlX3~8B} zri8H?1N_~|S_zoKi?Fw)7bEe7_NzmIlH8cvo!Ni-C@@rWefq@!7#n{@VTapK_<(id zRnhkSTU}~0hCE$%q!Feuqh3brVyH$Uk9Vc;#zTnTL#TzUnHWOq$Zy zS`=ANQn)UG%4g&H2bn2a_LPp}>S3#DF_OK*Y@(*kIzmr6jl-J=j~Vrdt^vzjuXmrR zgVC+$(qZ>3$~Nj&B!-Q9VX@1*UBle=;{!nTWK5e_baUA(PPkQIVL(pOQ{82kM$J|t zyA&0Z#u*-&@OHXP6?r=N#5tL{N!+I;3aO03kpi?w<=B4Z)Cp^QswPCfFHqe@YWUsl zL;eWO&LqLAOL8NAVz*riu%2kJ!YzUvztG+nKmn?DeK? z+g6NneaxpD!*|U(5s>t_Uyj{{!=dK->M=g2x%u5u5pJ_tgCZ#D7+}v$zno*tc&E#LNUlFyMg3a@el$lB7b$S&5x z(eh{UxnOEgJ4w@A9}D;;zA79nJ3&8jA=FK7)DVU~Z^i7R=j*0z#bX$_AowL>kz*jh zQfeHV^j`|Mo-q6x@)x)-7(R?`GbRX10XOB>Desb*rMaH2tPoc!*03|rfv^82l_MY# zzeC@VKIuV^A46cT^Y|@7*69($1x+qi!dKpUY>TGRw@~qbXj5G~%ONx^s1V7)@4*0k z`3-t)o%?21#9ONn?!gM?01@%sKgZq zyHz<3!uj#1CA6L}u@4$sSYK(0m)%M^`c&}*X)8crDdfu^!cc)oxQH3+%|^eBq6It! zVM(~@mkv}FN~4>7?2)Qt`ZLNV$f_QYf1oVE*%)sHA$J|H=EKs|u9YcAVveKfb$tx; z88}*c9Gj~y%Nj2uc4E3Jbh@c@Brg>=rBjdMZ;_;HzjB5dwmhWtPU9KKXK)NHQ;O9> z%+!CQE^%Id4v!p}B)6_1-1DnQZ5#1J4ph*>|9L^k`HB0go#xkQ&?oGQ`8$kL&K+;m zTxBOYg$rNvJ&7j*+3!Ol1~&R@#)j9ja2@1m^4Z&veTRrdnE7veX_gVfnW~;9$H3n%5x!_H8ocJ#BFzkX%Cq@};j)+Kp zTyEN*18AUznnOqiiBP{CYZo#9PHg?LevXPkp?HH%e4s=fz^%k^bK@nmd^iDDbLRh% zqm)VmB+-7H95WoKzg9k|x`dJ0wW8^hK zJFUc^-0|Nn7nP)L9aZ2+@8WI7Xk6yJt25fLPd=5h2E4M(Go#FcGl}tyX zAz{3=t{fy$H5_XECE}JsfNTFy-b^dii8*_0Dq86#z(%TU6V0C}?|>j7B*s>RtXy!F<93Ea^(W@4t_+y%`&gF&0cJ3&q7$5+SoW*O!cmwYz zK%U^NJ93ml%dar#Z*+@T;<||ZNjV0!wu5moaZa#{gclo@^l|C_1o^n3~-q{O^8d>yNR2Jq&E~XvPO{QLrOv!u{7Gw?L@4a}1k7(i8 zx$J$}^r0o{4szBIGhR+T20^A3hmn(MlL`C$i@~sBJ>B!acZrHSOIhS%%;!BwEXQRL z6x;{O#s!a^Q><^cZiSPrm%%%qmpco`N2z@YbA8Zu{@(X62y%&4wQCLyI^S6 z03QC3NR}gui>tcK0*Lx`Yyz5C!gO#mEoIH$DO7Oi@EECIV!#spOj(GDnXFT*_zId0 zdH2Q4NfZ&pm7DU~wdSs9G$q^ONs%P(CE+O|h&mjlR>wkQ=U~0P<{XrD7wBxJK1)L- z{D`$(uZm1CQc4y}6Kki);Z@io?(8DY#;e%6B9G@tkLs3i`%d`o@t)|huKRe=ZK6hSzV3j z9Cf>J$@uTz3tMxysmT^FbeQ2)99UQr9aa>SVSb06Fg)bC`z-SC>3GKb14EDe>Wq@o^*FHWCFy*Vt($NZ?T6$rb7i*vYTHsI~`(ndeA0^=)zG^Gt|VyxsXNZi#bzIEoUf?+!+|>@O}u zZql?)lip(TMY!1XM4rQR4AcS|vmWzwx4LYReA~-S=(K%Xz@Q8EQLw2@)ZG z3e8nK&SpE=V){8>X5{3~67P!Qc_Rj%&5;G{|FR@C^21bp6IRvTxCt30sgXv^QvoO1 zVSf+dxg}C@2{?JJ1W0iDrC+1Ygx>@%H-w4C`f&GfZO@ZyvnxWwhLn%w3QtxXovf|+ z>1Rl+Y8f0j?YKCb-Wvd_7)hEv!%l$ZXtB(8Ml;%yu7Z;1;*MI`k-7TV&?0? z$);mvv``XlDkrgxLD=jBJw@<&0lOdrF=Ku{5f%3pFvnJ$gsOkC3@+cFefZvKTrf z-%3%`?Cf--J3v0IB2%9&6B*A$iZ)G7OSnV9w{xDDnJjE_zQA}I)D^TzVpAtVUvVB* zw^XJz^P%1ZM&sUYF`ODE4Yvp5 zPUNw!Sac-p&2xBr5!WlL=7`}&#YSZ1b`V&zzOiod6MLvhmsSC{UdM6p@;ThTu$Jtg z9sX`d#D6jTrh|HoyfQy=mj<3p6d@%wKr6xE$oxoz|6J%jr3L)MDs}d((E@mBwbhB!**$J zG$Uc&BJTvo?p+gg;mskKq%eNDkAzGs`-4G;dG1g3Jzki`L0n z(VtRKZgs)#Wbt)E{f(_RU=Xak!WJBQv)(^RNd%w8Mq2*N%t8C*U}L&ecR4UHI&9g%HTsk2gc9 zJ8p^d{{=E9&Df+K0;}unG*!tD9X8?}*Xw9yJW-3i6Jb~Sw7t~E_-kb zC>FRwfZ*J1#h)r#u9G4RGkowxV&Jz3ZpUCTF>*@u|$!C9>Ys-`7S^>bbu5aJRCq63Rf%OBSxc z*HXc-_-o!^*T7ADA%QZq(`W%fNAAX$0zd}jMqwx=+M@Xvfyf7=UQlqDB9<*VqY6D; zLot_}kxbgnj#97ebQrv21k@}!6@RHO=F^K`;pyUd{88ulCQv`IuV_l{Q4)iar;-A- zLQ-xHx5eIc10Qlt<|XsfcLq6WggmW*R*)Fuc6 zfi)`=qbC{}WM|5uS&i?*HYC;-0NqV2H>beZN9Qg0%%HdQrq_0i!IHlPBwefWOIl31 zWHB}fxFKG#<=uRZE(*{eRq#i?I33LIvj#sR&~VFz-~#;t*?aL=rgojpT~=TNuuTR7 zP)r1s5|H#eq*dPc0}V>L0BQuE)3Z=?*jw6~VO?A@Lj?l8K+TP3k}c~%qupWZr8k8E z-<|j`EP{zRSY)!xFyC%s^uaaL7goaS(mnhPX|x8NV-QDYfp>F)&{_zeEbalwFjtK* z-*tlGmV=Fb(ahJVpPeCraQ04OzFCsm6|$V6LdQFy0+P^mPDfKg&6zFOt;R>XD%Kfr z4Hk7kUL2Y=*sz{7&$E)$i!0>fnFDdA@rdo6Y2r3H5OCOZ3vm|UFzCtJS^~fQ>}6+vrB>Co zwMDhUt^E6{k;K)Pf$tUo^{em_*A%x(UN45-=^6dGQog-s6>}RB$~Cv|_@Y)Jpo-Q& zJCt0y<00#QKPNT9_W*jO#k*edEB?n$xsmnAMI6PYlPr@kv${GTT(0peWR9*rv#oRR&flGQkWDkTIN8gK!jD z$~DASL&_B<@Cw-=4(M$Q?u@J&LQhJ~lY4b|B2uT~vu>xsy9v)(Ws}Sp#&-i94Z@rfd=*7f zcI^+%Pe6NBiZp@GaO;~-@ZwdlV0aI7n@>2b-vZfz9SMY*^!kFcKK)J@dsq+Q3g-Z? zY2Mu&vziUKcuXqZxiWKlM!i=KG51Nl?*Tu-Z*U~3smIYEeH~75mdj;!7goZ9q)}i@ z7FS;CE_|fxp@Lr{UqZRrjg9#&*YfB&-LSpS>dgKL39y{e;q~yu$ra?%6f^o?`_0`&s_ucai`YN@$YCPGyYl!al`kw zkS>P<#Oi3Y+g~ZmHcaYV;Rrr^l8NYlyYI36`49dam>#eaEHxFsCw8^CGx`z=;KP8Y z(cy5!dgKM4=v=G225Cv4EKWB&6DZn39Ig{93^f=WlKs{sWoOec2$#sv!IBQlumn?q zVl8bYGMI}&Ab(i>L}jrb9Tfrh#Q!FS@xLb+4sV+PnZTels(bkkshw!Jvq=8yGzN7h z&v{;g8P4YMU$DBT)QkG#T02M2o(o~TiP%MhuV6GY6;VkKO@23!1!;_Q`5$QrN8uK8 zF*$#kBnac^yqDk3zR5#JXiiCXQC!OZEKNU>~Jnuqhh1r&QUhe*>J_89Kp0h|zY0AQ!gV z7CEa-LqcV@)zc#ZE1YE0mOk8xXm0JHJOcUKN#ewm$SO|{WQQtWxwSM2dCgMFkesol zA9|tk){3@0IoKGH3LC`C)t}<&7rePZI8I zay21we~A3@vvYc4GURwZw5YCDxIWir6L}J~OCR~ z!Fh^Tf#1G9N5dTpS`4u2@gSzVWW7~DnzXj2=`Ao`K$lAc`tkx!H~=>6U{e#7BWCl% zQSZbvC1>k3@j%Lch?2YZ%+xCAYN8^n@)v>lB^#e!19v&$L8n1!;fqo1`hC%Y;Sw`K@P1g^LDn%aFSICiP2UZvW7U((n_iG zSgQY%xmHTCxfEhw9H@Iv2+HN2gPSAv{CK_?%B)nK!f>{-UR#TX#^Ka77q9ifJiutJ zgKerrPT~5F*47!n5qWeI#tIGS1?KVPqGDXMIU)Z*0A-io4YkHD*HyzDz3jWU!~4n` zMU?^fiv9+l6IL=l3B+h1~k!e&_yXj2xM27q7)i% z!3Ent#6>qdp{~9pu5+nD-GniUaG9Py{b$If>r{Oa3eyNYDXyK3Pp)5KicpFf!zdp~ zv!w#GJotgS(}E4kO#s;SVJ)MK5eo=_??yH6!ChT@r9@7-LRc-bery_5jY}uC?prF_ zn48x@X*vQi)mt~BHwJ01xz&_|k&6|4q;Z=oM1ZyEKxyNuDs7ZkC!CEuSf`>r@uc|YQLj^)(ZkZMN~8j*~;ha%^(z<#zJ zuq-?ugtRTmpV(g9sPta(sb8s0`MElWeDy)RvbC+<7Yxn&H4CA~^X*R`%Ha6Fp4j&e zs>FMJWO)&7X|b%Os+nHgqRj|!*_6=&XB9d& z44jm`iQlcYaR`$)FfA3Jha!D=It!#7)|0AIc1K%>Y|cd{C6nn{p)YF&xFR``v#=(s zV=nNt6vtJl+)jaOc)9L#K^V!AC@T^`)8t^F<)T4$-$wAgI$2mZYk5x~L!y=93pHk9 z89pwfpoSV{KR-?Q87+F0{Y&<)w0Ad)53+AY%#CVL80q9eHH6IyamX@{BdP^ZR&eXX zrCwe{-;Z87aaLlp-qyK+VME}ncmO^QBl;|GlOWHcU#vN$=l!|RrMJbTs`Z249+M#y z5!`X96G>UoiFCq<^pohZM$Xu-&{)L+6{m~DlIV~kgBBJlAg?`)p_l6rvXJpp0~VKB zv6-j@!zV?1 zu2jvT8+1pW4M)L&?P~X-T(%Hkt-Ll3;)G0Yej+xzWvvm*u=)> zIZEd%jh95t`Zz=fitAzE5T_}NuMbUbJ8VtCVtbn!h&ZhWF?Lr43s6vSsl?ux(9^QU z|H&TbqaH;N^%OJ3|xItPbfI8?zqtkSG&%a=Km>W(Pd+H`S6@H&>HQIi?^~G!} z1NOSG)vQe$}saGp46>X{*bpa$vW26B_j|#<|P2DCFgLw{9A)2{RX{{JJWuq4Z>s7Y^!-f ziZ3K#maiboN)eUEYHH9XHSzOFs9QU4H{;U7R*NruwmFlTCcJ6(A(yyNh;*MkucQiU zG9%Q^)RoaN#2@+%rtM4CSS|@A-NL}~@Y-Y0%UCUduNu(r1|rE3mJSj##eTYYq_aqP z$ahW#b2d#cUkJUQIV_|QM@DJ`Xt@B%VP6fTvL1TKViaCIflhcA#9-+*ExYksu!2&yU>o)R}SVsN%T^y-Ud8Yi-b2R3Ck2N@Q$C)R$C?Z*JtxLJ# zuITtBze94XgV@!$tFN06Ls!LKWdfDIJKA!v&7N(xZ%KKf$3C3o=(6pZ>mb>C<`_Ih zrHTj+bgJYh&C+z_x}P9rD)|gY-0daNL2>$$3+)I(o;~E=g7_>==y5Ep|D;3ALZ&-@ z_sRuEO___63xai|`5L6lAIg+uAZV&&MQ3HYMOkxX-rj#x_?OeRO$VAgsHu@CPd2b8 z3UwD`oU6y~N$>|)nkoqCb|P-4@R6Vf(l{@)Fo|}oy7dEo!I6<6n<%wwBCATJo__@x zeYg+FQbB+e=?UVl0PJKUW^3@7JuU2X{U1hY^5g0|WK`Y_*e7i<2o{idhtiVzBRJ`J z_yTCXCZ0^9r4U*xl3E<%?TW|WK6PTHu_jHpa+sWVQZWg^iIH9m=wriYnYta7oAp`J zyK!0v9lqU19*K*RKSI^Uhld6SwkB0x%Dewr=yP`pT@ib{}+ZL_VTgy`;))4BdD zm<^`8ifjpP7k|-p8NgrDlZ>C|ZH#XUlo*Ak)c7$s4&oxvrBdR-Z=IAm6>j9qPbkQK7bHE%#cmvFn#61KO5_dvMdvtWRXm`&_+?^ieV zQ}vJ)TktxB@Z3UtSGN}g()9jAe`cKcnzUz%wqTSaK`Ckc9qiQ}TR*QzR$HD2$wF25 z<2&f#z1g)XkTs}&5=l431aE2p#?kbtl>JD?ugz1;avWfv!kALP2BpK;RyRYw-*>n` zvc3y3{bFK@R1qQ@9OKx7d@_u&z%ne$cTma)Q9?~`qzdewiapnOXG7z8)FMkYO@Sq0 zYbLU|$GE$ts{rYw#MeSivvX>hzJN;125mwvpvWJ@;rV+{W!juqk1fViTPwb2SGls9 zUeWJjL+6%M{*KK|pWjnzz5k>sxFD!1?wWJg-1l-Ud+iX4q>E(Bk((#YaR<~QEwC{M zNpX=&{nhSm@8$(=q@d%PIk)^8ZJ=R#3mt_2J{%P<(cK#DNW1d3UtI+|!c8UZC(vTz zN&GJplJ|3~NIJn0+Ecjdcw`vk)SN}AV|U^jO_v-8-5eaP&wg<#i=Gq`2t(6oADzp2 zs7FF@&PMrt(G2qSyTXgZWu@vlL= z%~=bmJ)V4t+!-NXqlg!sB13Qh^qG7x4@ zU|#?rTp(LD-sph7>xJZ_9v4liGX#@vlL=%~=bn?lK34#Wu&wwvmPlCKeDW(FO4+Cawky!cw_c z-@&PUQY;6s`EuKqowsyd#9k^-;$@A9H5H00;NzYpQve==Hyti(HR#r;mzFNR&fOv2 z^ePI=b65+gXfPHeV1$8F$4T!E=In!qjOoLcoN|zobM?LEKoImp=+D$6Xl6KwSv%k8a9z4}2o+RxYM%5QGN?vdA6J6e?d^&++LnOK^bK_0XYq+jS zjD1)!D^yYJ{HN=TkXdGGdfV3Oabw*RVyMn~7r_QhxM90s=p)D?6(~$MDupK)ZmPg! zsv287a=$uPDV>T;{GVvS2GFQBrAnj5^yH}gFNd9_Qmn@OU5sb1G2Y^|@Q0AmVesb= zr96p)Hh zn=37|=0TaH53-J-ArB_g zQoVc7Ydl6u2f7X74|Gi~$fFLrjV59B5NQlcy?bq5NRI<)6KD=TugG+-<_fVJ+)U|e zIYmWAD+jA)*arW!{hDDA%GnH7gf$W|4k?5L_5m52)6+#+^l*GmMqUo&OJ2vW$VD?PTfdO)>vy(q@GaLZUv6V>F5ZhgBe@lGlIGk2J5h0q0 ze*uL$@0<1(pfNvYb722SXFQ7d?0q_bj_>P&!6vNhxli?GN{cC=dhp1)l~48h)p_-; zHs^jMW1I>y_es{DCYD8hKS^^+?vfTj6PmOVM^%9R6LWT~l~oUstU}-1cFzjpu3(;? zx%PDjU7CoB&kK92PQ2UAABjV04Q+33F+Rct0k`(KXOHYAaGlop7{7g3YgQsdlzfy1 zaqZm2BUur6c`an8zM_NUd+`x8t-dR`lhGqg0BmcfP7gCtF@(yoVdlu9~(%aZrdE&{Q;C z@kDbS(laX$e_n*dYVb}MgfJv1D?D=BBcIm?JP;wBOqs@^FYkD*#c#g0!@pu3PVk#Dfg@;|u`?eHeqr9`G|p zfy}JM&?NJd3Ei%HP(?8BInW<^cHLAYxBFt_S)nq%%XKj*4{@kd*q!vZNrEAQa zY&KcBUcAQ1$65Dy1yuS(iBS0f&2Q1v|MmpE{{pAE^yyN#?tsj?0-GUA0Cg4VZSNa~c3;6LqnRa&to} zv1p-b=Cdr<+I8x)s|{yme%6xiLF?}P$;;nFncTH7Bo zS~B~HOPuX-@L~boW=0q!Or_tg_CEamYy=xwPQ&Y$zH3yYP3!ByvjsAi3^)0%_u?9B zZj93TG9*m(l;|CFicK@?LVqt?Tm3}mwh*Z&{PSPOPMCNh)LyP(-=?rGq9a`_|09sD1 z!5hvEI}yH4?oTwws=`Cs6#73M=x_gF#;+D?g&y_Q%b@s~|b=3_(^PaYuTxhj7i;Ykv- zum6*i=oq$*9R4t0c}rI*0KwIx(ID|QmrsOeBoy16lGY z_crsD~KeVwK7TMDy`ddb6k{=grIJ)VmD?uh=Wx6<9=Ir}En$AIH1Mb>z1;f;JR2gWdP z(QY{hm+wQ#7aNc7rfpPD9SpAmfh`aE9Pq0GDgg;TSuddYk>G}ew10A*<=?csmvyCRM zod#x@H9~hxr7ErK5)H!|{;7oNyN}@DY1_G2e=)s2|0Njc0OP-6eAqUK%OAC|kqL6n zopoynQBIIbSNYJ!0NESJ%vnaKHkgY&ys(o)XA%UG`YO-qDg-?ryd5RYQcKGCOV_ zIky_GPh~I_5Akt@^<|p6nDVbFw7?uA+F_mVTxzq=KR_AJ0uF^9ob?GPGZ+26goW1V zrf38DRRwC+=zdCxQ#wj*7T0}_x`WMB(WpjN)PHdxYi`wF4Zl=s20fl+IM9!pRE*ut7Dh>2|d zS8j{B%iDD?zByqOUW)ea_z2#B`>@ zyhhQQUqgPo;suP+)mF8T7Ept(+7(V30mlC0zdRaT3D$#Ae1$Fysb2#vCW>DU8^!6` z-ERozZoQ-#gpn|~;26S4Ph#n*i9C0h2>@;7_~PZ>6y@P^^(N(&D|XTs6IBu%Jgh|} z!8q?+j*7A3NvkYflU})J4H2Cbq&Xe9VG4jbng$}ocY?Ye3E2ymg^%&&olB9M3st<3 z#oB6j#k6fB2*4dM=4$nL9~!h?|Bgf#Qjkv)Op2}9`9nwA;eO5PBZ_XRd>eCicK`%( z!unJbJ!SnClXfv2{Oa4r0P#h{EJkK?TqLmpuM1b+YGQS>gtSqo$}wlA<8baKFlG{- zPUbEzWH6lio+HEIc?{wzr{~`U=QPDHl+k4{AclDMMRO#B{ScyQ*mhyrlTkbIVKbRR zKGKO`TX1JqVLgVXL7A1htBT@REN>s5s9yg4!rtQCO_4A*I2H`PK5`8^ZyE4M(2P{T|4( zyC%=uZ*v3edd(-&nu^b+hI3-ycZ-UonzWm`R-)qO{vITQ+|9#zznIvS(S9N_P+kC= z6BJcpy;xK2;YNW_%HXkOF4)Y2)m|e* zn*_$9=$x+7!Y6pCL>w4aOVn@YA7+J?^1f-<{3^>=9M@Z?0%n3=S<$Yvi0z&znlKQ6 zjtp}_jx8F51_Yg-wA+jV#xw8Hd&0NDfZeZ(gtl$6!8FNOI?3A!m+f1^)>KxL4%l&V zV)2GfZpu?r{|pN=SA`ywUz6WsW*6j!rXjYrUPEw-4`4 zuM!4B1@kSQ^|$aDYxzcDDAFA~f5 zCT<0FQr+0%c^s_xeV8C!&SVp1tr*s(>|zFW+9RQX_pDicfJom+bMpgNh`bOD`lzR< zI+-9Lhe#!H5T9m=nPNr59lE8 z;Kur}IQ}sW%YOhbtQC6Ed^Ws5fllmybCnz4j7(;Yufkuuc~P@RMsii^6}4ivsf+6N zXv69)P>D<*l9};L(?+U31NiYcX7C(x&Kb%(HtY59XVfXmb2q7r=ZC+ISPN{fn&=1@ z=D0Aoob02ODu=^oSd@|+d%T|!t?_s=ego~T)3=T=BM?B36y-?YE{shRtJ)b-B)V)E zw_pNwfGwr}jg!Rwzj2aSm|6c14e38l5<3&;|Aiy{Kb#~EHddzpUrth+nX2yk3Y)AW zG?)kV*7i1Adlx1`sLfse!1jN|*A5mWQjfHy$G`BsmDS6))3<9V$doq4_PSwn>k^f% zsT8WehGq%}09xl-WMN^v2Qobd2(^m4PtiV+5aFr-!GfZq;_`BJl#|Ylt)rMynjgU( z0XuT*0HMid@1o!X)5^+j-5mi*<>SxYPg}t-z5tB@=ftY=T?I}7(G>OlB^evf*jXDp zpN4N{X=?^m?kkB1y5hs5o2JVSaH(Hd{5Ai`p&JBBU}A27=-|@Q0g1Vi1!jhGh6D0S z*vy(o5d?1p#R8>^v7G`UV);v>h?-wYQd^*~ zP=a!D*X*|>_COAMFTS}=l|>@q+5j9#6=P=RzfZpydwYAh6MFd>I3fub2%oIJrwVON zZs0A!xRt+c3KIG7cXcD}YZ<*Qi|Zh790Rv>z+>8(K-bxS`;y5719f6LQe@~jI96EnFWc*5E0{7I&u8vG@j$QBan46v+9KFZyeBCz63A)Rt%FoCL zuz&!Yr?U6&UgY@SW|V9juyYxCSwTCYt9h@t4Kx*{f%dqK#tp1*zt^4Z`VJa5@&eIQ zAONv&;Ql?glN`R56%%T0b*RkQ3usfAdZOEk+STK5 zYp_slYI1c1mX7{5xXOb5iJ!(hgEIsH!Uq!cK!qLIE&0g=?3$nKp0r_j`m6_E0h^1n z%L_Wlu|a_Kdbbek# zb^6|YQTcY0tk{(=ryiRb0X2kS4YmM4a`nN3F8>NxTp6^G>Dt;J#o7j{{%+0%NMNsP zZ+Lz=Z1oAV{_QJK{uW50%ORuP4lIpIouR-8@OXCUYHpg}oP*uW*aX^jKVnGUxOFjo zWUqHfi#xvMffbyc8vkL~-K5Rb+yu_a2ExM&==kfv_m;NPHu9?uYq*qzqLiGF|GnD& zg-&K~0m9tU{2x=S-UTQI4?mW7FJs62Z)gtw-tZUuM5*9wUl>^bm?5OIzYOqN7pD*C zlwjOlA4gI!em~XM<`c&O5M$JrP&SbGyg&qOKh=xD&^VYO;4N4aIA$SW4)=6a;4D_` z2GQFj@i({~I0oidOxGbh>c2_Z1mRPu>^GwK;nIKW*5fV-Y;h8Xq#MpZ38kiI$#0?|E@4d0*{yUkz08Si#< z`2m6$KtsnTRv#}I_wh(vq!tn~9{8nglQHkpKQE7YzfV79K<{}zZ-nb4Bt#wz-t6)S zKzy*69Dg&u?d~!%w77bHDOZnf!#4~t&o?7~5r4i#fq?>V1X15gz!RWvEvk-6_mm0m zzs{MdobAJkU}S;iGBn3Zn$Hnc+Awjp3NhR`whylx`cTRq?<6$ zz4UC4X@jK|Hx!G?q*#oD?pV;}byD1aQ4jf6GRpe+$Y3dC-N7@`T%wJ$8Xi$_psF>c zVeqi(`Fatm;{>-fnbjO~Rqb(^_?J%J!M7KXUUY+4wYc|7zJc`Fg(V9?QiVKFA<}i_ z(pyb2tm0j)6z+jz;8!u&D@Se~^0ECY`z_}L<30d!aQYDQP)h8+IpX+&mB*F6xxTEA zg~~ixcLga-tXx>IiprWF!R~}~wx^~5;KQcByIm^_wVYBg$BAaq9gj+jPBf>)4ZraW3lL(FU;$Q+RCoLBA( zp_OLhb8N9(2gAJIJD)4QrExTG)&K6@cq9Z`YpBtk6ZO?&-}*d&xr5(yynhjH^)~TD ze2CL%v%YJLl2_o96Is8E=KdQ4a(P0(|MKkAtWBp%L_71vIR#dkB71O=tku!1i{8tv z2jz!tny89D)30^Glu{Z`AYEPuF0MKw=4~=f7B$ak#XW}gTA9>&#=0yCIe40MnIrlI zg_h&S&?3@Kf~!XJ%;jfd-sNkg|J3A>%KD|^4>Md zVs&(&7#B{k|KkKE#i+y^+7hGR3ZjFoG%-DqTm~~%j>C&)dvYqMSKc*A8a#;y2Tvw(BKD$E|ZWIW`QCIC)(~O z!u_v%=fglR$!||t0L;pj@Im=|Qs@DF)U3uuzY1oFPiUYE|Nb)@Z7f#6iC_+#Sye*rI z*l20;>*_23c+(^K{rXlsWFv|Rm;9B7e2bGSXW#~jV+mm_Px#UB^{xUilq<4MyCjS( z^6BoucF2oKJq-yty>E|1?Y+4i&qP^BS!}k?n9xs6UWK)G9p!*FmNA9MMnTX)iP8{- zA(o}kl>EURQTMabRxr$vA)2y25&krd>`TDAb}Bf2u1%8}ki z9{Bw(23>(F57n){RmZne2(n~2%V_Y(6Hsi5%rttrRXTe-F{dBJA zY-q&^C*#SI_SEnv!%=GP5cN%nsF|m!sS!=dn<4@*iqUM4T9-|!7wBh5AS>=WB zLTfO5oe7CPA6<_Pq?)K^3#9xlBy69}LxSWVf4shZY$~=4C%*J3P+?JN7Vu4puGIud zPgoJBJ=eC$$27SG$T;l96Z(fw9so#_)L5^S9ml&}r6V)^U-RU7n@l7bl{+2iCLd`Ojb0z;44cwNb3gqH zZDGC-zs+D$_0aEw1=bGDf;Ty;1twe%?R=aM&nn2(V+!k*Y_YnzIWlVI5tQ9?qH(~7 z(>!@6W|~rr@M{|C=Er*8838Kqo*q)LHJg8;a1Bk9#07C!ZAUsK|4*QKZE-|qPiupPEk5|U{~JF zYSYYN)~LD_57%H#P)I*@l@k(fXmg|*0cSmlmO4;qr*D|RpdW2c(GoZuiAz@TjFPC7 zaa&6%kck2HDk&_Y9rJw;(MJJg(63g*aWK6=*<{ljeszPAT8mecELq1P*gm=(G#@wA z{86#G!D)H?MFqG~!+=q=2O7U|F%4ly?SgLzIU^*d4Wb_v#ajf3lVV0aP-n_^rbi69 zk*C;m4;}h#eOk#??Yc-1y~Wqep!7)~pUT%voI5FsK(qBc_d`8^8m&al(t<)_{>;5h zxD^#CksH()e!Su8{J6Oo((+D+7u8aohnpF+NXj&I_8}k{JnpnU#X4`<@9Cd#t%BBv zTICQr;Dj)kWN;BnqCSApvZe4nV*8Yuw_;3VdQZjm(ABozeTOI7Fg&cX8_tAQ7efRUY!EQpg8!+uOBg0lQq+TYK=!fPm9~BFHL@kd7&5L1b)p%g}3EXJTjh%K7|P& z?zG=)lbmAV?oQP6H{4^0xyyjYdAe5wNtj62tCBHeC?Ca<7v-@s`*x{XX?*z8el}7Y2DOrTZvPRGaXUmQ=l5L~6?;B|}AA`72_gSglMt#5~OQ^ph7P zu7!=AT${8i<#>&;#}9pv#nD7{?KbjSM3+-09Q-QcQ4g?d763}Y2VaeEricd3af&@2ifGk3Xr;iG7=2XbBiyI~^_AAnP@oKzlMRW1JFFli z)Zp&WQ#9US|4csu@1IMT%}lL*0z1b=rWbx~;tKzd&m1}~>~=pu!Bpri9+4A;L|y`2 zot>?^iV7=XMh`GoZ=Ti#KJ_AVobWhRnQ&O$I>K+V^=Q|t6#sAghFr9c5*-8D!dHmV z{5i4xrI_|J*ZJTb)@Q%FbzIXhAhZy681mwG}!^_>`3VRZviGOtsz z%=VDq3jM=t@xuxxoY06t5`)gdUH7zCBc$TWm}>wm>^R--)ihU}EL|&iL1{g;%3<;5 zgB$R9$`Au9Sgb%v&LaiA?M4!!I~aBe%Ys@8DcA)`5bs)T7o!y_%MJMWYZereB$BLc z?}CG8abpl(xP6u(VHFljlZC{8 z8#za#s_R_kznQXqJOH8pY8Mn{ykLG@URegC81&VmA3e}@vh~s^Y6y%5i5FGoj4#nl zJuT@Tcpt2*r{HTt%(R1#e4*-+xrT zzucg?Ai!e!)Y(zu$t&XA3539kuOz8&50M%9M?5>vlCtigW$Xy4{fKw;`Q_uRE||Kb zNiI$w{Us*XO;x+u$WMt^XfH9QxdviJ)ohv{Up(sqY`&Op~x|1VG6H^`5Q5IN*b9uEi!>O?Z>*~p~VczbMCRTW2^yC!o2>VexxJKn8 zioCPEP}W&qa+aS;+QCw0@|*2EasH95os0L0v(ZHV%;Hq1Pt%^Miir?L;^VH$U|Kkr z^|j4QAhv(VaCEQEAp%LPa9$U-1KQ^-#%oTDe`t$8 zqAk+K_pu&c(K*cBhaxSi1;a`tsF{Gc21_k5;%Q?yxDwy3Gyp;577g&NEyn=v-=|jr zVaLo+_}*Okb!1(B|0S)9pKowPL;G}=j5&Qw_FLpRgbi^!qaP2Q^kT7?Q^R{i%`Ivb zB})ic=!P>XD81h(dsu3KdyikFdlh*WiD!gZ+h5n1EP~q0EAbar63K{FSse7W)XAG& zj@uz_-5yKl2k;4;Vqqic!L$uVtm4sEFH*+U%YBWp1AskLG~TMA_vK(pfO{n~(2fWY z7OHijwM5{KI|5Z*_LXT5R979|uf{{@#73KIrDxPI6{W%$CW!`sWIW$PtZ1j{79@`N z2X(dR7)(QepYQ(o(YQO>&FxqGz@{%_%8)VqGM-8WU`BlHjU^y$1*!2N6j(5Ci*UDR3H}_A|-9M*IVahwhAsgxpRSuF(rnu4@{7FZJC<@0{LeEi2 z*TNs{<>ipam%~Y^cpuyu)A}L~>~hKrx0PbMOkC592Taj~=!eu7)Z|@%ZN!(9pj{Mv zLj}ki)u&1t%&Kq(!2e<)qOA0)l}V4jNSN99SJz6Lwa@q)kV=+t5bS!Cdw-U+vgSK7 zgSDFpS#C5^J)Um6pmlhN|PeXP)M7iGF_y ziX`No6g@wplfNbOCih@V@meFi5Xe4z1oobdW{qf2vZbG+gGNUWiwkPqpS<&eG2sv% z6lVVy^pQWG{W6P3k+|N3{H`A9JYF?a6#qp(?^=w3sDSU(dJ)!FogA9wc1raAUy79` zalNjIl}fKvu-IRXndH#|t>e}*#!gjT=6~BvM|uwmLTt;QT>b}HFmyxSz-DLgGaMA) zf0q||wD8FN6Hr)zAeJ!yWB9@b04I0U^8vWlO+VR^>i7w-$BMCAhvoz7kLFLFeaRy2 zI)Y*eOb}~hKbq;yU+y~>KZv&+2;S@w*3N8hu-mw2+Ang()gG$Ijx=`v$t*6X@s`MG zo*DZ?A$H(1OsLLRC`+(yHcDM>Zu}iRKR0G$9ok zY!DCK<`)%TL(wqlE*-8$+)~E|^Co%`gU~le#Teitt#Vk#E@(4z>KSDX40Z{6sJ_aP zor=(~1bwpsn~TK+J2=~|jLWVJ8HDTwh>rwAl z3Ue`}fSr~-JwLD@-NI(7o!d5giSAtz)&{#gt#NlHt1K7KkZ^eyTv*T!9o!54=)b*P>vz-QU~`5X>p+^gK$vBP%2lxFMTdvRmjB zW5ue${i`Ia&yR`|bI^myxE7JD#^&fwR%yA>Wx4K^2bCb%l(jM^6`2u1G@qWlG#j}c zGqA;%P~(XAx}hvPvBw#)WmQbamDq7ox)Ucp;fGHU=ce*H&4l{H4MQJLeNO(m-8j#_ zmM9;d6(PoE2TX>1NmRRF1Fp?V&~QU&Erz zRzpv1XcWHc*}kXwdF#kgdRy_%J!ZF>ekt1dTL?F99I6z5LrWq=KIv;3jn!wj2o)<{ zewQlma{Ej=VW)rn#>omT9y5n#E*xP;>_c9Bs4H-U%6jXEcgGL^>dQPQZH=JX4~A4l z_aQueX@6VKewD~I2@A_CjJ9Fr+8~9J;!7OgYfpEIi!__)!*4M3NmkR?arp2qRmI&g zdQzJaLcz9D%6Y8W@Vzm3$9W5!V@e;amPj*&iX^t_133NIC+1TofSFG=h1^WArxPFC z2k_ky52Zsb6V(MjLX4~~>L&B%OZ~q|<(6*5PJ7R7eX~{F)YZ~_Z->h+VO^L!td{Nt za0`-C<4ivRhC?h(s&|M&8CXU{-C$>#{S5W{mcRTyHxsEwaX za-o?D*K1Ex%Ky($Gt0;?jkpQNM$Ogj8^vBaudRwmn0N_fa{a<0nOqmkU%PsSX$89G zv1f17OI5^(57pnwrI1Ndn#GwLwQa*@;G9M5L45w}!zl8)V2oF!FH9)kMbB+4cQJ9f z?XTI;pBte~7YQ!6%}jl_{oaD~7M?HHu94fxpVxAlaz#r+ak0!b9oxRCWCuP((8q&p zsa5Y4Gh?P|n6de8q*5>Y`^xHrU4_Msu>o4yGV$ZEaM|%gV^J?t8XRIYEFhw#e|1OL z?&_$F?;kpQ-^m#T^Z{pERsCPu3!){d*>TmaQu}G@)gTc#LLX{LS|3&IiQ~Qz%4)8p zgI2Odta!z+=NvL;$}5`M^SQ=>cRZv^rPUD(Y(Ijn_sy|MGH?CZm+A{ z)dEa`N;%iaAqGx91XGPA8v+c1f&t&!N#gr?!KsQ|vVF=-kJ-0W&ibat`L;|>LMrrY z3tZ#v%VvoxT12@}su2aRa1zb-xZdsofq!O9%_@$|6oyf}%8NLm01eCvJzUK5%X^uK z5TEn-0q(CZda1)>jk9I9lYTE~S5bD^&Xv2|=?=rL>+RwAliQ9th=*-y;eC4)3vu@u zfP8i0VnIYQI~A={5}(1dt$e~v=PgGPn!%DA--#mb4fM1W&w9Qi~) zaaAfa#0*}0vr|xGMGHfIGdCwL;sBpd%YseML}?BxInnG#ZgAl74(|+b_PY7-88cYC zpyz!h-9l_B^LvRXX|LHO+~qyRt%G;0ijj+G(^&D41l&J_jVV8Z+D%|<8L~d2T_?Sz znzxlu%+YULvHqw!0ishkzdv-9o2~GUY+-2PjT~fUN0;B@h(%L|Yjnav z4ZfIi?i_!*0(#&>V*VUGF3OzPR~tCsR*LxOU2CP_6NSziGswd-9NiVl==@@~WZdnn z9_5Fza@uqU)d8yE3j}4#dt|loUr7ecLMHT#7OP0v_R|(V%bz6IvDuY8nF8J;ia0H%{%%^#u8FRss(Np+OO&ex4#cn>SN||86vT0>^?(05t0>^gwK6obW#)7xp_uns zck)&?&$y?QMSLLzroJS#DA9g-H!^fY1AoWO*5~m*P^C1aP~x(OWZl*8XGJ_kNZ(`h z0ie5k>3A?a99Vv|XvQ$pTIdpiQ-5+dZH>j&YZ)~RKUsIr{9Q)@iKzrdtr=Lpau|jH z!4~~+x!Vd-9%9W|nx@D3ZGU-J&?cxUCDiDm6SK$6q1=JK zAzI^j*T=$##goaGGmjRS1+vhO?6f0&<{qxuQ+9FK!(j@IvJoq(_-Y{yyCwSJsW{ho z^-vU*RyQaJ^g`q;Md(`~sfrf#<)0(@W~7R9AF9oYm9a!cfs!6Kd%oN_*&|4GJQj-` zjC6#g%B2X>_I&QKb^t7|Qvd@>MSVUsJUYmhqo_l>wTm1vQ zMluvqN&rCi6^1UfTf;`)?Jv8%=YE|>PB{j1f@>BkZh1G#DK~1k2-DV^y7*7%3ygP( z@QR?^Z&l9aC(!-YgzYec*D+Zm)UiPfxvt$a5y+^0WO@sZO`3CC7EgHAXS7K}tv&f> zV_ZqhTo74rwU9Xm-RJauUe@X~;m2|Cd#eVi@8}DXja%KDwd{T==sr3mY=yA=*Q4iX zAs_jd*cS8KU}2+;g8v>7)T=dIn&(xIn4m^-Snt_JEDeZC*>6RUpJ{txSQ*@6s&}uJ z{)hehY{JyZsbp1%=YzHU;VBrgAHyrxrF6mLPcu9TLR>dPE)1!_=))6eU>)jk%67dw z`PHjcmKq5dRHm z%KK*FW7O&nZW=;;5N!mEK}d^b2aIw85Bm9wuKU)WMpzhuBgcxvaV}rcMs8}Q#fR(* zNSRXzmi~`{ybQ5O>YCua;JoUsMr^|6oL9{ru~@X+#r%0M2onw7e-VL2X~Y4| z<2wl6imq(vEFXYE9D-$*ID&-labC7KJA|(WzfluYg<}Gudy}@ExR5{P+u?VxYF+XN z=EIiw?;b0J#j>uqiv>r?9kf9TMy|3&ckg;NC5rdv#C4LKWE8schF z4Nh3)ZI}1ey;Cn#ICWEo7rQ_pQLcddn3swx>cCoPrVu+wi9yNcYTFNLhM3(DDR(7z zLTn9EZigsi#WH0wai6IO+aj@OYBYCbFEmHfms5-V93<~zT_{Zl2|UCn*b0XgB|AmY zb5bNU*Bl|}ET&7y?4n~m+=g{&t$)*cm-1-jXVK15=d4`q=YgLwo}<0AuVu|F7D1Q| zZa${UPepA5Jy4_5TbVFn(a5Wyc$0^>vbhKl1j5+b0-=sNxhG?JQ7Y=3dVhV&f^;%a z!Eq+Xl~%!g#WcluG#G7TPAbn}TCnm?Yn`fT-;`LVLC29*HBHN^9_HRPn=)q85_UU{ zKmB%ZIA15IO)5AZZ;WqMNb%q>B7QPAz#W@kTRa>4--*?&)?Mp~o?N~64{~y8GmYTs z5Jmt?A%H(qvOu62*#|Gh4>I^6;iTP>jLJn78h6jJ{l)%DyZ^8Xojm3S2Ivd2)7rFx z(b%mP!x?X1yH9Ql#HF#$AJDODPH_W*Vs@g}=IcsDe!GGjXhNSUc~;XEK{e3g|?2T#MyJt z((z%yXoCkQ@vAa~({S_k>A5>VeebYWA4F14ES_VYu#Q3SbdyZA+ z*x2_&0YOI?1LpLJb|I&?GG41fvbmdwUT&G|!X_wa!rP0YzZ>3Q^qzd!cOn-t&C-`D zwEe{2w_AopmT!im^@4n_=J^!!PPP9pXMK$R0}Qb)*-*XrYKz9kl=Bma>Y2ZL$P{G| z>6b9afyWD^zWC(z5!`D?mk|XWI@IKt5xBqyFkopGM0qz}m$6MYjHM=tngmvG;)r|E zuSu;m51B>O|11EU?vb{hv_)UTczU$;+y|7ffyXsdZv61@yb(#l4D(8g{H;ttsoPi! zBj$)&tQ(K|m~yQx*lo6iRSy|Jtc?Y)g>K-WViAINr3P)25p(#Qe&(uoT@-gg+VR;C z4)wE!$)BS-86<%KRbCEUG4)I1fn%3_5yhqNvfJKbOGqM7IR`jgMy$!^(ia`O=7x{= z#!;FxodCmunU%;F*aW91$!kEmdP^{M@k0+>Jen!jIOv9+Gx0zo&!>A*TR?Y`7kXe@ zeR)XbQ77fDJZSFNxh$EWJc|=hXTpquzyEXOV9D&>hI?p3thIiMu zoYRYpY@gLY=ZGXxI`A!a6P`_AV(2Wc?`X{wLenp1YqpXxyuWPio}a(Wf_%`}%^_Z{ z6OhbzgNaFYun;YM#oW#t66V382}jD5d}7WN7vYn%Za_%vrfxx+hxL2ehB3MaV_B54 z!q_<_2#dA{fk8VIj#ppOvfHJrg;Kwg9G48=N!FQRz$l06>yyLA0O`ZZiNNF>?t_|d zFUYd0MGpvw&m|U8zzb5ibev;Jy}BxFUwYT3Zd}a zL-aZioy6e6Twk#|Z@X79z-$4VJzvlVM97e}nLlayFJSf>`Wb_Wy|IQ!%=q{UkN3)k zrfJ2o1?g_P+`9yxH-b&fEf3Z-*4SXs%%LW8fjdi2$2EO`|7r~~jkca0$+&i1fS>6B zw=BJz@%S|z*1qnaeCB+TjkBo>vN?#$uhGGh=z9}<#0eVSs;q`UjEX53OJiN`2}b;k z_WK8w-DoKp-pFEXecJ*ySn*K~Jq2<6v8yRR{$AWC88`H+>^Gvew%3_Z0D~nDhTL+3 z=0x@kOg)1hPQho!3K$5h3pRxDz3@Z8rR&|Z5Qwu5j3;Z2=s!^XsWI0xCaMAHWybfD ze6Kh>s?Ye{uCn<21ApP7#sO8d*QqFhB&i$erAGwMT6x0|8N^+pl1$ORT&_l2jo8bF zBeAhNB0F_@cE;zxuNamQ#iqfwIXDgf z7qh`Lvo$kQD(R_x9aoz&_3|krZ{|(j(`ba=mt2&Qm40#AxiCiZ&B~~_G*N&j+(L#L zWboUwhDKOxg?8cga)d@DR!QuBb~v*PH?c?c`xIYC?ux&}aJhM}{Vi>06h@(rI|moZ z@94>i1i9}#Q#B*|1_XUWyynqU_7Gv)4!u5oBKl==CQ1{Tg6%dyD#vHfM#OnDnY8ed z9J5DASbFf3bC!=ct+>xlsa~n#T3(V)#Hlp4T3}9ORmMN}=ME445c;s{?hL`Mf#W_W zXwrW?T80rCw)ndmqr1lqKzr65S>A)>Cd@dqR3HwWbw@)BOn$10I*evu61~UKLDV!Q zphE~sXdjC7d*uWtDg<=+wb35k+t)DtL3(B_1GHmnCvM?)Qm|W>LZv%w)8{*uSMNKx zZ?nhbe;g_n%}#_vn2FULQMQ}w^)&RhAn`osW>ulNm$Y)8eb32g2y#-IN)|E@^_{&` zgb_;U7CpX7WsDCwM9$?`_p=Reo&`UB`W6jQ1r>q)9Ntt#Oxl;`p190d34z)ur^)Z_ z!^g5n^&5_-=V}{_SD+95+sY;SM_9JOr~^iEv(46Bqoaos%rS;8ma?qm7yylh#*aM7 zg2bUBkT-N}rDijiuw0Cv(|sm>k=0puR!mONW=+j3JR(@wSeH zERn%6>vM2-@l|p|0WwRk1|OLJK`|9X-XiBGB*)yU4@r=d$K7l_<|Ff_el(& zll(?P1ATj5Py2}b)l#$CqL=-4`)fOD1-+!M3gdk7TBO=`bQZM97(MJ`5USIZ>7-P~ z;cK2SG!Q+=s9*gGge3;?ALz#Ty8=ORyFnqfxwdEK%)h+tbPaH}0~0tuos3lsEtZxP z*&fJ)Yz&kYFp}MD`lCl`-8E`EMoCBmIdZ6I*5}*w99vI)$`-|ldW>9)f&!njqYXoA znvO2QlHJ>0NH9#aau0+PG? z=*!3gti0)UOMkOaYp118s`5|OGQ2>) z&wi>#bJJ2jMf(&HzQ1|Mrz?)8$-cv0sJ-^qi)O6O;iI+(Yl$$BKW;Gq(p-+a1Csng z6Kycsfg5e;qw8;Lsr7B-t9`zgg#2PX);wBq*$V9exm`=O-dB%tWj2s7V!6#K637^K z4tc6Bv;_(~&qqKV6c&6{0c2?uelW20*q`U%|Ec*8T6<$Mbz_D|p^+EfXhpZnM2R|+ zNG&Sokko6{qz;=)si70=;;pbU`IEj2PSp_mT@@(X!+Z)a7P8(SrJl9GG&syrnKvp* zwTx8Nh+v(*%4=Z8hUckr9Vhs@J9BE@jPC{ZPR`!&7}C=s9+oFL4Ou%2q-4fd9`g;` zmM=4`dCF8r%*;|V*CF+0oJpT_?(B;Rl9b|YE?sIT@yJ--(r znr0HMBePY5zV&Y1I^h>usU`^ zg37IjlZJ5&dJJ?rIju;OG<6dRWfxk^argY^t6vA%fBw!`>gglQ9yN0v3YV^u4-R(X zvGronpj?Y7;CcwR7HgWL1#R|Rm0~6%q&%jlt4G_XEAz^m(BIHykB^q+GHJLR&3ax; zcJfS<86$g|9w)RE)w<6R_=zX+;lCG)F7&Hu=37+dACJ1;qo#~aK+Qk>yQ8<>Ny{SU zwsuW9U(;<+!W5{1bZi5C#d(zDsl;G($pfR>OvmkEStsYR*Q-qC#boaI&nnfNY?+st zoLEcDW|5;SQg(6F*>k7V|JB0Q+8qW8kiaI!MZ55b%f?$BKq*$D)oimCL)QxA zg4Mi>MP1ujPi#0u`?+)u>}Z7F;nuT^rYB11M@tfKt=0RV3q3ng_u6z_$|pUq3#^LTB?) z)U_M7(!y-*A5%FT5se%go)eSIY}Ge@wdTc0*6Y7=%ZAVGnO)>W>rVH}G$Jl(I!=HoiBPKa*ZIr%?L#c;FctgO*VwJ|lPO>4HTX6dYjaMAE#fA%&yYqriLK|mBW`ux zinEFT_d#^`KZ8%(sz%F1uhN>(@a{86mWf0Rtf)YAn(id9;PWCq21!f|=_aW3~ciCiF_v z?&IRxgbK_j+1CK_*Hz2G7O|TS;dL-ahvl-o=%ZTtA2rGG!aGO6Giksz2Y%bV zh}}4g!U$h$SW`;_IOu0+9R}g|^Sd$*_(8q+U8BubtWEw-bS5oAqAojU8d+7ATWwb| zo*I&RgY`U~`lPJ~wg8>Zjo2bqYQ*MwZac=`=`n1GMF7i!VgRY~c2$_?ay0I$K{DL} z>OW*IYPkHh0&2SnOJYG<$Yp*D(=uWK=7{!YXg_>Sd8mwhcx2hBp`p zvEAKk$5w%t)r|fm0!9h$B@Y^g16VlSGZj9GuFtI2|1fqAL81WB6&>5QZQHhO+qU_~ zw(a?2+qP}n%ulLP$s&tX^`=q1>qX!9?md}PC*JTAEDs1+A3KCALJ&&ot?T|&7aVUq z@u$TejZYujEbPw<_W|6vU28UmK4E|lz=et|HT$ZN2p`>Df}Fb6d9u#H=Pzg7oSv;# zg-?x9SS_L^#Aho*Z=BG1AL2bj#2On8_Fobl#aAWysO;)ZsH_qu5$!+WR|MmbYoUuL zSjEw;1@G$38mI*}3}NvycDoKu!&^^sX4TKmt|Z2d9Eyo$p_Um!ai~*f-H?Ax8llB@ zv_r9<>K|gBjPC5PWoRpXtkI#s2hxCMaAn7cPhvuoN(4(wuC>`)@(ZU1-q8{eb41X; zm*Bnc1DU-jX4LpryK~GD|8NmKpo3{*a&Y1KVDrL-`QXOjQp%`c#3SkqTuW1qxDpil zb=#o%s6K+f6R;L&2z!sHD`Urm7s-YU+XG&v;f`W2?VuxB198+?nPWJaXu`((HtmfQ z%*Gk)0EK*88vrj;M)8eFOcOIxHtP=VRKnJ%PKL*y79l-sIvn;x3=TU8^LJt{L#vv- zP^x-fR>WsmT0kQDkZ{J9#l6gn**6BFEDz4LL?$7Y%widCsAg}|zm{P2cl$|>r?L)J zY{pF~F)E4#^yE-h&eR`*Z}GVKss+_NIiHNeSUCE=+q};0>5|Y=hHu%46geh~4_w`KJj^dsW$Q$quxJs*0c%II_X(D4+wF!`DZ<# zL;A;CaZbw!@yioKO%8It8u3W@PzHfguz&pT_F*CXCx&NVjorQHruDe*#e$8s)Fi{L zf_avv0l?!GRmP-qdG_gnZ=kNX`nJ?hlK!wn#>@Q87N&ZOef&*=?Ix0-}O7Umv!K2h{+e{wZRIQ86e4lE-C}?v%XY`m<8ttqg zqm$OatM?sgfg6iZ<1lfsD4*JauM$ahH+YiL8gin&XVqvAxvFPy;tRWMj@|n)aAyes zZzJv-ZBDxc?l|D&a8ByXX=p8Gqok$CES2!PK7)Egb|2UeScGRBZrXH*!8(puSfb!M zUWNfdf4@hez+r2WCNO4p&@o^JtjqpwV?|UW*ONfZp)6H?ODA$)4}jmw1@EB^z`{d=Rqw z3J63RR%)K{cpG3%)-NpT#TB)#Y5mrbsO zi+%A0P8?Csxs){L5VvV|K%q|m8dpO2E%$KqO9gdYCm%l+C}8{<%!0k?a&%t0Glna= zZr;Qd%l=XWC$=Y%0h{~zu9RuLXgnoWF5_Enz9P8TaSW4TJ~SWHX)we^;FPxvp`FYw z*IL4xb{ujgjcJbes4EyY$~l!*klK`39&Qy7FL|-E(52du*Xvp=KyZZlNqzOP7@2(& z#p~rbFB?seSYce0TPVA}7yxz1P*=kI^4ZP7H<%O<@@0WOtMwv^nxyD#6<7d`ORxOWf-KLdTTLw?j_XzL!2}%sTB^60@n{I_Cm}zzM>Eu5 zYjI?<`y<04e&d|{QPG!=S%}%WavFK`)jp+Ie$6Syf?_V7|0JhKAc$m9npB}dy>z`R zll#6M&bufimEsg(xaH1ofw94Eu+-%>zjX4U?lzYs6cPb}$R)=vey;I3fqSl&@zmF0 z75hSLH-GnbxIp{&fUCsQ2LoJi=JkPo{9GDjyD)BI0W2U!?Y7yNOp*9zb*Qx6q)(tdY!9$k*adzML#*hJwM4lOgTC;RW*eTokT{|BwPTUvapTJ@g%zvLW->d{|g)c}acL84AWqyynEphe7^p7^}Y9~KzkwRKLu zW;f^gX0+qOq@5v>Gu7ykoFNR}r?f8%$Hu=t2e>i%mKQ4SU-$=53H@iK5vpce_GT%rjHSJt5ba?ZP{VAN-6Bbtz*%(VuM|YJF2s7@u z3SJF1JbfPwDKpA}Jg#w+Wk*+|J2`POzUvvF%-=yPY*{YnAJ+^>E||l-Mg$#tu6N*G z5ANDjrGinr=PkTz!3a4I8?6*oxxN5|3(2L+b(b7Wxt^gl zlluV4eO@F2S}DZGLsaI=?^~y78Ok?_&pN}rq`0poj8{V>OkrWl7nPtX{oo(BS4`sG zyp4vo05{w@wgeZ*rY4Mr-~2Wqr5pb|;8;mpYKX^Sz#2GKMVu~38I3pzQtD4FHl1Q7 ztz?**qMO!D<(KyJd#yXPwC$+l$2+EZ^)G^Kq@W#H_GOPx+Y<>?h?dE!QECgz$?j`Q zic8hrwnc}xtfYu9?Rk{y9oKINPFc$Yl(K@b&!M z0A$o8@p4}xt;+ty6Pf^wqgU-z$Pd13R!2*3hB2B96S>1+GhF?vKQqXn88luBt zQx>UCJgzo%B6}y~?#0+YmKJ3qF!kBIkFlKBc!tL3n_7xv^^j_|uv{Y3_tkMW-TrR9L_f+s|MaWmWs45Ck`HwJ3EaE?U0KD{w+52) zdf&5*0G3jNSY%6mL5M@4$431;RyD9SzK_c@Rr?W*NFAnZ+_-%$?)Y$5ek z6vI{_FU8%BO!1bqv%*tyy}kx0Q~l_`G)>w2j_NUUYonx6FX3}$?Yf1hH%va>NY&cB zTVAk+t%_*BY-rZuueTe{iF2}fn}Pv#t)8`^@{EXR>EW*5xq(vo4RR!NDr5-$9>=nU z_f$;!zF8=yly9!_nW#5Cz1G*#BbV5~yB*{oK4uz60ch}yl<=875Mv#7`Ljme6$*0HkmaPFxX)l2f$HSM*{pRw%INnhRj6%cMp&`vNU2dMz zBdo}~B(^mT+IeJ7XZFTz8ezLb&%gwX69?OHj@EGP_9V_@&`)QsJ)!q*;jbY^q|>2T z+f7rJ0f2Y(lK#Zkj#!=J0-$=J&%;7gO9Kp2EbbULo6Q#6{~9?gYQ|YH zw%VQdob0>XpY&$ajb>AUz{Ned%Y%gMsN|9ZqeV}#W3UOEyb6Q7{j96FB_oIuEQKZV<14-02-8XZBCM{Z z5%@wSnM6A)*a;n@og-_VhlV}V?}VeLCLv#Ire`RVO9q>Cf-2G7n91s^#2Zv@;**J> zxqGW5=C;E)2we#sb1|Lns-okBwT=PpCihF}!Lt0{Zo2&_|`@ z9QLk@3F|<=QpiN@(TKFaqcT;C&&Rs4LA^E$fuHu2K;auhdU+Adj@n zdDbN0|ALLYNxFmz!n(T$m!9|Klpq4bEjn{p(CkhidJMfL5*X#xD@-VU#vk5W0-4rf zA9xD+zgM8b@+Fby%*x0((^Bs>6M{X4XlL>DRRg;=PLa+-0ZYd>&#S|y{uwlG&~sCV zB~%hTu~rDJz!crB9ozj4KEwv*vGIPOu59YNG|HZnx3*^^H<3Opseg(Za-2E9>pdV`;w1cq+$EW?u6&Qs z#?BKWxG5?aejGfT1mr6&^mYPIj>q5QbT}1tD?%vbieOFng^%0@g}9ZLE?+TwfXO6cAtI9h5)p; zg2b&8ZP*zq786YC3ehMvNoe&?3_x2SR!RXKQnNUsAN&2MqxGv(+-6g!;ep{T7XnY5 zU?h9$$t!ewjC367E&Icd(7uYaf1uApN(>|+uacP?bUX!?WBz<44bNBYij>?VBM9Sg zhBi29+j2tbj8UNl3E{7vh57t@vbB&$3;r?%0{aMO{-R9H#wQ?e(Giy#E25WK8)<;{LIA7;*KM+eJVU|Cy|4USGrg6OytG z%pyB{($H-X=ZV(x$@Tx*Q-pwj!aZRz?|Nk@7t&Uh_B#P@PTWoC9y)XHdXMZ-KoPs{ zr8rC5v$RXB1XRIdso4nCo*Ps&)0m2Y;4FE7<<7${Y*UONkUy2Cf2-1YMNuTP8K|-0 z+*Vx-H9VI8`1TZQU}fYxEF)v-pGxvwnk$uC;eqkSd!)b<)J1zse#nw+rP1?9u!hUM z0mpeLENWrqEz<&5lx9^>$gOt0XExF?|Ah~kU2RO{$DUQX*lwqN!?>ItG^1$l&W#(o zSzo0Pk_R|7d9~5Mkl!l(7ZrSiHq>I_djrm8e9y$#Ggr4kkTt!uYU#hI23hH5Eu*C4 z`IeJ(&n5J)HT2s}DMW!J+|i9DdXKl>NhTL%G@LBU0YoDyTKHL&zGZrf*_##RiI}{E z$g?Esk+~4KE$j5|$(T3dFz$U)V%^yv372Tj8%^%Cw}7`WY`Um0GL97iK|El~rP1k& z7ll*jK|vNHMCbKI9S6Awh@Y3Q>~vli z5ESz*a&>?Y^G&xJo$_b&wAyOdf=2=hXE-gilT0+pO`}ZJ=tZp?^fVfK!G(0EKygen zC-lbap<1kx5d_8!cQ5T2e3WQ5cFfAYDpMSXm>|Rq2MuC7)X`1&gdv8T)pD3LuqWz- zAEH-$nyYs&MxqC&{FH}bC&qug^s5R2xIk#h9|6=K`l@hGR%T(JkbD`1sfG2s z2l1qr>!_PfJf>vfO{{K+n!M^1@7uSz(=+od0+WEd>Kr=Mt zRS;EGFq=x~&o`-i#Ls|P4mrXzXZyM| z^`|XaAlB5Z`V(zTDu2K=A+Ie0RQiOqs%pU|-VmvFvdW*axBx*y3F^~_Uc$xu_!mw# zphN_{J6a#Dq6UyIGGx*k2Ot#aQ=8KNi~OV}t;V{~Sp9}kPwPy!zU%UgAUJ)k;U``# z>EgKN9EHq_xIT8~n>oBmE56-4rO-iZ{{s>^4Kk({_=QZrbke>V&YXzwi#0t*=}g#v zQ3>j2rK4)gy_AnD9P?us$P`oi`Bt7@Zh#+g3_4eZOX_xCEFCNoEZ^j=`)z(#UD@`p zWgGAa8MRHOcE)OS7IJ$IhCaz0gQErDZNUTze`E-j-8ime|073Jp_$39mYsUZlhT$S zpN|N`R(2k3>iI~(N*E?kX=pdyV#wFHvhb@&aRR+P!er(TqNtD5q~1_{M^E>4S#I$; zRW(QWn^=>?Svnm8GIwh^l*-9HU;7+UD|xK&X-t__xkqXTt)zHFQr_hGIDoDubyAj! zQkyX5(-)*kc(<%z#$gAVsF8qHhfQFxXa@JuwP%FfNNWof0i%1<@UwQLhcUxg-xIm4*z;tf3b$R<5R2vsiRKW< zYwR>>Sff#v7bl0z2T8LO!C&tpn32a41xrtSmAuJDq$RUCk(wXacPJ}enWuVUmnYuk zjABzkUIOc;tnKkvhEuJ}w@rhoR!Dn|Pn@<0>G~G*f=PCP5;c_*z2>jlmV_B#KYj28 z=V(`)Pnax1D}iJz0twZ1BEm&Mb%OQ5xCxd19C5xMYJ>-NZ{ZFbb~D>;CNC7PEVF#u z@$Mbjy+&a8sEoBEO2YV#9y7l#G3Vk*%rm;vlTCMZR(d{yvmH5jj}Q!hoIE17e$)<0 zRy)KWQcv6NO6~0wIiRhBY)Hynx5s4IN-{bY7^kS3gAVX zCV#}6acJz$d|i=`3DY5R@FpS&vNQD?R|2kg@;AO+pg8;cKazStWUY5F6i)^{_=t2g3jmCYbnv!G6m|dDHGH=Bh{Fkc`n{*c#IR< zQg6p(Qx{ROGBy2=Dl#zK$p9iX!1d!r6}tn_XK4^j6dxktXP|_PQAi559pTy+b2B1M z1KK$+bqWq5<4){xL8d_=*%tbPV#FPi1@BlcD`a(@7vd>lHtkPP`nU>w2+DMisFU7S z{+S?UX77PIgn(C;coqTY3qHvgV|nMcoPD~toLV2x^aWk>D4HWrbS~n@diU9%O`F=W z7x0CM1NivNFMo5TH(&)ahO)N$6=It%r)X5UCxpNTj$~ z^&ev@@BTw^PBKVnuMcGcXq0@)x;rkoxtqRs0}EA?2Si$UR$u5p-7o`^rW}J@IB-7u zZE;@u863P}xPX00BdyioqgO8mU|m}F4^s?4=T|e%0f#_h319>j++d%o zOK>I0ui$yeSa3L3)n2Xl`h9ZVpbzxO;M%=%n2)Cl-dLf)WpH1;(?;6fNt&nTTuHJ4 z03|Us9hq6jlHj^~R3A~|y)jZq&!#8Y77cbAL`{+w1o3TVQkgr{9-NNKOeH>7%;g!f zq%bZDyiJ`PY}hviXAo(c)xk?PhvxZ9-_#kCQv$5l)2GxTJUcdy@CS96D;dGl&vy5= zJ^D@r?$*kguFBGxYPY(8=U`(tFID7}Wny@+Lj_-{sP4}rfrJmxH$jU4HMhH7q`=u< ziyuJ@yaZWa?{U`-zW2%mlgk0h26B)!-NO>Y@?8nZmplSvW}itm&lDn;bWj#+0hx!X zI1n^EPl#s3iRpA&>LR6I#F86{48AK<9QdUTj#>B$fhD!g+h z9+rCgN5z5r;B`Wp_?`2?Fc#8mNyD!Kn=b}RWcU-uG=N$RUg<*X-b>B&aV-^w#hKf` zi2zkj53uApZ3WgT8EGpN69-0x;f9Xs?h-8tx33Y3uM%J_ksT;gcs|eYs#FwKDCZoE zl8}!0yPMmaJ{L+kjkP4&XNRI+;-4Vm4x@ifQ8+0z4oMuY2L%Ec`gX(>X_`e+AGk2N zF>0$Fuxueq&wZIXtM~2dd|<*>!L=D?|A5Re%XHaj9rP=eRmDF^#i!0b$VJpqPg%Ku z%~NnNJO?-OSH4)#P|jy(%1rV+r<#oKwKh0-y$m;9!-@|}?yoFzy2x=xn@2Skt65&@ zrvy&aGFIaNu9j*FveZxK1ns6L81KbPq2_*5@3|mxIQwJL923snZPhP#pYnxCfI6$f zYZG=6I-tly&87#lG=hklw$ConuQjv};FaTO_l*l?((-q%A zz?vt>vS4o6Ag&v6UZz-P97mJXR!rgeOXm6x2qlM@Kca|tBLFOa1iA(P|x$-NHkxKAy(ySBEAlY)j zkM)wX-^t*xIfIF|P&mPTzD|D%La9!M);e#=1tvS8^ewBd@S{|1Iaq`01qR%J^=yj__O2V zsP#RMy9G%wT_GQP4Uvpx52xx?Tq#mc{n=uYsz!OKB5`m7+TyUNuu|b38pt0KRu^?l%``cU9$yOIY|A zjwXCE(Bm6uAMV(;C~YC-;P%^|1u27_yUrIAuDtSQjx)&K4F27#O#W zQD?m8GTXnmpw~K$+<^tXLe6@(Yoh-!W0vsS-)~lT9TahVox5=iA|GY}C<5nv8O%jU z*K}DhvBRo<8HYR?Vv}ZngfLj@@n?0eT+}5%HtBQqdd$%CYn-FmW4VAo61`xL!qvp? zPiHHf!i}RdX}3K0b{g&cv@M`>)tVa^T|dG!)BM7-B3DzAT#9FChy=>>;Tx9`qL@C! zX5gLCAex@OzX_F^&%Y^)Zb&K%+ov6MH^Dk;_t;94`l|(yRz@tzzO)Q0=+2acdDV$~ z;>rT;eD`Uq*=N|0+2|b~`(xp={8NiV&>*5rG0rUS=FOy37Ji)*sZ)9nx}qadb#DsN zA;j66j|9y}z)z)(MuUz{?pW`mi~_6;%ae*t5nZEbmZt-U2%WS6IhSz-A-PS>ITlxDS2ma z^uoaKefGtZxI^@uG^o5wm`8#H+wGyBX4O4&Vq5*}iknL1U)5|f4-uawiW%g|U-yOl zZx3EnRp5hcejP+lN(2Hhd9V67d#vtt@W}1k-gBL!&4&1o$Hcwo$cj1Cy&&0hAB!Sj} zBIoMdQJ`VB((^ErN+B)PZQj9bLxdE9TRd1J@0v7-moaC;ldYg8eiBBh1^sAqesk?R>YaDt+ zJRI|qVndM#utG)_FaydPGbNP+cwJmfdr10w`aI`42U^cGO$!XZV)%v7cV}G$#E+*uEMH4Ouh>g%gOH~=@384UlrcwVe7NDRl%)Bm*gpx~ zdFn_^=N#N6jMZZ$%_P2iy}}ujv#Ng>*VKuBhs@aSd8hH5H=^ESbG??_(CdiEo(Obq z)7$@iXp>DPPjI&bL-4!wj4A5mtq6Qcv+AiA>WZDaV#P%Z43c>sK2DZSc$;x^lt~9c z_?V~vNPg;&L3r0}jG6%Yyruvd@7QQ`aEPS5b!lx$ZWY`d+KUr);@j1$T3-D0An>jD z%#Rjn^O4K|#YqZRU+E@`2|LxbXD#t%flG^ib;{Hi<0vq+jGtEm^rDyyLY_cefC6>i znazRFyCIQ60RhaULR^-YA}-ffvMLGZ*VFA@X-=GgrMecaQ8jj4 z|FiH=8}$<{IWDK$ul_KAqs3TP&hwmYU< zO$|E~&*sq+>^F*4K$zNcy4fbSmjAT0>P1d|9%gA@H+nnn zJzqXkYrDS=VtlGT@adsMM+Jw^{FYCvRp6NRrgx6X-Y=-h4=Tc@0k8*}Wba^D_2)oe zTA=oq$K$@J{pIy}r5tju9`gK1U)gF1=E^N7imc^hVQGAwW%dxI1UG_L9}Z*BYJE35CMNM0 zV+udp2_;Y1Q0_Yy0dOPj#>%K>Uo&>|>=`3#k%-(-B|T1Ym5$uF%#A+r0iR#pp~y4b zYzOcReWp7lJ1bA&Pjnik$U5tQBBl@h4*0{_dv+0R$dL2lJ{?V1@}2|J8Hd9mt&v#~ zr2MBG!a&5`?9*icE-|TddDi#EMf+YPAZ&M@&T6v_QPAM_D7d#XbL%v*s<9IYh6?J) zd@Y^8TqfP<)*!L{i`+g5yMPttVW7kH$avqzA?3$58i6g+QD}qzF~C^Xg9x@9j=~?FSKXrnlJMeX)fv3xUTif3 z-kD%46gt>3-^spSvx@oINddddVk`8?K$|>h&PEx3wn=<;o*{=J28|Y-myS&XKRE zKk$YLGKttShXo5Zz*jtxIT6be%B1mEtKHQvP;4 z6zN`>BoSfU%F|cfS#NxoseiYRMJRzRCXutiu&;8SHVgt&&LPGoF@*O;R@<){F_U+S zlQ6ZBGx&U=;_(lOi_5z4!G)>oSKl?m$U0jwP3xC=cf>L*~7uInRtfB=3xn@8p{Ze+M0aJN- z_!c$Kh&^pdbdt5)ppBtM(2K`xJX}wka|am)MOjlEx&SSX1Njyw7Cr?^KiG*m8T_&;EHR5jgMv?}q`+)?AKci0^avSYw$IMR8fUr$gmZWB`pOE2jjFO+E za*gUOc{yf5cc_ERnyYnVa!rNF=Zj~!?tMQ+@VhA+6)HYf<)FD&T9P=LY*v7G%F5p_ zu#&$%S?#RisF3L1k|GBu)>JUjR&_&j8Y@^sN z2t`u+_g}CzDg@Er+IBDKn&&1jH2aJ-VQ)q_+k(1@W8I!U&A0Y*$s2DiMw;~Q2jr(% zq(y```}_AsF}Nh(d9I209@keBOsv0%uL6C9^*ul1I{P~#P=V-=X?B4SG4~-Q!K-|? zuA;rgDk5=`^AJ)nK%s-+jOm`#ojE|dL4&oQKp7w$$dpOLr+IUmU4y$8Do!}IF2cxm z5ABVtz#`YvO^TpQK*bRboc~gV^Rl&uFCVGFa$q1xte!&oY8S`J}%SAfKVr z!Q-{_yw4t`{*&wE7;k#?uw7?wzsLB~;FKgYM}4WH=c9dyou`#Ie43ceXzg%thF6}B z8fi9()GM9}mUV(_UXn56r_gD!U64A+MltV1Jxqddw7>GeoLmi}KCiIxl~+LT7L%Qh8tY-N&wZrB!hv=m?8v6Eq3UWUqY}sa@c%KnfM; z>L|pZlF!PCLB+&ly>L+ZVy-C@&_XqRhK|Hh)V}Ge-xBR~7g8V?j$o+mXOLag1nc_h z#umWuZ~t;<(B8H!(@1C$|3=t=t3TBEPS7qeJ@jY0pUC3X0-B+obnDI?7wB98PLAq0 zN<+k?V@&Yy(&-kVklK%PaSRTC=}}_MyGJ~iEP^90rJ9SMz|4P063weg=6u*n(0@>) z;Tk$qIQZo zN%T@oW7RAgFc!~Fi+r8;ep?D1a~Cn&7B|~!>M}I&LdcSLW}DiH$H2;nHXtid6P3!y zr-Z@T&^RisHt>Q+gxuYkQ`0WAY|aW=qi<6}j#SO$kMX2_jp1l?PlzCW|Kib#oI^;w%Ff^}K4o+4rqCzn7;;J@J_w_r4Y z=|cZyDifX?jrOx(D=5Q&f!NarKUAkVV93rqYf<=9GmYLWAhe^wqZEg})OlR^bXief zkT#HAqkYb#F#ALLXMEhUhOm_{m`v8g1)<=HFHRj7IeRes#u<_+g4@h-f@&hPjfO#- z^iNhzksv(udP7(UOV{-{K_jU3z;@SD0lzEdKGl_AFKGxgn-0liItK@hPoXq!>)DDf zv^9s94wQXbR$q1@mvLtFluvo) zTIGcMBzG@tCTPd(as6YouMSt-I8JXtqlTsE?$wLl3=l8wF2jS5>wROV;b;v(T9 zJ21{83H~XVF!R+;59BQcNo$HreDjxzAedEFh#T?)O}ux*56Qe=HWC=&+w|bKOML|y z8+hb#N@ImLZX-E24a5+xOK1AqZ9I`g_IM7-F&ptwx#1SOpY;oHJrlgN?Bp2r9JV_$(!h5rSj&jA9&_VGFD(Qo7Byn5NquANF1yPXzeZfiJ(f zi!0AnbbYi6a8{KUEZKgg3Z;UOX-6;rppyFY6IG=3Sp#Wydmr#JIpQ@KTPvd#n=}VY z`bd%D=|)kekeXC&FTS8Xyl3ln(L;Vhn@b4ybV!r zq?Y?#jV?kd;i83ND{0ZLg;>}1YtEdx(bS((e<*5L&QV#Wd*CJuYOCe4VkD=7YOzW zV}B{2xS#)dubB~>@f}>t)3;_DmgQ*&ajb-c$+VtMvmui)nK6b6x!xQ>^ET*oPGoyk zQA+}cEen{B(OTFwsxLFDlqfXwrYiLs0+@tuI0>gz0CHsZ7|uyc$Y?GpMe7f}o#7;s zgiL}Nahlt|>ALVXTUASnE2k|9y$%56cMv4gku|rM6RgowvJwzW>}t&M5rCXZnS2$nz>mPgnler3CI!x1D7!Pl8-If#z2 zh}2s2uM}I((Jepi>_+X41EjD1)6}fH2t=wtx;pl`wsBkWw1E*_wrgTgWW+)=T{@hs z0akhBIQ?*Qigj2=DM00?hT)M8>8M$7973@p$a}z_d}&K+8$i9q#2sXo1nW9KdyT}1 zfU)+#6qI@W?tL$)Si>QkHT~g)H5dm;u|?cq@WvwM^DDlqB(;jy2t=ROLtAWDAiOwF zSC&Cb^E65LeFd+|M=li~oPi@t8ki=yAab78E{P4v0INdI6p{_qVt}o-+3KIYJ(AuX zM^pz`qunAJv=KQ)1r_~7AYCDY)&q3#GpcPaqcN(5TuoQ>YoH|{e5lmP*%bGO!Z@b| zqG-$J0y{uOwPdx-(k+D56&s%A>8P({%yhKjJs_6+-8I6o(}R4#K&v%x@Jb~fhV7lw zyrjSqJ;FV#<~Dc)hdZtDu}=#x-p_ix+MfqmGr{vs#H}VYp2tF(*&tv@23H!>2z=ZQ zcOJ{}uOtBFQF%e3WjUE)_J##*DArNLK}a-QWM{C?r04L`ykoUd zu&(4I5|(9DABOrQa!ugb#L*A`B-dTo|3w4i_`hgioD6LLLjz-G=3ry}@9F=hfibhP zGP3@EX<%=r8p*pKd~m>0?$YCPg#QR&F)nZnLkhy|5EAa}KuStM3;))16QO{Be(xK5 zy)SoqPp_RF`W*CJb6=ZlUF%$7U_&#>8rw>WI2A?^VGPa84UqvTD6KiT(gWAm(^&&n z>|V_10N~Kr*yvEO{?*{}F+q+XQkjAQKmocCumdVVK{BCZ42%!O3joJ}`UTL-7m*BZ zKo!7*rkc941FitP8vO$@i>O1^x28}pz=CQ74G4f)L>K1ACqYeYf!}q5lQQ1jOLo_h zXaGQ&p}EE3)wvP+U~C{23>3`(%Q?IRVh8}bi7^b|niv~ffjG1Pn*!_sH!>HnG66JU zRc%>i!O$!WW!cHe#nXNli7F~eXeUA9k<{lC!2n#-0U9n9xw*u*E^LLwmi(=3!VeZ7SSe7S-=lAh}0J>p84oLbY zF825Pjjm6i3>{tmnmIQ7isz-mj-l@DpBaG%_;mnW2mZ2*z}i6Ck`IBs)dBUYgXV)Y z00ij<_9mI&{2sdmv>;`IGzpd1^$W}8=rj0*Cu9WBK7sdfP?|` zn;Ae`5DdW_oIo*rkAi)JYAt+A6Ce|9R;2RU)v+BZ#HbtNy(; z*bKzw?c@99$5A7wFIm3b(eB{ z(Xp{rozWR!;g_HHdsl$@UrgevfB27l1l_+LXfIT8ba3X+-}^uvQ-NFoX;y@xffN0j z?=)RJBd{EQ$NFYogbteD^d^6MO7F8Pp*1*K)$QF z{uU6gA7&Z=HMDwSkW3&4r{FihY8+h!KY9vy_5jtd)^q&`@II=0@OvN)(q95TfT|_@ zA$Wt7ANT`P;QEO#!7Bi@b^Zw8KB`x6M<9*kUjmBG1AGuu^^f5Es|kOEWZh%3{p`tR=NjBh~&)01DpE1fw7 z=Q9l<_alFze6pxt0y~SY&>~(Jh9BGggAZFrhd1S<9M}(uRDVGW@j!nnfs`NSYJZ@% zg8Mm4Cg`y=31-o~HOUQl6h#`h5yh&%z} z=FIT>t=I4)4anW(80*g>WX<)HGCTw4D^|vDM-l!nViBYPT;DIdf}{sFq-sUmgtg z#_Crec@*yWS9lWE7H4P#^lf!d2pi_!;foqjYw&uOFVN}7nb@(}!R6gMB|paD7g`9^ z`-^pTt}xeMkfLf;AE9Gl$Dc)*+7np!r(~~px7Dim7UvhI)W%=$UsD6-C%Cnc4$gHz z2Z8jN=u;hnDRTt$*kS;z7gB@p^<19+ulbWc2#Y`5eQyIP2@bDsdV9WhTt+bd$IeNR z8wgiQm)~!S^?jZ9JbxL3OWH5?Z%;BnfPj2H=)^)-QRp7`W)r=k>CXZ_+2p?Eo2DE! zq{t2xNtezV3GQ)#BBv4vciD$U|Z_`flm*qicNyl1j zMsEW@WLVRiL@r#En?ve@k%1>S>0pA8Ucrud?RoV{$jK_eb%L?v&q{13M(n-$Rh5d= z;KRu>kVo8s=1ZLi-3v!?}Uabp$>AE7c3CEb1wMnREYlPo3ir6!P zjA1g^kU45L#nLwQV~i=|x5H=qyM}xDZ9aR@LsQICqv1FTCDS`A$7OLasNIq9+975Y z(4Qs&Dz80+>LK%G*+gwMYnns!wTZehoA*Qgvqv4Z+)11sYTse7_y~n$fw2s4`*<~C z?xKx-qHe#arFw8@0X@wJ;kY_$izM(Dq^b(YttYJDr)wQ2*dp-vP65nORfxP|n99CK zYHK`xY1V=3IAOPRTGKiwrf8}?NXdUVt6pv_}1iN;YL`P z9T%~d460bkY*s}ssYL$MB!2p-{u7fwDbbgczW5hZi1^$EFv1`r^(rO9erkVfC5y>i zO1HO{w9n{}XUR2Pygx+n$;iZ8YLySZ=8EL5n%(LC&@wwERV5O$I;koC~WIV ze@{Vvp;R|DgbHaOQxizfHpPYiv0?Q_;xW1tYWH6r>%o=D6b#V%>|T=fa`!t~%BvAR zJhe6B2-zd68g7G7MAp52qih~*d7LPE3adPRcG;JRgL72r zynX@umRUYJlt-wyO47b}#H)$2beTqvhds7Y^t~45{uqHm>?W_O8R0nA>sTnImfPVivf1-(r~Bkp z0P)CCZ3?%%kiVqQLH!NPgj06en8j02T!Lcv+KNNcUg#}%(mJI$yPBj-l+_98P`3HF z^ge9f%5di;HIg1N!5^(}k>>p3t~dR?S1Z+E2+2yI*~q`Z=Kdc5O+d20dDohmka79` zk*T3QoqvtrVNZN22-ac#LPvl$lz47u6LsDUoL@u`&n(bzn&$VAX*_zmWBO~RHeZz> z*pY-b^gMVoF^bQ;lRKy?!0-V~zcn@JkZtu1wo#jlad!nXkO`Z?7PYO1i|2!0N&}k2 z@k~5JkW$n*(K;EpdQ;ZDWSh_Yh=Pe6Ml28eT@`nXqoEeZO4-tmAzBR9QkIk;X%mC$ zq7tn^k^++Mr`>owU;W0DA=j}OewjUVP2D};#ar%(P1y78Mooxs$wWLl2Q@>08QO>I zI`iCZmyHy*4<`M18XP@dbDAll6l}sD#+=L4oXVagKMhaYDj_%{d!oF1ulA572p2kV zze4}PnG}Ie(CcAFGAjGk{`W)m?yDC9PYy-61>r&n9B}L3(Kmw|r0T1k>5d%?;(p}2 zs;B#F(j3PygjW0H;T<#isv}zkeRXC^q$3ZCdi)jn6FIweZR~l=cq^~P3oB9&6rrQl ziDJT5{1bLXI*pU}6|aC`Txt}aSbsw8y|eq~cp@EoIHLh@yI4%}P1;xh=+?T#`?`6P zDXC~a&l`z=W%0pYPld!DtNm(KE7&)aCj`M0mEB9Y=WQe*hCZMU)z{w#GUrXjVZXS| zN$Gw~88U(C3_8Djb?PMA=BMWN)cqp!E6Vlh=gdEOD;Jj_8z(Q@yMvAM69{qyyO^4{k88Z$V+l<%EfK4eQ@xUMZvXm-ri+bT!ZZA67S)vH6_N2 z+m|EIz8!V{dNatSw)@DEw#>^zc6NL3fSWfG>p|!VWayje5mUSNM$6=TQ&J4e5nR?h zkanaH^#v8JajocJYMHB0TV8nK!vM88c~`cmxwu47YlBdcZIIasmKt&})2d-#IgubXvdXpx-!adeFk#U6y>Rsej+K}%dW zha5C*qX2=>U?<=p(z@4G-tjZC)_+E%35j$=}0ScZuQVa(ozMB@QNe+pcLH3ZdcFF7MA) zHCd*Z+HMvV@{@NF`mC165T6N?WkoZlnVURifZGZgYX|?bN~}G_V+pfAFd=VCo+M_b zd@XD_DL2lggW3VxYqnj~BH){;NZl!)S8Ij~kSCT~pMK$dZwFTllkilnsZ>nAw;1~v zY84@>Q%7ooaE-Bj5n5ySB(O=7uf>WUU_)|o&yR40jptJ!vk-0mg|+=dzI4cSuXObC zL_k6RbL0&Nx*HsOgT_PrC1p)FA0gVAdsOk4w)rV_j0d}OYN8<$s+;&^qsrmLvv{-n zp3<#G4|~v42Ef0`mc^bj?IcWRFE@CxadD~VuzTv=KG6Qjfsxo|Alloj5Uxf4CB94Q z0^8jat6&nrFL4i}?^o{!NYs7Cg6TVQt96mcbyw~dRD9V8Eniur3Vo=XZ7FmLvBi&oU;p zOVp)_=ip(*@JWqHIJboA0OIOCx_WC76P+N7MbX9Ng!QL9aBd`} zYZ2RIv5$oM{mZd0M6Wk6R|8b7jlW^keFetcgb#gmTRIkUu~yI_;(uhFviRl4foyN< zuYyEow&pFm#4DN^pt$^N&Y-RRlu8@Hr26U5KI$XO?9sTDG`>pLXH@nGYY)fiV&ssK zO*#AYx=`pH6gNTAM8^PW*bdsX=sR{-3eov)W=Qg*1_)0&W<|6La0u74zK7 z0Z)W&E*c@@utK@W*#dK>Ekhp})jsF(I7v1~8>GI2{V*1k=0G7<*?%u;YP>V3fK~QY zU83kGm~O8_7xr#;ahDL~_OU|uORaQ(w><;D1F4wj@dlysHJfezZCvh9 zh(b(u7Oz8=X4bcd-HwcFUj?p`9348$mN8C5Jm*T>?D+A37({_+*;&sg!uQqgaYs)A z5UxE@`c83w)aeerUKi13)~b|DN53uK4)a7O(Yun61s|_6OsT5Uyz3(o z^OQiw;L1pjmE0QaY~Zyw;X#U^a#}|eAnXRo!%aQc_q<8^?9ik7+!wj#@W2IsZHZj( zA(U}UT}UimxS1mwVsdY1`SCnQ0bz2v*0>UK=<{_qS}pDI)ZaZBm-^sP6euw;n~Q)+ zlGHQQv#MkO&nhZG^p;sVIV)Pg3-Ke(=dVE)M)PXlUpC|Q9L>xnxu@$2-uEkZqILdI z{t2fP`xQ!5Ra1@gG8M?GHA7n1zhidQ9ol+JfZrA zJ7svIuQkro`-Za8{q(>FtP*pQ`C#nWeOeAWt~#5G^34(4PrPx4j~+{NA3T)h+Y`2HEsIX$)-1&yTtkA%qQ{q? z7g9w|oS?cPoJF5(?W^!+LT~x$KQNDr<=#wl6de<<&Xa_!I-Mfy%UD)$(zUE<)M;{Q zd_b-xS?b;;##pc}{VVO=Su=d6?+b$U2fEBYX7CWZv%OwIk^R+fDSUE^;*7dr7iPYr zXEUOy3^Fzfhuhs-5}|1(VfNHFqq_9-24UuzuZDOk#I80}Y-h@gh}@|g_MI16Y_48o zTfB%v=M-Qh1QPg6!3e_cK$%a_>f|AS-qh_W=0>+gsxY4gK`XyDB7Z^a%!?6TPcf_5k=O-*R zTrhQ*;XmE=TrSFJz3F!qTj;`_nRdoN{gdlRUy8`~t0k@gjRBMi0+O;t8dQ2j(r>gI z47kE(oeLI+IN=lK7JlsbhRIBZxJkD5P3OI@I#TbJW~MAp_2cNd_D&vo%`9=7P^%nr zxsjr4WvAQ@ix}-CMm1|xFBfli5crnRr{R~nFYDuL5a|lfO`wYB^6{^$Tl+7mY-wv& zV#6iZ&OhWJ%SPYni7(M=wDB6Xa-?&c&$@Lk(XCoNSKi_zobe2ZrN6t-m|Brov)7qU zGsd{QHYqgDdbF{iNM*kkk7>yjUioH33(D=ydKbf*Y3I3LX{PaZ-(qN5`{6X-Xa7F& zj^PArPEwQBpXme2CKeL(Su`uRhW6j(qyq-uPZyZ3Io^`_!hE=r?gECm6 z0WJ_rR@nj;+s8@bAvw2dgo%H@G{+6)FH3r&U|DBJ2xHayFeTUaUP4#)WKr>kCt1O^ zxPcD2^r3Kfh`Mt*RwmI)$R*YM+ks_d#)1JFSO>U4#KHL>!}-(z?k@gipnNv`h)sY; z>*FnDBaFBcu&-Ren1aczRhGl~qpt$bO0VYGvc)JVn{CLQuT%3{PQ;c`CS&(_Pvvc5 zKU!@W6WL)im+liaO1k%*u8Be0v|Fg&G3%EOB`;KM98L_r3}@U^T|r*MTcf-Q0oz>3 zeD)Uvx53z-%8AQTl%mB83dvn}C0>=}i5Hs)1*cB2d|Cv!kju}#P3C*4Vp6&xYW<$-b^kqSFsuu$%Jk`8eiIkO`exjn3HX>c(M# z{yUf^3k4DDnp?A>H)8kp8t(1MGH~tTh8Qt|S&d4kG$qaAFQhmcc1&M{a*iO;>1nW+ zyTtOe)5x5fh~>Z0f(bEEJx{q46^!4{uMQDl>TM}wb02PX%Mo^B3}q*UoP5yl=5TJ& zrJ!{+b`hyRhRcow?vj#r4~& z(0(c`SFMYlbEtX+thcAw+?yWZ)fx^WrL}GfXE?75EH(Ou#A^TLxQRoMVlFVo!gkd& zU9yavqThpsme9gwtAOKE8XmrtJCx=;gsY%ces+Q(4V%a=9@Nmn?Aq1)PWcI_{xQbeZJrF=cqf35I=^Jl|zuu{f8fHE7)4s z#*&;nLj^6vIJI~7Jmg^lb#Q_rX}9VXAe$}K@4wm|AfzbDIE5sW{tk~)5tck@>V$b=X`a`L+F z9rbG$sLSq!JSARyjw9p@8Mcp39DAV$lWu40tlLDC!Ihc7T5z;gs*YU~vgKWTg{kJ5 zBPe%Bz32vK{~gf+9!AeQHQ(iY1W)uNK7RB*`6`(KbXThVJd$7aJ?3f{C_PZjAV95-YYA{V@I13CSPBwQ zYToa$GtJj|ZL!El7zk#*F-|6650839xU-GaaqoCTkaU0fqP){kamU!aiX{l^$qv=6 z0FvC>#(IrPNEf52Y11(bFS)U?2FK-ZCs1WsCcii6JIr52PT2aP?hA!Rc5AhgIecIw zWgRjiMl$+ECYgh6Tih3V3elHG6%nHj3F`hupC5M^JV%xyGT9NA<;;H7SSra7=mOEz zMz{y$>J66l9|(U^OjVh#El3PAK&`JL4sVWj|-rvqkF{N!nU2H{IB8+_00N=q)u(yQ})+ zb-xrak$N#2zljsiXeOKLWS{opdp9D;fTgBRG!M6=DXW}4oLEZUA$%|1U= zmym#%THhuv0?1co1={2AG_h>kcu&kvEh;3`Q z=d*eTV$?4_ZY3;#n###Q77UV7jLMn&$T|;O-%UaB$Z?S+_bx5R3^#bmZVN}ne?c>h z`^Xm_^>|J!)t`T2O2!fVu6r}`ryn;=;6&6AGdk_Z^<~G+Jing2Jm!5{t5;gr0L#4K zSppP9Iv6ZG0=S+MT{^K9^uTR$+fS`ajrODlbXL$Muc;C?Lnzu2PL^b)jvZlZyvLD5RPu?3+JPurY$W= zc7L&{>$5EiUt#KZOPmYO>1bdpS*dg6R~7eXOL<5j*88Xm+3$#lAr!=fef9FDuyRgV z-Y@BVqnyZsI*`>L`@8vo-hL$X6{VnVR9D6dng~tD5A`C6?@*`Ho#@O4ZAM?*ALb9z z=`=|JjyLQL7MsnQn31!^o~zB68ViTVQLWyOwZU6k_)qp{fc%qMQzJz^2TfIL1W>M% zw=ywwZj6<1O>5o|;ZMko$+;s=1+!2qt8KqvsyufRNfbofoW;E$R^2f|;sB&y$W~s< ziIJ;R75hYJH~aMko9{8Qjm8ViTy*O5D4=)5-|R3=zYo9N=G_!a0T&T(-E8Cu9A#Pr zj&8U&ha8+*2XP%`TPkGVrC0eOtizzT4@9`RQN~`ZynZ{r-8764nH@Jt7x>^MBYE9V&}ybDb^QM z?he0^iOajtW}6t>pD~x!6Xcj)hJN|nrkfTCZAXSGJu2Tc6xem@9`mj-EJu8orR<9o z3ah1fNlTlGq|rZuS7EK|Vbw1K_g9fO_NStLTEz%w6 z#!BB1XYT0F#F!-ReW^;=h;_JYcVv^50N65p`T}qq-}olcpdEkBVbryEH^_k$gc?L4 zjwE1R1%SQey>030`w~o;I;Ya*IzZ3d8i?p}X`DV%oe1yK%}3Qv#}y~v^hzoBw{k+Pg5iH$En!jg#FfpSqk_TQT)^z5Tlf2%_;?yAtX1OuPP{uj!hjqBjCT2z+h0>-f7#H~v7JVF|*1*&*m1{piQ1xjEjj(G;y z6M5AX+$h`>5J|6XZ?UIoc6P5+2rfAfP}&eGCJRT*^IQE&UmE6U^5T5Qh}SkzD{M^4 z?l)5{wQB?OwB%a^rx6%u`;DS}H*b5|DXk`96)hz|SOI={W1XRce!3!D3?r;mL8Ii+ z>dJT*`^yt&;AqIs)z`$%R{E^CLS@QQruY(WD_K^nWv5S~J!+);8r*`-PoPp8JL@79llPNyMNV- zK}iInag&7GI#e8pKGl9g&H+*-J9JWb_ojz;%`+6NHrT}f$oq~bGQC5SDqf8*>?dcE zLVX>$y%co8e2Bvv)bm=~Pp4RQM$55ugzvTPLJj7G3AMfcW7@*)^2twRrcqGp>X}f- z+zPWy?#P-lc6U}PBk%#~wYHa6mfccVVS5X>g9 zkvYcYzPFq{kV3Is9zo#EW3Qa#-umM5o}%nAY7Fh!5U)nlf3=u7O%oe52H`0o^Kf18 zoz0!5ovCvE+0sgaZKdVI24+bpO>n6#5RjwVm*$Po+bK#(;8^NTx{$Q!Oa^~F8@nTF zU5|PJ{t_-y<{jZYYAsq_q^5Ez70pn3C&+Ve(ag>-9mK7V`Olow8eAwg<;-<1jL*O2ytS2aDjBDov4l6o!JnHrDtsThdDr+JAc&yYcZmteF(e1fgD+f6=#*M9A<YN8 zVYnNmr}Ff1+M_(KhqDkgvtjDSPtVBeQFGiW1)5><^gq=~{yJ`r_C&RC$^T90O90pBR%}CyH-~n{8Mlc=or$>@ z`ldM7?aeuFDR&52-5%=Xq&V1L3h1yeF%2PS$6w7UF~>XVGb6S|va>j&GSe&5`&?Is zC}(-R%jS)#A-DK`aqGekGq_Bwd^7m9hG>+XE_>QaB#QtHq>*p&^_Sp_h-xhP*N*gD;O_q0g{>Sy`CPo#-w`W5JR+*YUKdaZeO^bFv#uj7JNm?H6%0W6|~-;~7JTSoY}z6|o%4&+#?Q zdN_#JodkGH#8I5y$cT4D%=M8KmS2isX7zN!QNHM>O@q(B$K5WH$!x)(f?if#EZ%(= zQ?}@36}B)MA~G%xZg~INECtU?Amr;<|Nezkf2v$Q2YN|k0sup#EeA!oOgRvD#eQc) zt5I}h*=ud^;`w?HQu?{C<&;M(%NK-0!<|=^Q$fWu{Q0xQ6MW%a5C=F7uA&d0=Boyt zZc`U21IAtBUR7bE*hW2U0v*OqOYZJ%o}hZKJH2OGv)xWrBEqG*hbvRxmso7Asg%6^ z&DR!Z@AXH-LO;a#pwbO5eXX|hSyaH13sjoeWwbMYiqX+m#L%OHI2Ad({z1i~e+xsC zT=(y<%03kyJTo+~ON=4&#A~hUq=@8>ZpoK^i0ui*f6KVtS4D@(UWBxuFzpLuOh6Q6 zt^N-DwW+3|%8*4lqi^vDf>CXmG_EieodqF(SWNsWKxx@~?<=|T+3%xu^Cn`jdkS_U zLzvL$${v#}--Y8N)sI}RuPA-owwj?lC~!U0+GL6KU)(KhHpvp$W?-wxS65!YkGF#; zHD-k|?MI4zid;xbHb>cBd8;9nnp$5;$(qv!_4`!2 zjKb%UGkzp5{Ct&^^-=APVS4z!>^m$n%PYJ&kp>^Oo7sqP?ott70Y*NhM7TWu+IGY1 z1vMW^tcVt7iuu_epFadaH0;IRh$4;eeca}kPV`PKw((iI7AE3wA1lXaLQ_Lb7=Ydh zzO3>E6L1@UE^Xq1GcWA{hOfU&KdY-ittl(TE}5PW`+&v3kvqKWvJ!D;oq~VQId`3C z`OON6N=`ZNWgw0%r|L8=O7jDJC|5@ow+H`w`?MbEoY=06DHbVzZ8Gend8bSD^3)s8 z%3~)O-WuEV@0~y^sNA0tw9j8mLMpU*9R_yl>krP^Ug0}oj1K6{$7Y94y3L;; z&wF-vhg%!D;w#9&=q4yhTkuST9xpFZwpX!FQKb>N+s~_2GiMQMHej9EN;C`f)y3>e zhPZvJ65+Oe%ANhLUDH2nO6V@|Zhi{{k9g&w? z$4m|s`W9W+#O389HT`*x#)p%OJQJ<#Qb9%ur5IxkyxZ|d{^;Ax^+_+=%%bRx$w*j@soJ`)Nr8O@H z*n@09Z3&S%O^D8~@+D3*PCQ}gz;1Ah{TaS33sdAz!%7?uIZNXtmR2BPJ8a&~->v2(#s*1y-xB;Cx95b|z9%A073B)aEiP(yE) z?TB)(`dzP6WWv|g$G7osES$xMdhY2P3`q1TI*7HTxG&Sk>l2#iG#=5)a25(!fbs3y zn_n?!)NXap>#<*Wp79}WO?>TV3rD@ZGa71}8Fy66=hYG`;^qGx) zoOxq8)qLi`{d`^)NV@WUd#CG26yyCWaF14T$Rf4*CGIaatYxgq)Eny(ohtT%T8&?y z0;=Do3mxM5hV!p*OAV;FZr@Azgy>x>!^e6Sahr?^pW|Y0CO4^6WI zxyX^};#M)~DiO{xNNBN3=}w>I{Q4!Z6*)aAfWf!Xf}WwuwRcNn0{JGZ@ZEAKqXv>{ z@8AP`S_kis^hRA>^%0=?`2!N9UYn}8Kbc*5CX7xD-z1xg@;#~;K zz(G1!PJsg9$LGf>j^nW*G|vL*kYMUCaB&wyPBK8qCh_f+=10&Cj-<@kos-&*&J~5j z+hT$gX)6*`ZZ)b0|xDh-UwyP-UNcu4XrI1%T9{r-GD-?-8T8xlY zl>v)S?yKFtpL)en#RguL#ZCj;dwsQ-H)d!b+w9pJtr0BzY23efgSmj(_?bs-g?e=( z70VK*PN`%V>USt<3Xh+N^;-|`lRk*e-*dh<%*t#_bjq$G+@dC$)ilC93tcFuG?`cY zB`(`SP@3V>-1McOD5-Vbx^9l?hqC{3wzC*J-XRCak97J{2D*whn6>_7YzgV_B~<+a z5hnX!JWC=ypb3@1q|Rh{^l}@$iDJp4W!AP*JoR1ySIj_TdF1J5qCU`u&`hW1&1g5m z=%8F_v17`-KG+bpO{p*KbIL{>flYR-4p-yt>K%cd zedU)K`ngJdM6|9G0crp#{0BHhdCt_JcHR0hwRnL|>39!fV^2+Yi_Mxfg7l`TLJ#lZ zdEE_X*+(vqZ*SbV!AQZz7gjpu*u;XyMnl~ZH$n%@)!m3cnZ|UOTdu0s5a}P$+*K~KV=5LpM5~zuBf*M;97NyGZh^(n|P0Dmq}u0 zb3J-d8)B>5Xe2z?lQXBqAfMU`2E_y7clOAM39v3x?+!q-LDw;hHe+v8kPJHA+FT?m z=TC%@`_VQC_vd#HqMPQ)MQ1QP7tVN0xoaIp*4+9DD)Zyw>;wwdx#8BHl1HW|S1aie zPc&dK%YsL-zqs9*A9&3_U|=g&bWht1a<zaW4$o3##WQ!yFb5i9V5w!#VQyM#IkQF_zQ^A!f=9DhmBjEdRnf zXvSos^3>ZovP)V8%W!l(l0(LE38#i2LIyXcJD5uL8l#vL4%vwoiA$^nVz{_U{3>n> zCD@RU-`KEieE#E%dqq$PNn)iDWD299Wxbpl-E${}Vhis5h}lHheoRuL%p3O-|I!&J zzRjkkfvTDZZb{}v#aM+?nahMg#aS)bE7ied{a{ z!M2u|N%y+STr_Jq>wCJh9g%F@@dd)fDs3sBMs8hPM%?5+o5fF$qgSQmzw&C2mtBti z$xquWp~DE)z$q-e1z&3>oiedrMtmN3?2^T(L!5kn7JE3lv8kp~eHuSmMN)@qANYw*vzyeNo@hrKS|%T|?ONjr&-rW>a9mR#GEK=Zkx{op@WC>W82PH8WMEPo z0VvJGvY%d6mu%I(6iEBY+Sf6odZC-(ynN1B)D?4$doi1X&*FV_ zEGj(?eMs}uP$>&r`A4{R%vR>NJGw{Z#HsyHtS2!&70fu|GMh2Q9CaRpABC&mZ-nP3 zA!r#@Ni-L5T};iPr}x(S({D(k`meTOJB`##lEW9Ug>8*ZKsfhII=k zpB(4d=K{yqJ|`H)d!HIiZ^=L6u}B)m$6QT(e0TEdtOyIoX-dCD554H<`Egq?^Iy0Q2k8LkCd+x#Hf7iM_{rsGqr8S4J@oR;ROl zeaghFo*%D&$`6Z=)3|VCIQ&x6 zlvt1DZnONgVfg0ZVXM-}aj4tw?m101Aew?GO6B-P@w}64AimMTK@Cb&#sO!!WnBWv zIN=3P7fL#_us-c@gAuu8(~m*mvKpl!17N51EC+em(DdpJ;*|pJT5y-J11Z4$Fw%kl zfR(=#hpi<7H#@McXvMA%74Yq|m!>qUmFB9-`>P3X(s}5$^==xoT^GQ1OX{(tlO1pq zL9F`N{iSJ4aZQz*N-$QRt@M@ruFhoWbt*nEtSly;q~33DrgOxc|AE;+VTV#V`#dAG zOr^|e&igDNqpplC0%O}IkM0w)~Rur7=x9yC&l^XB>Saqi7LCSw#0jYhi;o1&H>1E zsKi#ciY&0a_?MuwD0tcy!yD+g4LB8Mh^rxt;-Cvc&!`VE!xhvj*;oyylb-8RrX1D= zQ_V7YJ>PDPU{YlK(D(5df~=4!drbM4bGP}O>uXJ_xuBiA8U!%Ea{#ieIip%e4^ZJ& zt)m^imnSVWi2GrTrUk<0XeUn97w+M-L1nXkg==j z?PrqFwoIP@oobFc4ROBY!o0?3wyyAg{O1g9V=fCtjf=)ck#oag^*T%V7yJBkOWChF zQh94DcFifjEbwp(^lsCgw2>YThIs90$lJP^(8MDIax~G=)TxpuXA}O)IN?(sNEKCz zqFe#J7%8;6a%)||T7BzBM&R*?aD>X@M#0;9_R7zy!$Tu+1K$3=va~b2zO%KveCx(N zY&Tp423U4W>ne!I(@HbRv~T-)+6e6?-9O=GT&A^N1=|zjT}(ghxNynaaC{yn}7d)T(<}FPp<+V4Con>Hx3z5od zThn;gR$`LzXx8zJ@+CiF707jfs$Pvd%vez&Xpow}bUA!cw4Z=*`nHg|DA1ft7H1@9 zvswLJaw+Nx`H0BK)$vd1%U+h;%2;Fd7t~ z&L%T(gIX@(il2`hqb(>-F1v@@C&l6RY&M2C?Bvt6TE7mAjOAs-1|uoVZNB`)g{Q{4 z*qY&Mr{92zX=*`hth-$|C9dZtNk(rEYZgNn9&6U;yHoXpSzQs zSp}Jlh)%>$0HB0&_0LlI9h@YHU|ryx#H zx+&GGb$n*lxU9r7z3_8UH0LAq?{)s??>>NAAmb(>J(exwZLMe-xRGjmoj<%hmKavE z`*NyUV6u>lx|2>%=+jZ#1CfOxzg#<0_ISa&V1J58KAVDT^~5iQxvh*9>m|oeT zccxnjB9pQQn)qQFt>AcMM~WI>jye)p+-mHhpank19c1OdMe+ku3XZ;s<+- zQl#9E4#d3Py8u-ia$f|L#}|y@L>8!R)fSxM_#=~V`&kih4~I%t4a?TV=GxVtM2or& zI1VfG7XtECDKLGF4A@Rp@(tPYx(q-v;75ca?EV}6uj{H22d^;D@qFE#y)a>YHwC?k zAXP15?ZD+eg^tnkuS|3BM~&X3fD|3tegpk4e024=x~1eE8~!!6C6(XI@EDd?_!WXK zth9%AM1!T$f-DhIc|W`wl6Q0kv-*(F7H?T&7|GN_;`q>#f*q?&)B6=~d6^n!(>YW8 zJ-k;?w%A%6k>eU8+Y^}E>m^jWILAZKT}v&Wk9gyjK4OBho7bF!jc003RfV=l?Az!_ z;2#-X(BId8kn21zBQ7*lNW|9pn3QO*tU~aXH?O7sVQ7tGsG^VB5*AVLtNQ+fCHh-@ zzaHek7VfwzGhX#{^~5&eae{eab_~F6op2=O!9KijM>1tgQY9L2U?H(SZ^k4CNAMP| z#HHu9H>fZ=(9;F2W5NtX@zcPNzzY@MV}-P{eGP?8@KaoIYfv-?b9~#hkA17iSG~P+ zc~RPHLyhx$6MMV~_FtGbK8^6ik4)7l`(vHioz31zL6Z^0dYkBmY|8wsgG}WPDP>OR z?&`e)oTuE^3EG$`^8?|D$*lcJ< zVbX|TxP8YhwMj5#;mgCSsd#+VxaBI?VZs}*M*1aFxlPLB-4FoOZ zBh~7}RMYP4`MGxYFr_&0OStgG)?P+@6hBnDGY_#Im+A>{J((bYaSUA6VNatQK~tY{a=2R>V&D>9xN4~Ime^FxO+lU%i5B2rC*b-lJRav$*wl}f?P-!$S@*Iv6PF+) z`{l5Ri4Ga0d+n<#C7opN?gfoLPw=M$ddNb?Ix1ExAzfrjCf8Pk*#K-m{R~#`FT#&@ zSu4yJQ(|^ACo-cVC!u!)qNTp>Z4bG1BJfMLm23SI1YOHy;k`Gc7?QlYn{z*&1Q#_) zKPWNzC)1-~52iTTvmd36?y2~oIc&%T*syr0liy9JQ8ca9!*h6{1)c6tyyU#Q)I%q% zQ2InS?_mp1ZLDLl;wb}u#*DBCw6d~jLy+)!KPV2bG@@O&9)y8rHjQlSA_clx-m&)n zM)jKWpnqNTy&!=U+bddTh{IGRJ)ukz=RuTFQ}T_wZN}%SrX#%rqqeUktyHjNX>+zJ zdI89+^c!*9t2eEC@Ur}jOyVCC-mZc+Pq=^NJ&UyKjr@OXoYRgd3V;O1wr$(C zZF|nxwr$(CZQHhO+q=o;zU^OhS5jrecFEr}<9*;jL#2$K7M&#W{dx_8Vd$)QPBS+F zpvsgRuR2OOmSkNc4mzQ@pOrBUGudO-i~Gh#9e(g14XeTY4cL_%_W*scan)Xylo~7J zMLJmqC`m#2Sj+=X@OXF>I!w$zpMgAV|LT7P%!=||L$3)s2AacIZ`Am=(=-n&G9GXW z;J*W6l8pfT=H{0~8*q#HQ3{FG|O~*pvqK5kQ>1bCuH1r*_tR=z&j~Yn%ga_E4}dw^V^@3k znP$gYRB@-|s9#oxju;^e>mng|>a(Fw9W0we9hZ#M$FZoZzMF9nG4#4nY%Cf^%WYLB zQ_+nV#--`p%_gvb5o2&XGDXWkWgEd%P(w#6OtDEG+o<0~q22!A!?pi-7q6yR!iQtt zpcGj#_Qzu?Wmlo6qNc2Lm_^m$w%FA^Ghch4j;RnA*~LJt&g$wC#4f!iXTxcvUxN>T zir1I+y8B@6Y3-@TtT+riFv^9cZnq)!N&wyUq}pt|+9V`+i$qSOo~wwegn~Ju@bMW-(sH5ic6oItQ>0{9Rbmn^ z!=!_r;QoEUUdu#|U@d=G(wMiaf_WY|WxdUzjPZ6Co@#Id5M0V@Q9p>ehh_37)CQm? zP7i39EGTtatP6C-KQsB(S6ucqO3Lu*IPu<+VZA}z7YIhXLr2Y)?jy^&oUbB7ZsA^9 zS4f4{^^~f6Z-ptiB?;3GciRJ1#ZBH_NKyy1M3XOTv%rV(vD7YYur>R53Mf8*j17Io zeM@7C!&+iC3kKiH)WXubk!%heYHy(F(Zk=Hp!<6-}%X~(ugwyk1estYvF!Rpw zwQqTNo(FY9(5*J=!2khBFT%zcDe9n{kdP@k0PHj3)4cFi$ zHUQ}dSu`qw%li-C&GRX2BCzhrmkMB|_VR8L%smP`0q1CAQCD<+hc5ecrA5;j+6TSt zA#baoR;79vEr6;pP*Ts(lMH2JT5DS3>FLnJuw4@2_dCEv)omTo!MKfATdmDH$yMjT z+1FB}e++FMP%(CBNlMH&8*M9g#8GEU%01Q!u3hmx+Kt%_U~IQ{&rLe52CKgjfX5Ec z457VOwQcOH`SEpQZY%r#0?y#ZIckjQlwtAVAB(GrKQxyTP&c~(w5Xsp&A)ueWGy`E z&Aib08zA6wUX@tY_(&DCRE9DU-gYC&cVjAj-#Ads8r0r)^KE}8A&ufvATLfE*9%2gv1;zGK3zv%;U*Z48>wbo1U7gQk2+_+n33x!X&WUrnYzpaGo*&^49Gj6qK#(Cg%)JbZ2 za;c+>ha$#iBWuaNlZralcZV2|JbAnvZA*&{<>Rb=OKM2&E=84Yz`4ge{0YQK2mLFz z#XlP9NgK$)GuQ1gGNVYeRSq$;F|3->{d@X;3F>;T+yXj_vWe{3~f7lWliQ&)ousfD1)i zMT5L2s2!Ej{hJsuFpxLohe*x__4J^Gu5=Pms)gr)e<7}i_$P0L-uFp3y;iMrm|1;2 z+||6*BR6ASfnH%$R~zwX=8YHbhvoU8O0gzPkL{&X)+)_!ob?kWxm12gWqL!KDM zsR<_s*M*E17=d9KMw>^#O843uG97B&-77q&d=PWvHW5ghpmbKx?*IGM%ldHDD2Ipc z*?)6|eswUTG|1oW8j|iS(vg8 zVM^`ih7EC^lEx`NN{%yk3usvh;4MuK=VynpBcw$8ug1 z4rCqb9eFb7*~h=`npWQ22bc=i;Ye3d^Pjl3BWAe=pUS`S>I_`&S!HNRW92aO?cLCR zeQ6VWyv$r9lbt~^@a#voJaeb}p&wQx^)R3sFU5((T_LJWYDntczOue&aU0J^;e+{j zBQmwU-qmhT+kjMVPDdC^3XP=J(|L#4z2W zHOT!za6&jkZME*5t61|0W`DV_(PJ_O!TmykgxT_j6UrS`mq9kViVwYx16w*8mmO|V z-IC#Bae(3mDqv#1gR-gR{ZP0>LK3Sn_hj>g_q|s@@qTU79%vM99!SA+7ElPTHaZ^h znV}paXu-#oNbTG~nu?POzVjJ7p=JvU0rWCticq7Y%**9-YW7n#2&aBhE0 z3Zri9j+DONCaiBu+xdorDuQH{J83V(%r6B>egl{tj_{N8tOrNI=(uc~Qp)B&4wv7g9VFnjk!`EzE=4!;CDNy;(ZcrgEotdrfosGbq?Jdag6t zSaLz0S#k3pXT~MN)NCSbX&_+S%8CJ{g&Bk7=~2od;M{CNWVUK_D2Ge5$?nx&Xwv$2 zby~Sg*hFGop9#oi#3ltsX7r2u48D{5q(gCbBvA-K5MrUpF-&lsdTAlqd-|%mhww=& z9M~-(b}G%}0H_rZ{B`YavxsjIYSS&RIpQnr6-P8hs%QSr4OAih@}lcaju311KPoU$D>b7T=%^E6SG>lp%@$^IT$Xnf+c|pvzioA1q1SI) zb!cXE%l!Z_jr1%VxmH3(2mqiKf3k-;t=QB8@Xh%zH=sQZk{jiRE}w@{6XY+=P%1Ky zHXQ2WFBzk2UXC!EH(&jV3@!#3&H#S*SajAD<6Wd!{ZDrh=v^6$;tfr`_YHZv9<`dh zu8>%LSW6J&L&{PkCL)Mc&7vViDU{v7dlu7aCBmu0{Y9D^{eD--UJx1gDzIQE|GVI}SG1^4%35A3{~)io_vrzlw+1D9dS8hSM%A+2pr+Dozq)AhQQHs3rf6)N zecV|>0Zvo=yJJlH1#lB|=TZkktWbEE-%Ub`y7K}m8eRaxxrq{daW@ifHq$2=V!!Ec#eEp`_N!!yqrt3EwNwSJ7fahUdnku_MVPxK zbop3F>3XjC(cr%dFQ>k>25UoW1dYjW1emH8h_Cq}j_WGru^IpHUF9MC+{vY8I^Z+%>B%0WU68K3xiH}BqmP2`r+b1jFFfa}H?7*EnT@sz5srr{ z@6Hur{zm*WN((C#QrLTrAif*ho#aoz?9xFTYA6{K(aLY5g;J>~pp&nd1`ci)nN-;2 zmfBdzLmupusm$nA9odz$xgV0at>2D<$OcvGDYZ^%e7hXlIhi#H#@&WR-ZBgF=y^+t)(NVFr`$EVcT z8!qVH6va4B@Y$FEgU=@U}Yh2>ZxQ{Rp!&$l&mwHWYLfmG|1_>^$fjiOD-0)!sHSHH=2I2dW`E>Vkc7 zC5Ad?+eglD0NFtIY#Z>dmu^4OjJVe9Au%1eN$_9{H4-SrShuMg$2AOATjckEhW`{Y zI8fK}$_U4$Nr#m8Cz^~^^O04Yk;{D0RR7fQVf52gr?1}pzgh{}y^oXPKo6vsa zureh4OBfxmd^mV){7ihR%Red&X$Sw|LXHAVN*5(YK2J)xm3RhYx>6pRCd1pnRM$GRPvcD?c<5))=OoK*0ljvR zFY>y=7q=(q`E{_yy_}RQcH?}9TTMxu<^KDmst=E8Lb@#!QwUfRa93%d@6>&jfA8fN zY!?Octk~;um`%X7a;OBiX-L`9N@VKSE3YK_31PIRcrD>Z%iYlAGE%P2P z3{5&e1*aLH`ZtDmnfYn*6smL<-@LgK%PaHM8Yn>aUi%s)&^DzQRYLB%?-%XxpjWQ# z9bX(Qoe7$9pf*-l*aZTDDTHO zf7^&8@82EahnVhtKsDM&3i9Wh8K$@Zpc3kpx?(~WWl+H(9KAvTzA;wr7s0TJ&Mi|? zN^kC+4M(gNTdg#_Gp6+xXs!PH=lke{JB27W(K1}*fIsX#pWnbj)v!L}AR{F!x#41| zmzE^}Bgsls+-NYO#aM~SIZxpP98-WRw(OPd>5;I|Szd~6T&>sNyiKFt8)|t^&kR*% z98gP%iAvPMCRi1Dv9*U2>>8GRFTKE;s(1PU?P-97nf(lMrX-$mC4x9?9JcwXSzJ0p ze!i=>W-o>q>|y=;+UWCAF`D0)1dh5}k39pRD4FRMxpg`A=nWbm);8On?X95ig$w5J zeIhS94R1ZJLkLmhUA+gwC0v;NTz3CCl3_+Q@}u80f{&8x3CZMj71%r06^DZxBJc^O zCwmxLSxN$G?4p=Upde28>SV^62%$4r4f&HqmgAw+!9^8RBoAcGxr?a@P9)-kmw|VY zW#QAlgbr|KrBUs4-DuCV2Q&S*DpI0E&=FkVFacMUv!m~wUIA*>vC;CJiERlK*JT0U8RTHF$#p>q!T^& zZOpMwjs2=~dtY8_AC1-<-NK1=j%k)D&p6HxqkWsnL5BcuQNTbRF7g0qK&aYT@J-9q z7;+1dqGO~D4Gw0OQx_wGrH~@Cn&H@>>yi+_ZEk~ZrA^GvwVW*`E=8Ca0(9J!yLgXa zMY%eW%x0A_YdxwAd>$P~;Gc(a?x-iO&OQ@_4LjcF7^iJmor{hSeN_o_o^GKk7f_7g zj{D5|&%$sHM$AmWt&Fkao%fua%|Vu>O}X$xQ7)VXkPDaadB|@}!1^*hR8SefX}4lI z#~s>e02KsX|Gmi5>UvTacm#bI4v~KsU)=jU@%a1ErE<5K&rLeb4b(V{ysL7?_mNsV-EStwNy5!YyJf;XSvz~_P->pXJI(G z#C5&X4Q!)+5A`|Lf7vVr!Lgkz9yUv|EKgi6oMFy!_xb#%sIf=^??rjv%6{S|15{j< zFEM#9@E{88_U&c54GZMWwVogZU+8KYV$rMDMSyF28MdzD#m?vk7IQc50SEn%=i0nQ&mIVVr42l8|QGUmba$67bK(w4c7B zOM01n3iO6h#8gnHwPnC8;Km-b#u6oMh8#%Zp*=ou_mo2iid;ggwDWbkYv;33jxP#_Wu$HC5wd8 zwcqZ+RSO6ts@EIhR)h>F=0s{*xH!M0DEJi z|73@dPK#BxXWscAyT%%P-)9~W7VZ8DXnx=l#e4pfssU-UTDjjB4wS|fVwfdh?2MDN zRw}wVbo73xGGbRczn^dr*}ufegD*wNh&Di`42Cf>wsI{zy8kdCWb!z8VfxSr_F;Ep z$Hzc~mt#mojv@X=_ECZ-bjcidafmv9bOgSLg6U7iRcudqCJ^x`!AQ0_zdU|F`+aE3 zc4w_S41#`@Ft0RAc=Y94>Ph3&L*AZHpMZL{&XNY~vSB{el0<&N?(35pWOk@y=JZp% z=xLU+-mJuLZf3Mdj>N7CD4Z!q)!tdMNs^71mfiZ5+;}J`U3BZw^gXj_RQ_gY3?;vI zQTD_+(E*a9fbm&()upltWWi?FqOPB$zn^h|#%=_ED#26o8VGSgrt7HXVG`e>jVo$8 zhmt5ug7q0OwpM)`3~q2uO^@3y9)6;+!j0m#u6E=^sNzPTz6E9<(wduQr9hH8RwcVK zHL7nY&k=Km1G!?sG67?ynkL3{ft)1r&EtcvZ*?PKvL!_%N3$A%SnK;;|Jo79t|+c9 zWwIM4BZ88VRqn2iMqllGfFcxbp(lo7QW!yiw%v#&qWcjAvK%lck^r+S5n2EQzB8PA zy|l0El>oUDe?}~TYH;NUFVx&;08Oi|+X1$p2u7=kq-(o-i4~M>I43O+Tqms=af6rV z9R|d7QuehMUR#0dRUvGC<_8JwM%9D)bK+e3Z+DO+g8*YB9v?;~DghFiH|QTGc5NTgP6HDh8&s z^jT!Jv&0%!E@l4Y_3G&Wf#PCzZ%juocxp*C>dNv?^Q=}tfj{5|q52V=;-~p&se2oU zfGN){&COx)bE>uk4Ta_1=KsA`UYG|2vx+9d`H9-s zER6;GazwATU*DJ~rRX-_#F|^TyJ&Z3mGYTBb)r_i`rjqbzEVjWVBRZ;+!`i2H*FuT zngIS7b%~~(NCS>+(neIYSbONp9(G2jmkrg=$b`nf-Nu5Z=7GaY2!Jxbx)V{yF`N@E zmF)sWQy_Su$*?`e6;p~})=k?70dKTT{w#umZ1(6?$G%=_Z6A$aYldPW3k#y!aVB*=5 zOO39`h1c3X479wk$w-!J!y>GXoE7^Gz^Vg@Fg{Hk$%+D-T-rSKl79q(I0hajJ}IiX zmt^<%WLCO`-We9APw`0@wj<8FD_5HHkAe-y3gJ&>ie?F^EO(t$o9N)d+0;dVzIK%P zWVwX=G`dj|DernoeW*7Qgrr>2D*13m;f=oGJ=~{c>bgie9T~bkl&c^i(Czisz&pW1 zrQMI5<2V-+Ym(S7O&LMWljA%f-cN$(I~NyL7HFWKP$nb_0K5n0`yMXyfzbwGWoWZZ|SiOK@Q^z|}@V_7pzD0pL6 zAfRYjwt;`_A8SNu092X2FHdctfE(rmpU<{QRxV=BVXq0khMWx z($S3*`mPG`r}C@A6~6pooC{o#tB0Ohne6E3;{;X@1E()T8b9*Hgp7Lahd9Nt>^}!2 zq|iG>H-B_mq}tTih~WOhRWa~rqUVF%v?V>RJfx8cqAP*VTOBhuoqfElGEJ6xodzG{n!nso~g%>TIXY<_n zMQ?jjq3z*U+IUk5hA-qxA=pun$VeRDeVtH>qkI1_YwYwP;=LPPOJppH)_|dV3F_zy zyIbKsz~1+Tq>8=p)}Xs7rujrZ7|0A)9DBN@EU3Y4`R;SS9(;UDa1SH z2&qSb5nigYCkTtRWowICT02DjjD_eZWZ~Go0`Ut|-}0pohfTeC!U0{1*uLlK*wu&V z{JUd57;-E{SZf1+5{8b#*~rvP=adU@6*lLAlzkJDe`}%nb*Gm{Z!TCoCv$kC)!_A& z9td&>LNNSh#|f8|k>-#t#?=|XeaG1IDlEDWB2Ksj>TZU5tiO^X2w6`$di!Q7=~T*X z+X_QUAXKdNM#3rRxqs$KX!6VSUU#Eb=hjY@%cc}#HqhJUq_A*m7_JJZCrrW8r!utT zj{8%YIgaSi)OB?eKrI5W*%XFQ<;zhXa9h$Va}dTBH1ER7AoOpd3Lp_VpZC3(2y}La zh$B;)NePRwEQ@y;vXl$o{pl=jH{HW*?iB`qxlTJ3JOple9y|g>P`z zPPco@Imcw3WIoJX3e;ev1rks~5GpvU_A_bO1dYtuZUa}*KNZvEAHbjHDX_RR+Z(*k zpCcQn+se0ooTiDtYOkqhd5BEo#ddd7FA;17G&kT7qvi1-&cpCXVRwO&#tzT+0g&aI zmCHKN^T#{Be=B0O3|mwFqB;+{6hevVK|W*(tPW1f^xwLdWB?#fsk1@%D!D~_r9Cxd z?!_DQQd_n3A_9^M8r90|WPF|5=YGQ(e>pdB)^V#2+UjXH)he@FJMhOV!lm?)z1)oZ z^6Rc{&MM2qTu#@Vg1u77Q7rM7q1YSA#4XkY!O90)eY~V7qBgceGNslaefhazVCNG8 z7ka+D9oaq{udw%8d>Dua=}TZwxZhq-GbC$}(9iJ~Y4&Vl*rt~wU1`?Vn?iJhvSJ@J z8IloVldZe!FMFT@VEm%BS#qZ1C;7bkxaqs%Rf;=qfHIV1hut0~;?aQk$|dR+>4+R?ci zNwmce?`4*3UX7Qt`-3e`Q>+fL3NSQsXu#qJ+I0r%&8uC;w88p81BigA;n|pFpf+V_ z_K+YK9N(GK_6xE6V|0<4D($8|X+4)tP>by_)w2Loo94S;`L#{}m_aFh;-e&U3Q+8T zf{l6YN=u~=&QX}X*P$P{tO)lR6A!Kn;hDOHhu402nK>U4?jW4CB(GQz9t5M6!F++{ zE025hhrShX>`lU{Yj?QW`>j_ZB}oUwC>>XD)Dp z%`vQ=*P+ZVlDd6xJfP`Q=H;=q?kVHz=IeUTIed4+-X4v{I=<2{jrfyLYX?O^$pCO= zg;*>NL|klbagJ7n=XsdL;8~sf8xSV5&3|`uepKc?EeW%_E=!>_N;OnURu0M*19faH zbyIH3-#6&;BTN;^jkj>q`faLUtchnSY{6s}-p?qheQ;&w;Pj_dIEZEmCwEFtH}I6z zwy(oB1AB_^ zmHs(0{L)>jjE=s|9HI(%Z8Yi;xkeSEohpff-HRZeva$hHtTJ$s6M~AjU zR*=V@6gB=!?D7XDhiC(e30al=P(dU~guRw8EQav@hCEIrf%K9Ol-ARC%PLpokfUPG zlc7-`*BLJAvAogZWd&8z7;v4>ignu?DGt26E{p9Yl5rB!0V1JN2m>`@P;6Jq?G znV=KWYJ1CkDF*d6mtJMBuhsA4y`;QR`W5h{{{{gN3$$;;i^|&jJL&hF{k|5N8aS|9RQ?t!s8H|htoZEC;kt|XS(3jyq<1atF3)21Wa6jym$gHKhXyQ3jvqCQ`osHEmC9AtbsP5nCaGZp|t;YQ) z(Tg}Cjlb8MB}-7>8`aB$rJ`BrmT}6DY-Ne1APbEeMZGQ@jtpPN_B?PXj)%#FnmVUQ zh?(0QDkLJ&thZ(8yOo4#v6e_%7PJn;(t11XwqO+OYqT^`DM*W^+1*!-`pd{)zbKw-QOM|1gxVfL@Wbfm=0bQj~jKoZP*; z?@&N}(B`IoL09;KeeX%3M^>!#jJ{}(>crP{!cU3iw+w1VY3O`k1;>3RR=5apDG!`2 z*^~wC$?+(~I7i(ZDdo29E7|Yk(KvVOS8~XtrK2Q@-@b;2jq} z_3XzqqgUZ{5JWq2_21u`(xV0%_`3>6nIXcc>&Xf%FNXpDN23zX*`fecaUVC$PQEBe zZMK>ng0)*hXS{2SOf&GP1>5@49--h>on2^j@Q?mdry|V-IK{e#g}3R{$-XjFAsMD$ z;HrA1+uKc6dD^JO&pX4zCDW4~Xk@PrrS!rylB73%#WI|s2;t+Q0(z&>GAz~Ebv4H3 z1eZsG=%3IbI9f?;awsbK8b+SM>HQ>+7XK->b^%+C5Y}ggRwEyUs-F5gcdZ;YKr14H zeQ`t7-sCaP4QJ`)Jci1~J#z&XPKOZg!H(C+0%QxdebQRUGk12J54*>aYg*%mEZ^%( zwN$X$8-P^WddlC+w4E0Ee0f+)Z;vs6H~oU~Mp0e$FHzkeRam%ud5VtEm)=%!H)9U6 znqK5afGuml_K20eQMM8vl-B+4boPRxs`vaMnlaC-@5J|!`*1QaaM!Zh592&VSBs%h zIR_I76)P)hOOv>pJX3pXKXc76Uyp~#Bm{o5x$mdBsxV&aw5J4nc{AaclJEXW>{mE? zCU&iPO%2TM=Z8im-h||Z6%-dCoBt>4;y?RhGAYVi`hFbJgzdG5t7=TAd&Z&`W}sni zzPM6X4>|PiBENaev_(j8sM~pa+n|fV0DOP@!#~nd7fGXoof#<+Er{y|m)`vCE&r_f zF}_20cu9pho%0}}N?J4?_Z-73omXAhx&62xdq3Ds3LEnPkX`*Ra>8a=kEOo4cIbIA z^-B-5GO`bnx}BbvfPSEYtTph!NwM?-p`gE5bfL=v`O01gIOnv``5CK35XCxHmAb^E zYG%S!L{@AO#8g0BgDfUqeR-au^Zs!mG6Ogz5`3A%_P*-s%)o{F+lYVJ>ym^HAmNbn zEvhC|%LlT8Af|c9)S|&>JcN%kl$q!-h4wXm0*?pD!L#T%QbKf=El;Rd|ES}$)q9Ty z$>UIp0Lw^#_Bxt$V$~N5rj^LM3p7$d6l4z|7b=Ic(yH(uoM{E*o~W%xzIC7oUU<*S zKSi(Cvxh$i<-o5xO)|DDb8S$4{aR5!O}HMth~WpFMqw6s31~~vLE9zIrdaW&?n~f5 zj0lLY-1N^H5KZ6OS{s5ISEhca0{3^b&)#;#9S4VHFk0yBy{G)a|E&soysY0SKz{jW zgnVrjUF6^zk`y)X!G%fju6+wwPJg&~boc`|8uWxa6W*Y^mt)O!CVXlf=c%(>;~D~6 zKIRjCx3E2~HY1k75M>f{^noEhV_{>T@nZB8aOaY!7m;0*On91WJUpb&K%V->CV-bC zn})fEDo^I=Eqz>ihRi@)xdE$X{=io17bTNHv7`FL+roEGg7a?4w67QkkXbyx>@ zE-AGPbGkd;;6az;*Z@TN$|RCNp$`+1-yh1>Q3H6^tC(teK;{ehk0``Z7C4C z`?zv1%G9gY4Ufu z&z9H42}{J?{k=(9-VVrwX)*Jnq=A97wuZLE?MHCidHaz#5?@2K_QMe`PY3jaNlk}q zb_$!}`R&QGuQ8h7BTHm>$4&nHE=6v@DxB;(`k;?O^~;Ye_Iy=R3(;a40IFel$ed`KMGqG)65JGuFoqAu6F z3KsGJSBtldHq2rz>{>eUE_G^ddj(eDgBObI5h05x<85Rm$?hzaF2hw9Wd8EN8n40O z=9yp=muZ8#@9hC;JHo0i2L1oENE_`zZeiiP?H6_mdwJ*Rwl+z$w4qmc&GFUV;i7Zo@j^AstTjRh)+^phc-C0(nl z#f)1zimmv)r{oVK;sl{9NzxCFWk_SF$?JY)uP8G93RzAH=`B$hcSRk;y76(pGd|6` zNOz+q)GBongFSt^+8NED@1{;Yyi-z|akU#5zc<0X^IJUbg5_G#YRAh-f4*I;0` zYga8yeXFj?%Td;4Q?sb@v9f~B>9KG8m_F_ZFV~`9(5ObREZ4|4qzZ*LvQW92e>{e; zzph+x5RI8)cpd9UgN8E4&Hz8aN~>7A8N)eB6!%oLD1V6Z+chg_cUO9uZ_jDX0>xFg z$=+M}Z}v{DsXAXm0GaG>H2w2U()Tx^!E^M=>Wv4B;WvlsZ9AC`~d6lp$jv zI3uz^wsCaghbzSCpL>xI!k??g){$}i*_Xd6BJbu}Ype43U5 z_k*ul6C#yJ7$w~R69wN>)u3qaRE;XGuBQ~PX6(spMiAX6_)OHOXTOqE7RIwt)`wa` zncza^#BIPgBg1-(K+k3Sh`qrD2`)-fZW2_mC8aEk93Fur9Ky>wKWkhwPMi*{Bp3I1 zdt%QF12~!)B$FQ8ddAJ31 zL6T4&WbN*g%!MfDoCxdg-hgN!Iz>8sJJ~`xnArJrb$B&eU56W=f=_UYbpwXDix>E! zfuCDJqGdz`gPKyTwsxt71V@p7;90bJ(vGF;o3^tqq9PTLKhoEkC0lc4_lwF6_YhPq zCj;u9=q+z%UVu5+QJ)nxetU)0Moaz*e#iYGy1x`LYTWtP_dHiD+={dQB1OpS0gV^& z1I!?V{{f8Ny&7Wtmb$6FWAj=32J_$EN94@E4}Pd~#y2g{iL>#K)ZH8@SRBO^qqi4{ zE)StQ+-or^2B_kD9EwZ_zwfYO1TGXwQ3O3ycbB_o?zcx+MRB>w9)xJDcX!yN z0uZUhxp~`(Z9JwuSbJl?U1IVrW7nSmTx>+$Wt%TSQWCdE%6)wAYD3t4hbsJw+@ z&B)m0pzIj$(2C=WH=@VYbapD%ds!td2AXP1W#)nr!j710kOmLp!J{-NE&Dd>ZcbIB z5p z^2=DHit(8S7Of|sc}6^rvF#EbhSegtQ8`kLqb&;g4hTdQSS&~O)%QNOjEXUax)X~=DkW7NeUnbgQ(s7 z8@FBu*S9DT4NNyLo~dX7LUa@zlZ78>7N_X>hR0o{6Ro=E(p(MiNN{UQ%Aa&mw;Nu@ zjNGY2xm4!}$9>V}@L=-Ys)sf>w5}nP`p{~0%wD4LL!=qK>#H30&Ns6!?4mzk=MQx} zQbaoI+?9s{HgnPJc#1yZH? z=8)U;E4Xcc&gIhk93N#fCZmS^jd69lWt0-?ZQYPCRAMLzFd57La6ERm7o3Tf7R3^F zwT{?5JmplBX_&J`%W?ZX94iRF8kGu){?dzcpScRB(nhj-3|d1+M8S@W z$g)^5J)9e=X1FsFvWFiJujB^G*DLwZ_4o;)X^*-D!ivkbxUZdeZ`&hC)zM&%Mw+le zH&hC@2k@Tc3c{pKYoJifl^H!P{h;;k;_(UJtTDdC?$v*84<#__lHWO!#L#aSLDf#h zdc-|!aLv~GaDGoLDF7W_HS5TVRYZ)WEa9;u1`N=6z+PtH>t%9W(&;UOHB_{dZqRx9 zcaF(>PB#$>)@aRm>^4X3RKWrv4MKUoH%e2SA_Y5b2p>!*x3$l(pe`7>A=A$aV|lV! zhDPT30r?P_0}M&+M)tj~)2%ibG&S04##~qY8|?o+9n6xhbVdho;TYxp_Hs@Jgzmjj z$1bAT*LA->Bu}-fP1+315~|L}DsC;X)y&G6>O-OXEqo*{!Sg5*pjW{ zo*`dW$!*J}agV)|g5K*B6lYOznT>HA!seV{;hn4@6&ya1r%mw}=D1c8=o;*%20*rQ z@r?Ej=5o1Wan}2eO_Vzp!J6__m)~ey^z~j4gQ(ZDFWcVP;-y7^_)Gc}JDT7tt2pEzxw ziv#4IEbmhSnA31Ck+KH>6BK2a$|OU1IAH*=r&W-?VkexYKR>MPfQDHyBLSfY-Cl{h<2Bllq%a$N#$M$2I0}ktzIZ< z`CZ+Fs?k*vk$!f}!%C02iv1VLcIV!!jt@n+$qPzd3g}YpYgF+bCe2w zXu!JJudHww2}MWhpGBXSxcO+7VjU`i_R{UUx4#1c?y6db-aL!TLjmG`0vJ+MI2J3{ zQxAhIJ8V%tjYeLZi0OM(r6hLz>yoiNO~WLnVt=6NqzQdoX_#Id6+qy{6m7$HX*&d0 zS&6N=5aLlJ1NxfKPG|H!chRP`xwmge_=wAq&Adna0GQ8*;g4V4q8Z!a!9b7jJh6|8 zPIsJhmoB}62$L)wqV?!;o9n0+P~kvpcnqVDH4`lkqtQBjqA2mjRX=iiM;}wjMky=6#syv|apwzLUC0I@Jg+ zH)D&GEg}=Eiv!Bm-l*l+9Veh{IWGyacbn1BkGU`xdBdr2N(+;#>8I&lKLn6N71fy& zVTN&ZIB#8aJij_k&CZ+9wJApI83v_9{70neh{^EF5^2i0Ide&MIzHcT#?^3&Zur5G zCMo7WFw8n2BFMbgcqVMV|6GVMqv6s=12e~`w6knQg+wT#xx_4=K~ERXW-p^e=xj!s zRda9Hw?bw;zZh$vk~o8ekQksFnLj?hD(Uv(^|C+rQW z64@h*ngQ?4BS!E;{y239L!_%>v_e(Y3$$QU$m!qMczk>*LjhD6JeB)w6#x1ZayKExgFoALR#)IX}; zWT&laXGw;og6Gu35!K}ubvoa9fDm>#{)b9vo5;7v6+s6@}bWa>i zMc}ImI_6+9eh@Y}V@3P%w6`$f+@;LTmQq3&Sm>nS9IE0x{`IRSh643)tpI|2L(NP5 z52|2ZsruSR$^hc+(uZqyblSQRP8O(LWB2XDcvjighuSPYqsAvG2{*?xdaJu?au!F5 zgJ7ZtaSES<%b)XXH>l$8rj-*~WfI7mEP1Q*J@9=cGFpJqIsKa6e*2FYs;JL4dC3!x z9x;s+xc>ePlh&Wy!L!~ch%wd`__`bRSuab7ulU5eTy6T>iZIKXI}SEtq#&&G>lzjO z*`Of>fBMN6(3{KJf;Wr?R?{)9_K-|Ld~1Toa?+Tb+piWmu6v?9)jR5WbydEBIBYpf zq8u)E!naMX>BgS57+ifI^6i&gTJQM~JEJwl*vksF9s%l-v>Ux&!j<1xgx>nn$Z?LC z<+><7jZY@(M@Pe%OML-B{5u3|?`?`djw&nH_UQ|eaD)KXo43jb{}PUEG~fdf?ih~6 zMT;2&Mb%D!>-@|z55p9rb&&+DLGPaPKn>tB>&5q^JA9HSGy5g2EqI$+6B}^G^kOGbNy-XN7G$a6#F>F%wb-B zigA3F)1v8js(Pygk2Hn4ukdS^ALD~*Ll;Ix-CJ6R(Ij6vZTQ5O7Tf*3(C2WcDmJ6< zciP)r-NX4JB{hVyqGJ(E+293H@0+W8ElpdqVxk=Nq57%5KJmu6jYsQ|`0dt-Yf@tZ zb~KKyGyJ8HEJ7FF(!z-N2W<-Ccj=L1sq=QMdor#O$%1|4t^LUbeCiK9QdVB*6Z~pC z9SzbIj8~^GPWSo?px3|bQ_3G*)Cb2DoHK`hfX|LJbDtucG)C}cu?B~8A#+y~;p83< zYurgn$%w(Y_(?JKsSEb|zYi=jR;IYLsHl%a4FD!)t6U)34+?Fg#ZH_)3g{}^a93oS zir~3_6`!o-2-s`bn)8edpNq1p8^&`LDp~C~0pW2E_BHS=ifxWBqF}-=Oi|eK$)44C z!%Lk5ghjv((826NEcuGApaqsY;Y*mht^=HOD{6FoC;_ zdvb0DJ+3I9mLd^jgn4veai!%I;pdO|Js++c^Z{&+8VkWvezw$TJ;rCjq%yf$80O|^ zx5ESo@i|F&6YE1&ZReMt3im0K<>*#n>!0GN80sKn&_7TlD#OB zaciBx%szR|qPa2ErIDQKFStDo9Pgx?BYffarD4&hhtTr5i9DusZD57x)HA3sOH5#< zA?Nf(nW*tAbOog9k63XAQ>B<5m7fIR_)e|_W#P**@*nCnKz*C?F)YoA=7xn~=Ne~> zXFNS5ZCbPpbhY1Y36#+`>Fk;nQqFnP(QP%=48~9Yu&3eoZ@TXE_}oIHF5T4$)Ek$Y z=a!*W5yydzKD>us(=iN+)B+?1WjK>mDDvsD|Be%lJxo5Da#ce}&W{BjTbshwNDH!ggk@7vGAC#BOuD| zyZt!y_4&o5t~OGA#`s zi0m2mWK*9!?=jm!P_);O^{h9;&y)5ls2=_%KZw))HY)2K8%+~LFwF9YR!8G_qgZI; zyBWE=n&smp;dzW5{;TS87JNhou>A>!Hniy1^o6-WhZ$A9vTt0lMSsfK$CB|1JAPRv z7H`_dq-Q-2KdlNO*t5I4E=vqLG1by{@B6b|)v2{RqL-Q{4db%AYdy-WfrIkdjYq8M zzoRIajOTR|Ro*_ekB}s71cC-Y@;f0GPHYWs$-wqj3p6>=Y7>_FV}rC`Ou?@B(Bq69 z)~bPsSKhxoChfjA`N;oeSMwo)eL`Adg&@~X0(H0y@9cG8XQKwv^81!tfLGDjG+%t& zvZESE2I+0-LX&e~dignK>3DwYQe8j3;Mg)$a>Dtc=jTeifYoofbwg zwFhaUY!rWe*I?ycvsDDOnyA#~m`xXU`Vk9Yu{j+A)9V7BASH|PiHRq2=uLc-fHfL+ z7&&~wBGeM+(~g|6f*l21Beq_>gmxpf$?D6J52Lk4kIjc6#brL}i21sRz7#5BsWeGd zT>hT`h6s80WxfEOy@XwQnI)C;>AP8yP#_C5mkHG_ftTcf_xcN*6bD68xfm~u^3=WJ zh=%FRalP%Fq3ZSb(j%&YPPirT^X0-{;KN)vCTP81rFq3bzzq%Oj5mHnj@z(;{gvSz zLTE3vR8NeHF+5R8?gu~H9Y+a7$Ptq$Rno><1)T6mHMgg`R@2iLed?&qwSsIX%L64o z&Q3(iqgWJdxTrbtIBTXP6Qm*uJ06<%wHz=D#y`&Xrf^A6@Zc<=D0;hPd*a4Zg3JzVxs7$VMWzdy^(GJMdIH@yS=i-j zdl$wxiarAgAVTAc^L-XFU%5(ZN@*V-*8aMKwH51keL!X~JHBqXgM>2_l}V+gCt1@p z!TXHo#?MX_ZtUU99K?o5(pXY<@P)!1vQ;z6q1Yd&*Z}dSjr`FdciNd$B@KI!sfIhx znlfrluwgBXp_^(#f8Mkgr|_ELT=*#=@a}#+Uq)A_I?mG`3KqPVO^*o6N%2{)oLkdm zZZTgc%wluN=j**!4hf4G2_$@`ajD5@?15wF-8ueJbbtPkly33WZzz7At?N2uwqszt z?Rx~;C>c$J$F@j%BQGLh@RN2wa6ss|ZVfYRy?}7=>FP7UTuVPIL#8ZAE(az@dSdsE z!)dPiL+7EIZG+6av)_zhix&@iCn)TddWYAz)Z4n1(ZPiYGK?)bVE>p%0=uYRl-Dbz zNt{x&k7tQHlxJvcBY6ero%BK-MK-QFa{QX=Er6KJVcCe1xG1}@y+U};FyOy23^q(e z4qP*pZP)lTwu6F1(S&-OsTzYQg6{OTn7bDhP_`4YAzdHf@5q%oGyhzNhkC4yj{DQc zK4fd%Hli+Je_}r*LbeH$CSQKd(7>UBBWRddgY`mCt2a$a#l_rcx^!8c zGKR&_FsW8@VodF_C)ocZX<=Ij= zihJQ}@dz-!&4wDK_y`MA`);vBJ-we_O}Mw<9J59(5or>OXYHnT1OM9+K>ns0JFYV| z4zeDrEx-e0vJ|`v+H*CBZ&%VP;>TmsEiBZIQ-%FE1&EIe!_a$uEWpc%;sPvLwEOTf z!COh3EVEf!EP1NfP@D!AG;iYle3oz`$>JfH*k)gd1f;k%iCtN_ut8yYvu5VExTF)S z!_nA}-y9sw>HY`frgm0_yUM{V#~7hG3ula1I$6d0NHT)eSe-J)H)+o-+n^;ujBYQF z27Dd@&gk_WtBeJw;}CfOpM>6Ahu|J;U(ISGr~s@6WS*9zDAde$_@5zP;OISveqSKA zx~x{RxhW$-weNKVm8=`7nW2*^NfsXvsFV;D@KAB}QFK%?nv+bs;fJ3fYcWPk7*!SP zRk8fn6bpq z6*(Pd^8QH>k9OYh869rYj)^I)P*6ikV#AddaKkGvejW#1cKKIk#@k0nicj>I9xlmU zyAw)pRtZuSriFZJE=r17bs&B|fE%Ut#7IzuQhY7R^-vXTmyMJmVW3YA0~a`zjjf@h zNsf3!@nZVL=H{jC}?w=SsN4gkTUhkAFWP-6wHSL31?4bc}x4I55g{% zOm}WY*Jh6PF^3X3MQn&nV?BQMD#Cww3sJbdU8UBpUDr;GeFjCK3PGa>OfW-w!EJgP zG_Gz7aMh)v$vqIENMx}&6Z=Fr>wU!#r1fT9)X$oHx)J*P{Kug3cZA)gW2*cxd;=lt zi1x6=qD{|8H6B)qO05Qtm|x|qRw@Nel)*o#{JmOc#JG-fk6%8jiD;Ld}9BMxb zwLr_o$&oR%HskaxM;Y@Ey&A;uK?G&_TQ_sNl0#&Q8{$?829-LQ^jI-4HR80ky-4(G z68yi}Y5`bER?-h8UhAdgsUD{^cN=~ytqXvvZmwTI`NYA|1_8#GX2MAieJ9y`Vb7*WqEbM?rz4q9Uv1gbOvl^tkIE9ou<32i zLDd*5w<^FGbl7>Fw-rC#T)t7_jPF;Hg{5jT+Vhy}mw5#j2L>M=pVXUgz3|*}Kn8YQll#6{o zVm!pn+c8cu*r=O>s(xTbcaqTLLj)JJZPUngey>ne>WN%_>3NbP;ATS_rVrmLJJPI#NWo~D5 zXfYr$I5sf~FHB`_XLM*XATlvAGdT(`Ol59obZ9dmFbXeBWo~D5Xdp5&GcYwEARr(h z3NJ=!Y;Daby z8x?eHC!KWMvC%O*cE`4D+cw|ywQuZuKi}VP)Tml@Ot0gdbFLaiPOPXxCuC}83>3Gs zb*5vYXXFOR$|>8~7}+v0(4pfdUgDB3wW(-|8%eX4=B=9acV z>Q5IDJ9`gDOLGh7zcEA6f>n%(VkTx>0vU78?vIH2}ngXQh<>&$Oc5a_SO8}Lf zEx;IPVPtIvurmXw0yP0@Dq_ki010IUHANL_`p>{BF820zj{jAQh>EJ31T8>RNM2P8 z092<1NT{i({{2)1+J4q=P79D%{nY=>^J)0kT~16@NL5QwjEUjzJph;hu0Tg8%fD&= zqc)1q$^idc+NZ0Tqn*t^2>?_U&d&DS3=D2=ZuI6ZPR{gpj^_0C*8kL}YGLUFaI*ixa@`AKB*{XiE970)YS# z7e~jxIpqFZ<@i5o{=0NxyU#n*wf6Eca{JE{GqQDY^87b${_ky@*x5Q+IypQ2DQxQ8Go6oA9;QrDlYWc~Nvz?;{!~fgZRwG)Elr$1Tm5rf;Qom&Wou>!;QE*Nvy%T- z{Z|uE{WGf6pL1$zXKU>NFa?^yG059Ff3^hG|9>X!KXQq?SX;{**#N2jA5Q<%(8$Kp z+T;J4{)dSM@NczL@^+3kM%MqKvvd--bO)L$S~{Cp{EOOu$)%i)KKozD*4!HSc`W~k z)c%f?^=I#X?jOs)>kB}~#KHC-y3e*Wv9bj^IRRK%|4{)yiTIC-KiU6VFMvTzPE-opUSMWp19&lgHnu6y{hww5FwooDIe)qU z>|LCF0A_ZMaDNY!o$E8fU(r8^gB`#i`@e`2z##uWh?5z>p!`3Givz%5^uOrS()fQ6 z6C)FV0r+o_1;AkbZ;%bZVEJ$G)7SccArm8j!S>(aXDGXWgRB4s$A5#L^*a9>{Ja^r z|Aow-z8?R;|4Xgn-}Um(+%Wzx*Z;M5|G_HGj&@c+4NKF{XU@Nw$Qe01TDt2nel|VR zr~LEv-{189PXhA)o!5W!78bU1_o8EEW(LqPbABEX%jX7RVq)g-`9HoU|5}0n4BTf^ z{5Sr)e*i$BJJ1AfY2MC+C-7TxL-223vAoF=NOCUv(=sf6P3c&OrL@Ubd>qm2Z4#hB zzJKHQbc%dCSxIg^-$Z}gLQV2OOzZdcriAi|TT>;$9V1^kUwkAnp^+?gdbNObxyA1# z?IhGk(pkA$MXb~5&9Tj20BR%0B3!KyAE?(!B)TQdt2vNv1+z?lFdVJX+!s;s z+VB@A+d!Q^o-m>#jJk!EzRnot24js#L)mwApdXa!Tc8PKJWpXFzoTn~b<+sZn6wX} zFB^%fW|=%=`A4rV0lE$LXu(+Nhs!FfXKvf{qioN^<&^`EHn0Cg00*M z$?p}0`JXCHbzrX8&YK75C(;T-eIa?|Ls;?Ut;QQbYC`=#Z9ib8de}B#s4`+0Fwtlg zDUi--BsN9Lv**YLDS@kKqRaBrAK;}(?(A0~pq^jr z(?yKf0rb;zH{npYYNi58>FRSZM72Q_y|6@$6v8K8yRl;h3UI$*1V~XPXQ$ChYOTgW zdp3O|8_=50p^LcVHlN8V<3PwuTu5+Dnb;0!E1}SdFq^@J<(BzoMLLtNkq-8DQuW;H zY$M!=Hx#<1ppP|US~>NuuXB)|crP`%1IDMM&Ah-~%|BO=U}TSfo<1)o7qyzDEP$N3 z*iFTy`EkhP(mK!WK38AjsipOUycYBRB5JNXMgThbTIW28^7s!me_VpGc*F^(;?CtI ztrTWKjHuurB-K5Y$E?9Mpz~Y8I1v8V{$W=IdS@#%5vf!%vyK=p_{}Cb z30X@Wes#dKb>RoBa%F)`smq9;b~^b2r=z&@@v&nM^>S7xG2}t!`7`I!8WW~}NIs-J z1WKUEK}idXZ3+`ct}X=|P#bVte0baGG$+tVNA9v0()_(qUMPco#pjyw`D@HJ)B2uQ zCLa+KNj(kNRZ)!xpihuq7gn;5jNhzLy0_FU*v%5j@}0Oio#w!Xff=c{5W`-)HXwM0 z)xOg;<nB*BKlzM>*+{ z;ZWWDN;yQ|tQH3I$quBcZQ+(LUXQAkX~a8dPN&A@rb^2!I>ih^%e4@4gt(M|^@X6R zr&)%}JHx7DQWo855yMNZK|RmC8iUh-EsJ>NZ%#uHs|zEqUrySVIE>C`x$&lR7Jub45k6SSNO~7X0qQ5$;9T{v<`T_h+2>i zCEEO>yh(wOQ@Q{aPVD9T1M&A|OmTDVEeo=>z=mNCwUmZluG}Le#y^#YB9Df1bCT6& z-CD$pYvn8{)ET5p!r*7`HN|1+(7`E83NR_?$xPqQH!3CVG~ch41MBOJ!p)77+)28d z2!#oGBkmS#pb0r7duXl(JdV(@zz;jmw&#=f5#RT&^z^giR(ogDu{Z?gLZN$Qpg?W! zw$0&U@wOyJwUgB!?Qi0w`6k(Puvzp0nx@v*HBI91c`)SX4$2GjjR0VT#MV;p`Pg7 zuC=vS(56o<8W}fMSW5dQMzid_oskLmzyMcjw$Tz1zJ}ETTnzUtk59sNU60uX4LNqx z9mpCnQ+<6SvAjO^P#QFlnuXh4n2J{=gkqYJsE$?n2Gpo;9CUsbJ;3DRw=%wq&ftO6 z=goUH(6o)j2eDP=elj{53geFiE?@Ccbjx(Rwi-B=p^KbLEg%gmkl+2Z=HhtBTg1}e zkaZquFs9@iW+9FqA~k7I6JlO~x|@Ualt8)`B*I2Z)^p|6P? zsIxkD0rh#u%1p1BqV66~JzZ=(YAIU%)iSt-Tagv>0kKwdFd+!m#xO<)N&_BBw1V=p z(N}cK&egW0R@e}O^V3$$6svmc9rG4YlR7B9uG`WIHBphJwhVzBwSn7w&`i|k5VN>W zw;{7#^>BgF^bv4w2d|L$kKxmHf6mibP#wF4Uk7*Q0`hX6iX(qymQN$6g>i_&7+~9q zY=uNe*KQWU6Sk$g72FOu{J5P+$C)vWIA};3gGeUv-v~4lLr_29BfKiWaufuZIu=Rf zYi(r%tn7`QCu;UUr1R-F;DtJASxmIoq97r*Ohd5a#T=hpnpEq~pC3TrzsFjze3$c8Ynum={lX$svq8=(}7B?xP3=@C+%&YC~ zVmsdhfJpGyA8J2bCp{mbt1QLxl1K~?;l1|o)2J$)z80NC#3II84!feJ?W34L8I~CN z?d#m4ok@l{{USQB*RT_d&sp=Fz|7e)3!{IFs#qR|Ffilhb&CWvD9?5y^&4NiS^Xl= z_W|HafxpQ=Bg$Q#w7RR`o7`kd6J7gFsOtyd_9Rb>w_W0G%FMda=>ugXW}91elHMuPKR44{ zh&wSx|3dhZugYxPNd3sb?H!oP$ouW^sAakrz0yx zAdCg^(N%JZ~X=uO0?)KNl-x2$W#2$Mx~S3yFx*q!l%BBvBwiy_{zl5*|%;;|74Pc&_; zX|^F!2C&=hxEpdbxqwdtwIIwx(tmKOF{-rBLe#9ztJ$WCS$y!lNW1{z17#jZFfr$u z%5$uIVA3XHgRPoJB^aeZxETN7{y5&v2{dfDkCaiZ`C=i3|7XC!vY;YnSH1!dB6+99 z;R}jtQ2c=2Q~+~vn)oiFP?YFkH`S5=FJTN!oW=fx2&8j@;13`8a?5-=>bfOW>H#2{ zD5bIGGp8DVjbi0%?9iS&E!y2*l^+Mo4trQ1p7Pk2ROktEMvFRvD#V89+eA6!L~Mp zuh__YV$dcd6rK3~C7?Kpt^tft} zmtj~@F(l@$ply0>unZH~Do1#~d)&OTb8y#8cu8MQKk_Kf7i&+G1ly8ZJvO9coR4sk zZ+xz5szSttn7IY_#z;s5g!%IkGH<))k4`U&7PZxG%)h2r#w@USZGDf;+oZo87kahw zl&fPy@^<(1(e`qs7F*+lwo4_M4`-Otk~ryC<o;9vXd-Or=r^2{3IKG+kNO-sR!F(oWwjeHYLzW43+^bV_TJJ}8P ztc~wag_5<}f$&{Q&HA09NvZECLl?*u#mbT!RCrhLkesFG?hw?beEZ(xc+cB0dkyG; zvleYHi19~IMxlIZQFKI*Sf*5}ey2WxUeFt49rliQ8w-8CtKhJt`vmqO$xfmxx7ILi z&m?xhft=Wy?3k6rm}i|$ZYnbXFjMg|+}0lZF`{`?j<7z#&Zx-XPp?dNc|fLf;P|@- zl2WqqPnmCOyeb}727yw}ISLvMulVW`K*Uk-_Z(yFgt7&Z>$QXvD+WR|o5F1;sLb|) zKRoqwXXhG>6DyW8fm_e>myED(NK%9m`1BMs3*!lrYl_ElRpovxPodQ|%x`c%Zdew+ ziFB2sBoe7CumloVh*q-JwvPp#Nt9a{&4ln?ia1}TBL&!Z5*Le6J7NS!+@a>wcdAan zw0y-(h1TeJ|1JAXKL5A1rOo6%9iB52uRMHX=JqI78|rKvEf&r%0{kZkuRmXQL`kA# zg4qau!qEGl!yL}c0e7iG*2>92c-BOs3=`n+yih(Y*kmF2-tF8F)D@=FcglvyBXXfi zwNae8%O@nM4SCx7glY-W61&u#R&8c0L0zEO%pdLYEdl!gJbgKXS1xI1uA|Se93GxJ)88oblMnCdV!{_O;u4DaEjh0oi z5{a;uesuv~a;zC5qjKk>t!M>?#N#I;HrF2EtkNPh{#AWMAUJwif|+Kw31w|R)J8e0 z*LBpcz6qb2Q}e3Fq7Zn}l*h8{7e8IE-HW>nwOaqPAE$Jk0&|qs)(bb)Hl*Y}rj5ov3%tL`aDJvE}lfl8M+fZuH#Gw1pe1eV|^oc42CR+#J^5i$m9NFVfkmi$~ z6cP%YXAdatk`80fWnv5*12t1JRMlWvUS%9(1_uaW{Ul3u!Rsegy$jV&M&DLLI2C$f-7$l#2d63 zHW%t|4~XK($UexL~8Kd}FELh(qCwnJU)r zMLS(zsW8#ha$@>*wY$1}Ner^iLAK4)Su)$zga|XB11B}Rdf4j>@LLcRu~g?xIDg4# zhsK^71o};hn27;%g1nx(kk*rG?Za{wz~)r(E&9?h%xe6U>|@&FX3u)erVvb#XwGw$ zEUG+Ch~)cfcuMj@K$v~ijvMoi9xc6u);Omu1@^kJca@~+l{x{*zGn5`$Z3RSz zdv10^AnrYtUe}ETVQ0gHLTz6pcFoDYDITd4?pI;3;YF72XHg^t;BX>Y?WI6+^hGvq zMd6v|Ndh;*vopBFSo`g_0t1l@gH2&B;FnMA6U1d+sn4#pWE{j&p}wyg z7XjV9v+1lqHtseMuy}DIo+!z@A<`zfbap&@;z2NQj`**$W zi)4bTM`z;q8~2?KdaV@9IC`uxhC+K3bS;i=Y9S*grbozO-7nj%hg#We8!#Y@E`2Cj zVUfOLy~eDkOM9TYZ8n`1bt%TB&}icF$I8u}$nsO5@qhSeeXJdFUOE+QQ#A4QTzJ+3 zx=g4l-od{Hpy|B2!lF^LNVP z#K8Y417XMU=bSL6iZ{#8wNCzse6S471s7u12k-@ib@g4dPTOJj=xt*p%u9T}N0l-L z38BcpVFqjTkAk{O>QqNB)%vCmA7_;hs<~*8twox|uiD~P7$TMtD32eWOtKJvREv$GXl) z@Jp2E?alG17K!~v=Wwb0$_;&nC7^g#rt1#yLeDtOETgvamV@9cBPrXpl4QZv*xz8E zvDbI|68}WXaKctxX5Bv)Rr>U`+uGw}Gvm0y=*EvRNoRt_Dm+XmsaMnII@x0X=1W4( zkd07lv7az2?lIdw{2^a>DVW}jk6HxB92#r^VyAL75$o{wj6}{6TkuKZ+sxF8gGLR` z3eAJk5?q=0Y1COsq|mhy?cmGT^JRQy^j?2Z@=XETCj0^vb#AFqewh-^Ht-%raPsbs z$2yPUx*xUKtSgGC=Fp|`%-q?2 zT+)fSHWl`Lt=G?E7w^@gyGs3!YjDlgztU!4L^_;$+#3%Jfa2m4i0P zHAreN!%&v*{FWskA)pIz6q@Sccv3`(gg=t$P8Z;cQykDPb>q|Qs$9FAU;TWJ7v3t~ zI4ZI339!59cCa+zI#fZ|4fF!Os=1kKb;ZxhZUXGb7kz>xjaLU-Mr)Q{J!;^?>sX#L zU+>SltZ+!mpb-yD%}r~xvL|mCNpK=cQgASvirX?$G;w*l?y^xOd@I zOzw|7=vuyild;|2OTSurG#YrMkM&@kH==6gR~3ow5R3 z?+KL>nL%EmiXB3ant8<-1_m=|ERBf<)`N$DC|jLF1hLT{bhO|AmeoRkZLpN}wiCJW z3unKcdLz0&9=Nu4mEc&S;&>GaOmStE$sgpcoL)dr9-Yq@N3Sx*lTiNOp7HZU*S9! zk;fQc_zDCo!XI?Z#WXmm*};Ci3#HtqV->;dCiSMF5F`J-4xaLf50!2n1je509FOFe zc8kL~xT20c47N3mZoZh}SSw~5rd5HnB=WVE^YTXXwLc$F?pOMnAiIvJEH{fku#zA0 zAHfc+jxbfbckgmWx|bp`@*?PNSb0aLnkBVFHk|u+U zyGk2FtP9wEsl*ul6NAS~pjrf3Awp7Lm^DM*ld>uGnn*;I7kh8ox{DFXG~aesbZj08+C3@+xn$|~Q4exC#4p;siJ^kj!{%XY}1}ljh6ffO4RnE@x(U5A}E=)hPkNo^aBlRLN*pg3>eMr3agS{y@TF7iuFbA zji)Vei`Wi(gOVZ-C;PGyHG*O_rVtwr=01GxomO|HqYTnNh0gcd%UstAqfZo>Z!RZ@ zfDFQ<)+@05$$`IAq?^U^;_C%2*|Ftr!8Ed(nGFKEMpYtTRI1{4empJvz%6o7Tip?6 zohOl=g&R64Ad!Y>j%0G2J)cxmEpofe(qd{5UCDd8o(|$yMspbXFHH`#oJ-Eg{KP{M z<+X~38>GGDi1_rsRb-HaM0lf+*|)|5h4Wad42>1+yvv1!E38c>B}xV_0?_4qzxaEt zqoga>yb0MN=(X(x#<+z|zSgQwS?g_^E_bR;o4>J6MF2-iVUgli={Qz4v~Itd*q-kf z(%7P5jBD{meG^@#35oyVG2F!64(aS1tAVugJ%+|Vn#&eYL3Z=fvXtP}R}AvBY~@uM zOkmDGukFB_UYr9S$ylP+>u_+)QHm_NI`8;})~Nr;j?%72jtX{iaRXd^DRXAAcuFtx z@r~BVBh~lnt*zUBTKARs}hjZI1sj*a9c}>Pmt0pj{|lf<}a3 z#0i8f_>1QS;8&{tRwXv{19oZL$zHhlt#?U)+IPmJEmJE2p4jp%jRq+ zu&!L?%T7Aaj;NUn(8ExS=qY~PQ>~9QYJGj!B5a5mQKId;ygDUn_+dR&bim?zuo3tV zeuejfrDFyoxRta67cWxioR$pp$sokuvq*n%rP$Vrk-F69vcHGpKYTA0)kwtkkW`$7z}JKog`*cK<>$hn!Bf zcp9MCvliBFslO5jmyYPg_%n4z)C`M>IFVk6yr zPM}4^(X5Hw?b!+nPVEls!LOiKQ5yDaAFT29v59N;5~i_Y@huoK zEy!@2A-{HmS!?08hq)00Nq&(~i0idcQsa4+V;l)d8dRJeL-z8PkDnTk4Z2`EnXDT6 zbNzg{KnXp?F;Qvits(Rbz9;N^*$~j{$>);jTLAr);ZwI+{e?aydkXvt8Zt&YtueHc(e(bd96xkfn7{9w^a_a_rAbH-K4y+Zu+kT-T*-1*9FIQLk zb>Cz*6P(*~g_H-xY2@I;@7Sjv*d_HfYT$l^d6DCXl>d~ZV_z*%5j{;)n?)EJoPMng%h7mx5$>o%Y!v$Cy>LgB^Jyc^kWTt8FfngDd|@ z$!pGl3~{YD78lJDt|*R<6oq(MvlMIkqXLvXw65~}*zYb5I?4Ga6Z~eCbTgAJ(ckKr zaw2E3zZ)M;)qe!K3kU?cF|0i)(1?8hR%5P-!%{>%P@f6|fRjTtA@ zhk0Bp(W5=}WE3A{Gl2848lsmw1O|y?YJpMT31&JkML6ycW;C@f!DjtdnwieAag;7Q zk!hCAh+Rm9a?P4(X z%Skh%(}sSE>y&b#(bfz<9-`b)-q%Kswg33zt)g7tUn+mff>2Bd{zWmdvC^ezk7V?au5r_+#G4wSg#vt@{;sps>p}7C^t=^Bn+TUi%z6iJ&*?9m@8|PF&i4#V~s(c zXv3N$4I7uwPdL;^3nXP;5~3Zc=81GL6+%g>^IxN+udfxR1pt)}T zYk6iZ+VPb*gCv}=W3knb!l=xaYeWfYLw2~8g?>TP%krX+;x41~xBW;$<4D;JUQ}Cn zEl$wWw$$au7%?eEp2x`tIx~LJPA-o|x#rJ#GrncFV#;s_-imyzs^0= zzp_{gd6r{C3-|L;<6@ZwGNyTC@O+?-B}}{q-Ae-`i~3RT|H#Kom8ynYL@2mxnF;K2 zUfINdL2-L@4-N`{kn5ToSZm1@ZwMQ#&?MM5i*70#dnOTMmmS73<&^l?F(vhKV5oh8 z1M?dqBkfZwY7Ut?dC(_cip+B=@_(iWi6+_cAV=@6=<0l}VS>+ORXUkwX>=cHWjujt zno^9x;gS2wW<&QOth%<-=g`z&Pk|Hee84&SB_DL@e>1Ds`a6HpF7+Fn;9kcZ7K9_wo^s2 z5tWs0Cbw33gQ&eKr~p6jfp@hW*zOPk;#e%$H*d6yE^d}Xt$p(1J#q%gZ(WqirRNMwjWgu1g6=E+)EelC@DxGTvLGtC0$iw&w8) zW9vs=(U)sJ^tZ|b3gIA0C9U%4`&lp-1vssTIx}Y?wsat&q!!;nQFlMyJAvO^AjIhX zmeZVFBp>fkKa7&gumbOzclDwtY6F*mKTEL$@zPbq_5~vjEf|6KXa}xE#|_w0#^gvdIb(Ij4-L-`#P<`2-&Oc8ytH~TINuDByQqN}{Yq}eC40A+r zih?v_-#IJAokkrTO?957XxB}m4NpkDSk0?*&0|}DJi!`@&YIZ6R6C2sToT*yqr$eF zKyIwmy(=d?w4dX6VBEW6JLexcOfAK&7UK0(nUdGVmZ~XW(APCQ7 z@4R7XM21y;P|w@wTHd5A!$3`r(umYos!YG?GCLK|Z0?3PM4j8AR%Y~qX549)gPu3j zuk!?xZb0+h$i*dCg_Rs5fm{cg283~6&Vb#FL#B}({=n0%=2aZiDJWqCXLXUs+uuFAyvYQqcqe<*J8_r?X$8|wDsbEY)UQp{F$hKGZ(oKs*=NQd&! zJ>GslbQG`CVr!p4Duqe$XXYL+2h$iV|G^pjYD$Dvfz2tHIw8X#Lg}Z=jPxoWTHb_9`@5QA}$C1wdKerIWp1hWKkKjyiJzZ=V)xAzL_ zrN`@PfxT%LzGYY*#fVsVt4np1LjmyI^L^@QkZ*RdOx9J6SMj!DeLsO<-^uRbrBd98 zT^ugFt@p*#3cg8?m^Z8L$w#eFG3N?I9U5A_y*!>FHQzDOdds5CwC&3OqTdA7<-o_v zE+6g7mxU(*T0_tyMm;%ekr<1(LVC)%`u_L_rkRc0k6ei&u5>mTr1eHhI+xvZfF2P= zq%vgn;S8&O?E-n?G9Wd+mdJblOruVP*pDcEi13f`sk}89nn&+mDq$V%fwI@}#VS z>L9;H5vIK}!l=xapDEAaA2_bwF;tNavMbA1w{GhKl^VT1x6#PNz=HmHoPo1wA z7Dm4QRvX>7u1xlx`t@MMtUsgOJ$T_vfS7ji0ufPg9*W!1@%M~SduJEXc*6H4F^#^M zs?3pj*Xf-THQRJ;Na$hJV#y&*J`4>v$cu~X2ocvWt4L-An-p864V-f#uIp1&4%2}BQyv`vp!n8>K@CFIkXF~wVU@{wy?qzk%_SM_bLHB0e%4Ay&^#}0Q=i<)o9ZP#A+E?0+@j2{Z|XfF?-hi?^c zg;JVL_=34okcw&mVPsxu26MA<;8hHP$W?~1gU#R#v=4;JFA9&+Bsy-z{${RW!V|uz zi)C6BYL^cS*16=@;q!Tj+6SNlsT;GV%>(7I7;q|sPSNWM6;mqIuI7pXGMo2M&E@6cDL;rmkYzGWM z2;;_8NOdmi@rro}b?0~4FCXN#EX8;QqK` zpO7pC*uf4y73Fl~vvp0;^P6_7Um=>cy07RFgbSh9r-UEiN7Pud%Lic1<*#YE3N=f2 z5{>w{zMFBU?u)B2;U|8bPkUgM!J##bqXiJ_l*`E&JE(HYj2DclDxsY2S9TN{>-gsg z^;Av`L%Mm@TY%Yn{h874-S9Ta!qz__4n3Mo8-qdPhY2mRl~bRl7boZKN!gY>qgVbN zrqPR)9F$UE9tS;Ootg@slxR`M?o^D3pc;#Q#7r>P*C1JbgdN+M?j#>Vvmdfgnaabc zPcJ_X8-7ZOj7nQxB>N$=5XNkqqKVV!JGzri%ip`rFuVL!CSQ?{v zdOmui6tE=+vktNcAEsqDc>7+{7XT&(?jk9%9r=C1)a)xranKfark;<5#)+a3=O6Nw3VuD9Z=qJ^%AocvWag^&tfUwe+$`_0_*g^T>y5NTAEcbN=F&v358 zH%Iqnr1;z)M>E``ftS09>LFLD-7%&kor(hat!L~)6bAkVQI^%y^Tz|QRa|$}_n7ux z*VCAI7>Z#>iUJ!L$|`LEo+~0#8aZvRwWK`p$!D@E1mkO{4?XFwI!(ey9wj;JtVzpd z)+|LS4Ts>_zkih$`{e1U&$7 z+>cV)36ugkXnPt;Wimta6%F`(dWp8QTri=d9eItnHn6MI^srE5CbX9+Zozqr-8HPi z^@K)F<$hV?xn z?M^KTPXcI8YS^MXB<(iSlgRFEQv)iVD#rq(0mmksj1~@da8J*lOmgGfG|%CCP9Vo1 zn#)ry#pDtj|XD@Ou5Nc}Zp^WD8}% zHrz?}{!jr@m8Vh{iTtHmXHhhaBMztYV1@`4E3FPqLhbt-`eT@dr8&B-DYU_}R(z7e zEK{mKiixjkX#(8R*g9XsU^iPHh+xzT&pgnq~@?p)fpRcgVsb(VQk_@H1) zF<1b?K!n2c9o$#5rNpe1gJ#lMmxXkF7h0?OmCG5+=s#3I25z9k_;ZQx4u=`o_tNv7 zr~P?j>n@mu(UoieM>weQ0Q75)TJ zI?4-XX>UkzxO`9I7wTX9w}E5?Uc)Sjyf?v4qZsa?L}n{R zq=NOaU-1M(>L7!z##PGz`E_cOCZXttGw=z}J(F3l<%v1{3NQUkUz66q=Pr7n{@lHu zzN?#``wfp11c|K}dUss11Jht@T`tt{6^xq1a{~M*jF3T{$Ss|PrJSdeiv|)tQLwFO z7gs3nwVuckbH<=%o(*S5fYcC-5+pIrcz8nVV?53dk`QU{Y(7-5A6>pNHL&ms##{k) zSfj$d%pz(#f@vkj0P2U~00g#V^~)-Wz(zGthIl7TCtT6Z=1j3P{D?YTJjvY^s9shawVcyck$hzE zG+$=HTyihn0HZE~tPtnF#oSKQ*K*`4B2=02kiAX zqdkWZ!5ii>##=O3806lGsPoA_@y{(jtU_hoap%O zbEXQ#buY>1;TU)x8>zo;I_2VxtwbSz!3Xomin5r|u|!phk3T-(XYJN(67v}{SDIiM zFkd&E5{{Qz`iUb?eQ*Ks$sR!7KpC*G?l_fZjrGVnz6J-rZzxYup zK?%7?X&W(|MKM<2C9UcQ5(dq($-|qHBHSiQ6tgmTbb3~H7^Qq)ceWLH~}3WTul(t z*s6P%W%?&(c|B6o#Yh8EAP_T$KGRc2pG8uMB9b3M;ZgBRHpEEYuJ?syfOVqlMFx~Z zA|_-i-|IyQ^)kf`s2Yb4SSJ!P^pK-lwNrUk3?W4w_rm=KVPpBievXsUEy37|WDJwy zWSo$ubYe#?9s6W-%x~a;y(`QlW!(#}qlS!HPeRty2pUrqpy7J~l0AGHWHpjL@~_A3 zItyLuh0?y%k!>82mQhdjc9c!AL&asno`!CjGgoCcEY}7QaO~4!o-CYOFdF4}5W)i_ z3&DHz!@e;@P)Lv42`PGW84`|tyz<{$Xt3YCkCly`8rHsslQG80e;b1DPrq1OwU*ey zm)16hh{zUbqcURD4cc@5BH4cmIp&h77|Ht9>zntucQ)2KqYuh=>dq4jRfwG`?@sVR^j_=jQ$rt^?ldN8+6@{%&@t@Pk-#fftE#7RA-h3f_gp77pb+L3$bbski~{=AVG zo1jMB^AAIL+Qd>6MP&%q5V0G9L6c^T4|bHx^B2khKx|Zmgw5;scAIyY)1ysLv$2Xp z(wdAN`obnbEn6`1FK5MuV4%guyL$(JER(htb(d+g3I8ZuZOniSHtbd%~Tj& zs~#~g)8Czl(%jlheBfA7R1l7SEr7v~)ocgjrf&NA)QS_;prYzuq|r^TugP2%XjBSm zOYeC^CXQ+H?$*Y?dx<8J4 zJ|~+9yH80HYiuDG_PU{Z#Vn~=8KFQv{HqwTL$3#FC}F&ioX+zBRJYyejA`30y;YVg zPWO#5#bG){TIdFG;a9Jl%`nrxb25v-y60OchG}k_{^nNAo3Kr-z()yCnFb2i-ALCS zR}L0@N<2_(%I8K!!n_kPhNM~FddNlU^sgnJkgpfcC95uSELhw!prB6DN|2K4*r6Z4 z!Zun0_#QxZ5vb$&FI?zS+Sl7CIgWe|F`HS7CWO`LL|FDSiT0zb?AkOt)L9%?X5dF0 zz1h*Fz#{B-StTyI_u%H#z}P5}3f(>B(ZE?Kmae^}1umzggFlW-35X>p5;1-lC}Ma~ zc`k7aYWODGeqzHNK1RHY|b2eK;`>@svjXM0_IjfJ~tw zl8qG9(928?@9wEOvvc^!Q2}-0U-u~=Gp+hzoo{+xes0(e;2I`hqDSspZA%^G+YGm6 zs^i=p6szTXn{7~8xo7I9i%q41mHO;;aGP>i>iebS^?5L!VLw-4H3=N93syFWF~*J` z${U149Q!^VQ8Xp|+jqONwhmdnlL^PEXq_9gk9c$)YimN3!E?(+#Q3~|kSw$`6uKbG z%=^ue&<}=&YC(*6_O#qpH(UJ|LEI@kuBl7TNATt;B!uG2_3Toq@xv?VG)w2kU=KO$k4_Jqi5**%nGne8(qaDgw}RZ8`S!LY;r82Syik_QXM;`HGnC;kDWNrv;p zy?b?Gh84HtEYgq(QY6=a@yB$6aGWpk(GPE;8}=Bhrm$eLIp)U!6CQ|(s~O@ze~6mi zQ=j&t`SPzf$La@(goiY@LbsThO5}G$9(c#eptV`DI)C2U(3Us( zZZ$ZFa&)6reA$o2hZFMMIWI4ibo+sTS;8*gmewr$(C?PSHaZF7G&=Tx1leR0O+ z`~hS3s@BKT3R!HPyx^Z%k@$}P>BbU|5=ooKIG0_h0_!=Kk3T}jtf6PFWjx*sEd+I_=OPmRjtWqw2#XA$HwV6qHKe zCzE19edu-QE+KFx!kWcaF8h7LyNR=2kgI@nBSVT2{t#S~ZF$v$%WAO;!}4NecGYUv znzz~E-{`!mlL}LSe;sSrn4Ba5sUq5Sa@`c0wun*SBt&|)Ra84nyM2{Zvj?>E8&3Ag zhSixY}nkS7KmwvruWYoz=3Kg;8 z2l9jW9iV!d5b(8~1U*Q0-wR4i-76w4z$A0}_;Ua<*ibAgG_l2sEB2zlem6L)ddYDi zpcl!unH&ih==qxUhvTZ~yTTniY)Vdjz3BzOs{rg5eiXG{) z?6qC+za7|>_dGQCZwmW}Du*1W@Y1!GSn_@_fd|XhL^JHtr#}<)pimZJk23**(y9h4 zU}hGj``)B2DBu$4(!D-%Z6Q8r&r2gbll{|+!a|0vrWbbiUZv4E{`6;M;QsWrq<>d* zmdeBKB_hd0kL_~8ygw!AkZe6Ff`gcyu+X!2A!rIJKRfl_Sh!jIplHQ;$y!bA@wG^E zefFv-I;#YaiF0f=;NX9A#+!kQC$SF{3j5US1N*gHXE0tH%7vpW8m<+bjeEFE9RbQj ze~Sn!bLF8J!=8EsP+e;kEJFr6G(q0x$dD!FO*_G#-C2`fxHbb5=ZBgSLIm~3We&)- zqm8KsZYaT=c1Q3Mh|8*|maiTuFaahuN^d*Bs)WXYol+Re7!sI*WZCn#Rkg29WIkeP znHx>ac}Ln7Hvyb~|KUfCmp;~4wHZUHDA~6=t~gp-yw`~|Ypf!jxX^46iXbK@hNHWC z#B3WV_nulHroHQ`RbCLZDA^A4u;r3>q}H15*Xtwd$ie8mnw$;$jm}J8GlVhh-5-PS z^$K;4BGL@#KAZMZ`|K7cBAV?=$rs&jQHgFgZLF;U&Coxt0!`d6Cw1<{3&-te48yhd zY@Tef^*TN`DfkXcYGiAPC(tlxCefA9MGSCaH8)4B8UQ4{{H zCpXnEX8eNle%lp8hgpBc_2^e1L(b4-mY>gqz^eM@_$ovV^rxgOR6m|OLcYZkTnIiP zgA&#%Mama*NC@uFyPue4BiQ0c#1VwVyZbGQQeQHx&O$G!2@#SOi328zeJwJ=JT3sa zmv&jnlbTj+F7*6EYY?dQ7c8(g7gkfE6q=t+xCr7Up4(=UP7w6Pc;kgYuZX}^Tr?gA z>|kroV~{l2FX17A?Sj)M{fOiE4RnFiF)ukrK+E*XD(q7lVYd0|mNnd1(@BNU4r6aE zr2~R@Ti-ZS*KI-Fq5@J8US{5yYAxck^uZPPpnwCw`}~V(A1O29jAkhe+c;q?{fn49 zg|7Z!K-SYtx7cKgJ9R^OMrq3}5VcO5mIQ6P(Qn_ptwo$v^+ybpA|{KJu_U*Q}B6U2IDh zSgI*fS8buJN&O0C7J2);;tDaRyV&5ap574iF<;!8fzx;>k72?e>R?G&A>dJ!f1@|K z-z{fKnm+@Ms{>%q+l+Y=!#vD;PU#N0LIS?k5AMKe*j($>F&yJ*;ZESl0hJ_C>>qe9z_P718?3 zc`)V}W*rh$w9IG8Avi;5kjNT^bT>|fJ0)q+$XE=L17!?-=;R`x7r?m6t&$K{M_f+t z+Bvz~PLN+U5zVv%wlzF%aefOlu3M~@mdGCZ%pc7O$)iGhJigfWUr}8HH?8)^ahHz& zAzOZeN8J*q2Jr2WB;aP~@{_8$!#hIhqk`69^}6~{O#F`j@EeSh-k&q%Z`;J>$=%3J zrcZjH$a7VgnUtRycuo?ELz{KLy}wUc1rD|e0p2)aNnPSDosbkScS=}{q6r{LlPSKn z8I=QQy0+J-_pVVy31z@FUt)L(sU04-dQ(f_J-6+}@n?4Zva^iTR#!Yc5TZ5sDgh6_ zeBuVpdq+q26B$`OmYNRwH!@N#MfM@WOX@zz2q_<-hsE4Eg*z{@XTF?q?o8dRHx=wZ7&;tPNT?36$f~T@9>9B)WddpHM!*x2h*wu7nUf zP!));OwH^k%1m9}Ng+)tL*BxJ)v_8=5t5pBY-9Fqwt@kTE9?l)5Z0hMLKA?A4&IE% z(TKLB-(sQGK^;3Y6uxj8dIY-G`g;yXHl|4gj*>0ihFtlS6gzK$u~mWn0E3k_qSkV6 z{x~T= znQoS+7eX@-O$(+=N%v^QpI<`&X3rT5D=EXHAqX5pvWb2km@AS6nJ6k;v@84$$oTi^ ziO&o{Ty^VL{9YEVw)K0g$o*5MLQF2y-R^mrhBHD&T5EouBXxZh9qvxFjt0cH_FA!I zhUg9%Ds5*&{^rgK%b$gPMl>40-?Vju0Nf=>W6CBj_s672Mm?Jd&4SK*cXD7&Oe#kF)Yv+Z|uHS^D6lc)3 zKtUQ!eC#I-9^Vq}OvXNMkYRFl)XGHW1>Gt^R#U-oxz~)Z6{v-z_IsM!lqhf#tH)0tt)EUzcFFTbqIVcYU-a`%hN zaM`xM>{p};rakCI(WkP`r;VzN}|l*wrK7$SpyJomh}7 zUl4`gRH0>37Z=ZwZKm2k{xmlfWB8gk;NoWH$~|G$7pms7S1*r9R1HQcMPqxKWNWpDA$6 zSjf}WvubwsdRX=EBC)QrFRkyig!16v3qX2z{`nNY60g)MSJbv4Tufp$C^CS@b#IzY zQe50}8=Hgi?$O)BErr#rW}tN?sd#3hI)iFij+1+jts~|Xb^Fe0gj^NU(h~*iHDCDU zlYWtdkYHBdy&`tSpd?A*e88Tcv6`>^NDrA58p~miVUvlcN`64+64Wj-#{{deBP3{g z4fu1X5sr~`&P{?luSun#yzQIboVc_c`8!4jtd~|Hm9ym+(g$&YA}+*a`2H1EC9u~pRS-DaaXw)mwIpUoy~XoCd*DTd z&F(d69v-LCih=C|>}=F_KAlP+-2kz&7JaK(ee!oki{MDUTpp1HK-~pzCfQFOP4D6~ zyO&H5_J*p#HERTOlLXgOT8u{#$50An*m?HlL~;l;RQrnq+#{2LVACvZ3Uj;J^&lB} zo334Vzet|76vL_78uc`DBu>NhyHjC1+jHKuRlKT<_^M^HLeR{_+tvm~258228<}Uv zne^|nh%?VC89FbP%~m%ja|o}p0G}nWxzj>(XK6E_4GVE13xPo@KBdNATUmS&F&s13 z$aK{0!uYOGna4wVo#I_duzlX7M~V>KKzQ_lNk^HKm4@Xt&?#q#3f95 z;@GyCSrQuKI^7pUQ$2_yrIwS#=ot$SSm>JJr<~!>g*)?-)Hy zqQQ8YR9@H{l4^^h=fmX+^bF-?{yR=OZ-POlvjRJPz2$76FT@*J^xK}4f>g1_5muq) zu|MBy8fW-t`~BDu9&c*{%TJk+!*Rw1j)k)M@To;p+_Bk5lhQ4YMjjVtb zUb0B?&h3gx9{hD(v)x()q)Br7#E74E=A-kL{a=;_#(lOL_I@Sa5t9$_ynP!D!1?1H zm8v_f&>Dl9FT*6aZGP&0OtwLxM%dtwjJE@wyP-KUEGj-({Vv3%;BWe|w>DwW!cEIJ3UsJqF2p^u&Y+O;;Jyq5 zh!{&cIErSC&0$dKHap)$k7g#uJ){3iIQ(c$!VhnX2r>T#YmcZ@hdTCO)A%?_({Ski zGE+yA_>BI5unG6%FG%lneL25ln7jvU@~JYB-|PJ^sx{b%UjU=%Ggf}DO(b8AdU|CZ zCm6`|+$&J2k0+?*nl0e$OVxs=Y-r-RW-0@XsOzi-}nHfH$^40sdcvv#AG42^;xF zAIx+RQ?hy-T9fS~F?ApeQ_SWYCar68pMz9mz7959b14C=32yB>OiW9S#~+M(_g_?5 zq~}QfDk?#nFnW}En4vsFLl0q^e{hg=+!3j8NsYb|mI9T)9wMph)n6hvG@}D&SB20a zZ!l|Nm=9Wce)w3XFHw}}4w&w2P&CsIA?3s_vxlxiEb^MPilJI^ryP0-sj9f?V!#}D!Fd!0=#k=em5|$o3D;A2FsWv zx#Jf$A*+(jN=@Wk6e|s6E6q@G$i=x*_m6m;yWy7&=eus^H9d~qs#m3NX}f1NH_MD6 zYSv6<S2c5e^BqDt`hPvg|)Ec`Zo|ZuM53sW!hp zr5+dE`e!@ta*KxQP}fdQWi`-^>~))6s^Sj(6fcipwINWva4Y;4&|_GKQxr`>9tuE7 zb)#0!8L-lQ@fT>6BpGY0WRUV*wh2Fx2n5v9S@^meiUTl!>?B*9RawJxCJSocJNNc+ zi8Zmc*v$UzoVvYJ6dhU@!?%FS{kPdIWMF>vAkzTZJ34TH=?K<}UyQF)u>_4y6?Iqj zJDveO0Rv*3TD!$HhTLX4kI%#H%f^<%A`R!Yr$S(>F@h?}QllYt#G4^!8!*Mvgs=3< zfc7?iZx&+=*(}ah#@?ktiVI za;AAGN2QV5?f@=Zy@$|wbxeJVQLyfBzqHIANGiA6rn!vBQpPt;8WLIXeiI`hQk6)x zwGWq_ZyxKCw-))csWS~TB{(^9zMY33$+L{sxLdi7*gQ0ot%I68Cv~sE3-%?M=eeXi zbqA9>R7!7(DU;I%vwwfEnM4pbpY21LQo{VAZO~U#y__x0TLq^rHE`6SHfPu>`~x?S z@V1V5z-)d@mWz&({LntK=u5lNSbvJ4F1#rfRGljzbZv6NW+!XTGwb@>}9E`lF^IzJW$k}3N z*g|jOxO74ZFk$kqj!EM-G^u~@z= zWA>-YduTUg_pjd(+-_M4C{ow00We@3(scylQOeni|gwI^Diu@@Ikd5+M@Xl-rSPI4R%W^U^0P3k8Rz+9%A0 z2X<5qWOmXxtM1vCc(mra&_q4EpY8uNx=Ey8UdLATQvVzwtwx~G#PPjUWbel|&&j`u zK)aHf-o@{haihUD?Yty)G~0}<56?_Bwx#m!XyDXpXDNRUUby=FNZdHg1KqSsl^#3C zL~kmTN7NElNI$-8zY;FQ% z|BuYe%EZO~|10x$nyBb(wz5TnySYKP?cMx$P~k%$5aF|>Mcpbss6B!v9;5%*5?q1V$tTX|Rp0a^pbSg`7|(z9R?Nx2 zf2LoWsr^zmW-^<&Wr%0v=t=bwO2Ui`26Df#=_*YJUlx@D1XL} zNE9=OvFx<9;0=B23J?mUlRs?{2#EmF(NAqN#GF4aP^kb73J(m>I7mMH5`=lVWO*fU zu}TVS^0GPBE=pAg7k6OxFJx4DW@qSO!6^1|0_&WNXuM5Nm@GtS`%)nQUoI1_kF4WHz zw7|{=?Aad37YZrV$ENwO+_BeO*UmGbe<#BJJ8AL8&dnbN@r}TwT1Mw5GDTf26>=?0 zgQpz?PX>2-2Txa4XIlqo)bD&}SHS6_4;Td4&~|p#&yw=1ZsHwa@`KSydFEsC;kwgH ze)HR7L=JCDulKum!k=aX;b`CB>frLuLxQMpU<3ITv~&C~SCi+fL>W;rIU!j=*(~1A z?k^++_#6)pd~_{-t)Iv51O+kuKbSq!6QKG#d!Y2)ES13l9av+#-`EZC9|WI+mD|4^ zf!VwnKXyi&-2Pj5-M<77FjkOGQT$t3U0lo-oEkhGz$U}LW8b>qzjirfb7=jrK-|Fo z_@-(ye$YS541PGstXs_az&>u=cNuPbXqTkGSO{OYgcJjjorbkQHjR*r^GhOCyT;ugp` zo%N07=?go{-<7HM%`|T?26X(hu3aJ#f0r4_N~v3uyZEFHs{nDx3;kd!ySTI>MKb8e|rfMc)vN{J-H-v>)1~SBDA;bx<5p{U0*oxV_xj) zG-iZ%1n{?)PM>b0Zj5>Yr+qX(r+ieuTvb2VLMMK9TfevmeiN3pvxM6DsV(oHa90HM z(B!qVEBKz%wt@*9ixJyDC zA~e9Y?z7}r3gv|P^ZYrLK%@*aR(D)X{RI+P%$QR*E-h3A-d`I!qV7{iO@n42#!w0S z*0N$T{mvn~KPA`3&5(`j9^4~W%I7l4t_3n#~02sa@t zv~cOOu4njtiuap;eC3-1x_Wu_M@2H6qiE-3aZW=F5vGKATwU_9%?*pqQR`w9XDB0V zVWKAoT2`FZU}AJ|G&pG}OXSt=aFUOcX7mJ0l>rdPsEsEjx|8CZRULu=$8{RYHGdec8eWvTxkrUs z(tj2=R+Jxyml1Y8K*5T(`7M__w5q@XF(l#Klstr&?-gToBpy6Z%c;3vU?#VGIu*n2 zP7o(g#FT<-k3XZld_uf@(QN-k;{t(JZ&(A9Ig#y%Pz79)OBk00;3s3sDM%SEm9;QK z%}J2Be>-rpB-uFrz*8(I4D|Fi%nT=*0Bg0DD5gIQ_dCZ_CK|)QzHuIE@2qJ{7s!}w z`E+Yu)NNe`QNEVoXEaQbmn|ed4bXZ&K9ZGlsv4UPT#C+AI1uo+S+>{mvoq+_%b6r> zfga)e=BLB8cJ`-lvi19z_S{4qqmJ*Cq8HD}X+v)YCKXnLb9Fgu9NiT+6B*d9A-a=F zQuU%)F&Q%x|3-)DBf}zlNa}{dUdfw^u*q?xMMEocLNy+LYPfo)?gCxby=`rNa5k4jVEh&Jaa2O zQr5+M>@Mj)!RG%r8Ly+=RwG}uM4?t%pzJ%o+S)a^)E0Q1k5DybReD*H2Iw~sA9fK# zTE9l285eo& zuT)9tY8^ihSqS}IXT+NH+YC?DGo}xEMYuLOeoiLTq2e7-T`>+NOVb7~Dy!+u zCe5^usn`5hz4rOFD%E;8jTkoE#aNw z^GVp}guB@f?mBaDrGAKsRL>fNQx&)>$gEXF%oYYdr``p|^HrBJB#f$FTo^p&6D8(L zWYJw^P8HkKw$>)8&Z+3yuGvkc>an_uznjcflD|WesYwQB?TKOl$`4cnK6@%NerI-f zuWi>a_*UNxS0A68?c&8_MkW1FGe|aJ6(?crp?Qjmu@Am-bKV}fRAFPR6E$>r`XY<` zqj0cE?7Q=D(Iu7kkel`goYK!n70a2~f>p7~G0^eTkj0k*Eq4-NEF(RgyLV@JoUEMB zVF!YvkA#1O0nSa#p&&jCmBGCmVQ&PzTakpR<>&IZl36gaPf5*ygtl-yB5}tZ zH0Q8l^HbAoUMSH#D?B(@WfL;H=j#u zM?YP?I1b!*XO~Pigg88Kv`|}Ys!1Dl>jw9QXr6!3a5;G{~KhL z5@D%$oJ%Bf$({>C2xc;u#d0QzVJVmvyx?#0g_w0wFxV%l5T7H!iOyWDZ7TEhlZDrv zygkSUtcg?{NP3hB`{x^cY`NKGAY?FUBZKPE#v<3--YbqKNFBl|LfDw7ZS*C_K&9T% zga5n;^n(9HXi5n#>_L#uM>rsmvO60CtVXjj&6`2HP;17Iqn8i=VWx*W`mK21pS>)cx8IMk^+Rix^2L1eGB(s;LB#+{>NV@{ygPxO3tiu?+EGwDfziA=kESXA#eA z{7cjq z*}^w(l#vm28Dg{`@y_SEzXx~G`6J}w^#pqKL!rMBqb1rv59C+M@865QtgR{XlGSk| zdg1zZASA9l2emziDJp$8?MXtzEjns$0Rw z-oI{5b%!U;hX~PP@YAmAH=s@$@}OaHrQ*0kBV}Gv6a(7Jcdm+8M*F;zW#QD6$=TPm z39V7(lwsEKL-3@CHT(SJD6ul9>yO)B%JBov!v9A7ysw3i=e2FB8b{L%(Tg=}7>aop zx1;3ZkCmLEYMmTq<8MB{I8lfuNU`rMtJOAEGQ}guzj`r}Zc)0wQ&>=KgppX(T(e4T zGkG%IKPLAT)J^xfTyEkFA+PFtr`|62(>u23_l7cWa&yUQBI0);nxTqWJBp6*2~q^r zv<%!;j2xHG&TQ8Fu9lacE;Lv44U$k2#N0W})WP<@gx3oFcH-4c{JIUgkfTQ(ALgMV zXiq`PbGY(i4553N54RsPs1;()@GQq^zTJ-iolMVXtp6U3xcS1`oH5`=X|vu69+Zb> zn{~t-NvOsm;_HO@cExoh1g3kY(<%VSpo+iK564Kh1zZ?=U=LYzl$T6gQktWE(Snib+5 z!R8$dax>eU=|P{^Qt_(5e)b)xN$Ld6Oa>4|2*N-!*Jd^U)!q{tD7mobZ$95R4!%#& zBqQ>{Oop7={H3CV7mar%fl%u+)3dTWpiOFEM)oR4FA#h#{6uFYaxx!b52v5EYA(%)Qzwl*L9miRL)_g)Z=N%KctND5;F_U7#ZgZaujUa3N zn6r6w(B_#8JFLfE7#{udo+&^(3@pbG(TEDt2CE|5XSvx`7fI_miBf2uIzVm&-JSR$ z_O{$6w^_vr>8-`4$>*1YE0e8nMnnq#}4U z%1C9-4AncE%NX}{s~gr9iM5awkfvHSbPT!9SNyH%({;E@I826Iz6Vx=Y=g?7@pZw4 zA&s6&BC@wBlaVJsdyBuVny!>d=lJss0_FObb$_o%Ej&RGrPI^7P_*oHADOYyRrZyI zmdAvqC|CRJ)ZNm!zHDYXq=Rb7eS$g;B>MIlB1DFgzl}WdZ?J*?i%#@nkOq_^@zAT0 zAI1Pt^XW3f399g`CKPtT9|VgDnM5H8;uwfh+jg>#pw?zt3$P1w*@>feTge5BeW*(v z?=}>iCU_6WF%^e50%!~?zm8~gkjDn@KlSg6e%!wrlO32Un-=9}FsAJc`)K9)CXAmd z_aW>_-h!wPM=hmC(%drU&{4?N&|=I{yoJD~PP31!48}*9W$n|v#Rbq94Y2n?GABgj zG7wYQKSDAMF4_!ja4BR~0WX!=x!ka4kG0fTg+Hj>skYhjsp`mjj_`-yN(dg2bLg~& zW;~=;uF7;uWtMqT`biTUyU)q9f1)Pn3UD+x*o|ZhU1X$$d`GpKqguGSJ9s`0*9EML z&E5+RVP*UA0JEX~<8!yv3GW~22hlT*%}UnLei%>9gp+~s?g>^)3~NySigpdk?>vik zeE&%L_)B~_`|$dtEv)*1cbh3SYjZJfS#E*{es*rKFIw?%4BLhgog+CFHcE~Y#zqh6 zxZPTwOEB_`JI3M;nGY}Soy%q6JZ0z=paQka8}(tpiiw&j@(cs)Tc4YalE#x*%fckeT9>h7RXg63>K*6d zd*^Q;y4^_z2QMvbI>nf%He zFK7?7@%*8<%h+zR>`+ORiGxSAZnMg_nL%!%>9)i$$x4c6OM|Vz86RnXM4@2_;;J%f zxm6u*{9;dou12L->TdG4o-{vj@@NeBdvezp({o#${$q2o&eDLe7=wt<+E}xu^^G=F zt}dC}UQdOT8YO&Egt4wFssrX)4Xblp*tX4CiVvkdil^NR9bni<-P==AjJpq8uAex!0Cb zJe|TZNO}8INQSj1dUvZ^7Rqvdi2@#nnG&bF>X;Jq+)-GGSTGJLc*BK3Y)UQl0k7JK z6t}c2in-;^1vNNs(`V}9J4VGj(0ewlrK40n`UD_-6*QGTq^3w`MoV)prMkTJYrArw zR6@q=@Zw*j4@i&Y)FPcMyrlaHp27xnTQTa5J zOw;5={ssQex(GRsW7SivNMu;+GVLpHQWcZZrs3>zp&tMvw#X{p?oyPIHo_V5{K zVJ@;><73V@-nL|{rpf+CupMebk>IUZIMd#G z*yu-5@S2~ae{dN^9dx+T5tfs8;NxbHd)E6ECB*QxK}1X!fN01yP@Vvw@n=^iSaNA( zKe@TK2xD_uHY&HLO{iw!uQ37hys5gEmSDbWRIYVUmqQ;`WYWx_yJ~xo2oSd!F1m$d zv`fgF;(*H4B;icg{gg~e@!7Lv@}s^7-d9r~Re;a3PH!cp)~WteVU-#&G4}0<+HqCE zHOJSGdD*3QAWvJq-F!eq9S0_;gUg?R01|U^LiTo=`W#~z$jWkWHz=fB7`MHj?UE%k z$h(rQ(}*^#MjuDyxqNVOzRwMR72M)$89>`=yOj%_LHu8zrTkwz`zbOD95*w(x=gB< z2teKwu2|fo-?J}ns>sW6XRl}VYuEWDA*6aqE6np+pZ>~%Ag`%vrj~T87ddZPNpnoK z7DJ{Pr608&J6`ioNHvd@N6|XblrusBrQk*#6CDL;G6Ov*|4%+_6=}8~$!H(IFM+=u zldO*w?bdfbSmPxqqtI93^p2yGDi2ybVki0$x7wabQ3YwMlv&-|oC;jq2MqF}#Dk8- z53^l4IC;lpjgQ}&OKn&Ui`7g#E`qhQRJQkNBJ_-YW_x(9giZaLgrNiF4Jq@AB6&&A zGTyvMZV}0j0A)&;er#ZmtQVJ;;8S}6Kjg)MQ;dQ<=`pgCmZwu9pH8H6PmD4VNh^1} z?(QmJR{N#k1RVkY6Tj5Qt9tuAAg`9DG3bQtk;icSf!%c(_PfpFr4FWsRzZig$7!Sn zTQ_H6b9p=}bHGaEMk7G5FwbMHh!mc}pbK_{A-!kfv&{BJHkopRKsfGUAu8LVqfm(Y z>(3RZb3KiK)FNwmd+oxC>h!_s&giUrphqp82`i_(g_p@97a3!e;_O(?$UL)emrXOn z_PDuyBn$eyhwcY6DIXG1FONvGRt=g)(4y4$KKu8iRK{M~dLEC7@oP1rXYbLhI2U7} z{h3{g(_?2hf1H@N6?Glvne>#E+i*aMHA}&1i@V{G4ele4FF2$l8nZ0=zy|-nm%+?~ zB}p@bq%c^@kQ<_VIGor4S7*kkH8brr;e=2N0AdRJOxE#~C$heRpwbhI<$rPt_@u>T zNeTi4@?v{RR74p0TTO1OQvEu>2PT{Fzr=_8G!b8^DRV??(8gK%4;`ZNw!9UWWknI_6&~62pl*YL1?ZB#ad9+Bcv1dMX?Gs+_1R9}@V1N~<~vy62H$Q(Bx9gY??nre0vIRZtGFo}0c z4T(wY5GUX?-Va+sx$UqWLu)I69i$rScN}YoJK+pSjkIDh7G4Ri6()x)z@d#{d0<{> zf%oG`(YfmOjmv7s>RU#sEKhgk@&PQa;iq=Fbb+wf1lT5rtFN-ph-aY9U?4Xr1-P2Y zQ*`e|weR8M^5tXtBt(kM-g|#mZ?TZee8H+{H5<;3#x~)-ecyS%MPlM=$>`K?ouqc5{7ay~81icO5aH5lOrO%RGW>Q6B{yYd^KSYO=^Vds z*dcsTRMCY<{AYsgiV;;Dg|~q3r+ujV(l{osd!&Rvmd?h28oEoFGnND~6<=+mMquW9bb}g~ zXl4}9?cWdpYI!?vG5V4lD!A5fFB-y%YPthC!O1unn;kaFXH}A4X^K+T*t}Q8L`BXA zNlTK%Dm6}f1bIdRVOzo&WavrgRE4~FtA*zvzsjRkJT%(fNp_R-bMvxP&*IQS%byRc zl3kGqZT&ayX?^&zY$SAAv~#&V*Q<|Go&zfQvB375SX*jM*$f;c`2(;^HwG3=*nnkX!Zx`>T z0c&1JA%D@arm4_ft(LVp6IGOGHMc-Tu`13c-S4`}9XdOOn&H29F@h2)k<20aL6{91;oZS#!*-MM5hM z#ebzO%CerE<=Bn&D-OUheapnLb6Ff^iIzdaSu6u)FZb%OB+Cq_@#V#Qnw&HcK>JMb zZi69U?BQRdC!4-~@rbbXWhc3=$WB@ylaxRCa%}}ic&vT&k>T7^)r)lAWRh8?he%wN6agdUDD8o1x5rvfJHlp^QJeAF_D zbeM8CN8jR0zsvXSM|xq+*dI}+EJ*mnc27^txcK={0~1s@IeB9Sb!p0hc`qqbW5Ou% zX;#J0dHTw@sBhSCl_!fYn|y^iN#_RbA3#4AO-lkUYY9!&3S>bV2Is*kYUxUf!~?)+ zlxwF(1j7d6YZzBS>e4O`pJzP27g1pw3OJkK(ST3VN$;2hsln z$MPxUh+}_tHY=s28iQ(Fr3@AOqG@+z_v2@_L1!bWnlmOIK&9W!C_OOk5l zB{PxplS{P9v$y)Q%;R?__?c==lkydWa%Wip7bXRW4q%c|^EE@`nDwZ%N{eYMYf$p$ zjt}wo*?|C_%dXd8O*go#|bZRkthla90FmQFTdpU|zxT)1;b#W|zGk zF>5IM02z78LZy1iHNj;Nv~AIIkMg=k_h+#x4-s0PwD1m}GzW9^<#AOKZkOGc2^JRJ zpv}nM^T#;a*D(Y9>qSA3!2q9AMJ+j4l$!TU2-pE)5k=0C>q-# zy#taB?Ud;~G}ZyHkac`?diKN)n!2~$ zu>W0`W)JY~_9*Y)s))b)johDZdTf?c?VO=wXeb%tj|p6oY|wf%xa{J!@r zr>W70k@MAuiDh@63O$qGhdBe_EwnyoGUj>t(PIyg^Lf+q>B*X=)`Jk}-y#OvswyvT z4?5vNP;=S7meIaS0g1n)Y9Lt#%BB{;IzyEjs6?XW9^gTz?@6}Wn$j^uum!NadSRBk z^6b@^29EsRT_Vb*U8N@x)6D8f=Q!R8eK;e~t+HE^SXYY9x*aqNmBaabs8_+O3bFd& z5Gi3FHG@oChb%X8b>t2wjl0k@wyQ>hgL2eM6{Z$aRe++O=g;XGwk-dK zS_|>!kdiMiG>zr3Ye|PWK^s3f6<*X77WIo8YHv7V$3Fy0E-R1v&Ax6q3(B-Pve5m| z)ZQc!2$yHyhqe;d)S|{1_GKqzB_mye-?_S<2P$~y?j8})q0)3#J`G>=D(hOl_f10U zFSZ5OkswlmiB9k}ZtR1;XBIwNMV#5l_X)8t3oK`2)Cy7p%xkwG(ga=p@cF_IPgT~# zcai}hVBwjlBe_4#V>6R-QHzMKZ_0B%a3G=0!qYjYj~F%ifdz<|Ve!N(5U$>jU|b!N zN(W=3xq(3v)i)~K|CN{3%n;~QBsS=?eF2`sn?8lX(hiZ5HkO^f)e9=&^Nb(YZ7 zhLdpiEg1Nht8R%b;OLpPH+DR8T3gxvx#J6z42o^l&0vHIk^YxOD&p-n1t%O1dsf_& zN0>BJsU<2+H(wICceefK3)PO~9tweGQa>DXRJuuJ&(_G$#EmqjLwo()GNB(lu}zp5daSbGU}(dpg@4|s!x z%~vLV$lf*l#f>##YCgV43QCO+4Ke80zb+H(n-ekmz)(|?%#5x=OJ*chRmjqAj4K0< zq{NySb|9jTT%Z~n;gy%&2U&Aa`Kuv3NvfuiRONP>02|!zRJl|MWTK$p`3$xr4sbl- zB6*^$z_tKMYi$n~%bC5ZzW6v~%o=Z_MT=uCoH>NEYG-ba8!v1@HL>2He}yS0BCwF` z4G>e2fV@XWK5oRNMJ`#BJd`PK@y)KjJ*Fp}p~#bbinLq|V!btrgL_qHHdqQwy$Zwe z-C}NMS+1pvZ>WqXCYj9P8?DwQNUN0tr(X^l!I@zqW70)v=10oNxSw5|>Ky9EH0Sby zMkM+OF{ZjQtIyqb*HM?1F7mITONtqGZnPDJ!2EIKA%ZRq8A>*r4R8YzM+C>^)ynp$ zbwkC|`Ih7Vsiu7h8PWgtAIaR>e`D!e#WiD3o3i#nHD9flkp=6svs)A_-8S!P*F(9j z`6xQvgraB76nO-JK?KCUsk(Xu-2gjTL>Y8Or4mWDwHt229rz;&Hz+&oYc`JiEt`54 z9-mC>q^8CCaEtb9xjCvb?!@Ev=~WR_zBG7S6`Qzd@l!Y+PFH}0KJ$GBr&n(0H`MET zJE`v@4r+esY;FGk<_PIaqPxoLNtkOSqK(abrbv2@UT90y{j7C-B(83kHMK74N8 z!1fdaTM{sa>QLEj*PLSw{D?A0Ja@S;9bzxLSFCy5UEtiWewqqeT`yfsA&Ff2{tXgs zYLhcdEnEm$kd)k%Puj;OSpx_(2Lql~eR@3Vs&K1KUwS39Dq6oObsJ_J3GG2Hq-&Y6 zCRPe#VdZAt#yYr|{1ld<86{ZL$bi9V#o?P$ICTfxOzDID75aNL|A(=AYRs$&7c?BR zW2a-=wr$(CZQDu5wr$(C`Np>QcQi8x`(XY=t*TY^Tz9RWw_VHOA6E*S_H)d-P{w)O zBvOKb9D_(#&n5mMywmkc7w-4fmg`&MKns5uv)gAtq?gz?2fRP&rwG#NdBQsWUZhh& z4W>J3gBF~PjFkq9^J02359F3nE)J{6<_HPruHk#_cE%BkpY`hkpBY;7t}d^LH@w#0 zK|sjH|j>jzOHc;3UU>`N=Iy z>wwSo@KPj!kho+pZ~v@8S!Vej2css`t<$kp)dWkm<8O@oRjx*cAI?h*=9HArVbd4t zg0$$@{I4=mXdf!~p6!*w&Z;k5X;mjz^m+tUdX->ITg|3wd*z{{Dz)yA<6lh2#1 zMP@(1(sk_{-3dREqa5d+!W^=IYqwN0W8MfH&Ljb750MWgd(QS^7Xd2*+Pt{Ovw}PN zBll;Z?65%f{c9Oe7^%9!Rk%;_6>~-mlItjYwtuSC+hVd@c%}OW4Hjl8FY{3%%}_J% zv$1PoN}_m5L4NFFE|P!w{zqg3x~DFK>ffp@IBm;*WR%iuRgncTNFz7OU)}P4mYF9Q zqKsY}_5FVp#;aPseg;$KQ*|c3Y?Hof`&EQ+vCc*gEzO_NWT4RVK=n;#jMO`)wrQh2Tuc6L zHksu;PPWOgWTHP81IKAP6d3qBAGRw>T6E5|$jI6C*2cky7;`DfDs(oB=Nj<__Xrp@ zeYp-`5_Jqsy70K(qchQk3iX>mU}3|FTEntKxvoIB5M-OX^7&E&u{Gi&=nwM^HVsOC z1e%c&Z{Q0hX%Vnv>$4CQG`Td~to(q5H<*^wBVxo!Zuj|LjTs2h;?E<0aW|#dYN*s9 z*9c`HDM9MOP{Bhs<}`ij>^lw0+(Sz6P1QtMYrqDcbs~LnUrf{T`*`TiZ-PLyUZKvU zrpSyc4rk6=vO??V#Ed-2xgyW#3aBQA93PLZM*6UQE4p8!*FjS^&PrfXi6bZcrMLzoSTfV1MDe@LgwZg0^8PHehFvV2+iko#V; zO0$8LW7QaM_}f=>5UU5aJwmw1`QnYkzB}VJml5rQsE1bR-=I^}6Q^vDowm?9w31vY z6B2(XsnMODE-05Mq-GXZpEg;3LF%8rT~iz7#h6#09DCA+YUv#Wz-aEW{__0eHJLOz z)Do#xrK2$H5uzO2(kWHwBGFo2g`XsZV=GO-}V3v-{k*;wY?XD#%bq4THyf5l@Le0cLv$|>lvZAA92q~EmTSFGobgnt8}77Tze zE!Y1YpL=(3=(xW;d?SjOgSO7SR>d#myPwk2g05YGngc%w!hV8t-f~2>6sM16K5%28 zG2;WL95dY@go{*rsmtrlw(R+l(jUuag5oj?=4iTo4SdIY^{U9L43NF=@XNTUtgxd2 z5(V~&_DodUTn(bWpt3xzo-<5NhG*)?Mp_HE;q01^jCLYI%0>r8PG<2(<}8{KVBGd9 zsQ4l(@;3Vpp3)G4N4vdb`|VH?7(igduZAJsFDs8ByKBms-YN%QlxKTbq4H2(V*{S` zd4_9!_=<_~A{;o`x2mP}RF*Rk9NC=;JQ-PmkQ#a}J5BzCt(?U2(J>A>4M`rqR%pH# zW76*es9~wbY`uqRHgfA@Ef&%-{u9QY_F8@&=)t<`7A$<&xucZl560h6m8QORpYc(Ez95>;#$wVk2!!lF~?1%9Y^cYb9zM|^i|(K(p|WJ+;=pKJZ*$gMd) zkpnlJQ{e*+djSw|NcZ8WZ6|ofgfr_Ai$Gf-%!EoC_8=vX1%S2KFv zIhoWk@qBd*QO6cRu(C;+;7WPO9~8c!iehaB`y(ji!oSY;H+HYYnOoua>m$SGYn6;DvMF>Atk#*LV^%PoF8@H6&in2Ri4tjHt|K#f zKFXLa9^j{Q3+lx7?F>;m=8&V1pSGR^X1~k)AnBFku{$ zN2)fW+=%dVizw+k9hxrNumVi=l2Y>wkTew>M9m|n4x!7ja(17LrBiV`AbRJ$CNSDC;E5r z+dV6)#Qxm>Ooz-O58+9T_1)NFdSFYNvs?^H z1g{QF*|iXGh$3*8aPkw_!kr>ikm>eC2ZEDIQV&bd4b0`CE6NV1!+)>$OtR_bn7kDL z%CN8_ho|DN#5_6{i{;B?X9iVdQ(PWhYe9)HqwU`Fbt_+x+f9k|-^f?kZlSgPB(ZR% zlHX#85VN#(=b+|-$cQ+2!ZvU@i`klVB>7(Jy7JmmB``&$h7lo6Nie=MdDSz)LOO(` zZCaU6i6HBezP(0#Fg819#xW8y{V3%_XIzP0btUPB-L zte%xU`aT>18{9__Mik|)!yiFj|EOU(MN3uNGzom2uiZRDH1DMUErdCH8iJvkCmEFQQB%TQWQgYag7wE3C_f5(i4 zZ5$+n(5071?75T3cB2O;=3?ibar$QM3YcbjiLyt$@<}Aa!2=g}XG5caGW7He&Q|F+ zpoe-QOVS5l3R&YxmU0KoLA*GgI>9ZqzcITsAIixzMf~|Y9(J9B!CvRfXh+gJlDWZ@ zKSBlL;JV0fVEvd`QM<`KyW#}VkE|`HwHehm!s{akhkHEIfHQ$L%@nE_r{+WQ!BtI zxjfSRS;-l5tF#sO0(&pOg#ZxPbljIjSHfqYim6&cMv#5^RZEE}B-g`6vsyh=a=dEV zz(x0h7lbQ1&7r3#%F35KtZAW9B(SSLg%8q0^owaezh(K^q^*f{@_+VNIWWJ!*gDhZ z9Q}uhQNJB44-LA8$f9nQ&n-T{MOTCc<#Bz=dzrEwF^4RQBXPfZ&Nx*Ov0sCe(VJW2 z_tP=i(xS$T^wEg^sE?~>%4F9&a{K-(MAy&rdQk21J;*z_{)L)Hw&OmI1tOtDSakH92 z-l`{WTE_u?^J&|Zi1R58zqJ~r5<>Oo4MJgmGR!SMTuCq;SmzCJU0hGp*Bm#)%^Hnf zfDX9CsVt+KTDAU&L*MfWYirq=Bf;;K!Qu`F`rz8VsVt>Xf>J33QqEXUt@Z^Pe- zz#>-R+MMGprY-I)6+kG|6a4DDr^!htxfgx6R= z)pDA`_evBd#ge?&=x%(sp}m-5bjhQu1hbkOUv;SDbXGDQoDpl~^QDI- znE>^K{sEmpDm@F8!mIq!9cJyCn13D4zzgA)2~no)ErG*57S*e%#v|sx89+weL>EJu zP+ESHs22rGoQ=0J>!jA_7qCqaKNyzg;BOaIJGdWVzAKrS@A5uburWjC-|=}cjIYDr zG&$fEz-6bqY3*N1OHBy;E2bc3=#(SQW2so192u@zK=b6RP#+w9PqRA9=SkRLcSG z?fo3it8n(DPZ5|cZFs?1Q(-i@kU|f1d-9T#d6As_KJskF%4Q;4V)$JeNtfMbn86*vKmD?FVe@BtHN)d zp4QK_*<#Un2)gr@PlN7{+~+PLcnYV5cQCHgkxk)={^d(@Fp_1=*}5+AYZ>o12LA+p zl56`O`|m_h?LM9CH;)%;N+(uiw;ikpll)94%b6B$FTMejq^tn`QyCU1BpfpQZ5jsg z^}`iv_R@FG<}LpwCDMBlnskWzJ_CBAWu}f!b-g2SRsIWynhcznV|Sbg*Gu7Z^*~(w zixcdetnDruKhW-bjL;aH+(iCruenHq#^C#%dCy)ynoZ($aob$r&un=9du7_3#9rqj zy^^dM-h8Z{h|C=_QPT+pNF$*x2eN?~2~D+gHk^)ZUW%rKBji0rUCK4(5YxP(Uu{qw z6Dj6{2az=4nj3%uRM}83$+>`NR1NNNnbm+rGYS3s zWjQ`xzNULhVHk}H)24^8!Ql`~-@67w^gCNoA?AoyicJRM44<3eOzGDZ^XVOSs#wA- zsC{d`58F>+&Pl|;*?o(T)V{@!rmX(MEN&ac0tK-^`Y_h%TKY`5oTR=CK#wq!o_wNt zpxSlBhe|65V%fsSr(vcces)j}>mQ<0>gTd>Lfbhx^0v?@E&I|9B@sn0IbI8(h0_^l}tf!I$_s`a_nK_s0k zq5>KA`R=SE_Uwj7<6v+WlTu`Ni(ct~0D>Sl9^PzdhuPktEifQp9kaz}4Pk!rui?4|wV!j0qThQ2bNp>dP z?O7D959pqrrf-}yS`bUk>1u<7FJpTj-0I@0>K_zE5W$6_`$en-Dy2v;O|$iRewr9{ zo)mwzieVe7+!3r_Jx9!e%-t^lM0-g<`k{NFS%s?M590>X^uYXN~)WB*s>`p@y&{2|Iv|{vx&=Z5A z4Jic4^saiH*6|La7=Bhn^N1S3ZtYJbu41Ity`LC?o(ILlvv_Bt;~Vm?a9B9>Ev-P$ z_Oy)z4O5{a9Vj*;DX5DQlHlMg;}C5N)e5qU1q`{6K;FtK)(EE)Vf87B(&I9otkmO4 z-9ca-#p#%qyIv?lsmP7CT9a7C6UxF7{tmS+wtMRf-o!8qS*jjHCR1(dRW1(d8@i(9 z+Cy6_c9^(=ejrskky?nx8baZ+%yxV3VNAJ%e&6jgTMP7&uYjqbAW$e`_Vdt^OGYrh z-1N&}*OZ5ZZr5EePTrOtL(_+iqRK9uO)dd|(yM6wQhNbSX!@CZf)E$!$J0RoN_O}5 z*+OaK;OeA}2&3_eShk|60_!mCI;@Oi@lI+hX1u^q_eL2A=A>#|aCFkp#qb*54NJaT zus1Jze?nje^c~8JR}=Lu9HxkZNP_Tf)u`v6QU}e09m$V zv!}}#q?t%u!EIXs8GxzIp;4?Mi91R}SP3}<)G@=pU2k*4;*)aq8b>xcnWpBLzfIki zTxD-q-E#R4Ot6t+_?aVEJx@B4i@U^&iHbO+dBWnorlt)UoIXzPm0;4de{}%@E9 zsR508E-gEvHF9FDxnj4v<*Z<|0_aUcIan_#T&(Boj6Ppf3o_`Iz{RssEejnm=}&<6 ztTJuaKwjssCy^Wl1t87PJoaC`qMg*jf$7tE6~P5jREe zy%8rsA>AH>jP5I#{idZ-L}Fh->A!TD5j2vej9jp^?2>>K3OZyH*K%*>IL{9-gH!&5dA1DIKc_!p3${+|JCE zqrK@^`1@~5T+&Q&Z=xo|`XxZwYk!9(CEE?Tr=RKJ)Ro|TVYMc;58aP1;sFA21_klOYS8@%{smnadav-&OPoDR9TKbMU& zbDNq>Z}{$(jn`Z1|xNSS~hNFkA9j+Oq({Q56o5_xXLi(*$OTjERBYIpQsDI#5l zo{T9momVr$nAHUdq19|`%HL9>KLNN-HgwIQu{0)(4tR^iq&1cdxcC^zTKSq*0O@a@ zk|F+@$%L~4@PpD`Y+G%ozR4t*TtSL)b(|?fd`^BOmGr@1jOyu^SI&2%zdYC4SyuKf zT{>TCi5Frq{@F`sw;$%=^ft-0y8f4w$cHdN@b8cyTVzKrVqP80hZQB+MGJVR_F3*K z8{2(H+I@pVr93u;K7K0e&(o%>f11s0S=ux0)xGlnZib`5gL$b1JvKAd5#`|@(za34 zNxmn|H0>VFvb<^-7h2Ohn1OYN9&=*5v#H>KA!ZOs_~{ z+KaP4>PUZ}8zFQgW)^&spG*%Al1gpb!p6$~jWmI$Kjbz7=+ySz?Z`h0y3Nnovc+#w z+pGC2AA)Nb0&uRT9U3}x2@5kh1zloj!%l$GFo)Yly63ru9%`1<`yt%jIw>^F2C*G)Hm+2XpI=pEI8*A4mh1Xs zZWRSbCD&|fMtQ4R$s$i(k;IwSu~+IEY?2y@YnFZWC^d|eYqO{&mzjB&pXa0Bg;>1G z)Po1M9vb~j@bv6oM6yE;G*1KwkDpHh|5ed&lEJ`s9$o!cD*eOR)@5_&6gOf2A-)a1 z38Lq}O039f?-i@IrwF)<&_VwR_Wdr{d5R99K8gi@`k;_E7rISZR--O8Qf5N?mGKR# zoTC(*Df~lX`O7t+?gnQA;*P+ac+6~o_+(M?EbABSl0LtNF#5H4m}LGGU6HSEKk>^X z>-1}az&b08eblCNGDbmZZ7jEoV_7Gn_P_xW1yk89z?Y#Tj>yt>jcqR7qS+0V$y$1| zd?AV&DO8Ja0>>WIhiQ0Oz3rzlnEeQMKn#)Af4?#Dtvfh(ZtW@x}old|B znK&24S;|5Q98|uw95mx17Er~RJvm;ras46qOk-D$*A<$J$(-n427+PFODL@Vtu*s= z!onJ^jJNFvGYuCm^=HPqxi-Z!W!GZaa;Vzp@iD3*-<$S5ka6(Mb_C2m$ zB%98dwZ7Utp6!P#m&V;tmj0Hj11s<0=>%#9hc#>t%>o zxJzXnW5E4zU~nhj{8MV+>WRi8M%E019LO|~pSi~#%l-)@#t|Hn?5-6gaqY%n zXsp>)i{ZgS4%a2;fk{>==bDV;)z7gp`$o*rv0d843{)5tfT0gsV}e}|?QIFV6a&j5 ztlPc%xJp-*KSuUCC_t5SCkz2Fy9RknOdMhoc?0^DA6Vpn6XYn3HO7AFmH=5QMv5XmC|PT!8`?8o;x|LeZ5VewR^S4 z>W|qbOFgyQP&rr1UV3G>tuDT{HW_PZSC6;Iy+CNl_uO27IP9>0ZJ)`t6jN_FAv>-# zWZRpBe;Fm-KZ-=y&2R%vARr69zvT+67DRQv`PLeBe{{62La0ek0BG&z_nA{^&z4_R6pY9R_ z_nrUhDX@~tsms8KeyO9|0<$p3?aD1sb3(1_?}hP~eCYT4ehanWcv-7GKPUF7QpT-w zJoiBYJAGA#rBcUg2Wk_xB22E&7B{xbcqMUbR38SPzW;3iT^Ylb7JT&1wUpn2}3Uq?+nM&YI>;1k0v5wkm|90 zrZf{Ex+GfS>5p>ovzAd?jcCS*j;1!$$TfX`)a~X&$O}PNudXX0w)z_XDwgR-84Fh! zj5lsuj5a|@ z!(S2is_X?#d*1@yba|gqoalC1AB)z4NP{7lI0bxkvohe7hN5MNkyN*S<3??H{EGyn zN}O_bAuGJ4xoo;9$Rg8t+z?9eCE;rhWWA&QY2AA?92S^(UTu!KJ73l^sn-2>={UHy zQz-_sy+XH#<*Q!y7|k7@ZMmxW4J%|g0Iug9PqT>ri(NX}nT*kJJ%j&~Xg#VTsS}SE zchCVSviW?g@7MWGySitY`Sir+!tPB8j;U0F=r==oYa=QVd=slTxYYMk-e z3jh12J0$_qxp9)l6xFU3g!pc7c#(rd4$x5ns&Yv>h z6uG`zd-j31gPw4bloVEDoEF9`FMx^zCKBs!6l?rD3Z-_9hHzTXA9jJXfk{3j=uG}a8I>}NL#1mx^*n0#fNaNa9ZRm z=O02I3D$r=9(92T`nM3=u1=^}&X3atb@!W>CD%z&kzA(vAy{XOkov7a6=j%?)Ruo~ zV#7tbo1qR1y~cHRUZgfWKgHemZ1hrQd1%*ju5MbHP6?acNnVzm?BB% zg6>Hu)248AvFS#?jS+P67$RaTzoiy@TRKN%HlA)QZ@MR2pYhj-poGwQ5t+<7$?E?B zn^n*g%{L}2-c)-#(LLAhMEhLrfNPTQA}0%YNgP5SGWc=&Kp!UzL#X=~T-pC-_JVSG zZ~H=^TV6X%!^aL4-}14U!XPt9q~`QI;F8VtEgK7#20x`D76sCYLS}+0v;Qe-ooqFc z<8+jBAW1r6@m>YykwyG^6n9h0z^(T|TjlF(_6`72Z_Eb~5@!#F)HTC?&M5@D`)8!j zwb-yj@`eiFlLga>e_eAf!2|7!8rwNCs;p)P*&pLajuSEmY=8tl*o&+HG z$;QJx{{1@Jj?;sdUe}Lx+L8JhU@GB4flN|Sh`SQ=HNTGb)pyu)o)YbzTdFR$O`_8*YtDyt_Rm;rVa+uU07e zQDcvi%of`j(LScXa?}zN*q-tWG1kCXku=yz+ACVDB4|C1xygmV>O_k{^QTPM9 zCw?xazAU&4-_WcR>avy$e)L*_sLQIxCAYh{WKIq9^ZNk=o?ko}VdI^b=*mR(aSg;S z{abqbL2Vld8yzE;JsM(zXn}5p(g5--VFlFmD>m7z%N51sBasKMi7EQSjD(j8Aq^ge zSqz>>jc|CAP7O9!bvK4r`L{7zuqJ5(INn8_$L$<^(lRu?4e=jn3DC?Out+3`ToA zBTHh@$|A?Ir%&-f`f+5BMJ7RBTas za8cQTgZu`iMABA_u@bKQE$n0qj#K+f|CjV{3(@NwcKeSBsY?|3jlI{HmiY*Tdo)MU z1@*VqGB<(Z-B~1Td0ClOd_4LbgHw$32f(TK#ugGX5i0_%Q?E)r2D zuhds^GBc0#Q?Z-EZl~+wBWqr5y+OJ-5)o1MEk=)|gryF0Xr6n!gmV_o;yEz~^j^c) zy6PjJq3Hxw-e_I?W>80RS7k2WUKPIOqnlYx%5J-^WZqyF>``XLOFi)Ot`{yBLkU`f^w#v(PB+Yj z8OYCt7sUKAe~5GtPz--Q-Nh1&{A3>+3{?B$bbP?pW-#*%+N5Fa98j5?e$T+yI)mb~ z=28T}M$iUp^y6{&-92b&!Q;7gXjo=;adH+juIlo>esZv@36$dShwZ$!-Z&1< zFs4`irjaF@=PX^!jLCIRE`&_r#Z(T^cM2A1is?=ET|hCDw&#ao7-SGfRemm;rdprc zEn#t30t#)3QrzE&cTrm%4bF{*x5Ly68m`hgaLN`bnoo6sAR&;GzCsT1-#3>R{b)7&5|%oGBMD8C|{V}HQ$~HMso%)Hxajed20vMsj=I= zJhX3Aj`%3%O3~~5OSQVe2e=sv;s=s$r3WJVnnFr+}QDLeO9)FuTld;(X2n9$A0{D;b3W zFPAZK?=M=ngwsv?;Y(81P} zO7XUy;Yq*RtN39*%=(%l*i}U3k*h1EfBeLg#A~nDU@xXTG1X3#3#`AidqxLzTR<+u z56{u!mZ`p~{BecdL)OZkf-MPzey@B{^q+)*Gfxpi==dXCP*2It@l zEOol{b7JvlN06<`V}2h)VCZ3wbZcB}CSG~rdqcq!5pZYC{eSqy&aJo6M(s!zzo@r! znC_U!5q~?)i`1IhR%RKJPjv74#zLGfgNAZ`n=_3ACe~auyyZaRXa~rVpJ++{^gvY| z$HA4XIU(1e7zoOFaRXsZh%bP;*_bY|Ia3vu}No9XkokdwoGc@Rou3FQEITVpa}3 z=8NWg@-fb0g!HPXtq}D&18h`$s5}scyzCIpn!fXBH)9aWEH-gYIib#qu)Xn`JW8jm z_wmEL&+ku1YI$LrIC0so-`PhE6MZdVvN$~YggV7NO`3QPvNBpdD;Ytobt5-#-RMYhn@q(34Tgo<FJf+I-*>fZDec3tB?Z@f<9Q+!iPEPqcy1 z+=#r_ljGmL&=hl`AZ0LSx_~zB0x7>2QA?n242~zO2R!qoIsurPaCDr= zvg72L`&!J6Fb5f!bezLjCx+hPjHhLN|G>OD_E58IiIXidu{a2pu!m~OM(e)zyM`A` z^?eH<;nKui<2$Qb;aiXVP8bXCb0jy{$q@`(L53JR;vzyHHg8IwKgKEK74+noG3{y$ zf0&l~SH2;~CU6eHU%FVC)e|sBP`J%DKN)QFyzCS{e$VmmHrXg=6a93msdo-TE{cVC z!6&Sr3D&~79jjN_-m06A2tw+lpwXsyVx|J_q? zbGzY)S)B3*o+2D_ho!EO*9rpY$K_pW)g^lPp>~DFK?dN%!=j5dZ{yg4{POH-e8bMz zkaQ|_1s$$)nawUjTk2ec9^7#{`1ODmNWyomXnL7&lTd%~;8kwjm~)m)CMxEEtn!tS z(itqj@0(~llB#$oBm03QdAJ%7$LtJCzw5#elK=Lv5`FL+xLVnzwCY_O$GMP4h6a7k z6YKg$r48WONSi6_*pKLd%E#e+K=gF~_sd;^?T6Y zGM|zn6@y!FvuXjV5FfvM?1#SNo$32UaUq(E4nyAEJqx&`+4WpSYc8j{886oA% zmSbbDOO=V(>q71&d4bG&%7|Ch__zrb8&-WXLg^k*EWV>iL#*}06rQDWVY#HUVK8a} zRVv70U>RJHgkz2)Z++{Q6-evYx{=Ar~JZb}6}I*_|XdZO@i88zaz|19MCz29}A+OjqymC{FS1`(ZlQ5E_YZ%tC= zC5e2&PpMGo@W=V$W6JE_Oexj zI_aqRLP$br3M;r~1I&f2PtayJ;7)@@)h@!!&W)7@x`iAFJ1O{}uw>ObDoq4|Im$*J z;jD9GEs#C;FTS0j;Zj8AP8@YNfF0gJLLB_Hl*}W8AF;FRvo1s2P8#CVDMp+A@vWwt z7*tAQqGnS!h~fhjq;x!3cmnX}%3#XgXT0{E5_zgsa0l%O9tXC#e^R-3^mYbG@mVYK zEhH9hG3XqLP?itpr$$czzHydX3K01@F7G{QvK2lj!KIfAB1fu6rzBSbz=?L|oDaL}x3o$;xjCJ-qGD#Nb$h?~Z(|{LsZUlJr+x&# zVfeZ{Qz5DmlK$bRJp20=t8)8-=F0|;{%QtTS0uurX{}-$Kj(105z!FVz{sz3YLAjDnAE&q5`_ow`fRk?5*$uhVn1lXC?aTN4*R zC2cOcGkPdM$6`_#-&xedD{I^FdH8=LKnhS8{crd^%m0Sov$L@MU;Lhvh4cSV`2Vkc z&&a^W^8ah!x464%sAzw(NrVTvFuS-1ySTfL0SQkd3WvM2Nl3U$MY~9{FG_{8BrV<* zoW?%p?(OZdu1)8b-9A@;YI@sa!?4PtJ5oo0D?osRH9FKc!h)ovuoA=p4B*|+JjGt8U4fLd0BI6no;}z!gJ^gF zrvxfE)6$a@KnCo7#pgpfhBj)XckyKf8vI4X9KXXMf_8jx0^V2`@;}`-GJMZDcW(xx z78uxG#5+8&LI6n*t^tCno~#B!ix_J{2Fni*07e(kc80VD8ph5CUk0_Xma?`0F=16{ zSz*D_$V0L2g`?Ufdn0vEL2d2`Rd)af% z#q|%TmbQ+xKChB=uK(5p4FKJTcX0&&ru#&&X`cJfy$^lCvAPCv{89!Iu!jxhf^KZ^ z^zf+PZ0``#B&1`jmV@`dv)l;M0mehb@a}(H0Y3x!TEb+nUvcIxXzlMq{@O(iKpsbi zas&T?PYV1pb@8z~ah`9&`@lDtiw*dhJ-_?M-H!(KmB-WysP#8WU0zNBiUSZZphB@h zYV&am%@o+x0yXh>p3=`p-OvXJ1QcgQPu*fq{<3v^l}+~*NDJhun;q{Tncv*c;W9&Z zb$I>Ou>W@1NJFio9mBYOQ~!tF!#M%{h~0j8&k5}FbD27#d16`0(xR7`9|mfs5YFuY zHwp0;_;>rC{&)X^40hM_2*Lr@4tzC7k_w?MDTITYr`T2aW0!||)*-JD5sk6+d(gs* zc?kUS-sfeFxIX#eep<7gz1}=PV9uW3z1-KGr&|8IvH?^83<_VHMs z|6jirp*0K$>_>^8_`U61A2t7%x%|(ZvK2Tmw+C=_z-qY-72+8);o0x+^aj7xL^~%( zc{(@9`R~S}|3}7uxPJG~+9N()XaAnTxher&902~eK2XP0AXk8z6>)j-rEd18P%$SGRcc*6?@8_~p0uL%(bvUlZj5qyh3Gs5;2W}%za{Rv9|L5y7@4x0!{`>9M7p;~M$l>|W;LH$$!2znr4LZi}ql~k| z!`ruf^@%>@Vji%^Zm$1SpFAiK;u&-f<4wH2g63!ho~ooyZ>Wzse+D__BSe z1HG_A5y5I>y_tW)UrSh8Pwr)YR=<)93gz@S|IlJyRsz6~#8o~Axft9b8|4VjfcvXj zn~jZ5^~?vYcs+#A*>|zC%^-^wktUMHX&oBjtu>3eZECjqn`A$|)Mc^*^&`gBUKJE` zUuyaN#o5ln%J$)pxCfyIgr7us6kS85G5)Rh&Q?yje={4&43zNYIjG&z)uEmg)lQ&` zsQtGnzJDVY_lgF5_(gf6i5ZY+XwbL_scjc?D>M-e{8X&npXHiFx>g%3E^$7q3mYzR zA5no{KyTPAxrZtTpXC5jS5hl5h?%U0?XHxNO$Lz&j{$?o0GrytdZvu@$0i?E<|Ro= zQ?$Z$8dGq%57srSzkwod0~35rgl7>PWUlTuoxmF!7M4PX$U2tV72A}=OZd`!ss-a? zAwwnGyE}+AzBV9OLk^nymA3kP!0u#>%;Mo$VL|EXroCW^1b8}p{jMmtf1avQ<(&

rVB%%&T`!!9H(R{7268=Xqh_VT@wsf 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 TDKW6KvNAKkk&y{X3BmmjidPFV literal 0 HcmV?d00001 diff --git a/developer/doc/ReleaseNotes/ReleaseNotes_template.md b/developer/doc/ReleaseNotes/ReleaseNotes_template.md index 66362ec6f98..e24f1ddbf2f 100644 --- a/developer/doc/ReleaseNotes/ReleaseNotes_template.md +++ b/developer/doc/ReleaseNotes/ReleaseNotes_template.md @@ -20,6 +20,7 @@ __**OpenStudio SDK @VERSION@**__ - Command Line Interface (CLI) - Radiance - Ruby API +- Python API - C++ SDK **Note** that [PAT](https://github.com/NREL/OpenStudio-PAT) is not included in either the SDK or the OpenStudio Coalition's Application installers. You will need to install PAT separately which is distributed on the [OpenStudio-PAT](https://github.com/NREL/OpenStudio-PAT) GitHub page. @@ -27,20 +28,20 @@ __**OpenStudio SDK @VERSION@**__ # Where to Find OpenStudio SDK Documentation - OpenStudio SDK release documentation, including these release notes, tutorials, and other user documentation, is available at [https://www.openstudio.net/](https://www.openstudio.net/.) -- C++ API documentation is available at [https://openstudio-sdk-documentation.s3.amazonaws.com/index.html](https://openstudio-sdk-documentation.s3.amazonaws.com/index.html) -- Measure development documentation is available at [http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/](http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/ ) -- A roadmap for planned features is available at http://nrel.github.io/OpenStudio-user-documentation/getting_started/roadmap/. +- C++ API documentation is available at [OpenStudio SDK Documentation](https://openstudio-sdk-documentation.s3.amazonaws.com/index.html) +- Measure development documentation is available at [OpenStudio Measure Writer's Reference Guide](http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/ ) +- A roadmap for planned features is available at [Roadmap](http://nrel.github.io/OpenStudio-user-documentation/getting_started/roadmap/) # Installation Notes OpenStudio SDK @VERSION@ is supported on: * 64-bit Windows 7 – 11 -* macOS: 10.15+ x86_64, 12.1+ arm64 +* macOS: 11.6+ x86_64, 12.1+ arm64 * Ubuntu: 20.04 x86_64, 22.04 x86_64, 22.04 arm64 * Centos7 -OpenStudio SDK @VERSION@ supports [EnergyPlus Release 23.1.0](https://github.com/NREL/EnergyPlus/releases/tag/v23.1.0), which is bundled with the OpenStudio installer. It is no longer necessary to download and install EnergyPlus separately. Other builds of EnergyPlus are not supported by OpenStudio SDK @VERSION@. +OpenStudio SDK @VERSION@ supports [EnergyPlus Release @EP_VERSION@](https://github.com/NREL/EnergyPlus/releases/tag/v@EP_VERSION@), which is bundled with the OpenStudio installer. It is no longer necessary to download and install EnergyPlus separately. Other builds of EnergyPlus are not supported by OpenStudio SDK @VERSION@. OpenStudio SDK @VERSION@ supports Radiance 5.0.a.12, which is bundled with the OpenStudio installer; users no longer must install Radiance separately, and OpenStudio will use the included Radiance version regardless of any other versions that may be installed on the system. Other builds of Radiance are not supported by OpenStudio SDK @VERSION@. @@ -49,17 +50,18 @@ As usual, you can refer to the **[OpenStudio SDK Compatibility Matrix](https://g ## Installation Steps -- Download and install [OpenStudio SDK](https://github.com/NREL/openstudio) and/or [openstudiocoalition/OpenStudioApplication](https://github.com/openstudiocoalition/OpenStudioApplication) depending on your needs. Select components for installation. Note that OpenStudio Application is a standalone app and does not require you to install OpenStudio SDK. -- Setup a Building Component Library (BCL) account to access online building components and measures. View instructions on how to setup your account and configure the key in OpenStudio. -- The OpenStudio Application SketchUp Plug-in requires SketchUp 2021-2022 (not available for Linux). The OpenStudio Application SketchUp Plug-in does not support older versions of SketchUp. SketchUp must be installed before OpenStudio Application to automatically activate the plugin. If you install SketchUp after OpenStudio Application, simply re-run the OpenStudio Application installer. +- Download and install [OpenStudio SDK](https://github.com/NREL/openstudio) and/or any third party tool that embeds the OpenStudio SDK into their software such as [openstudiocoalition/OpenStudioApplication](https://github.com/openstudiocoalition/OpenStudioApplication) depending on your needs. Select components for installation. Note that OpenStudio Application is a standalone app and does not require you to install OpenStudio SDK. +- A BCL AUth Key is no longer needed to access content on [Building Component Library (BCL)](https://bcl.nrel.gov) BCL is typically accessed through third party OpenStudio applications to provide modelers access to building components and OpenStudio measures; however you an also browse it and download content using the BCL link above. -For help with common installation problems please visit, http://nrel.github.io/OpenStudio-user-documentation/getting_started/getting_started/. +For help with common installation problems please visit [Getting Started](http://nrel.github.io/OpenStudio-user-documentation/getting_started/getting_started/). # OpenStudio SDK: Changelog -The @VERSION@ is a release. This update includes several new features, performance improvements, and bug fixes. -You can find the list of Pull Requests that got into this release [here](https://github.com/NREL/OpenStudio/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aclosed+created%3A2023-05-12..2023-10-26+). +The @VERSION@ is a **** release. This update includes several new features, performance improvements, and bug fixes. +## C++ Workflow code + +As of OpenStudio SDK 3.7.0 a re-written workflow written in C++ is used by default in place of the Ruby based Workflow Gem that had been used in the past. This enhancement is in support of Python measures being used in an OpenStudio workflow, including mixed language workflows that include both Ruby Measures and Python Measures. If you need to use the older Workflow Gem implementation, you can do that by using the `classic` subcommand after `openstudio`. `classic` will be deprecated in a future version of OpenStudio. ## Python Bindings @@ -78,16 +80,33 @@ You can also refer to the [OpenStudio SDK Python Binding Version Compatibility M ## Minor changes and bug fixes +Refer to the changelog on the release page at [v@VERSION@](https://github.com/NREL/OpenStudio/releases/v@VERSION@) **Full Changelog**: https://github.com/NREL/OpenStudio/compare/v@VERSION@...v@VERSION@ **New Contributors**: -### OpenStudio Standards vXXX +### OpenStudio Standards v@STANDARDS_VERSION@ + +Update the openstudio-standards gem to version [@STANDARDS_VERSION@](https://github.com/NREL/openstudio-standards/releases/tag/v@STANDARDS_VERSION@) +In addition to some refactoring, this release also included conversion of 90.1 data to formal database. ### OpenStudio Server vXXX -## Issue Statistics Since Previous Release + +--- +# This YAML header controls the pandoc (via TeX) to PDF settings +# To convert the markdown to pdf, do `pandoc release_notes.md -o release_notes.pdf` +title: 'OpenStudio Release Notes - @VERSION@' +author: +- National Renewable Energy Laboratory +colorlinks: true +linkcolor: blue +urlcolor: Mahogany +toccolor: gray +geometry: +- margin=1in +--- From 1430a0e7965aa631553eb095d2b8c5fe2ea6ee5e Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 9 Oct 2024 10:31:06 +0200 Subject: [PATCH 26/28] Start a 3.9.0 release Notes and add the API break in there (and the update to E+ 24.2.0a) --- .../OpenStudio_Release_Notes_3_9_0_TBD.md | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_9_0_TBD.md diff --git a/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_9_0_TBD.md b/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_9_0_TBD.md new file mode 100644 index 00000000000..6cded456f37 --- /dev/null +++ b/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_9_0_TBD.md @@ -0,0 +1,118 @@ +# OpenStudio Version 3.9.0 + +_Release Notes_ - _TDB_ + +These release notes describe version 3.9.0 of the OpenStudio SDK developed by the National Renewable Energy Laboratory (NREL), Buildings and Thermal Sciences Center, Commercial Buildings Research Group, Tools Development Section, and associated collaborators. The notes are organized into the following sections: + +- Overview +- Where to Find OpenStudio Documentation +- Installation Notes +- OpenStudio SDK: Changelog + +# Overview + +As of April 2020, development and distribution of the OpenStudioApplication and the SketchUp plugin have transitioned to the OpenStudio Coalition, who is independently managing and distributing the software through its own [openstudiocoalition/OpenStudioApplication](https://github.com/openstudiocoalition/OpenStudioApplication) repository. The OpenStudio SDK is continuing to be actively developed and distributed by NREL and is released two times per year, through a spring and a fall release. + +Below is the list of components that is included in this SDK installer: + +__**OpenStudio SDK 3.9.0**__ +- EnergyPlus +- Command Line Interface (CLI) +- Radiance +- Ruby API +- Python API +- C++ SDK + +**Note** that [PAT](https://github.com/NREL/OpenStudio-PAT) is not included in either the SDK or the OpenStudio Coalition's Application installers. You will need to install PAT separately which is distributed on the [OpenStudio-PAT](https://github.com/NREL/OpenStudio-PAT) GitHub page. + +# Where to Find OpenStudio SDK Documentation + +- OpenStudio SDK release documentation, including these release notes, tutorials, and other user documentation, is available at [https://www.openstudio.net/](https://www.openstudio.net/.) +- C++ API documentation is available at [OpenStudio SDK Documentation](https://openstudio-sdk-documentation.s3.amazonaws.com/index.html) +- Measure development documentation is available at [OpenStudio Measure Writer's Reference Guide](http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/ ) +- A roadmap for planned features is available at [Roadmap](http://nrel.github.io/OpenStudio-user-documentation/getting_started/roadmap/) + +# Installation Notes + +OpenStudio SDK 3.9.0 is supported on: + +* 64-bit Windows 7 – 11 +* macOS: 11.6+ x86_64, 12.1+ arm64 +* Ubuntu: 20.04 x86_64, 22.04 x86_64, 22.04 arm64 +* Centos7 + +OpenStudio SDK 3.9.0 supports [EnergyPlus Release 24.2.0a](https://github.com/NREL/EnergyPlus/releases/tag/24.2.0a), which is bundled with the OpenStudio installer. It is no longer necessary to download and install EnergyPlus separately. Other builds of EnergyPlus are not supported by OpenStudio SDK 3.9.0. + +OpenStudio SDK 3.9.0 supports Radiance 5.0.a.12, which is bundled with the OpenStudio installer; users no longer must install Radiance separately, and OpenStudio will use the included Radiance version regardless of any other versions that may be installed on the system. Other builds of Radiance are not supported by OpenStudio SDK 3.9.0. + +As usual, you can refer to the **[OpenStudio SDK Compatibility Matrix](https://github.com/NREL/OpenStudio/wiki/OpenStudio-SDK-Version-Compatibility-Matrix)** for more information. + + +## Installation Steps + +- Download and install [OpenStudio SDK](https://github.com/NREL/openstudio) and/or any third party tool that embeds the OpenStudio SDK into their software such as [openstudiocoalition/OpenStudioApplication](https://github.com/openstudiocoalition/OpenStudioApplication) depending on your needs. Select components for installation. Note that OpenStudio Application is a standalone app and does not require you to install OpenStudio SDK. +- A BCL AUth Key is no longer needed to access content on [Building Component Library (BCL)](https://bcl.nrel.gov) BCL is typically accessed through third party OpenStudio applications to provide modelers access to building components and OpenStudio measures; however you an also browse it and download content using the BCL link above. + +For help with common installation problems please visit [Getting Started](http://nrel.github.io/OpenStudio-user-documentation/getting_started/getting_started/). + +# OpenStudio SDK: Changelog + +The 3.9.0 is a **major** release. This update includes several new features, performance improvements, and bug fixes. + +## C++ Workflow code + +As of OpenStudio SDK 3.7.0 a re-written workflow written in C++ is used by default in place of the Ruby based Workflow Gem that had been used in the past. This enhancement is in support of Python measures being used in an OpenStudio workflow, including mixed language workflows that include both Ruby Measures and Python Measures. If you need to use the older Workflow Gem implementation, you can do that by using the `classic` subcommand after `openstudio`. `classic` will be deprecated in a future version of OpenStudio. + +## Python Bindings + +As of OpenStudio SDK 3.2.0, Python bindings are officially supported and distributed through Python Package Index (PyPI). To install, users will need to have Python3 installed along with pip and simply run the following command in a terminal window. + +`pip install openstudio==3.9.0` + +Please see [openstudio on PyPi](https://pypi.org/project/openstudio/) for further instructions on how to install. Users can also visit the test channel at [openstudio on TestPyPi](https://test.pypi.org/project/openstudio/) to install development bindings. + +You can also refer to the [OpenStudio SDK Python Binding Version Compatibility Matrix](https://github.com/NREL/OpenStudio/wiki/OpenStudio-SDK-Python-Binding-Version-Compatibility-Matrix) to see the list of supported platforms and python versions. + +## New Features, Major Fixes and API-breaking changes + +* [#5242](https://github.com/NREL/OpenStudio/pull/5242) - Update to EnergyPlus v24.2.0a + * To see the full list of additions and changes, refer to the issue [#5240](https://github.com/NREL/OpenStudio/issues/5240) + +* [#5237](https://github.com/NREL/OpenStudio/pull/5237) - Updates to Controller:OutdoorAir + * This PR implements the fields `Humidistat Control Zone Name` and `Electronic Enthalpy Limit Curve` + * `ControllerOutdoorAir` has two API-breaking changes for `High Humidity Outdoor Air Flow Ratio` and `Control High Indoor Humidity Based on Outdoor Humidity Ratio`. These fields are now-required, so the getters no longer return an optional + * `getHighHumidityOutdoorAirFlowRatio` (`boost::optional` to `double`) + * `getControlHighIndoorHumidityBasedOnOutdoorHumidityRatio` (`boost::optional` to `bool`) + +## Minor changes and bug fixes + +Refer to the changelog on the release page at [v3.9.0](https://github.com/NREL/OpenStudio/releases/v3.9.0) + +**Full Changelog**: https://github.com/NREL/OpenStudio/compare/v3.9.0...v3.9.0 + +**New Contributors**: + +### OpenStudio Standards v@STANDARDS_VERSION@ + +Update the openstudio-standards gem to version [@STANDARDS_VERSION@](https://github.com/NREL/openstudio-standards/releases/tag/v@STANDARDS_VERSION@) +In addition to some refactoring, this release also included conversion of 90.1 data to formal database. + + +### OpenStudio Server vXXX + + + + +--- +# This YAML header controls the pandoc (via TeX) to PDF settings +# To convert the markdown to pdf, do `pandoc release_notes.md -o release_notes.pdf` +title: 'OpenStudio Release Notes - 3.9.0' +author: +- National Renewable Energy Laboratory +colorlinks: true +linkcolor: blue +urlcolor: Mahogany +toccolor: gray +geometry: +- margin=1in +--- From 622a25869f9d14b07e29d7fbc1fe1ca94f22ffbf Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Wed, 9 Oct 2024 08:57:08 -0700 Subject: [PATCH 27/28] Clean up and fix ctor. --- src/model/ControllerOutdoorAir.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/model/ControllerOutdoorAir.cpp b/src/model/ControllerOutdoorAir.cpp index 05645c4ee84..21affb4dc7f 100644 --- a/src/model/ControllerOutdoorAir.cpp +++ b/src/model/ControllerOutdoorAir.cpp @@ -181,7 +181,6 @@ namespace model { bool ControllerOutdoorAir_Impl::setEconomizerControlType(const std::string& value) { return setString(openstudio::OS_Controller_OutdoorAirFields::EconomizerControlType, value); - ; } std::string ControllerOutdoorAir_Impl::getEconomizerControlActionType() const { @@ -190,7 +189,6 @@ namespace model { bool ControllerOutdoorAir_Impl::setEconomizerControlActionType(const std::string& value) { return setString(openstudio::OS_Controller_OutdoorAirFields::EconomizerControlActionType, value); - ; } //get needs to return a boost optional double since "" is a valid input @@ -260,7 +258,6 @@ namespace model { bool ControllerOutdoorAir_Impl::setLockoutType(const std::string& value) { return setString(openstudio::OS_Controller_OutdoorAirFields::LockoutType, value); - ; } std::string ControllerOutdoorAir_Impl::getMinimumLimitType() const { @@ -269,13 +266,10 @@ namespace model { bool ControllerOutdoorAir_Impl::setMinimumLimitType(const std::string& value) { return setString(openstudio::OS_Controller_OutdoorAirFields::MinimumLimitType, value); - ; } boost::optional ControllerOutdoorAir_Impl::getHighHumidityControl() const { - boost::optional value = getString(OS_Controller_OutdoorAirFields::HighHumidityControl, true); - OS_ASSERT(value); - return openstudio::istringEqual(value.get(), "Yes"); + return getBooleanFieldValue(OS_Controller_OutdoorAirFields::HighHumidityControl); } boost::optional ControllerOutdoorAir_Impl::humidistatControlZone() const { @@ -547,7 +541,6 @@ namespace model { setString(OS_Controller_OutdoorAirFields::HighHumidityControl, "No"); setHighHumidityOutdoorAirFlowRatio(1.0); setControlHighIndoorHumidityBasedOnOutdoorHumidityRatio(true); - setString(OS_Controller_OutdoorAirFields::ControlHighIndoorHumidityBasedonOutdoorHumidityRatio, ""); setHeatRecoveryBypassControlType("BypassWhenWithinEconomizerLimits"); setEconomizerOperationStaging("InterlockedWithMechanicalCooling"); From 330ad0c9fad565788e6068ee9f7a77151d0d25c6 Mon Sep 17 00:00:00 2001 From: Joe Robertson Date: Wed, 9 Oct 2024 09:18:29 -0700 Subject: [PATCH 28/28] Update and fix vt tests. --- src/osversion/test/VersionTranslator_GTest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osversion/test/VersionTranslator_GTest.cpp b/src/osversion/test/VersionTranslator_GTest.cpp index 4e0b89e35f2..41b14e429b0 100644 --- a/src/osversion/test/VersionTranslator_GTest.cpp +++ b/src/osversion/test/VersionTranslator_GTest.cpp @@ -3938,8 +3938,8 @@ TEST_F(OSVersionFixture, update_3_6_1_to_3_7_0_ControllerOutdoorAir) { EXPECT_TRUE(coa.isEmpty(21)); // Time of Day Economizer Control Schedule Name EXPECT_EQ("No", coa.getString(22).get()); // High Humidity Control EXPECT_TRUE(coa.isEmpty(23)); // Humidistat Control Zone Name - EXPECT_TRUE(coa.isEmpty(24)); // High Humidity Outdoor Air Flow Ratio - EXPECT_TRUE(coa.isEmpty(25)); // Control High Indoor Humidity Based on Outdoor Humidity Ratio + EXPECT_EQ(1.0, coa.getDouble(24).get()); // High Humidity Outdoor Air Flow Ratio + EXPECT_EQ("Yes", coa.getString(25).get()); // Control High Indoor Humidity Based on Outdoor Humidity Ratio EXPECT_EQ("BypassWhenWithinEconomizerLimits", coa.getString(26).get()); // Heat Recovery Bypass Control Type EXPECT_EQ("InterlockedWithMechanicalCooling", coa.getString(27).get()); // Economizer Operation Staging } @@ -4240,7 +4240,7 @@ TEST_F(OSVersionFixture, update_3_8_0_to_3_9_0_ControllerOutdoorAir) { EXPECT_TRUE(controller.isEmpty(17)); // Minimum Outdoor Air Schedule Name EXPECT_TRUE(controller.isEmpty(18)); // Minimum Fraction of Outdoor Air Schedule Name EXPECT_TRUE(controller.isEmpty(19)); // Maximum Fraction of Outdoor Air Schedule Name - ASSERT_TRUE(controller.getTarget(15)); // Controller Mechanical Ventilation + ASSERT_TRUE(controller.getTarget(20)); // Controller Mechanical Ventilation EXPECT_TRUE(controller.isEmpty(21)); // Time of Day Economizer Control Schedule Name EXPECT_EQ("No", controller.getString(22).get()); // High Humidity Control EXPECT_TRUE(controller.isEmpty(23)); // Humidistat Control Zone Name