From 55f6b4baff200e5e82203f165f7398b6e0d7b781 Mon Sep 17 00:00:00 2001 From: Noe Date: Mon, 17 Mar 2025 16:37:22 +0100 Subject: [PATCH] Update SodistoreMax code --- .../Backend/Websockets/WebsockerManager.cs | 8 +- csharp/App/SaliMax/SaliMax.csproj | 12 + .../src/AggregationService/Aggregator.cs | 248 +- .../src/AggregationService/HourlyData.cs | 42 +- csharp/App/SaliMax/src/LogFileConcatenator.cs | 4 +- csharp/App/SaliMax/src/Logger.cs | 4 +- csharp/App/SaliMax/src/Program.cs | 71 +- .../SaliMaxRelays/CombinedAdamRelaysRecord.cs | 211 + .../src/SaliMaxRelays/IRelaysRecord.cs | 78 + .../src/SaliMaxRelays/RelaysDeviceADAM6360.cs | 40 + .../src/SaliMaxRelays/RelaysDeviceAdam6060.cs | 38 + .../src/SaliMaxRelays/RelaysDeviceAmax.cs | 37 + .../src/SaliMaxRelays/RelaysRecordAdam6060.cs | 24 + .../SaliMaxRelays/RelaysRecordAdam6360D.cs | 81 + .../src/SaliMaxRelays/RelaysRecordAmax.cs | 134 + .../src/AggregationService/Aggregator.cs | 368 +- .../SodiStoreMax/src/LogFileConcatenator.cs | 4 +- csharp/App/SodiStoreMax/src/Logger.cs | 8 +- csharp/App/SodiStoreMax/src/Program.cs | 65 +- csharp/App_backup/Backend/Backend.csproj | 239 ++ csharp/App_backup/Backend/Backend.sln | 25 + csharp/App_backup/Backend/Controller.cs | 1015 +++++ .../Backend/DataTypes/Configuration.cs | 20 + csharp/App_backup/Backend/DataTypes/Error.cs | 24 + csharp/App_backup/Backend/DataTypes/Folder.cs | 3 + .../Backend/DataTypes/Installation.cs | 49 + .../Backend/DataTypes/Methods/ExoCmd.cs | 445 +++ .../Backend/DataTypes/Methods/Folder.cs | 100 + .../Backend/DataTypes/Methods/Installation.cs | 161 + .../Backend/DataTypes/Methods/Session.cs | 430 +++ .../Backend/DataTypes/Methods/TreeNode.cs | 48 + .../Backend/DataTypes/Methods/User.cs | 261 ++ .../Backend/DataTypes/TreeNode.Equality.cs | 23 + .../DataTypes/TreeNode.EqualityComparer.cs | 25 + .../App_backup/Backend/DataTypes/TreeNode.cs | 19 + csharp/App_backup/Backend/DataTypes/User.cs | 17 + .../Backend/DataTypes/UserAction.cs | 20 + .../Backend/DataTypes/WebsocketMessage.cs | 10 + csharp/App_backup/Backend/Database/Create.cs | 152 + csharp/App_backup/Backend/Database/Db.cs | 310 ++ csharp/App_backup/Backend/Database/Delete.cs | 144 + csharp/App_backup/Backend/Database/Read.cs | 59 + csharp/App_backup/Backend/Database/Update.cs | 60 + .../Backend/DbBackups/db-1701700887.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1701764858.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1701787282.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1701787283.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1701787284.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1701797550.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1701859479.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1702291326.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1702291327.sqlite | Bin 0 -> 122880 bytes .../Backend/DbBackups/db-1702291328.sqlite | Bin 0 -> 139264 bytes csharp/App_backup/Backend/Exceptions.cs | 16 + csharp/App_backup/Backend/MailerConfig.json | 8 + csharp/App_backup/Backend/Program.cs | 92 + .../Backend/Properties/launchSettings.json | 17 + .../Backend/Relations/FolderAccess.cs | 9 + .../Backend/Relations/InstallationAccess.cs | 9 + .../Relations/OrderNumber2Installation.cs | 10 + .../App_backup/Backend/Relations/Relation.cs | 34 + .../App_backup/Backend/Relations/Session.cs | 57 + csharp/App_backup/Backend/Resources/CORS | 9 + csharp/App_backup/Backend/Resources/deploy.sh | 4 + .../Backend/Resources/exoscaleS3.json | 4 + .../Backend/Resources/s3AdminKey.json | 4 + .../Backend/Resources/s3ReadOnlyKey.json | 4 + .../Backend/Resources/s3ReadWriteKey.json | 4 + csharp/App_backup/Backend/Resources/s3cmd.py | 3380 +++++++++++++++++ .../Backend/Resources/smtpConfig.json | 6 + .../Backend/Resources/urlAndKey.json | 6 + .../Backend/Websockets/AlarmOrWarning.cs | 11 + .../Backend/Websockets/InstallationInfo.cs | 10 + .../Backend/Websockets/RabbitMQManager.cs | 179 + .../Backend/Websockets/StatusMessage.cs | 19 + .../Backend/Websockets/WebsockerManager.cs | 238 ++ .../App_backup/Backend/db-1733849565.sqlite | Bin 0 -> 4579328 bytes csharp/App_backup/Backend/deploy.sh | 5 + csharp/App_backup/Backend/deploy_stage.sh | 1 + csharp/App_backup/BmsTunnel/BatteryTty.cs | 95 + csharp/App_backup/BmsTunnel/BmsTunnel.cs | 191 + csharp/App_backup/BmsTunnel/BmsTunnel.csproj | 18 + csharp/App_backup/BmsTunnel/CliPrograms.cs | 11 + csharp/App_backup/BmsTunnel/Program.cs | 85 + csharp/App_backup/BmsTunnel/debug.sh | 21 + csharp/App_backup/BmsTunnel/parameters.txt | 0 csharp/App_backup/Collector/Collector.csproj | 19 + .../Collector/src/BatteryDataParser.cs | 343 ++ .../Collector/src/BatteryDataParserV4.cs | 365 ++ .../Collector/src/Influx/FieldAttribute.cs | 21 + .../Collector/src/Influx/InfluxRecord.cs | 92 + .../src/Influx/LineProtocolSyntax.cs | 76 + .../Collector/src/Influx/TagAttribute.cs | 8 + csharp/App_backup/Collector/src/Program.cs | 173 + .../Collector/src/Records/Alarms.cs | 43 + .../Collector/src/Records/BatteryRecord.cs | 4 + .../Collector/src/Records/BatteryStatus.cs | 32 + .../Collector/src/Records/IoStatus.cs | 18 + .../App_backup/Collector/src/Records/Leds.cs | 26 + .../Collector/src/Records/Temperatures.cs | 21 + .../Collector/src/Records/Warnings.cs | 30 + csharp/App_backup/Collector/src/Settings.cs | 13 + .../Collector/src/Utils/Extensions.cs | 44 + csharp/App_backup/Collector/src/Utils/Log.cs | 39 + .../Collector/src/Utils/Property.cs | 49 + .../src/Utils/ReadOnlyListExtensions.cs | 45 + .../App_backup/Collector/src/Utils/Utils.cs | 19 + .../DeligreenBatteryCommunication.csproj | 22 + .../DeviceState.cs | 8 + .../DeligreenBatteryCommunication/Program.cs | 124 + .../RelaysDeviceAmax.cs | 38 + .../RelaysRecordAmax.cs | 98 + .../SalimaxDevice.cs | 13 + .../DeligreenBatteryCommunication/deploy.sh | 22 + csharp/App_backup/EmuMeterDriver/Config.cs | 65 + .../EmuMeterDriver/EmuMeterDriver.cs | 66 + .../EmuMeterDriver/EmuMeterDriver.csproj | 24 + csharp/App_backup/EmuMeterDriver/Nic.cs | 149 + csharp/App_backup/EmuMeterDriver/Program.cs | 60 + csharp/App_backup/EmuMeterDriver/Signal.cs | 16 + csharp/App_backup/EmuMeterDriver/Utils.cs | 49 + csharp/App_backup/EmuMeterDriver/debug.sh | 20 + csharp/App_backup/EmuMeterDriver/deploy.sh | 61 + .../App_backup/EmuMeterDriver/service/log/run | 3 + csharp/App_backup/EmuMeterDriver/service/run | 3 + csharp/App_backup/InnovEnergy.App.props | 25 + .../OpenVpnCertificatesServer/AccToken.cs | 17 + .../OpenVpnCertificatesServer/Files.cs | 35 + .../OpenVpnCertificatesServer/Http.cs | 48 + .../OpenVpnCertificatesServer.csproj | 26 + .../PKI/CertificateAuthority.cs | 141 + .../OpenVpnCertificatesServer/PKI/Pem.cs | 53 + .../PKI/PwdFinder.cs | 15 + .../OpenVpnCertificatesServer/Program.cs | 287 ++ .../OpenVpnCertificatesServer/Utils.cs | 38 + .../OpenVpnCertificatesServer/newToken.sh | 32 + .../OpenVpnCertificatesServer/token.json | 1 + .../App_backup/RemoteSupportConsole/Login.cs | 7 + .../ObservablePipeSource.cs | 20 + .../RemoteSupportConsole/Program.cs | 162 + .../RemoteSupportConsole.csproj | 21 + .../RemoteSupportConsole.csproj.DotSettings | 2 + csharp/App_backup/RemoteSupportConsole/Ssh.cs | 46 + .../RemoteSupportConsole/VpnConnection.cs | 25 + .../RemoteSupportConsole/VpnInfo.cs | 36 + .../RemoteSupportConsole/VrmConnection.cs | 128 + .../RemoteSupportConsole/VrmInfo.cs | 45 + .../RemoteSupportConsole/VrmProxy.cs | 6 + csharp/App_backup/ResetBms/ResetBms.csproj | 14 + csharp/App_backup/S3Explorer/Program.cs | 156 + .../App_backup/S3Explorer/S3Explorer.csproj | 20 + csharp/App_backup/S3Explorer/SnakeGameSS.cs | 283 ++ .../App_backup/SaliMax/Doc/AllStates.graphml | 934 +++++ .../SaliMax/Doc/SalimaxConfigReadme.txt | 110 + .../App_backup/SaliMax/Doc/States_Table.xlsx | Bin 0 -> 13885 bytes .../SaliMax/Doc/TransitionToGridTied.graphml | 501 +++ .../SaliMax/Doc/TransitionToIsland.graphml | 487 +++ csharp/App_backup/SaliMax/HostList.txt | 14 + csharp/App_backup/SaliMax/SaliMax.csproj | 44 + csharp/App_backup/SaliMax/deploy.sh | 73 + .../SaliMax/deploy_all_installations.sh | 37 + .../downloadBatteryLogs/download-bms-log | 284 ++ .../download_battery_logs.sh | 70 + .../SaliMax/resources/Battery.Service | 12 + csharp/App_backup/SaliMax/resources/PublicKey | 1 + .../SaliMax/resources/Salimax.Service | 13 + .../src/AggregationService/Aggregator.cs | 355 ++ .../src/AggregationService/HourlyData.cs | 118 + .../SaliMax/src/DataTypes/AlarmOrWarning.cs | 9 + .../SaliMax/src/DataTypes/Configuration.cs | 12 + .../SaliMax/src/DataTypes/StatusMessage.cs | 20 + .../SaliMax/src/Devices/AcPowerDevice.cs | 8 + .../SaliMax/src/Devices/DcPowerDevice.cs | 8 + .../SaliMax/src/Devices/DeviceState.cs | 8 + .../SaliMax/src/Devices/SalimaxDevice.cs | 8 + .../App_backup/SaliMax/src/Ess/Controller.cs | 318 ++ .../App_backup/SaliMax/src/Ess/EssControl.cs | 53 + csharp/App_backup/SaliMax/src/Ess/EssLimit.cs | 20 + csharp/App_backup/SaliMax/src/Ess/EssMode.cs | 12 + .../SaliMax/src/Ess/SalimaxAlarmState.cs | 8 + .../SaliMax/src/Ess/StatusRecord.cs | 55 + .../App_backup/SaliMax/src/Ess/SystemLog.cs | 11 + csharp/App_backup/SaliMax/src/Flow.cs | 56 + .../SaliMax/src/LogFileConcatenator.cs | 34 + csharp/App_backup/SaliMax/src/Logfile.cs | 49 + csharp/App_backup/SaliMax/src/Logger.cs | 39 + .../src/MiddlewareClasses/MiddlewareAgent.cs | 93 + .../src/MiddlewareClasses/RabbitMQManager.cs | 61 + csharp/App_backup/SaliMax/src/Program.cs | 1020 +++++ csharp/App_backup/SaliMax/src/S3Config.cs | 79 + .../SaliMaxRelays/CombinedAdamRelaysRecord.cs | 422 ++ .../src/SaliMaxRelays/IRelaysRecord.cs | 156 + .../src/SaliMaxRelays/RelaysDeviceADAM6360.cs | 78 + .../src/SaliMaxRelays/RelaysDeviceAdam6060.cs | 76 + .../src/SaliMaxRelays/RelaysDeviceAmax.cs | 75 + .../src/SaliMaxRelays/RelaysRecordAdam6060.cs | 48 + .../SaliMaxRelays/RelaysRecordAdam6360D.cs | 160 + .../src/SaliMaxRelays/RelaysRecordAmax.cs | 268 ++ csharp/App_backup/SaliMax/src/Switch.cs | 15 + .../SaliMax/src/System/Controller.cs | 726 ++++ .../SaliMax/src/System/StateMachine.cs | 9 + .../SaliMax/src/SystemConfig/AcDcConfig.cs | 8 + .../src/SystemConfig/CalibrationChargeType.cs | 8 + .../SaliMax/src/SystemConfig/Config.cs | 279 ++ .../SaliMax/src/SystemConfig/DcDcConfig.cs | 15 + .../SaliMax/src/SystemConfig/DeviceConfig.cs | 21 + .../SaliMax/src/SystemConfig/DevicesConfig.cs | 7 + csharp/App_backup/SaliMax/src/Topology.cs | 534 +++ .../App_backup/SaliMax/tunnelstoSalimaxX.sh | 44 + .../SaliMax/uploadBatteryFw/AF0A.bin | Bin 0 -> 589824 bytes .../uploadBatteryFw/update_firmware.sh | 29 + .../uploadBatteryFw/upload-bms-firmware | 288 ++ .../App_backup/SchneiderMeterDriver/Config.cs | 66 + csharp/App_backup/SchneiderMeterDriver/Nic.cs | 149 + .../SchneiderMeterDriver/Program.cs | 79 + .../SchneiderMeterDriver.cs | 91 + .../SchneiderMeterDriver.csproj | 26 + .../App_backup/SchneiderMeterDriver/Signal.cs | 42 + .../App_backup/SchneiderMeterDriver/Utils.cs | 49 + .../App_backup/SchneiderMeterDriver/debug.sh | 26 + .../App_backup/SchneiderMeterDriver/deploy.sh | 61 + .../SodiStoreMax/Doc/AllStates.graphml | 934 +++++ .../SodiStoreMax/Doc/SalimaxConfigReadme.txt | 110 + .../SodiStoreMax/Doc/States_Table.xlsx | Bin 0 -> 13885 bytes .../Doc/TransitionToGridTied.graphml | 501 +++ .../Doc/TransitionToIsland.graphml | 487 +++ csharp/App_backup/SodiStoreMax/HostList.txt | 14 + .../SodiStoreMax/SodiStoreMax.csproj | 32 + csharp/App_backup/SodiStoreMax/deploy.sh | 21 + .../SodiStoreMax/deploy_all_installations.sh | 37 + .../downloadBatteryLogs/download-bms-log | 284 ++ .../download_battery_logs.sh | 70 + .../SodiStoreMax/resources/Battery.Service | 12 + .../SodiStoreMax/resources/PublicKey | 1 + .../SodiStoreMax/resources/Salimax.Service | 13 + .../src/AggregationService/Aggregator.cs | 356 ++ .../src/AggregationService/HourlyData.cs | 118 + .../src/DataTypes/AlarmOrWarning.cs | 9 + .../src/DataTypes/Configuration.cs | 12 + .../src/DataTypes/StatusMessage.cs | 20 + .../SodiStoreMax/src/Devices/AcPowerDevice.cs | 8 + .../SodiStoreMax/src/Devices/DcPowerDevice.cs | 8 + .../SodiStoreMax/src/Devices/DeviceState.cs | 8 + .../SodiStoreMax/src/Devices/SalimaxDevice.cs | 8 + .../SodiStoreMax/src/Ess/Controller.cs | 269 ++ .../SodiStoreMax/src/Ess/EssControl.cs | 53 + .../SodiStoreMax/src/Ess/EssLimit.cs | 20 + .../SodiStoreMax/src/Ess/EssMode.cs | 12 + .../SodiStoreMax/src/Ess/SalimaxAlarmState.cs | 8 + .../SodiStoreMax/src/Ess/StatusRecord.cs | 33 + .../SodiStoreMax/src/Ess/SystemLog.cs | 11 + csharp/App_backup/SodiStoreMax/src/Flow.cs | 56 + .../SodiStoreMax/src/LogFileConcatenator.cs | 34 + csharp/App_backup/SodiStoreMax/src/Logfile.cs | 49 + csharp/App_backup/SodiStoreMax/src/Logger.cs | 40 + .../src/MiddlewareClasses/MiddlewareAgent.cs | 93 + .../src/MiddlewareClasses/RabbitMQManager.cs | 61 + csharp/App_backup/SodiStoreMax/src/Program.cs | 945 +++++ .../App_backup/SodiStoreMax/src/S3Config.cs | 79 + .../src/SaliMaxRelays/RelaysDevice.cs | 72 + .../src/SaliMaxRelays/RelaysRecord.cs | 83 + csharp/App_backup/SodiStoreMax/src/Switch.cs | 15 + .../SodiStoreMax/src/System/Controller.cs | 727 ++++ .../SodiStoreMax/src/System/StateMachine.cs | 9 + .../src/SystemConfig/AcDcConfig.cs | 8 + .../src/SystemConfig/CalibrationChargeType.cs | 8 + .../SodiStoreMax/src/SystemConfig/Config.cs | 272 ++ .../src/SystemConfig/DcDcConfig.cs | 15 + .../src/SystemConfig/DeviceConfig.cs | 21 + .../src/SystemConfig/DevicesConfig.cs | 7 + .../App_backup/SodiStoreMax/src/Topology.cs | 530 +++ .../SodiStoreMax/tunnelstoSalimaxX.sh | 44 + .../SodiStoreMax/uploadBatteryFw/AF0A.bin | Bin 0 -> 589824 bytes .../uploadBatteryFw/update_firmware.sh | 29 + .../uploadBatteryFw/upload-bms-firmware | 288 ++ csharp/App_backup/VrmGrabber/Controller.cs | 260 ++ .../App_backup/VrmGrabber/Controller_test.cs | 311 ++ .../VrmGrabber/DataTypes/Installation.cs | 43 + .../DataTypes/Methods/Installation.cs | 7 + .../VrmGrabber/DataTypes/TreeNode.cs | 11 + .../App_backup/VrmGrabber/Database/Create.cs | 13 + csharp/App_backup/VrmGrabber/Database/Db.cs | 299 ++ .../App_backup/VrmGrabber/Database/Delete.cs | 17 + csharp/App_backup/VrmGrabber/Database/Read.cs | 14 + .../App_backup/VrmGrabber/Database/Update.cs | 13 + csharp/App_backup/VrmGrabber/Program.cs | 36 + csharp/App_backup/VrmGrabber/ShuffleClass.cs | 17 + .../App_backup/VrmGrabber/VrmGrabber.csproj | 50 + csharp/App_backup/VrmGrabber/VrmGrabber.sln | 25 + csharp/App_backup/VrmGrabber/alarm.json | 10 + .../VrmGrabber/bms-firmware/AF09.bin | Bin 0 -> 589824 bytes csharp/App_backup/VrmGrabber/db.sqlite | Bin 0 -> 962560 bytes csharp/App_backup/VrmGrabber/server.py | 14 + csharp/App_backup/VrmGrabber/token.json | 1 + firmware/2025-02-24.json | 1 + firmware/2025-02-25.json | 1 + .../dbus-fzsonick-48tl/aggregator.py | 6 +- .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 36 +- .../dbus-fzsonick-48tl/aggregator.py | 6 +- .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 10 +- firmware/update_all_installations.sh | 514 ++- typescript/frontend-marios2/deploy.sh | 4 +- .../dashboards/BatteryView/BatteryView.tsx | 139 +- .../BatteryView/BatteryViewSalidomo.tsx | 40 +- .../BatteryView/DetailedBatteryView.tsx | 171 +- .../DetailedBatteryViewSalidomo.tsx | 107 +- .../dashboards/BatteryView/MainStats.tsx | 8 +- .../Configuration/Configuration.tsx | 61 +- .../dashboards/Installations/Installation.tsx | 54 +- .../dashboards/Installations/fetchData.tsx | 212 +- .../src/content/dashboards/Log/graph.util.tsx | 1248 +++--- .../content/dashboards/Overview/overview.tsx | 28 +- .../src/content/dashboards/PvView/PvView.tsx | 55 +- .../SalidomoInstallations/Installation.tsx | 4 +- .../SodiohomeInstallations/Installation.tsx | 4 +- .../content/dashboards/Topology/Topology.tsx | 335 +- .../dashboards/Topology/topologyBox.tsx | 15 +- .../dashboards/Topology/topologyFlow.tsx | 22 +- .../frontend-marios2/src/interfaces/Chart.tsx | 1558 ++++---- 319 files changed, 33208 insertions(+), 2118 deletions(-) create mode 100644 csharp/App_backup/Backend/Backend.csproj create mode 100644 csharp/App_backup/Backend/Backend.sln create mode 100644 csharp/App_backup/Backend/Controller.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Configuration.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Error.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Folder.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Installation.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Methods/ExoCmd.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Methods/Folder.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Methods/Installation.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Methods/Session.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Methods/TreeNode.cs create mode 100644 csharp/App_backup/Backend/DataTypes/Methods/User.cs create mode 100644 csharp/App_backup/Backend/DataTypes/TreeNode.Equality.cs create mode 100644 csharp/App_backup/Backend/DataTypes/TreeNode.EqualityComparer.cs create mode 100644 csharp/App_backup/Backend/DataTypes/TreeNode.cs create mode 100644 csharp/App_backup/Backend/DataTypes/User.cs create mode 100644 csharp/App_backup/Backend/DataTypes/UserAction.cs create mode 100644 csharp/App_backup/Backend/DataTypes/WebsocketMessage.cs create mode 100644 csharp/App_backup/Backend/Database/Create.cs create mode 100644 csharp/App_backup/Backend/Database/Db.cs create mode 100644 csharp/App_backup/Backend/Database/Delete.cs create mode 100644 csharp/App_backup/Backend/Database/Read.cs create mode 100644 csharp/App_backup/Backend/Database/Update.cs create mode 100644 csharp/App_backup/Backend/DbBackups/db-1701700887.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1701764858.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1701787282.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1701787283.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1701787284.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1701797550.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1701859479.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1702291326.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1702291327.sqlite create mode 100644 csharp/App_backup/Backend/DbBackups/db-1702291328.sqlite create mode 100644 csharp/App_backup/Backend/Exceptions.cs create mode 100644 csharp/App_backup/Backend/MailerConfig.json create mode 100644 csharp/App_backup/Backend/Program.cs create mode 100644 csharp/App_backup/Backend/Properties/launchSettings.json create mode 100644 csharp/App_backup/Backend/Relations/FolderAccess.cs create mode 100644 csharp/App_backup/Backend/Relations/InstallationAccess.cs create mode 100644 csharp/App_backup/Backend/Relations/OrderNumber2Installation.cs create mode 100644 csharp/App_backup/Backend/Relations/Relation.cs create mode 100644 csharp/App_backup/Backend/Relations/Session.cs create mode 100644 csharp/App_backup/Backend/Resources/CORS create mode 100644 csharp/App_backup/Backend/Resources/deploy.sh create mode 100644 csharp/App_backup/Backend/Resources/exoscaleS3.json create mode 100644 csharp/App_backup/Backend/Resources/s3AdminKey.json create mode 100644 csharp/App_backup/Backend/Resources/s3ReadOnlyKey.json create mode 100644 csharp/App_backup/Backend/Resources/s3ReadWriteKey.json create mode 100755 csharp/App_backup/Backend/Resources/s3cmd.py create mode 100644 csharp/App_backup/Backend/Resources/smtpConfig.json create mode 100644 csharp/App_backup/Backend/Resources/urlAndKey.json create mode 100644 csharp/App_backup/Backend/Websockets/AlarmOrWarning.cs create mode 100644 csharp/App_backup/Backend/Websockets/InstallationInfo.cs create mode 100644 csharp/App_backup/Backend/Websockets/RabbitMQManager.cs create mode 100644 csharp/App_backup/Backend/Websockets/StatusMessage.cs create mode 100644 csharp/App_backup/Backend/Websockets/WebsockerManager.cs create mode 100644 csharp/App_backup/Backend/db-1733849565.sqlite create mode 100755 csharp/App_backup/Backend/deploy.sh create mode 100755 csharp/App_backup/Backend/deploy_stage.sh create mode 100644 csharp/App_backup/BmsTunnel/BatteryTty.cs create mode 100644 csharp/App_backup/BmsTunnel/BmsTunnel.cs create mode 100644 csharp/App_backup/BmsTunnel/BmsTunnel.csproj create mode 100644 csharp/App_backup/BmsTunnel/CliPrograms.cs create mode 100644 csharp/App_backup/BmsTunnel/Program.cs create mode 100644 csharp/App_backup/BmsTunnel/debug.sh create mode 100644 csharp/App_backup/BmsTunnel/parameters.txt create mode 100644 csharp/App_backup/Collector/Collector.csproj create mode 100644 csharp/App_backup/Collector/src/BatteryDataParser.cs create mode 100644 csharp/App_backup/Collector/src/BatteryDataParserV4.cs create mode 100644 csharp/App_backup/Collector/src/Influx/FieldAttribute.cs create mode 100644 csharp/App_backup/Collector/src/Influx/InfluxRecord.cs create mode 100644 csharp/App_backup/Collector/src/Influx/LineProtocolSyntax.cs create mode 100644 csharp/App_backup/Collector/src/Influx/TagAttribute.cs create mode 100644 csharp/App_backup/Collector/src/Program.cs create mode 100644 csharp/App_backup/Collector/src/Records/Alarms.cs create mode 100644 csharp/App_backup/Collector/src/Records/BatteryRecord.cs create mode 100644 csharp/App_backup/Collector/src/Records/BatteryStatus.cs create mode 100644 csharp/App_backup/Collector/src/Records/IoStatus.cs create mode 100644 csharp/App_backup/Collector/src/Records/Leds.cs create mode 100644 csharp/App_backup/Collector/src/Records/Temperatures.cs create mode 100644 csharp/App_backup/Collector/src/Records/Warnings.cs create mode 100644 csharp/App_backup/Collector/src/Settings.cs create mode 100644 csharp/App_backup/Collector/src/Utils/Extensions.cs create mode 100644 csharp/App_backup/Collector/src/Utils/Log.cs create mode 100644 csharp/App_backup/Collector/src/Utils/Property.cs create mode 100644 csharp/App_backup/Collector/src/Utils/ReadOnlyListExtensions.cs create mode 100644 csharp/App_backup/Collector/src/Utils/Utils.cs create mode 100644 csharp/App_backup/DeligreenBatteryCommunication/DeligreenBatteryCommunication.csproj create mode 100644 csharp/App_backup/DeligreenBatteryCommunication/DeviceState.cs create mode 100644 csharp/App_backup/DeligreenBatteryCommunication/Program.cs create mode 100644 csharp/App_backup/DeligreenBatteryCommunication/RelaysDeviceAmax.cs create mode 100644 csharp/App_backup/DeligreenBatteryCommunication/RelaysRecordAmax.cs create mode 100644 csharp/App_backup/DeligreenBatteryCommunication/SalimaxDevice.cs create mode 100755 csharp/App_backup/DeligreenBatteryCommunication/deploy.sh create mode 100644 csharp/App_backup/EmuMeterDriver/Config.cs create mode 100644 csharp/App_backup/EmuMeterDriver/EmuMeterDriver.cs create mode 100644 csharp/App_backup/EmuMeterDriver/EmuMeterDriver.csproj create mode 100644 csharp/App_backup/EmuMeterDriver/Nic.cs create mode 100644 csharp/App_backup/EmuMeterDriver/Program.cs create mode 100644 csharp/App_backup/EmuMeterDriver/Signal.cs create mode 100644 csharp/App_backup/EmuMeterDriver/Utils.cs create mode 100644 csharp/App_backup/EmuMeterDriver/debug.sh create mode 100644 csharp/App_backup/EmuMeterDriver/deploy.sh create mode 100755 csharp/App_backup/EmuMeterDriver/service/log/run create mode 100755 csharp/App_backup/EmuMeterDriver/service/run create mode 100644 csharp/App_backup/InnovEnergy.App.props create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/AccToken.cs create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/Files.cs create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/Http.cs create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/PKI/Pem.cs create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/PKI/PwdFinder.cs create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/Program.cs create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/Utils.cs create mode 100755 csharp/App_backup/OpenVpnCertificatesServer/newToken.sh create mode 100644 csharp/App_backup/OpenVpnCertificatesServer/token.json create mode 100644 csharp/App_backup/RemoteSupportConsole/Login.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/ObservablePipeSource.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/Program.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj create mode 100644 csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings create mode 100644 csharp/App_backup/RemoteSupportConsole/Ssh.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/VpnConnection.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/VpnInfo.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/VrmConnection.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/VrmInfo.cs create mode 100644 csharp/App_backup/RemoteSupportConsole/VrmProxy.cs create mode 100644 csharp/App_backup/ResetBms/ResetBms.csproj create mode 100644 csharp/App_backup/S3Explorer/Program.cs create mode 100644 csharp/App_backup/S3Explorer/S3Explorer.csproj create mode 100644 csharp/App_backup/S3Explorer/SnakeGameSS.cs create mode 100644 csharp/App_backup/SaliMax/Doc/AllStates.graphml create mode 100644 csharp/App_backup/SaliMax/Doc/SalimaxConfigReadme.txt create mode 100644 csharp/App_backup/SaliMax/Doc/States_Table.xlsx create mode 100644 csharp/App_backup/SaliMax/Doc/TransitionToGridTied.graphml create mode 100644 csharp/App_backup/SaliMax/Doc/TransitionToIsland.graphml create mode 100755 csharp/App_backup/SaliMax/HostList.txt create mode 100644 csharp/App_backup/SaliMax/SaliMax.csproj create mode 100755 csharp/App_backup/SaliMax/deploy.sh create mode 100755 csharp/App_backup/SaliMax/deploy_all_installations.sh create mode 100644 csharp/App_backup/SaliMax/downloadBatteryLogs/download-bms-log create mode 100755 csharp/App_backup/SaliMax/downloadBatteryLogs/download_battery_logs.sh create mode 100644 csharp/App_backup/SaliMax/resources/Battery.Service create mode 100644 csharp/App_backup/SaliMax/resources/PublicKey create mode 100644 csharp/App_backup/SaliMax/resources/Salimax.Service create mode 100644 csharp/App_backup/SaliMax/src/AggregationService/Aggregator.cs create mode 100644 csharp/App_backup/SaliMax/src/AggregationService/HourlyData.cs create mode 100644 csharp/App_backup/SaliMax/src/DataTypes/AlarmOrWarning.cs create mode 100644 csharp/App_backup/SaliMax/src/DataTypes/Configuration.cs create mode 100644 csharp/App_backup/SaliMax/src/DataTypes/StatusMessage.cs create mode 100644 csharp/App_backup/SaliMax/src/Devices/AcPowerDevice.cs create mode 100644 csharp/App_backup/SaliMax/src/Devices/DcPowerDevice.cs create mode 100644 csharp/App_backup/SaliMax/src/Devices/DeviceState.cs create mode 100644 csharp/App_backup/SaliMax/src/Devices/SalimaxDevice.cs create mode 100644 csharp/App_backup/SaliMax/src/Ess/Controller.cs create mode 100644 csharp/App_backup/SaliMax/src/Ess/EssControl.cs create mode 100644 csharp/App_backup/SaliMax/src/Ess/EssLimit.cs create mode 100644 csharp/App_backup/SaliMax/src/Ess/EssMode.cs create mode 100644 csharp/App_backup/SaliMax/src/Ess/SalimaxAlarmState.cs create mode 100644 csharp/App_backup/SaliMax/src/Ess/StatusRecord.cs create mode 100644 csharp/App_backup/SaliMax/src/Ess/SystemLog.cs create mode 100644 csharp/App_backup/SaliMax/src/Flow.cs create mode 100644 csharp/App_backup/SaliMax/src/LogFileConcatenator.cs create mode 100644 csharp/App_backup/SaliMax/src/Logfile.cs create mode 100644 csharp/App_backup/SaliMax/src/Logger.cs create mode 100644 csharp/App_backup/SaliMax/src/MiddlewareClasses/MiddlewareAgent.cs create mode 100644 csharp/App_backup/SaliMax/src/MiddlewareClasses/RabbitMQManager.cs create mode 100644 csharp/App_backup/SaliMax/src/Program.cs create mode 100644 csharp/App_backup/SaliMax/src/S3Config.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs create mode 100644 csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs create mode 100644 csharp/App_backup/SaliMax/src/Switch.cs create mode 100644 csharp/App_backup/SaliMax/src/System/Controller.cs create mode 100644 csharp/App_backup/SaliMax/src/System/StateMachine.cs create mode 100644 csharp/App_backup/SaliMax/src/SystemConfig/AcDcConfig.cs create mode 100644 csharp/App_backup/SaliMax/src/SystemConfig/CalibrationChargeType.cs create mode 100644 csharp/App_backup/SaliMax/src/SystemConfig/Config.cs create mode 100644 csharp/App_backup/SaliMax/src/SystemConfig/DcDcConfig.cs create mode 100644 csharp/App_backup/SaliMax/src/SystemConfig/DeviceConfig.cs create mode 100644 csharp/App_backup/SaliMax/src/SystemConfig/DevicesConfig.cs create mode 100644 csharp/App_backup/SaliMax/src/Topology.cs create mode 100755 csharp/App_backup/SaliMax/tunnelstoSalimaxX.sh create mode 100644 csharp/App_backup/SaliMax/uploadBatteryFw/AF0A.bin create mode 100755 csharp/App_backup/SaliMax/uploadBatteryFw/update_firmware.sh create mode 100755 csharp/App_backup/SaliMax/uploadBatteryFw/upload-bms-firmware create mode 100644 csharp/App_backup/SchneiderMeterDriver/Config.cs create mode 100644 csharp/App_backup/SchneiderMeterDriver/Nic.cs create mode 100644 csharp/App_backup/SchneiderMeterDriver/Program.cs create mode 100644 csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.cs create mode 100644 csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.csproj create mode 100644 csharp/App_backup/SchneiderMeterDriver/Signal.cs create mode 100644 csharp/App_backup/SchneiderMeterDriver/Utils.cs create mode 100755 csharp/App_backup/SchneiderMeterDriver/debug.sh create mode 100755 csharp/App_backup/SchneiderMeterDriver/deploy.sh create mode 100644 csharp/App_backup/SodiStoreMax/Doc/AllStates.graphml create mode 100644 csharp/App_backup/SodiStoreMax/Doc/SalimaxConfigReadme.txt create mode 100644 csharp/App_backup/SodiStoreMax/Doc/States_Table.xlsx create mode 100644 csharp/App_backup/SodiStoreMax/Doc/TransitionToGridTied.graphml create mode 100644 csharp/App_backup/SodiStoreMax/Doc/TransitionToIsland.graphml create mode 100755 csharp/App_backup/SodiStoreMax/HostList.txt create mode 100644 csharp/App_backup/SodiStoreMax/SodiStoreMax.csproj create mode 100755 csharp/App_backup/SodiStoreMax/deploy.sh create mode 100755 csharp/App_backup/SodiStoreMax/deploy_all_installations.sh create mode 100644 csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download-bms-log create mode 100755 csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download_battery_logs.sh create mode 100644 csharp/App_backup/SodiStoreMax/resources/Battery.Service create mode 100644 csharp/App_backup/SodiStoreMax/resources/PublicKey create mode 100644 csharp/App_backup/SodiStoreMax/resources/Salimax.Service create mode 100644 csharp/App_backup/SodiStoreMax/src/AggregationService/Aggregator.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/AggregationService/HourlyData.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/DataTypes/AlarmOrWarning.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/DataTypes/Configuration.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/DataTypes/StatusMessage.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Devices/AcPowerDevice.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Devices/DcPowerDevice.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Devices/DeviceState.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Devices/SalimaxDevice.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Ess/Controller.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Ess/EssControl.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Ess/EssLimit.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Ess/EssMode.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Ess/SalimaxAlarmState.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Ess/StatusRecord.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Ess/SystemLog.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Flow.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/LogFileConcatenator.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Logfile.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Logger.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/MiddlewareAgent.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/RabbitMQManager.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Program.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/S3Config.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysDevice.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysRecord.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Switch.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/System/Controller.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/System/StateMachine.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SystemConfig/AcDcConfig.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SystemConfig/CalibrationChargeType.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SystemConfig/Config.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SystemConfig/DcDcConfig.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SystemConfig/DeviceConfig.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/SystemConfig/DevicesConfig.cs create mode 100644 csharp/App_backup/SodiStoreMax/src/Topology.cs create mode 100755 csharp/App_backup/SodiStoreMax/tunnelstoSalimaxX.sh create mode 100644 csharp/App_backup/SodiStoreMax/uploadBatteryFw/AF0A.bin create mode 100755 csharp/App_backup/SodiStoreMax/uploadBatteryFw/update_firmware.sh create mode 100755 csharp/App_backup/SodiStoreMax/uploadBatteryFw/upload-bms-firmware create mode 100644 csharp/App_backup/VrmGrabber/Controller.cs create mode 100644 csharp/App_backup/VrmGrabber/Controller_test.cs create mode 100644 csharp/App_backup/VrmGrabber/DataTypes/Installation.cs create mode 100644 csharp/App_backup/VrmGrabber/DataTypes/Methods/Installation.cs create mode 100644 csharp/App_backup/VrmGrabber/DataTypes/TreeNode.cs create mode 100644 csharp/App_backup/VrmGrabber/Database/Create.cs create mode 100644 csharp/App_backup/VrmGrabber/Database/Db.cs create mode 100644 csharp/App_backup/VrmGrabber/Database/Delete.cs create mode 100644 csharp/App_backup/VrmGrabber/Database/Read.cs create mode 100644 csharp/App_backup/VrmGrabber/Database/Update.cs create mode 100644 csharp/App_backup/VrmGrabber/Program.cs create mode 100644 csharp/App_backup/VrmGrabber/ShuffleClass.cs create mode 100644 csharp/App_backup/VrmGrabber/VrmGrabber.csproj create mode 100644 csharp/App_backup/VrmGrabber/VrmGrabber.sln create mode 100644 csharp/App_backup/VrmGrabber/alarm.json create mode 100644 csharp/App_backup/VrmGrabber/bms-firmware/AF09.bin create mode 100644 csharp/App_backup/VrmGrabber/db.sqlite create mode 100644 csharp/App_backup/VrmGrabber/server.py create mode 100644 csharp/App_backup/VrmGrabber/token.json create mode 100644 firmware/2025-02-24.json create mode 100644 firmware/2025-02-25.json diff --git a/csharp/App/Backend/Websockets/WebsockerManager.cs b/csharp/App/Backend/Websockets/WebsockerManager.cs index 0161b0c5f..5568f66c7 100644 --- a/csharp/App/Backend/Websockets/WebsockerManager.cs +++ b/csharp/App/Backend/Websockets/WebsockerManager.cs @@ -55,22 +55,22 @@ public static class WebsocketManager //Console.WriteLine("Installation ID is "+installationConnection.Key); if (installationConnection.Value.Product == (int)ProductType.Salidomo && (DateTime.Now - installationConnection.Value.Timestamp) < TimeSpan.FromMinutes(60)){ Console.WriteLine("Installation ID is "+installationConnection.Key + " diff is "+(DateTime.Now-installationConnection.Value.Timestamp)); - - } if (installationConnection.Value.Product==(int)ProductType.Salidomo && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(60)) { - //Console.WriteLine("Installation ID is "+installationConnection.Key + " diff is "+(DateTime.Now-installationConnection.Value.Timestamp)); + //Console.WriteLine("installationConnection.Value.Timestamp is "+installationConnection.Value.Timestamp); //Console.WriteLine("timestamp now is is "+(DateTime.Now)); Installation installation = Db.Installations.FirstOrDefault(f => f.Product == (int)ProductType.Salidomo && f.Id == installationConnection.Key); + Console.WriteLine("Installation ID is "+installation.Name + " diff is "+(DateTime.Now-installationConnection.Value.Timestamp)); installation.Status = (int)StatusType.Offline; installation.Apply(Db.Update); installationConnection.Value.Status = (int)StatusType.Offline; if (installationConnection.Value.Connections.Count > 0){InformWebsocketsForInstallation(installationConnection.Key);} + else{Console.WriteLine("NONE IS CONNECTED TO THAT INSTALLATION-------------------------------------------------------------");} } } Console.WriteLine("FINISHED WITH UPDATING\n"); @@ -84,7 +84,7 @@ public static class WebsocketManager { var installation = Db.GetInstallationById(installationId); var installationConnection = InstallationConnections[installationId]; - Console.WriteLine("Update all the connected websockets for installation " + installationId); + Console.WriteLine("Update all the connected websockets for installation " + installation.Name); var jsonObject = new { diff --git a/csharp/App/SaliMax/SaliMax.csproj b/csharp/App/SaliMax/SaliMax.csproj index c8e936464..a62f192ea 100644 --- a/csharp/App/SaliMax/SaliMax.csproj +++ b/csharp/App/SaliMax/SaliMax.csproj @@ -29,4 +29,16 @@ + + + + + + + + + + + + diff --git a/csharp/App/SaliMax/src/AggregationService/Aggregator.cs b/csharp/App/SaliMax/src/AggregationService/Aggregator.cs index 37c7d3913..e430bb351 100644 --- a/csharp/App/SaliMax/src/AggregationService/Aggregator.cs +++ b/csharp/App/SaliMax/src/AggregationService/Aggregator.cs @@ -1,5 +1,7 @@ using InnovEnergy.App.SaliMax.Ess; using InnovEnergy.Lib.Utils; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using static System.Double; namespace InnovEnergy.App.SaliMax.AggregationService; @@ -14,7 +16,7 @@ public static class Aggregator // Calculate the time until the next rounded hour var timeUntilNextHour = nextRoundedHour - currentDateTime; - + // Output the current and next rounded hour times Console.WriteLine("------------------------------------------HourlyDataAggregationManager-------------------------------------------"); Console.WriteLine("Current Date and Time: " + currentDateTime); @@ -22,7 +24,7 @@ public static class Aggregator // Output the time until the next rounded hour Console.WriteLine("Waiting for " + timeUntilNextHour.TotalMinutes + " minutes..."); Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); - + // Wait until the next rounded hour await Task.Delay(timeUntilNextHour); @@ -30,7 +32,7 @@ public static class Aggregator { try { - AggregatedData hourlyAggregatedData = CreateHourlyData("LogDirectory",DateTime.Now.AddHours(-1).ToUnixTime(),DateTime.Now.ToUnixTime()); + AggregatedData hourlyAggregatedData = CreateHourlyData("JsonLogDirectory",DateTime.Now.AddHours(-1).ToUnixTime(),DateTime.Now.ToUnixTime()); hourlyAggregatedData.Save("HourlyData"); } catch (Exception e) @@ -83,14 +85,14 @@ public static class Aggregator private static void DeleteHourlyData(String myDirectory, Int64 beforeTimestamp) { - var csvFiles = Directory.GetFiles(myDirectory, "*.csv"); + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); Console.WriteLine("Delete data before"+beforeTimestamp); - foreach (var csvFile in csvFiles) + foreach (var jsonFile in jsonFiles) { - if (IsFileWithinTimeRange(csvFile, 0, beforeTimestamp)) + if (IsFileWithinTimeRange(jsonFile, 0, beforeTimestamp)) { - File.Delete(csvFile); - Console.WriteLine($"Deleted hourly data file: {csvFile}"); + File.Delete(jsonFile); + Console.WriteLine($"Deleted hourly data file: {jsonFile}"); } } } @@ -99,7 +101,7 @@ public static class Aggregator private static AggregatedData CreateHourlyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) { // Get all CSV files in the specified directory - var csvFiles = Directory.GetFiles(myDirectory, "*.csv"); + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); var batterySoc = new List(); var pvPowerSum = new List(); var heatingPower = new List(); @@ -111,83 +113,63 @@ public static class Aggregator Console.WriteLine("File timestamp should start after "+ afterTimestamp); - foreach (var csvFile in csvFiles) + foreach (var jsonFile in jsonFiles) { - if (csvFile == "LogDirectory/log.csv") + if (jsonFile == "LogDirectory/log.json") { continue; } - - if (IsFileWithinTimeRange(csvFile, afterTimestamp, beforeTimestamp)) + + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) { - using var reader = new StreamReader(csvFile); - - while (!reader.EndOfStream) + try { + // Read and parse JSON + + var jsonData = File.ReadAllText(jsonFile); - var line = reader.ReadLine(); - var lines = line?.Split(';'); - - // Assuming there are always three columns (variable name and its value) - if (lines is { Length: 3 }) + // Step 2: Find the first '{' character and trim everything before it + int startIndex = jsonData.IndexOf('{'); + if (startIndex != -1) { - var variableName = lines[0].Trim(); + jsonData = jsonData.Substring(startIndex); // Trim everything before '{' + } - if (TryParse(lines[1].Trim(), out var value)) - { - switch (variableName) - { - case "/Battery/Soc": - batterySoc.Add(value); - break; - - case "/PvOnDc/DcWh" : - pvPowerSum.Add(value); - break; + var jsonObject = JObject.Parse(jsonData); - case "/Battery/Dc/Power": - - if (value < 0) - { - batteryDischargePower.Add(value); - } - else - { - batteryChargePower.Add(value); - } - break; - - case "/GridMeter/ActivePowerExportT3": - // we are using different register to check which value from the grid meter we need to use - // At the moment register 8002 amd 8012. in KWh - gridPowerExport.Add(value); - break; - case "/GridMeter/ActivePowerImportT3": - gridPowerImport.Add(value); - break; - case "/Battery/HeatingPower": - heatingPower.Add(value); - break; - // Add more cases as needed - default: - // Code to execute when variableName doesn't match any condition - break; - } - - } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Soc"] != null) + { + batterySoc.Add((double)jsonObject["Battery"]["Soc"]); + } + if (jsonObject["PvOnDc"] != null && jsonObject["PvOnDc"]["DcWh"] != null) + { + pvPowerSum.Add((double)jsonObject["PvOnDc"]["DcWh"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Dc"]["Power"] != null) + { + double batteryPower = (double)jsonObject["Battery"]["Dc"]["Power"]; + if (batteryPower < 0) + batteryDischargePower.Add(batteryPower); else - { - //Handle cases where variableValue is not a valid number - // Console.WriteLine( - // $"Invalid numeric value for variable {variableName}:{lines[1].Trim()}"); - } + batteryChargePower.Add(batteryPower); } - else + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerExportT3"] != null) { - // Handle invalid column format - //Console.WriteLine("Invalid format in column"); + gridPowerExport.Add((double)jsonObject["GridMeter"]["ActivePowerExportT3"]); } + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerImportT3"] != null) + { + gridPowerImport.Add((double)jsonObject["GridMeter"]["ActivePowerImportT3"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["HeatingPower"] != null) + { + heatingPower.Add((double)jsonObject["Battery"]["HeatingPower"]); + } + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); } } } @@ -213,14 +195,14 @@ public static class Aggregator AggregatedData aggregatedData = new AggregatedData { - MaxSoc = dMaxSoc, - MinSoc = dMinSoc, - DischargingBatteryPower = dischargingEnergy, - ChargingBatteryPower = chargingEnergy, - GridExportPower = dSumGridExportPower, - GridImportPower = dSumGridImportPower, - PvPower = dSumPvPower, - HeatingPower = heatingPowerAvg + MaxSoc = Math.Round(dMaxSoc, 2), + MinSoc = Math.Round(dMinSoc, 2) , + DischargingBatteryPower = Math.Round(dischargingEnergy, 2) , + ChargingBatteryPower = Math.Round(chargingEnergy, 2) , + GridExportPower = Math.Round(dSumGridExportPower, 2) , + GridImportPower = Math.Round(dSumGridImportPower, 2) , + PvPower = Math.Round(dSumPvPower, 2) , + HeatingPower = Math.Round(heatingPowerAvg, 2) }; // Print the stored CSV data for verification @@ -245,7 +227,7 @@ public static class Aggregator private static AggregatedData CreateDailyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) { // Get all CSV files in the specified directory - var csvFiles = Directory.GetFiles(myDirectory, "*.csv"); + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); var batterySoc = new List(); var pvPower = new List(); var gridPowerImport = new List(); @@ -258,79 +240,71 @@ public static class Aggregator Console.WriteLine("File timestamp should start after "+ afterTimestamp); - foreach (var csvFile in csvFiles) + foreach (var jsonFile in jsonFiles) { - if (csvFile == "LogDirectory/log.csv") + if (jsonFile == "JsonLogDirectory/log.json") { continue; } - if (IsFileWithinTimeRange(csvFile, afterTimestamp, beforeTimestamp)) + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) { - using var reader = new StreamReader(csvFile); - - while (!reader.EndOfStream) + + try { + var jsonData = File.ReadAllText(jsonFile); + //Console.WriteLine("Parse file "+jsonFile); - var line = reader.ReadLine(); - var lines = line?.Split(';'); + // Parse JSON into a Dictionary + var jsonDict = JsonConvert.DeserializeObject>(jsonData); - // Assuming there are always three columns (variable name and its value) - if (lines is { Length: 3 }) + // Process values + foreach (var (variableName, value) in jsonDict) { - var variableName = lines[0].Trim(); - - if (TryParse(lines[1].Trim(), out var value)) + switch (variableName) { - switch (variableName) - { - case "/MinSoc" or "/MaxSoc": - batterySoc.Add(value); - break; - - case "/PvPower": - pvPower.Add(value); - break; + case "MinSoc": + case "MaxSoc": + batterySoc.Add(value); + break; - case "/DischargingBatteryPower" : - batteryDischargePower.Add(value); - break; - - case "/ChargingBatteryPower" : - batteryChargePower.Add(value); - break; - - case "/GridExportPower": - gridPowerExport.Add(value); - break; - - case "/GridImportPower": - gridPowerImport.Add(value); - break; - - case "/HeatingPower": - heatingPowerAvg.Add(value); - break; - // Add more cases as needed - default: - // Code to execute when variableName doesn't match any condition - break; - } + case "PvPower": + pvPower.Add(value); + break; - } - else - { - //Handle cases where variableValue is not a valid number - // Console.WriteLine( - // $"Invalid numeric value for variable {variableName}:{lines[1].Trim()}"); + case "DischargingBatteryPower": + batteryDischargePower.Add(value); + break; + + case "ChargingBatteryPower": + batteryChargePower.Add(value); + break; + + case "GridExportPower": + gridPowerExport.Add(value); + break; + + case "GridImportPower": + gridPowerImport.Add(value); + break; + + case "HeatingPower": + heatingPowerAvg.Add(value); + break; + + default: + // Ignore unknown variables + break; } } - else - { - // Handle invalid column format - //Console.WriteLine("Invalid format in column"); - } + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); + } + + } } diff --git a/csharp/App/SaliMax/src/AggregationService/HourlyData.cs b/csharp/App/SaliMax/src/AggregationService/HourlyData.cs index e3c5a9dd2..a7e50f83c 100644 --- a/csharp/App/SaliMax/src/AggregationService/HourlyData.cs +++ b/csharp/App/SaliMax/src/AggregationService/HourlyData.cs @@ -6,6 +6,7 @@ using InnovEnergy.App.SaliMax.Devices; using InnovEnergy.App.SaliMax.SystemConfig; using InnovEnergy.Lib.Units; using InnovEnergy.Lib.Utils; +using Newtonsoft.Json; using static System.Text.Json.JsonSerializer; namespace InnovEnergy.App.SaliMax.AggregationService; @@ -30,7 +31,7 @@ public class AggregatedData { var date = DateTime.Now.ToUnixTime(); var defaultHDataPath = Environment.CurrentDirectory + "/" + directory + "/"; - var dataFilePath = defaultHDataPath + date + ".csv"; + var dataFilePath = defaultHDataPath + date + ".json"; if (!Directory.Exists(defaultHDataPath)) { @@ -41,8 +42,11 @@ public class AggregatedData try { - var csvString = this.ToCsv(); - File.WriteAllText(dataFilePath, csvString); + // Convert the object to a JSON string + var jsonString = JsonConvert.SerializeObject(this, Formatting.None); + + // Write JSON to file + File.WriteAllText(dataFilePath, jsonString); } catch (Exception e) { @@ -54,21 +58,21 @@ public class AggregatedData public static void DeleteDailyData(String directory) { - var csvFiles = Directory.GetFiles(directory, "*.csv"); - foreach (var csvFile in csvFiles) + var jsonFiles = Directory.GetFiles(directory, "*.json"); + foreach (var jsonFile in jsonFiles) { - File.Delete(csvFile); - Console.WriteLine($"Deleted daily data file: {csvFile}"); + File.Delete(jsonFile); + Console.WriteLine($"Deleted daily data file: {jsonFile}"); } } public async Task PushToS3() { - var csv = this.ToCsv(); + var jsonString = JsonConvert.SerializeObject(this, Formatting.None); if (_S3Config is null) return false; - var s3Path = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + ".csv"; + var s3Path = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + ".json"; var request = _S3Config.CreatePutRequest(s3Path); // Compress CSV data to a byte array @@ -78,11 +82,11 @@ public class AggregatedData //Create a zip directory and put the compressed file inside using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { - var entry = archive.CreateEntry("data.csv", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive + var entry = archive.CreateEntry("data.json", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive using (var entryStream = entry.Open()) using (var writer = new StreamWriter(entryStream)) { - writer.Write(csv); + writer.Write(jsonString); } } @@ -98,9 +102,6 @@ public class AggregatedData // Upload the compressed data (ZIP archive) to S3 var response = await request.PutAsync(stringContent); - // - // var request = _S3Config.CreatePutRequest(s3Path); - // var response = await request.PutAsync(new StringContent(csv)); if (response.StatusCode != 200) { @@ -113,18 +114,5 @@ public class AggregatedData return true; } - // public static HourlyData? Load(String dataFilePath) - // { - // try - // { - // var csvString = File.ReadAllText(dataFilePath); - // return Deserialize(jsonString)!; - // } - // catch (Exception e) - // { - // $"Failed to read config file {dataFilePath}, using default config\n{e}".WriteLine(); - // return null; - // } - // } } \ No newline at end of file diff --git a/csharp/App/SaliMax/src/LogFileConcatenator.cs b/csharp/App/SaliMax/src/LogFileConcatenator.cs index b2873b251..60a7f5486 100644 --- a/csharp/App/SaliMax/src/LogFileConcatenator.cs +++ b/csharp/App/SaliMax/src/LogFileConcatenator.cs @@ -6,7 +6,7 @@ public class LogFileConcatenator { private readonly string _logDirectory; - public LogFileConcatenator(String logDirectory = "LogDirectory/") + public LogFileConcatenator(String logDirectory = "JsonLogDirectory/") { _logDirectory = logDirectory; } @@ -14,7 +14,7 @@ public class LogFileConcatenator public String ConcatenateFiles(int numberOfFiles) { var logFiles = Directory - .GetFiles(_logDirectory, "log_*.csv") + .GetFiles(_logDirectory, "log_*.json") .OrderByDescending(file => file) .Take(numberOfFiles) .OrderBy(file => file) diff --git a/csharp/App/SaliMax/src/Logger.cs b/csharp/App/SaliMax/src/Logger.cs index 7fdbd7b47..6728fbace 100644 --- a/csharp/App/SaliMax/src/Logger.cs +++ b/csharp/App/SaliMax/src/Logger.cs @@ -8,7 +8,7 @@ public static class Logger //private const Int32 MaxFileSizeBytes = 2024 * 30; // TODO: move to settings private const Int32 MaxLogFileCount = 5000; // TODO: move to settings - private const String LogFilePath = "LogDirectory/log.csv"; // TODO: move to settings + private const String LogFilePath = "JsonLogDirectory/log.json"; // TODO: move to settings // ReSharper disable once InconsistentNaming private static readonly ILogger _logger = new CustomLogger(LogFilePath, MaxLogFileCount); @@ -27,7 +27,7 @@ public static class Logger public static T LogError(this T t) where T : notnull { - _logger.LogError(t.ToString()); // TODO: check warning + //_logger.LogError(t.ToString()); // TODO: check warning return t; } diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index 5122351f9..614ca5c25 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -25,6 +25,7 @@ using InnovEnergy.Lib.Protocols.Modbus.Channels; using InnovEnergy.Lib.Units; using InnovEnergy.Lib.Utils; using InnovEnergy.App.SaliMax.DataTypes; +using Newtonsoft.Json; using static System.Int32; using static InnovEnergy.App.SaliMax.AggregationService.Aggregator; using static InnovEnergy.App.SaliMax.MiddlewareClasses.MiddlewareAgent; @@ -809,12 +810,74 @@ internal static class Program sc.ResetAlarmsAndWarnings = true; } + + private static void InsertIntoJson(Dictionary jsonDict, String[] keys, string value) + { + + Dictionary currentDict = jsonDict; + for (int i = 1; i < keys.Length; i++) // Start at 1 to skip empty root + { + string key = keys[i]; + if (!currentDict.ContainsKey(key)) + { + currentDict[key] = new Dictionary(); + } + + + + if (i == keys.Length - 1) // Last key, store the value + { + + if (!value.Contains(",") && double.TryParse(value, out double doubleValue)) // Try to parse value as a number + { + currentDict[key] = Math.Round(doubleValue, 2); // Round to 2 decimal places + + } + else + { + currentDict[key] = value; // Store as string if not a number + } + + + } + else + { + currentDict = (Dictionary)currentDict[key]; + } + } + + } private static async Task UploadCsv(StatusRecord status, DateTime timeStamp) { - status.ToJson(); - var csv = status.ToCsv().LogInfo(); + //status.ToJson(); + var csv = status.ToCsv(); + + + Dictionary jsonData = new Dictionary(); + //Console.WriteLine(csv); + + foreach (var line in csv.Split('\n')) + { + if (string.IsNullOrWhiteSpace(line)) continue; + + string[] parts = line.Split(';'); + //if (parts.Length < 2) continue; + + string keyPath = parts[0]; + string value = parts[1]; + string unit = parts.Length > 2 ? parts[2].Trim() : ""; + //Console.WriteLine(line); + // Console.WriteLine($"Key: {keyPath}, Value: {value}, Unit: {unit}"); + + InsertIntoJson(jsonData, keyPath.Split('/'), value); + + } + + string jsonOutput = JsonConvert.SerializeObject(jsonData, Formatting.None); + jsonOutput.LogInfo(); + await RestApiSavingFile(csv); @@ -835,7 +898,7 @@ internal static class Program var logFileConcatenator = new LogFileConcatenator(); - var s3Path = timeStamp.ToUnixTime() + ".csv"; + var s3Path = timeStamp.ToUnixTime() + ".json"; s3Path.WriteLine(""); var csvToSend = logFileConcatenator.ConcatenateFiles(NbrOfFileToConcatenate); @@ -902,7 +965,7 @@ internal static class Program //Create a zip directory and put the compressed file inside using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { - var entry = archive.CreateEntry("data.csv", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive + var entry = archive.CreateEntry("data.json", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive using (var entryStream = entry.Open()) using (var writer = new StreamWriter(entryStream)) { diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs b/csharp/App/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs index 23f777169..ef669c818 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs @@ -208,4 +208,215 @@ public class CombinedAdamRelaysRecord : IRelaysRecord public IEnumerable K3InverterIsConnectedToIslandBus => _recordAdam6360D.K3InverterIsConnectedToIslandBus; +} +using System.Reflection.Metadata; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; +#pragma warning disable CS8602 // Dereference of a possibly null reference. + +public class CombinedAdamRelaysRecord : IRelaysRecord +{ + private const UInt16 SlowFreq = 3000; + private const UInt16 HighFreq = 1000; + + public CombinedAdamRelaysRecord(RelaysRecordAdam6060? relaysRecordAdam6060, RelaysRecordAdam6360D? relaysRecordAdam6360D) + { + _recordAdam6060 = relaysRecordAdam6060; + _recordAdam6360D = relaysRecordAdam6360D; + } + + private static RelaysRecordAdam6060? _recordAdam6060; + private static RelaysRecordAdam6360D? _recordAdam6360D; + + public static IRelaysRecord Instance { get; } = new CombinedAdamRelaysRecord(_recordAdam6060, _recordAdam6360D); + + + public Boolean K1GridBusIsConnectedToGrid => _recordAdam6360D.K1GridBusIsConnectedToGrid; + + public Boolean K2IslandBusIsConnectedToGridBus => _recordAdam6360D.K2IslandBusIsConnectedToGridBus; + public Boolean FiWarning => _recordAdam6360D.FiWarning; + public Boolean FiError => _recordAdam6360D.FiError; + public Boolean K2ConnectIslandBusToGridBus + { + get => _recordAdam6360D.K2ConnectIslandBusToGridBus; + set => _recordAdam6360D.K2ConnectIslandBusToGridBus = value; + } + + public Boolean Inverter1WagoStatus => _recordAdam6360D.Inverter1WagoStatus; + public Boolean Inverter2WagoStatus => _recordAdam6360D.Inverter2WagoStatus; + public Boolean Inverter3WagoStatus => _recordAdam6360D.Inverter3WagoStatus; + public Boolean Inverter4WagoStatus => _recordAdam6360D.Inverter4WagoStatus; + + public Boolean Dc1WagoStatus => _recordAdam6060.Dc1WagoStatus; + public Boolean Dc2WagoStatus => _recordAdam6060.Dc2WagoStatus; + public Boolean Dc3WagoStatus => _recordAdam6060.Dc3WagoStatus; + public Boolean Dc4WagoStatus => _recordAdam6060.Dc4WagoStatus; + public Boolean DcSystemControlWagoStatus => _recordAdam6060.DcSystemControlWagoStatus; + + public Boolean LedGreen { get => _recordAdam6360D.LedGreen; set => _recordAdam6360D.LedGreen = value;} + public Boolean LedRed { get => _recordAdam6360D.LedRed; set => _recordAdam6360D.LedRed = value;} + public Boolean Harvester1Step => _recordAdam6360D.Harvester1Step; + public Boolean Harvester2Step => _recordAdam6360D.Harvester2Step; + public Boolean Harvester3Step => _recordAdam6360D.Harvester3Step; + public Boolean Harvester4Step => _recordAdam6360D.Harvester4Step; + + public UInt16 DigitalOutput0Mode { get => _recordAdam6360D.DigitalOutput0Mode; set => _recordAdam6360D.DigitalOutput0Mode = value; } + + public UInt16 DigitalOutput1Mode + { + get => _recordAdam6360D.DigitalOutput1Mode; + set => _recordAdam6360D.DigitalOutput1Mode = value; + } + + public UInt16 DigitalOutput2Mode + { + get => _recordAdam6360D.DigitalOutput2Mode; + set => _recordAdam6360D.DigitalOutput2Mode = value; + } + + public UInt16 DigitalOutput3Mode + { + get => _recordAdam6360D.DigitalOutput3Mode; + set => _recordAdam6360D.DigitalOutput3Mode = value; + } + + public UInt16 DigitalOutput4Mode + { + get => _recordAdam6360D.DigitalOutput4Mode; + set => _recordAdam6360D.DigitalOutput4Mode = value; + } + + public UInt16 DigitalOutput5Mode + { + get => _recordAdam6360D.DigitalOutput5Mode; + set => _recordAdam6360D.DigitalOutput5Mode = value; + } + + public Boolean Do0StartPulse { get => _recordAdam6360D.Do0Pulse; set => _recordAdam6360D.Do0Pulse = value; } + public Boolean Do1StartPulse { get => _recordAdam6360D.Do1Pulse; set => _recordAdam6360D.Do1Pulse = value; } + public Boolean Do2StartPulse { get => _recordAdam6360D.Do2Pulse; set => _recordAdam6360D.Do2Pulse = value; } + public Boolean Do3StartPulse { get => _recordAdam6360D.Do3Pulse; set => _recordAdam6360D.Do3Pulse = value; } + public Boolean Do4StartPulse { get => _recordAdam6360D.Do4Pulse; set => _recordAdam6360D.Do4Pulse = value; } + public Boolean Do5StartPulse { get => _recordAdam6360D.Do5Pulse; set => _recordAdam6360D.Do5Pulse = value; } + + + public UInt16 PulseOut0LowTime { get => _recordAdam6360D.PulseOut0LowTime; set => _recordAdam6360D.PulseOut0LowTime = value; } + public UInt16 PulseOut1LowTime { get => _recordAdam6360D.PulseOut1LowTime; set => _recordAdam6360D.PulseOut1LowTime = value; } + public UInt16 PulseOut2LowTime { get => _recordAdam6360D.PulseOut2LowTime; set => _recordAdam6360D.PulseOut2LowTime = value; } + public UInt16 PulseOut3LowTime { get => _recordAdam6360D.PulseOut3LowTime; set => _recordAdam6360D.PulseOut3LowTime = value; } + public UInt16 PulseOut4LowTime { get => _recordAdam6360D.PulseOut4LowTime; set => _recordAdam6360D.PulseOut4LowTime = value; } + public UInt16 PulseOut5LowTime { get => _recordAdam6360D.PulseOut5LowTime; set => _recordAdam6360D.PulseOut5LowTime = value; } + + public UInt16 PulseOut0HighTime { get => _recordAdam6360D.PulseOut0HighTime; set => _recordAdam6360D.PulseOut0HighTime = value; } + public UInt16 PulseOut1HighTime { get => _recordAdam6360D.PulseOut1HighTime; set => _recordAdam6360D.PulseOut1HighTime = value; } + public UInt16 PulseOut2HighTime { get => _recordAdam6360D.PulseOut2HighTime; set => _recordAdam6360D.PulseOut2HighTime = value; } + public UInt16 PulseOut3HighTime { get => _recordAdam6360D.PulseOut3HighTime; set => _recordAdam6360D.PulseOut3HighTime = value; } + public UInt16 PulseOut4HighTime { get => _recordAdam6360D.PulseOut4HighTime; set => _recordAdam6360D.PulseOut4HighTime = value; } + public UInt16 PulseOut5HighTime { get => _recordAdam6360D.PulseOut5HighTime; set => _recordAdam6360D.PulseOut5HighTime = value; } + + /**************************** Green LED *********************************/ + + public void PerformSolidGreenLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = true; + LedRed = false; + } + + public void PerformSlowFlashingGreenLed() + { + PulseOut0HighTime = SlowFreq; + PulseOut0LowTime = SlowFreq; + DigitalOutput0Mode = 2; + Do0StartPulse = true; + Do1StartPulse = false; // make sure the red LED is off + + Console.WriteLine("Green Slow Flashing Starting"); + } + + public void PerformFastFlashingGreenLed() + { + PulseOut0HighTime = HighFreq; + PulseOut0LowTime = HighFreq; + DigitalOutput0Mode = 2; + Do0StartPulse = true; + Do1StartPulse = false;// make sure the red LED is off + + Console.WriteLine("Green Slow Flashing Starting"); + } + + /**************************** Orange LED *********************************/ + + public void PerformSolidOrangeLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = true; + LedRed = true; + } + + public void PerformSlowFlashingOrangeLed() + { + PerformSlowFlashingGreenLed(); + PerformSlowFlashingRedLed(); + Do0StartPulse = true; + Do1StartPulse = true; + + Console.WriteLine("Orange Slow Flashing Starting"); + } + + public void PerformFastFlashingOrangeLed() + { + PerformFastFlashingGreenLed(); + PerformFastFlashingRedLed(); + Do0StartPulse = true; + Do1StartPulse = true; + Console.WriteLine("Orange Fast Flashing Starting"); + } + + /**************************** RED LED *********************************/ + + public void PerformSolidRedLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = false; + LedRed = true; + } + + public void PerformSlowFlashingRedLed() + { + PulseOut1HighTime = SlowFreq; + PulseOut1LowTime = SlowFreq; + DigitalOutput1Mode = 2; + Do0StartPulse = false; // make sure the green LED is off + Do1StartPulse = true; + + Console.WriteLine("Red Slow Flashing Starting"); + } + + public void PerformFastFlashingRedLed() + { + PulseOut1HighTime = HighFreq; + PulseOut1LowTime = HighFreq; + DigitalOutput1Mode = 2; + Do0StartPulse = false; // make sure the green LED is off + Do1StartPulse = true; + + Console.WriteLine("Red Fast Flashing Starting"); + } + + public RelaysRecordAdam6360D? GetAdam6360DRecord() + { + return _recordAdam6360D; + } + + public RelaysRecordAdam6060? GetAdam6060Record() + { + return _recordAdam6060; + } + + public IEnumerable K3InverterIsConnectedToIslandBus => _recordAdam6360D.K3InverterIsConnectedToIslandBus; + } \ No newline at end of file diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs b/csharp/App/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs index 1e7f8c089..e06628c44 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs @@ -1,6 +1,84 @@ namespace InnovEnergy.App.SaliMax.SaliMaxRelays; +public interface IRelaysRecord +{ + Boolean K1GridBusIsConnectedToGrid { get; } + Boolean K2IslandBusIsConnectedToGridBus { get; } + IEnumerable K3InverterIsConnectedToIslandBus { get; } + Boolean FiWarning { get; } + Boolean FiError { get; } + Boolean K2ConnectIslandBusToGridBus { get; set; } + + // Boolean Inverter1WagoRelay { get; set; } // to add in the future + // Boolean Inverter2WagoRelay { get; set; } // to add in the future + // Boolean Inverter3WagoRelay { get; set; } // to add in the future + // Boolean Inverter4WagoRelay { get; set; } // to add in the future + + Boolean Inverter1WagoStatus { get; } + Boolean Inverter2WagoStatus { get; } + Boolean Inverter3WagoStatus { get; } + Boolean Inverter4WagoStatus { get; } + + Boolean Dc1WagoStatus { get; } // to test + Boolean Dc2WagoStatus { get; } // to test + Boolean Dc3WagoStatus { get; } // to test + Boolean Dc4WagoStatus { get; } // to test + + Boolean DcSystemControlWagoStatus { get; } // to test + + Boolean LedGreen { get; set; } + Boolean LedRed { get; } + Boolean Harvester1Step { get; } + Boolean Harvester2Step { get; } + Boolean Harvester3Step { get; } + Boolean Harvester4Step { get; } + + Boolean Do0StartPulse { get; set; } + Boolean Do1StartPulse { get; set; } + Boolean Do2StartPulse { get; set; } + Boolean Do3StartPulse { get; set; } + Boolean Do4StartPulse { get; set; } + Boolean Do5StartPulse { get; set; } + + UInt16 DigitalOutput0Mode { get; set; } + UInt16 DigitalOutput1Mode { get; set; } + UInt16 DigitalOutput2Mode { get; set; } + UInt16 DigitalOutput3Mode { get; set; } + UInt16 DigitalOutput4Mode { get; set; } + UInt16 DigitalOutput5Mode { get; set; } + + UInt16 PulseOut0LowTime { get; set; } + UInt16 PulseOut1LowTime { get; set; } + UInt16 PulseOut2LowTime { get; set; } + UInt16 PulseOut3LowTime { get; set; } + UInt16 PulseOut4LowTime { get; set; } + UInt16 PulseOut5LowTime { get; set; } + + UInt16 PulseOut0HighTime { get; set; } + UInt16 PulseOut1HighTime { get; set; } + UInt16 PulseOut2HighTime { get; set; } + UInt16 PulseOut3HighTime { get; set; } + UInt16 PulseOut4HighTime { get; set; } + UInt16 PulseOut5HighTime { get; set; } + + void PerformSolidGreenLed(); + void PerformSlowFlashingGreenLed(); + void PerformFastFlashingGreenLed(); + + + void PerformSolidOrangeLed(); + void PerformSlowFlashingOrangeLed(); + void PerformFastFlashingOrangeLed(); + + void PerformSolidRedLed(); + void PerformSlowFlashingRedLed(); + void PerformFastFlashingRedLed(); + +} +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + + public interface IRelaysRecord { Boolean K1GridBusIsConnectedToGrid { get; } diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs index cc94dce66..50b9819d1 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs @@ -11,6 +11,46 @@ public class RelaysDeviceAdam6360 public RelaysDeviceAdam6360(Channel channel) => AdamDevice6360D = new Adam6360DDevice(channel, 2); + public RelaysRecordAdam6360D? Read() + { + try + { + return AdamDevice6360D.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAdam6360)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAdam6360D r) + { + try + { + AdamDevice6360D.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAdam6360)}\n{e}".LogError(); + } + } +} + + +using InnovEnergy.Lib.Devices.Adam6360D; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAdam6360 +{ + private Adam6360DDevice AdamDevice6360D { get; } + + public RelaysDeviceAdam6360(String hostname) => AdamDevice6360D = new Adam6360DDevice(hostname, 2); + public RelaysDeviceAdam6360(Channel channel) => AdamDevice6360D = new Adam6360DDevice(channel, 2); + + public RelaysRecordAdam6360D? Read() { try diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs index 2533cbd70..1e509c5d4 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs @@ -11,6 +11,44 @@ public class RelaysDeviceAdam6060 public RelaysDeviceAdam6060(Channel channel) => AdamDevice6060 = new Adam6060Device(channel, 2); + public RelaysRecordAdam6060? Read() + { + try + { + return AdamDevice6060.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAdam6060)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAdam6060 r) + { + try + { + AdamDevice6060.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAdam6060)}\n{e}".LogError(); + } + } +} +using InnovEnergy.Lib.Devices.Adam6060; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAdam6060 +{ + private Adam6060Device AdamDevice6060 { get; } + + public RelaysDeviceAdam6060(String hostname) => AdamDevice6060 = new Adam6060Device(hostname, 2); + public RelaysDeviceAdam6060(Channel channel) => AdamDevice6060 = new Adam6060Device(channel, 2); + + public RelaysRecordAdam6060? Read() { try diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs index 30a95e3de..0e3f86e0a 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs @@ -2,6 +2,43 @@ using InnovEnergy.Lib.Devices.Amax5070; using InnovEnergy.Lib.Protocols.Modbus.Channels; +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAmax +{ + private Amax5070Device AmaxDevice { get; } + + public RelaysDeviceAmax(Channel channel) => AmaxDevice = new Amax5070Device(channel); + + public RelaysRecordAmax? Read() + { + try + { + return AmaxDevice.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAmax r) + { + try + { + AmaxDevice.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + } + } +} +using InnovEnergy.Lib.Devices.Amax5070; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + + namespace InnovEnergy.App.SaliMax.SaliMaxRelays; public class RelaysDeviceAmax diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs index 2882736fa..77816f187 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs @@ -1,6 +1,30 @@ using InnovEnergy.Lib.Devices.Adam6060; +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysRecordAdam6060 +{ + private readonly Adam6060Registers _Regs; + + private RelaysRecordAdam6060(Adam6060Registers regs) => _Regs = regs; + + + public Boolean Dc1WagoStatus => _Regs.DigitalInput0; // to test + public Boolean Dc2WagoStatus => _Regs.DigitalInput1; // to test + public Boolean Dc3WagoStatus => _Regs.DigitalInput4; // to test + public Boolean Dc4WagoStatus => _Regs.DigitalInput5; // to test + + public Boolean DcSystemControlWagoStatus => _Regs.DigitalInput3; // to test + + + public static implicit operator Adam6060Registers(RelaysRecordAdam6060 d) => d._Regs; + public static implicit operator RelaysRecordAdam6060(Adam6060Registers d) => new RelaysRecordAdam6060(d); + +} +using InnovEnergy.Lib.Devices.Adam6060; + + namespace InnovEnergy.App.SaliMax.SaliMaxRelays; public class RelaysRecordAdam6060 diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs index 46625fdc2..6377bc947 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs @@ -2,6 +2,87 @@ using InnovEnergy.Lib.Devices.Adam6360D; namespace InnovEnergy.App.SaliMax.SaliMaxRelays; +public class RelaysRecordAdam6360D +{ + private readonly Adam6360DRegisters _Regs; + + private RelaysRecordAdam6360D(Adam6360DRegisters regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput6; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput4; + + public Boolean Inverter1WagoStatus => _Regs.DigitalInput8; + public Boolean Inverter2WagoStatus => _Regs.DigitalInput9; + public Boolean Inverter3WagoStatus => _Regs.DigitalInput10; + public Boolean Inverter4WagoStatus => _Regs.DigitalInput11; + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + private Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput0; // change it to private should be ok + private Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput1; + private Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput2; + private Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput3; + + public Boolean FiWarning => !_Regs.DigitalInput5; + public Boolean FiError => !_Regs.DigitalInput7; + + public Boolean Harvester1Step =>_Regs.DigitalOutput2; + public Boolean Harvester2Step =>_Regs.DigitalOutput3; + public Boolean Harvester3Step =>_Regs.DigitalOutput4; + public Boolean Harvester4Step =>_Regs.DigitalOutput5; + + public Boolean LedGreen { get =>_Regs.DigitalOutput0; set => _Regs.DigitalOutput0 = value;} + public Boolean LedRed { get =>_Regs.DigitalOutput1; set => _Regs.DigitalOutput1 = value;} + + public Boolean Do0Pulse { get => _Regs.Do0Pulse; set => _Regs.Do0Pulse = value;} + public Boolean Do1Pulse { get => _Regs.Do1Pulse; set => _Regs.Do1Pulse = value;} + public Boolean Do2Pulse { get => _Regs.Do2Pulse; set => _Regs.Do2Pulse = value;} + public Boolean Do3Pulse { get => _Regs.Do3Pulse; set => _Regs.Do3Pulse = value;} + public Boolean Do4Pulse { get => _Regs.Do4Pulse; set => _Regs.Do4Pulse = value;} + public Boolean Do5Pulse { get => _Regs.Do5Pulse; set => _Regs.Do5Pulse = value;} + + public UInt16 PulseOut0LowTime { get => _Regs.PulseOut0LowTime; set => _Regs.PulseOut0LowTime = value;} //in milleseconds + public UInt16 PulseOut1LowTime { get => _Regs.PulseOut1LowTime; set => _Regs.PulseOut1LowTime = value;} + public UInt16 PulseOut2LowTime { get => _Regs.PulseOut2LowTime; set => _Regs.PulseOut2LowTime = value;} + public UInt16 PulseOut3LowTime { get => _Regs.PulseOut3LowTime; set => _Regs.PulseOut3LowTime = value;} + public UInt16 PulseOut4LowTime { get => _Regs.PulseOut4LowTime; set => _Regs.PulseOut4LowTime = value;} + public UInt16 PulseOut5LowTime { get => _Regs.PulseOut5LowTime; set => _Regs.PulseOut5LowTime = value;} + + public UInt16 PulseOut0HighTime { get => _Regs.PulseOut0HighTime; set => _Regs.PulseOut0HighTime = value;} // in milleseconds + public UInt16 PulseOut1HighTime { get => _Regs.PulseOut1HighTime; set => _Regs.PulseOut1HighTime = value;} + public UInt16 PulseOut2HighTime { get => _Regs.PulseOut2HighTime; set => _Regs.PulseOut2HighTime = value;} + public UInt16 PulseOut3HighTime { get => _Regs.PulseOut3HighTime; set => _Regs.PulseOut3HighTime = value;} + public UInt16 PulseOut4HighTime { get => _Regs.PulseOut4HighTime; set => _Regs.PulseOut4HighTime = value;} + public UInt16 PulseOut5HighTime { get => _Regs.PulseOut5HighTime; set => _Regs.PulseOut5HighTime = value;} + + public UInt16 DigitalOutput0Mode { get => _Regs.DigitalOutput0Mode; set => _Regs.DigitalOutput0Mode = value;} // To test: 0, 1 or 2 + public UInt16 DigitalOutput1Mode { get => _Regs.DigitalOutput1Mode; set => _Regs.DigitalOutput1Mode = value;} + public UInt16 DigitalOutput2Mode { get => _Regs.DigitalOutput2Mode; set => _Regs.DigitalOutput2Mode = value;} + public UInt16 DigitalOutput3Mode { get => _Regs.DigitalOutput3Mode; set => _Regs.DigitalOutput3Mode = value;} + public UInt16 DigitalOutput4Mode { get => _Regs.DigitalOutput4Mode; set => _Regs.DigitalOutput4Mode = value;} + public UInt16 DigitalOutput5Mode { get => _Regs.DigitalOutput5Mode; set => _Regs.DigitalOutput5Mode = value;} + + public Boolean K2ConnectIslandBusToGridBus { get => _Regs.Relay0; set => _Regs.Relay0 = value;} + + public static implicit operator Adam6360DRegisters(RelaysRecordAdam6360D d) => d._Regs; + public static implicit operator RelaysRecordAdam6360D(Adam6360DRegisters d) => new RelaysRecordAdam6360D(d); + +} + + +using InnovEnergy.Lib.Devices.Adam6360D; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + public class RelaysRecordAdam6360D { private readonly Adam6360DRegisters _Regs; diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs index b840dbeb2..13c71d1df 100644 --- a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs +++ b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs @@ -2,6 +2,140 @@ using InnovEnergy.Lib.Devices.Amax5070; namespace InnovEnergy.App.SaliMax.SaliMaxRelays; +public class RelaysRecordAmax : IRelaysRecord +{ + private readonly Amax5070Registers _Regs; + + private RelaysRecordAmax(Amax5070Registers regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput22; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput20; + + public Boolean Inverter1WagoStatus => _Regs.DigitalInput0; + public Boolean Inverter2WagoStatus => _Regs.DigitalInput1; + public Boolean Inverter3WagoStatus => _Regs.DigitalInput2; + public Boolean Inverter4WagoStatus => _Regs.DigitalInput3; + + public Boolean Dc1WagoStatus => _Regs.DigitalInput6; + public Boolean Dc2WagoStatus => _Regs.DigitalInput7; + public Boolean Dc3WagoStatus => _Regs.DigitalInput10; + public Boolean Dc4WagoStatus => _Regs.DigitalInput11; + public Boolean DcSystemControlWagoStatus => _Regs.DigitalInput9; + + public Boolean LedGreen + { + get => _Regs.DigitalOutput0; + set => _Regs.DigitalOutput0 = value; + } + + public Boolean LedRed => _Regs.DigitalOutput1; + public Boolean Harvester1Step => _Regs.DigitalOutput2; + public Boolean Harvester2Step => _Regs.DigitalOutput3; + public Boolean Harvester3Step => _Regs.DigitalOutput4; + public Boolean Harvester4Step => _Regs.DigitalOutput5; + public Boolean Do0StartPulse { get; set; } + public Boolean Do1StartPulse { get; set; } + public Boolean Do2StartPulse { get; set; } + public Boolean Do3StartPulse { get; set; } + public Boolean Do4StartPulse { get; set; } + public Boolean Do5StartPulse { get; set; } + public UInt16 DigitalOutput0Mode { get; set; } + public UInt16 DigitalOutput1Mode { get; set; } + public UInt16 DigitalOutput2Mode { get; set; } + public UInt16 DigitalOutput3Mode { get; set; } + public UInt16 DigitalOutput4Mode { get; set; } + public UInt16 DigitalOutput5Mode { get; set; } + public UInt16 PulseOut0LowTime { get; set; } + public UInt16 PulseOut1LowTime { get; set; } + public UInt16 PulseOut2LowTime { get; set; } + public UInt16 PulseOut3LowTime { get; set; } + public UInt16 PulseOut4LowTime { get; set; } + public UInt16 PulseOut5LowTime { get; set; } + public UInt16 PulseOut0HighTime { get; set; } + public UInt16 PulseOut1HighTime { get; set; } + public UInt16 PulseOut2HighTime { get; set; } + public UInt16 PulseOut3HighTime { get; set; } + public UInt16 PulseOut4HighTime { get; set; } + public UInt16 PulseOut5HighTime { get; set; } + + public void PerformSolidGreenLed() + { + Console.WriteLine("Solid Green: This is not yet implemented "); + } + + public void PerformSlowFlashingGreenLed() + { + Console.WriteLine("Slow Flashing Green: This is not yet implemented "); + } + + public void PerformFastFlashingGreenLed() + { + Console.WriteLine("Fast Flashing Green: This is not yet implemented "); + } + + public void PerformSolidOrangeLed() + { + Console.WriteLine("Solid Orange: This is not yet implemented "); + } + + public void PerformSlowFlashingOrangeLed() + { + Console.WriteLine("Slow Flashing Orange: This is not yet implemented "); + } + + public void PerformFastFlashingOrangeLed() + { + Console.WriteLine("Fast Flashing Orange: This is not yet implemented "); + } + + public void PerformSolidRedLed() + { + Console.WriteLine("Solid Red: This is not yet implemented "); + } + + public void PerformSlowFlashingRedLed() + { + Console.WriteLine("Slow Flashing Red: This is not yet implemented "); + } + + public void PerformFastFlashingRedLed() + { + Console.WriteLine("Fast Flashing Red: This is not yet implemented "); + } + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + private Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput16; + private Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput17; + private Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput18; + private Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput19; + + public Boolean FiWarning => !_Regs.DigitalInput21; + public Boolean FiError => !_Regs.DigitalInput23; + + public Boolean K2ConnectIslandBusToGridBus + { + get => _Regs.Relay23; + set => _Regs.Relay23 = value; + } + + public static implicit operator Amax5070Registers(RelaysRecordAmax d) => d._Regs; + public static implicit operator RelaysRecordAmax(Amax5070Registers d) => new RelaysRecordAmax(d); + +} +using InnovEnergy.Lib.Devices.Amax5070; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + public class RelaysRecordAmax : IRelaysRecord { private readonly Amax5070Registers _Regs; diff --git a/csharp/App/SodiStoreMax/src/AggregationService/Aggregator.cs b/csharp/App/SodiStoreMax/src/AggregationService/Aggregator.cs index 0fa03f49e..0759d67e9 100644 --- a/csharp/App/SodiStoreMax/src/AggregationService/Aggregator.cs +++ b/csharp/App/SodiStoreMax/src/AggregationService/Aggregator.cs @@ -1,5 +1,7 @@ using InnovEnergy.App.SodiStoreMax.Ess; using InnovEnergy.Lib.Utils; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using static System.Double; namespace InnovEnergy.App.SodiStoreMax.AggregationService; @@ -30,7 +32,7 @@ public static class Aggregator { try { - AggregatedData hourlyAggregatedData = CreateHourlyData("LogDirectory",DateTime.Now.AddHours(-1).ToUnixTime(),DateTime.Now.ToUnixTime()); + AggregatedData hourlyAggregatedData = CreateHourlyData("JsonLogDirectory",DateTime.Now.AddHours(-1).ToUnixTime(),DateTime.Now.ToUnixTime()); hourlyAggregatedData.Save("HourlyData"); } catch (Exception e) @@ -83,14 +85,14 @@ public static class Aggregator private static void DeleteHourlyData(String myDirectory, Int64 beforeTimestamp) { - var csvFiles = Directory.GetFiles(myDirectory, "*.csv"); + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); Console.WriteLine("Delete data before"+beforeTimestamp); - foreach (var csvFile in csvFiles) + foreach (var jsonFile in jsonFiles) { - if (IsFileWithinTimeRange(csvFile, 0, beforeTimestamp)) + if (IsFileWithinTimeRange(jsonFile, 0, beforeTimestamp)) { - File.Delete(csvFile); - Console.WriteLine($"Deleted hourly data file: {csvFile}"); + File.Delete(jsonFile); + Console.WriteLine($"Deleted hourly data file: {jsonFile}"); } } } @@ -99,7 +101,7 @@ public static class Aggregator private static AggregatedData CreateHourlyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) { // Get all CSV files in the specified directory - var csvFiles = Directory.GetFiles(myDirectory, "*.csv"); + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); var batterySoc = new List(); var pvPowerSum = new List(); var heatingPower = new List(); @@ -111,84 +113,135 @@ public static class Aggregator Console.WriteLine("File timestamp should start after "+ afterTimestamp); - foreach (var csvFile in csvFiles) + foreach (var jsonFile in jsonFiles) { - if (csvFile == "LogDirectory/log.csv") + if (jsonFile == "JsonLogDirectory/log.json") { continue; } - if (IsFileWithinTimeRange(csvFile, afterTimestamp, beforeTimestamp)) + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) { - using var reader = new StreamReader(csvFile); - - while (!reader.EndOfStream) + try { + // Read and parse JSON + + var jsonData = File.ReadAllText(jsonFile); - var line = reader.ReadLine(); - var lines = line?.Split(';'); - - // Assuming there are always three columns (variable name and its value) - if (lines is { Length: 3 }) + // Step 2: Find the first '{' character and trim everything before it + int startIndex = jsonData.IndexOf('{'); + if (startIndex != -1) { - var variableName = lines[0].Trim(); - - if (TryParse(lines[1].Trim(), out var value)) - { - switch (variableName) - { - case "/Battery/Soc": - batterySoc.Add(value); - break; - - case "/PvOnDc/DcWh" : - pvPowerSum.Add(value); - break; - - case "/Battery/Dc/Power": - - if (value < 0) - { - batteryDischargePower.Add(value); - } - else - { - batteryChargePower.Add(value); - - } - break; - - case "/GridMeter/ActivePowerExportT3": - // we are using different register to check which value from the grid meter we need to use - // At the moment register 8002 amd 8012. in KWh - gridPowerExport.Add(value); - break; - case "/GridMeter/ActivePowerImportT3": - gridPowerImport.Add(value); - break; - case "/Battery/HeatingPower": - heatingPower.Add(value); - break; - // Add more cases as needed - default: - // Code to execute when variableName doesn't match any condition - break; - } - - } - else - { - //Handle cases where variableValue is not a valid number - // Console.WriteLine( - // $"Invalid numeric value for variable {variableName}:{lines[1].Trim()}"); - } + jsonData = jsonData.Substring(startIndex); // Trim everything before '{' } - else + + var jsonObject = JObject.Parse(jsonData); + + + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Soc"] != null) { - // Handle invalid column format - //Console.WriteLine("Invalid format in column"); + batterySoc.Add((double)jsonObject["Battery"]["Soc"]); + } + if (jsonObject["PvOnDc"] != null && jsonObject["PvOnDc"]["DcWh"] != null) + { + pvPowerSum.Add((double)jsonObject["PvOnDc"]["DcWh"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Dc"]["Power"] != null) + { + double batteryPower = (double)jsonObject["Battery"]["Dc"]["Power"]; + if (batteryPower < 0) + batteryDischargePower.Add(batteryPower); + else + batteryChargePower.Add(batteryPower); + } + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerExportT3"] != null) + { + gridPowerExport.Add((double)jsonObject["GridMeter"]["ActivePowerExportT3"]); + } + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerImportT3"] != null) + { + gridPowerImport.Add((double)jsonObject["GridMeter"]["ActivePowerImportT3"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["HeatingPower"] != null) + { + heatingPower.Add((double)jsonObject["Battery"]["HeatingPower"]); } } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); + } + + + // using var reader = new StreamReader(jsonFile); + // + // while (!reader.EndOfStream) + // { + // + // var line = reader.ReadLine(); + // var lines = line?.Split(';'); + // + // // Assuming there are always three columns (variable name and its value) + // if (lines is { Length: 3 }) + // { + // var variableName = lines[0].Trim(); + // + // if (TryParse(lines[1].Trim(), out var value)) + // { + // switch (variableName) + // { + // case "/Battery/Soc": + // batterySoc.Add(value); + // break; + // + // case "/PvOnDc/DcWh" : + // pvPowerSum.Add(value); + // break; + // + // case "/Battery/Dc/Power": + // + // if (value < 0) + // { + // batteryDischargePower.Add(value); + // } + // else + // { + // batteryChargePower.Add(value); + // + // } + // break; + // + // case "/GridMeter/ActivePowerExportT3": + // // we are using different register to check which value from the grid meter we need to use + // // At the moment register 8002 amd 8012. in KWh + // gridPowerExport.Add(value); + // break; + // case "/GridMeter/ActivePowerImportT3": + // gridPowerImport.Add(value); + // break; + // case "/Battery/HeatingPower": + // heatingPower.Add(value); + // break; + // // Add more cases as needed + // default: + // // Code to execute when variableName doesn't match any condition + // break; + // } + // + // } + // else + // { + // //Handle cases where variableValue is not a valid number + // // Console.WriteLine( + // // $"Invalid numeric value for variable {variableName}:{lines[1].Trim()}"); + // } + // } + // else + // { + // // Handle invalid column format + // //Console.WriteLine("Invalid format in column"); + // } + //} } } @@ -244,8 +297,8 @@ public static class Aggregator private static AggregatedData CreateDailyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) { - // Get all CSV files in the specified directory - var csvFiles = Directory.GetFiles(myDirectory, "*.csv"); + // Get all JSON files in the specified directory + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); var batterySoc = new List(); var pvPower = new List(); var gridPowerImport = new List(); @@ -258,79 +311,133 @@ public static class Aggregator Console.WriteLine("File timestamp should start after "+ afterTimestamp); - foreach (var csvFile in csvFiles) + foreach (var jsonFile in jsonFiles) { - if (csvFile == "LogDirectory/log.csv") + if (jsonFile == "JsonLogDirectory/log.json") { continue; } - if (IsFileWithinTimeRange(csvFile, afterTimestamp, beforeTimestamp)) + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) { - using var reader = new StreamReader(csvFile); - while (!reader.EndOfStream) + try { + var jsonData = File.ReadAllText(jsonFile); + //Console.WriteLine("Parse file "+jsonFile); - var line = reader.ReadLine(); - var lines = line?.Split(';'); + // Parse JSON into a Dictionary + var jsonDict = JsonConvert.DeserializeObject>(jsonData); - // Assuming there are always three columns (variable name and its value) - if (lines is { Length: 3 }) + // Process values + foreach (var (variableName, value) in jsonDict) { - var variableName = lines[0].Trim(); - - if (TryParse(lines[1].Trim(), out var value)) + switch (variableName) { - switch (variableName) - { - case "/MinSoc" or "/MaxSoc": - batterySoc.Add(value); - break; - - case "/PvPower": - pvPower.Add(value); - break; + case "MinSoc": + case "MaxSoc": + batterySoc.Add(value); + break; - case "/DischargingBatteryPower" : - batteryDischargePower.Add(value); - break; - - case "/ChargingBatteryPower" : - batteryChargePower.Add(value); - break; - - case "/GridExportPower": - gridPowerExport.Add(value); - break; - - case "/GridImportPower": - gridPowerImport.Add(value); - break; - - case "/HeatingPower": - heatingPowerAvg.Add(value); - break; - // Add more cases as needed - default: - // Code to execute when variableName doesn't match any condition - break; - } + case "PvPower": + pvPower.Add(value); + break; - } - else - { - //Handle cases where variableValue is not a valid number - // Console.WriteLine( - // $"Invalid numeric value for variable {variableName}:{lines[1].Trim()}"); + case "DischargingBatteryPower": + batteryDischargePower.Add(value); + break; + + case "ChargingBatteryPower": + batteryChargePower.Add(value); + break; + + case "GridExportPower": + gridPowerExport.Add(value); + break; + + case "GridImportPower": + gridPowerImport.Add(value); + break; + + case "HeatingPower": + heatingPowerAvg.Add(value); + break; + + default: + // Ignore unknown variables + break; } } - else - { - // Handle invalid column format - //Console.WriteLine("Invalid format in column"); - } + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); + } + // using var reader = new StreamReader(csvFile); + // + // while (!reader.EndOfStream) + // { + // + // var line = reader.ReadLine(); + // var lines = line?.Split(';'); + // + // // Assuming there are always three columns (variable name and its value) + // if (lines is { Length: 3 }) + // { + // var variableName = lines[0].Trim(); + // + // if (TryParse(lines[1].Trim(), out var value)) + // { + // switch (variableName) + // { + // case "/MinSoc" or "/MaxSoc": + // batterySoc.Add(value); + // break; + // + // case "/PvPower": + // pvPower.Add(value); + // break; + // + // case "/DischargingBatteryPower" : + // batteryDischargePower.Add(value); + // break; + // + // case "/ChargingBatteryPower" : + // batteryChargePower.Add(value); + // break; + // + // case "/GridExportPower": + // gridPowerExport.Add(value); + // break; + // + // case "/GridImportPower": + // gridPowerImport.Add(value); + // break; + // + // case "/HeatingPower": + // heatingPowerAvg.Add(value); + // break; + // // Add more cases as needed + // default: + // // Code to execute when variableName doesn't match any condition + // break; + // } + // + // } + // else + // { + // //Handle cases where variableValue is not a valid number + // // Console.WriteLine( + // // $"Invalid numeric value for variable {variableName}:{lines[1].Trim()}"); + // } + // } + // else + // { + // // Handle invalid column format + // //Console.WriteLine("Invalid format in column"); + // } + //} } } @@ -360,6 +467,7 @@ public static class Aggregator + Console.WriteLine("CSV data reading and storage completed."); Console.WriteLine("CSV data reading and storage completed."); Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); diff --git a/csharp/App/SodiStoreMax/src/LogFileConcatenator.cs b/csharp/App/SodiStoreMax/src/LogFileConcatenator.cs index 9ee7b4e41..c5e63f6f4 100644 --- a/csharp/App/SodiStoreMax/src/LogFileConcatenator.cs +++ b/csharp/App/SodiStoreMax/src/LogFileConcatenator.cs @@ -6,7 +6,7 @@ public class LogFileConcatenator { private readonly string _logDirectory; - public LogFileConcatenator(String logDirectory = "LogDirectory/") + public LogFileConcatenator(String logDirectory = "JsonLogDirectory/") { _logDirectory = logDirectory; } @@ -14,7 +14,7 @@ public class LogFileConcatenator public String ConcatenateFiles(int numberOfFiles) { var logFiles = Directory - .GetFiles(_logDirectory, "log_*.csv") + .GetFiles(_logDirectory, "log_*.json") .OrderByDescending(file => file) .Take(numberOfFiles) .OrderBy(file => file) diff --git a/csharp/App/SodiStoreMax/src/Logger.cs b/csharp/App/SodiStoreMax/src/Logger.cs index fadd6babe..e721eb1fc 100644 --- a/csharp/App/SodiStoreMax/src/Logger.cs +++ b/csharp/App/SodiStoreMax/src/Logger.cs @@ -9,7 +9,7 @@ public static class Logger //private const Int32 MaxFileSizeBytes = 2024 * 30; // TODO: move to settings private const Int32 MaxLogFileCount = 5000; // TODO: move to settings - private const String LogFilePath = "LogDirectory/log.csv"; // TODO: move to settings + private const String LogFilePath = "JsonLogDirectory/log.json"; // TODO: move to settings // ReSharper disable once InconsistentNaming private static readonly ILogger _logger = new CustomLogger(LogFilePath, MaxLogFileCount); @@ -22,19 +22,19 @@ public static class Logger public static T LogDebug(this T t) where T : notnull { - _logger.LogDebug(t.ToString()); // TODO: check warning + // _logger.LogDebug(t.ToString()); // TODO: check warning return t; } public static T LogError(this T t) where T : notnull { - _logger.LogError(t.ToString()); // TODO: check warning + // _logger.LogError(t.ToString()); // TODO: check warning return t; } public static T LogWarning(this T t) where T : notnull { - _logger.LogWarning(t.ToString()); // TODO: check warning + // _logger.LogWarning(t.ToString()); // TODO: check warning return t; } } \ No newline at end of file diff --git a/csharp/App/SodiStoreMax/src/Program.cs b/csharp/App/SodiStoreMax/src/Program.cs index ec9f2e542..eabea15d3 100644 --- a/csharp/App/SodiStoreMax/src/Program.cs +++ b/csharp/App/SodiStoreMax/src/Program.cs @@ -30,6 +30,7 @@ using InnovEnergy.Lib.Units; using InnovEnergy.Lib.Utils; using InnovEnergy.App.SodiStoreMax.DataTypes; using InnovEnergy.Lib.Utils.Net; +using Newtonsoft.Json; using static System.Int32; using static InnovEnergy.App.SodiStoreMax.AggregationService.Aggregator; using static InnovEnergy.App.SodiStoreMax.MiddlewareClasses.MiddlewareAgent; @@ -798,12 +799,68 @@ internal static class Program sc.ResetAlarmsAndWarnings = true; } + + private static void InsertIntoJson(Dictionary jsonDict, String[] keys, string value) + { + + Dictionary currentDict = jsonDict; + for (int i = 1; i < keys.Length; i++) // Start at 1 to skip empty root + { + string key = keys[i]; + if (!currentDict.ContainsKey(key)) + { + currentDict[key] = new Dictionary(); + } + + if (i == keys.Length - 1) // Last key, store the value + { + + if (!value.Contains(",") && double.TryParse(value, out double doubleValue)) // Try to parse value as a number + { + currentDict[key] = Math.Round(doubleValue, 2); // Round to 2 decimal places + + } + else + { + currentDict[key] = value; // Store as string if not a number + } + } + else + { + currentDict = (Dictionary)currentDict[key]; + } + } + + } private static async Task UploadCsv(StatusRecord status, DateTime timeStamp) { - - var csv = status.ToCsv().LogInfo(); + var csv = status.ToCsv(); + + Dictionary jsonData = new Dictionary(); + //Console.WriteLine(csv); + + foreach (var line in csv.Split('\n')) + { + if (string.IsNullOrWhiteSpace(line)) continue; + + string[] parts = line.Split(';'); + //if (parts.Length < 2) continue; + + string keyPath = parts[0]; + string value = parts[1]; + string unit = parts.Length > 2 ? parts[2].Trim() : ""; + //Console.WriteLine(line); + // Console.WriteLine($"Key: {keyPath}, Value: {value}, Unit: {unit}"); + + InsertIntoJson(jsonData, keyPath.Split('/'), value); + + } + + string jsonOutput = JsonConvert.SerializeObject(jsonData, Formatting.None); + jsonOutput.LogInfo(); + await RestApiSavingFile(csv); var s3Config = status.Config.S3; @@ -823,7 +880,7 @@ internal static class Program var logFileConcatenator = new LogFileConcatenator(); - var s3Path = timeStamp.ToUnixTime() + ".csv"; + var s3Path = timeStamp.ToUnixTime() + ".json"; s3Path.WriteLine(""); var csvToSend = logFileConcatenator.ConcatenateFiles(NbrOfFileToConcatenate); @@ -890,7 +947,7 @@ internal static class Program //Create a zip directory and put the compressed file inside using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { - var entry = archive.CreateEntry("data.csv", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive + var entry = archive.CreateEntry("data.json", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive using (var entryStream = entry.Open()) using (var writer = new StreamWriter(entryStream)) { diff --git a/csharp/App_backup/Backend/Backend.csproj b/csharp/App_backup/Backend/Backend.csproj new file mode 100644 index 000000000..518c98e37 --- /dev/null +++ b/csharp/App_backup/Backend/Backend.csproj @@ -0,0 +1,239 @@ + + + + + + InnovEnergy.App.Backend + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Never + + + + + + + + ..\..\..\..\..\..\.nuget\packages\rabbitmq.client\6.6.0\lib\netstandard2.0\RabbitMQ.Client.dll + + + + + + + + + + + + + + + + diff --git a/csharp/App_backup/Backend/Backend.sln b/csharp/App_backup/Backend/Backend.sln new file mode 100644 index 000000000..c72530762 --- /dev/null +++ b/csharp/App_backup/Backend/Backend.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Backend", "Backend.csproj", "{161624D7-33B9-48B8-BA05-303DCFAEB03E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {161624D7-33B9-48B8-BA05-303DCFAEB03E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {161624D7-33B9-48B8-BA05-303DCFAEB03E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {161624D7-33B9-48B8-BA05-303DCFAEB03E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {161624D7-33B9-48B8-BA05-303DCFAEB03E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A377D3C5-E56D-4A16-AC4B-F3B0BB4CFCCE} + EndGlobalSection +EndGlobal diff --git a/csharp/App_backup/Backend/Controller.cs b/csharp/App_backup/Backend/Controller.cs new file mode 100644 index 000000000..cb1ec796e --- /dev/null +++ b/csharp/App_backup/Backend/Controller.cs @@ -0,0 +1,1015 @@ +using System.Diagnostics; +using System.Net; +using System.Text.RegularExpressions; +using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.App.Backend.DataTypes.Methods; +using InnovEnergy.App.Backend.Relations; +using InnovEnergy.App.Backend.Websockets; +using InnovEnergy.Lib.Utils; +using Microsoft.AspNetCore.Mvc; + +namespace InnovEnergy.App.Backend; + +using Token = String; + +// create JobStatus class to track download battery log job +public class JobStatus +{ + public string JobId { get; set; } + public string Status { get; set; } + public string FileName { get; set; } + public DateTime StartTime { get; set; } +} + +[Controller] +[Route("api/")] +//All the http requests from the frontend that contain "/api" will be forwarded to this controller from the nginx reverse proxy. +public class Controller : ControllerBase +{ + [HttpPost(nameof(Login))] + public ActionResult Login(String username, String? password) + { + //Find the user to the database, verify its password and create a new session. + //Store the new session to the database and return it to the frontend. + //If the user log out, the session will be deleted. Each session is valid for 24 hours. The db deletes all invalid/expired sessions every 30 minutes. + var user = Db.GetUserByEmail(username); + + if (user is null) + throw new Exceptions(400, "Null User Exception", "Must provide a user to log in as.", Request.Path.Value!); + + if (!(user.Password.IsNullOrEmpty() && user.MustResetPassword) && !user.VerifyPassword(password)) + { + throw new Exceptions(401, "Wrong Password Exception", "Please try again.", Request.Path.Value!); + } + + var session = new Session(user.HidePassword().HideParentIfUserHasNoAccessToParent(user)); + + return Db.Create(session) + ? session + : throw new Exceptions(401,"Session Creation Exception", "Not allowed to log in.", Request.Path.Value!); + } + + + [HttpPost(nameof(Logout))] + public ActionResult Logout(Token authToken) + { + //Find the session and delete it from the database. + var session = Db.GetSession(authToken); + + return session.Logout() + ? Ok() + : Unauthorized(); + } + + + + [HttpGet(nameof(CreateWebSocket))] + public async Task CreateWebSocket(Token authToken) + { + //Everytime a user logs in, this function is called + var session = Db.GetSession(authToken)?.User; + + if (session is null) + { + Console.WriteLine("------------------------------------Unauthorized user----------------------------------------------"); + HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; + HttpContext.Abort(); + return; + } + + if (!HttpContext.WebSockets.IsWebSocketRequest) + { + Console.WriteLine("------------------------------------Not a websocket request ----------------------------------------------"); + HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; + HttpContext.Abort(); + return; + } + + //Create a websocket and pass its descriptor to the HandleWebSocketConnection method. + //This descriptor is returned to the frontend on the background + var webSocketContext = await HttpContext.WebSockets.AcceptWebSocketAsync(); + var webSocket = webSocketContext; + + //Handle the WebSocket connection + await WebsocketManager.HandleWebSocketConnection(webSocket); + } + + [HttpGet(nameof(GetAllErrorsForInstallation))] + public ActionResult> GetAllErrorsForInstallation(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + return Db.Errors + .Where(error => error.InstallationId == id) + .OrderByDescending(error => error.Date) + .ThenByDescending(error => error.Time) + .ToList(); + } + + [HttpGet(nameof(GetHistoryForInstallation))] + public ActionResult> GetHistoryForInstallation(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + return Db.UserActions + .Where(action =>action.InstallationId == id) + .OrderByDescending(action => action.Timestamp) + .ToList(); + } + + [HttpGet(nameof(GetAllWarningsForInstallation))] + public ActionResult> GetAllWarningsForInstallation(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + return Db.Warnings + .Where(error => error.InstallationId == id) + .OrderByDescending(error => error.Date) + .ThenByDescending(error => error.Time) + .ToList(); + } + + + + [HttpGet(nameof(GetCsvTimestampsForInstallation))] + public ActionResult> GetCsvTimestampsForInstallation(Int64 id, Int32 start, Int32 end, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + var sampleSize = 100; + var allTimestamps = new List(); + + static string FindCommonPrefix(string str1, string str2) + { + int minLength = Math.Min(str1.Length, str2.Length); + int i = 0; + while (i < minLength && str1[i] == str2[i]) + { + i++; + } + return str1.Substring(0, i); + } + + Int64 startTimestamp = Int64.Parse(start.ToString().Substring(0,5)); + Int64 endTimestamp = Int64.Parse(end.ToString().Substring(0,5)); + + if (installation.Product == (int)ProductType.Salidomo) + { + + start = Int32.Parse(start.ToString().Substring(0, start.ToString().Length - 2)); + end = Int32.Parse(end.ToString().Substring(0, end.ToString().Length - 2)); + } + + string configPath = "/home/ubuntu/.s3cfg"; + + while (startTimestamp <= endTimestamp) + { + string bucketPath = installation.Product==(int)ProductType.Salimax? "s3://"+installation.S3BucketId + "-3e5b3069-214a-43ee-8d85-57d72000c19d/"+startTimestamp : + "s3://"+installation.S3BucketId + "-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e/"+startTimestamp; + Console.WriteLine("Fetching data for "+startTimestamp); + + try + { + // Set up process start info + ProcessStartInfo startInfo = new ProcessStartInfo + { + FileName = "s3cmd", + Arguments = $"--config {configPath} ls {bucketPath}", + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + // Start the process + Process process = new Process + { + StartInfo = startInfo + }; + + process.Start(); + + // Read the output + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + + process.WaitForExit(); + + // Check for errors + if (process.ExitCode != 0) + { + Console.WriteLine("Error executing command:"); + Console.WriteLine(error); + } + else + { + // Define a regex pattern to match the filenames without .csv extension + + var pattern = @"/([^/]+)\.(csv|json)$"; + var regex = new Regex(pattern); + + // Process each line of the output + foreach (var line in output.Split('\n')) + { + var match = regex.Match(line); + + if (match.Success && long.Parse(match.Groups[1].Value) >= start && long.Parse(match.Groups[1].Value) <= end) + { + allTimestamps.Add(long.Parse(match.Groups[1].Value)); + //Console.WriteLine(match.Groups[1].Value); + } + } + + } + } + catch (Exception e) + { + Console.WriteLine($"Exception: {e.Message}"); + } + + startTimestamp++; + } + + int totalRecords = allTimestamps.Count; + if (totalRecords <= sampleSize) + { + // If the total records are less than or equal to the sample size, return all records + Console.WriteLine("Start timestamp = "+start +" end timestamp = "+end); + Console.WriteLine("SampledTimestamps = " + allTimestamps.Count); + return allTimestamps; + } + + int interval = totalRecords / sampleSize; + var sampledTimestamps = new List(); + + for (int i = 0; i < totalRecords; i += interval) + { + sampledTimestamps.Add(allTimestamps[i]); + } + + // If we haven't picked enough records (due to rounding), add the latest record to ensure completeness + if (sampledTimestamps.Count < sampleSize) + { + sampledTimestamps.Add(allTimestamps.Last()); + } + + Console.WriteLine("Start timestamp = "+start +" end timestamp = "+end); + Console.WriteLine("TotalRecords = "+totalRecords + " interval = "+ interval); + Console.WriteLine("SampledTimestamps = " + sampledTimestamps.Count); + + return sampledTimestamps; + } + + [HttpGet(nameof(GetUserById))] + public ActionResult GetUserById(Int64 id, Token authToken) + { + var session = Db.GetSession(authToken)?.User; + if (session == null) + return Unauthorized(); + + var user = Db.GetUserById(id); + + if (user is null || !session.HasAccessTo(user)) + return Unauthorized(); + + return user + .HidePassword() + .HideParentIfUserHasNoAccessToParent(session); + } + + + [HttpGet(nameof(GetInstallationById))] + public ActionResult GetInstallationById(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + return installation + .FillOrderNumbers() + .HideParentIfUserHasNoAccessToParent(user) + .HideWriteKeyIfUserIsNotAdmin(user.UserType); + } + + [HttpGet(nameof(GetUsersWithDirectAccessToInstallation))] + public ActionResult> GetUsersWithDirectAccessToInstallation(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + return installation + .UsersWithDirectAccess() + .Where(u => u.IsDescendantOf(user)) + .Select(u => u.HidePassword()) + .ToList(); + } + + [HttpGet(nameof(GetUsersWithInheritedAccessToInstallation))] + public ActionResult> GetUsersWithInheritedAccessToInstallation(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var installation = Db.GetInstallationById(id); + + if (installation is null || !user.HasAccessTo(installation)) + return Unauthorized(); + + return installation + .Ancestors() + .SelectMany(f => f.UsersWithDirectAccess() + .Where(u => u.IsDescendantOf(user)) + .Select(u => new { folderId = f.Id, folderName = f.Name, user = u.HidePassword() })) + .ToList(); + } + + [HttpGet(nameof(GetUsersWithDirectAccessToFolder))] + public ActionResult> GetUsersWithDirectAccessToFolder(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var folder = Db.GetFolderById(id); + + if (folder is null || !user.HasAccessTo(folder)) + return Unauthorized(); + + return folder + .UsersWithDirectAccess() + .Where(u => u.IsDescendantOf(user)) + .Select(u => u.HidePassword()) + .ToList(); + } + + [HttpGet(nameof(GetUsersWithInheritedAccessToFolder))] + public ActionResult> GetUsersWithInheritedAccessToFolder(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var folder = Db.GetFolderById(id); + + if (folder is null || !user.HasAccessTo(folder)) + return Unauthorized(); + + return folder + .Ancestors() + .SelectMany(f => f.UsersWithDirectAccess() + .Where(u => u.IsDescendantOf(user)) + .Select(u => new { folderId = f.Id, folderName = f.Name, user = u.HidePassword() })) + .ToList(); + } + + [HttpGet(nameof(GetFolderById))] + public ActionResult GetFolderById(Int64 id, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + var folder = Db.GetFolderById(id); + + if (folder is null || !user.HasAccessTo(folder)) + return Unauthorized(); + + return folder.HideParentIfUserHasNoAccessToParent(user); + } + + [HttpGet(nameof(GetAllDirectChildUsers))] + public ActionResult> GetAllDirectChildUsers(Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + return user.ChildUsers().Select(u => u.HidePassword()).ToList(); + } + + [HttpGet(nameof(GetAllChildUsers))] + public ActionResult> GetAllChildUsers(Token authToken) + { + var user = Db.GetSession(authToken)?.User; + if (user == null) + return Unauthorized(); + + return user + .DescendantUsers() + .Select(u => u.HidePassword()) + .ToList(); + } + + + [HttpGet(nameof(GetAllInstallations))] + public ActionResult> GetAllInstallations(Token authToken) + { + var user = Db.GetSession(authToken)?.User; + + if (user is null) + return Unauthorized(); + + return user + .AccessibleInstallations(product:(int)ProductType.Salimax) + .Select(i => i.FillOrderNumbers().HideParentIfUserHasNoAccessToParent(user).HideWriteKeyIfUserIsNotAdmin(user.UserType)) + .ToList(); + } + + [HttpGet(nameof(GetAllSalidomoInstallations))] + public ActionResult> GetAllSalidomoInstallations(Token authToken) + { + var user = Db.GetSession(authToken)?.User; + + if (user is null) + return Unauthorized(); + + return user + .AccessibleInstallations(product:(int)ProductType.Salidomo) + .ToList(); + } + + [HttpGet(nameof(GetAllSodioHomeInstallations))] + public ActionResult> GetAllSodioHomeInstallations(Token authToken) + { + var user = Db.GetSession(authToken)?.User; + + if (user is null) + return Unauthorized(); + + return user + .AccessibleInstallations(product:(int)ProductType.SodioHome) + .ToList(); + } + + + + [HttpGet(nameof(GetAllFolders))] + public ActionResult> GetAllFolders(Token authToken) + { + var user = Db.GetSession(authToken)?.User; + + if (user is null) + return Unauthorized(); + + return new(user.AccessibleFolders().HideParentIfUserHasNoAccessToParent(user)); + } + + + [HttpGet(nameof(GetAllFoldersAndInstallations))] + public ActionResult> GetAllFoldersAndInstallations(int productId, Token authToken) + { + var user = Db.GetSession(authToken)?.User; + + if (user is null) + return Unauthorized(); + + + var foldersAndInstallations = user + .AccessibleFoldersAndInstallations() + .Do(o => o.FillOrderNumbers()) + .Select(o => o.HideParentIfUserHasNoAccessToParent(user)) + .OfType(); // Important! JSON serializer must see Objects otherwise + // it will just serialize the members of TreeNode %&@#!!! + + // TODO Filter out write keys + return new (foldersAndInstallations); + } + + + [HttpPost(nameof(CreateUser))] + public async Task> CreateUser([FromBody] User newUser, Token authToken) + { + + var create = Db.GetSession(authToken).Create(newUser); + if (create) + { + var mail_success= await Db.SendNewUserEmail(newUser); + if (!mail_success) + { + Db.GetSession(authToken).Delete(newUser); + } + + return mail_success ? newUser.HidePassword():Unauthorized(); + } + + return Unauthorized() ; + } + + [HttpPost(nameof(CreateInstallation))] + public async Task> CreateInstallation([FromBody] Installation installation, Token authToken) + { + + var session = Db.GetSession(authToken); + + if (! await session.Create(installation)) + return Unauthorized(); + + return installation; + } + + [HttpPost(nameof(CreateFolder))] + public ActionResult CreateFolder([FromBody] Folder folder, Token authToken) + { + var session = Db.GetSession(authToken); + + if (!session.Create(folder)) + return Unauthorized(); + + return folder.HideParentIfUserHasNoAccessToParent(session!.User); + } + + [HttpPost(nameof(GrantUserAccessToFolder))] + public ActionResult GrantUserAccessToFolder(FolderAccess folderAccess, Token authToken) + { + var session = Db.GetSession(authToken); + + // TODO: automatic BadRequest when properties are null during deserialization + var folder = Db.GetFolderById(folderAccess.FolderId); + var user = Db.GetUserById(folderAccess.UserId); + + return session.GrantUserAccessTo(user, folder) + ? Ok() + : Unauthorized(); + } + + + [HttpPost(nameof(RevokeUserAccessToFolder))] + public ActionResult RevokeUserAccessToFolder(FolderAccess folderAccess, Token authToken) + { + var session = Db.GetSession(authToken); + + // TODO: automatic BadRequest when properties are null during deserialization + var folder = Db.GetFolderById(folderAccess.FolderId); + var user = Db.GetUserById(folderAccess.UserId); + + return session.RevokeUserAccessTo(user, folder) + ? Ok() + : Unauthorized(); + } + + + [HttpPost(nameof(GrantUserAccessToInstallation))] + public ActionResult GrantUserAccessToInstallation(InstallationAccess installationAccess, Token authToken) + { + var session = Db.GetSession(authToken); + + // TODO: automatic BadRequest when properties are null during deserialization + var installation = Db.GetInstallationById(installationAccess.InstallationId); + var user = Db.GetUserById(installationAccess.UserId); + + return session.GrantUserAccessTo(user, installation) + ? Ok() + : Unauthorized(); + } + + [HttpPost(nameof(RevokeUserAccessToInstallation))] + public ActionResult RevokeUserAccessToInstallation(InstallationAccess installationAccess, Token authToken) + { + var session = Db.GetSession(authToken); + + // TODO: automatic BadRequest when properties are null during deserialization + var installation = Db.GetInstallationById(installationAccess.InstallationId); + var user = Db.GetUserById(installationAccess.UserId); + + return session.RevokeUserAccessTo(user, installation) + ? Ok() + : Unauthorized(); + } + + + + [HttpPut(nameof(UpdateUser))] + public ActionResult UpdateUser([FromBody] User updatedUser, Token authToken) + { + var session = Db.GetSession(authToken); + + if (!session.Update(updatedUser)) + return Unauthorized(); + + return updatedUser.HidePassword(); + } + + + [HttpPut(nameof(UpdatePassword))] + public ActionResult UpdatePassword(String newPassword, Token authToken) + { + var session = Db.GetSession(authToken); + + return session.UpdatePassword(newPassword) + ? Ok() + : Unauthorized(); + } + + + + [HttpPut(nameof(UpdateInstallation))] + public ActionResult UpdateInstallation([FromBody] Installation installation, Token authToken) + { + var session = Db.GetSession(authToken); + + if (!session.Update(installation)) + return Unauthorized(); + + if (installation.Product == (int)ProductType.Salimax) + { + return installation.FillOrderNumbers().HideParentIfUserHasNoAccessToParent(session!.User).HideWriteKeyIfUserIsNotAdmin(session.User.UserType); + } + + return installation.HideParentIfUserHasNoAccessToParent(session!.User); + } + + [HttpPost(nameof(AcknowledgeError))] + public ActionResult AcknowledgeError(Int64 id, Token authToken) + { + var session = Db.GetSession(authToken); + + if (session == null) + return Unauthorized(); + + var error=Db.Errors + .FirstOrDefault(error => error.Id == id); + + error.Seen = true; + + return Db.Update(error) + ? Ok() + : Unauthorized(); + } + + [HttpPost(nameof(AcknowledgeWarning))] + public ActionResult AcknowledgeWarning(Int64 id, Token authToken) + { + var session = Db.GetSession(authToken); + + if (session == null) + return Unauthorized(); + + var warning=Db.Warnings + .FirstOrDefault(warning => warning.Id == id); + + warning.Seen = true; + + return Db.Update(warning) + ? Ok() + : Unauthorized(); + } + + [HttpPut(nameof(UpdateFolder))] + public ActionResult UpdateFolder([FromBody] Folder folder, Token authToken) + { + var session = Db.GetSession(authToken); + + if (!session.Update(folder)) + return Unauthorized(); + + return folder.HideParentIfUserHasNoAccessToParent(session!.User); + } + + [HttpPut(nameof(MoveInstallation))] + public ActionResult MoveInstallation(Int64 installationId,Int64 parentId, Token authToken) + { + var session = Db.GetSession(authToken); + + return session.MoveInstallation(installationId, parentId) + ? Ok() + : Unauthorized(); + } + + [HttpPost(nameof(UpdateFirmware))] + public async Task UpdateFirmware(Int64 batteryNode, Int64 installationId,String version,Token authToken) + { + var session = Db.GetSession(authToken); + var installationToUpdate = Db.GetInstallationById(installationId); + + + if (installationToUpdate != null) + { + _ = session.RunScriptInBackground(installationToUpdate.VpnIp, batteryNode,version,installationToUpdate.Product); + } + + return Ok(); + } + + private static Dictionary JobStatuses = new Dictionary(); + + [HttpPost("StartDownloadBatteryLog")] + public async Task> StartDownloadBatteryLog(long batteryNode, long installationId, Token authToken) + { + var session = Db.GetSession(authToken); + var installationToDownload = Db.GetInstallationById(installationId); + + if (installationToDownload != null) + { + string jobId = Guid.NewGuid().ToString(); + _ = Task.Run(async () => + { + await session.RunDownloadLogScript(installationToDownload.VpnIp, batteryNode, installationToDownload.Product); + string fileName = $"{installationToDownload.VpnIp}-node{batteryNode}-{DateTime.Now:dd-MM-yyyy}.bin"; + string filePath = $"/home/ubuntu/backend/downloadBatteryLog/{fileName}"; + + if (System.IO.File.Exists(filePath)) + { + SaveJobStatus(jobId, "Completed", fileName:fileName); + } + else + { + SaveJobStatus(jobId, "Failed"); + } + }); + + // Store initial job status in in-memory storage + SaveJobStatus(jobId, "Processing"); + + return Ok(jobId); + } + + return NotFound(); + } + + [HttpGet("DownloadBatteryLog")] + public async Task DownloadBatteryLog(string jobId) + + { + Console.WriteLine("-----------------------------------Start uploading battery log-----------------------------------"); + var jobStatus = JobStatuses.TryGetValue(jobId, out var status) ? status : null; + if (jobStatus == null || jobStatus.Status != "Completed" || string.IsNullOrEmpty(jobStatus.FileName)) + { + return NotFound(); + } + + string fileName = jobStatus.FileName; + string filePath = $"/home/ubuntu/backend/downloadBatteryLog/{fileName}"; + + if (!System.IO.File.Exists(filePath)) + { + return NotFound(); + } + + string contentType = "application/octet-stream"; + var memory = new MemoryStream(); + await using (var stream = new FileStream(filePath, FileMode.Open)) + { + await stream.CopyToAsync(memory); + } + memory.Position = 0; + + var fileContentResult = new FileContentResult(memory.ToArray(), contentType) + { + //FileDownloadName = Path.GetFileName(filePath) + FileDownloadName = fileName + }; + + Console.WriteLine("-----------------------------------Stop uploading battery log-----------------------------------"); + + return fileContentResult; + } + + [HttpDelete("DeleteBatteryLog")] + public IActionResult DeleteBatteryLog(string fileName) + { + Console.WriteLine("-----------------------------------Start deleting downloaded battery log-----------------------------------"); + string filePath = $"/home/ubuntu/backend/downloadBatteryLog/{fileName}"; + try + { + if (System.IO.File.Exists(filePath)) + { + System.IO.File.Delete(filePath); + Console.WriteLine("-----------------------------------Stop deleting downloaded battery log-----------------------------------"); + return Ok(); + } + else + { + return NotFound("File not found."); + } + } + catch (Exception ex) + { + return StatusCode(500, $"Internal server error: {ex.Message}"); + } + } + + private void SaveJobStatus(string jobId, string status, string fileName = null) + { + JobStatuses[jobId] = new JobStatus + { + JobId = jobId, + Status = status, + FileName = fileName, + StartTime = DateTime.UtcNow // Initialize StartTime when saving + }; + } + + [HttpGet("GetJobResult")] + public ActionResult GetJobResult(string jobId) + { + if (string.IsNullOrEmpty(jobId)) + { + return BadRequest(new { status = "Error", message = "Job ID is required." }); + } + + if (!JobStatuses.TryGetValue(jobId, out var jobStatus)) + { + return NotFound(); + } + + if (jobStatus.Status == "Completed") + { + return Ok(new { status = "Completed", fileName = jobStatus.FileName }); + } + else if (jobStatus.Status == "Failed") + { + return StatusCode(500, new { status = "Failed", message = "Job processing failed." }); + } + else if (jobStatus.Status == "Processing") + { + // Check for timeout + var startTime = jobStatus.StartTime; + var currentTime = DateTime.UtcNow; + + if ((currentTime - startTime).TotalMinutes > 60)//60 minutes as timeout => Running multiple tasks in parallel on a crowded backend server will increase the time each task takes to complete + { + return StatusCode(500, new { status = "Failed", message = "Job in back end timeout exceeded." }); + } + + return Ok(new { status = "Processing" }); + } + else + { + return BadRequest(new { status = "Unknown", message = "Unknown job status." }); + } + } + + + [HttpPost(nameof(InsertNewAction))] + public async Task>> InsertNewAction([FromBody] UserAction action, Token authToken) + { + var session = Db.GetSession(authToken); + var actionSuccess = await session.InsertUserAction(action); + return actionSuccess ? Ok() : Unauthorized(); + + } + + [HttpPost(nameof(UpdateAction))] + public async Task>> UpdateAction([FromBody] UserAction action, Token authToken) + { + var session = Db.GetSession(authToken); + var actionSuccess = await session.UpdateUserAction(action); + return actionSuccess ? Ok() : Unauthorized(); + } + + + [HttpPost(nameof(DeleteAction))] + public async Task>> DeleteAction(Int64 actionId, Token authToken) + { + var session = Db.GetSession(authToken); + var actionSuccess = await session.DeleteUserAction(actionId); + return actionSuccess ? Ok() : Unauthorized(); + } + + + [HttpPost(nameof(EditInstallationConfig))] + public async Task>> EditInstallationConfig([FromBody] Configuration config, Int64 installationId,Token authToken) + { + var session = Db.GetSession(authToken); + + // Send configuration changes + var success = await session.SendInstallationConfig(installationId, config); + + // Record configuration change + if (success) + { + // Create a new UserAction object + var action = new UserAction + { + InstallationId = installationId, + Timestamp = DateTime.Now, + Description = config.GetConfigurationString() + }; + + var actionSuccess = await session.InsertUserAction(action); + return actionSuccess?Ok():Unauthorized(); + } + + return Unauthorized(); + + } + + [HttpPut(nameof(MoveFolder))] + public ActionResult MoveFolder(Int64 folderId,Int64 parentId, Token authToken) + { + var session = Db.GetSession(authToken); + + return session.MoveFolder(folderId, parentId) + ? Ok() + : Unauthorized(); + } + + [HttpDelete(nameof(DeleteUser))] + public ActionResult DeleteUser(Int64 userId, Token authToken) + { + var session = Db.GetSession(authToken); + var user = Db.GetUserById(userId); + + return session.Delete(user) + ? Ok() + : Unauthorized(); + } + + [HttpDelete(nameof(DeleteInstallation))] + public async Task DeleteInstallation(Int64 installationId, Token authToken) + { + var session = Db.GetSession(authToken); + var installation = Db.GetInstallationById(installationId); + + return await session.Delete(installation) + ? Ok() + : Unauthorized(); + } + + [HttpDelete(nameof(DeleteFolder))] + public ActionResult DeleteFolder(Int64 folderId, Token authToken) + { + var session = Db.GetSession(authToken); + var folder = Db.GetFolderById(folderId); + + return session.Delete(folder) + ? Ok() + : Unauthorized(); + + } + + [HttpPost(nameof(ResetPasswordRequest))] + public async Task>> ResetPasswordRequest(String username) + { + var user = Db.GetUserByEmail(username); + + if (user is null) + return Unauthorized(); + + var session = new Session(user.HidePassword().HideParentIfUserHasNoAccessToParent(user)); + var success = Db.Create(session); + + return success && await Db.SendPasswordResetEmail(user, session.Token) + ? Ok() + : Unauthorized(); + } + + + [HttpGet(nameof(ResetPassword))] + public ActionResult ResetPassword(Token token) + { + var user = Db.GetSession(token)?.User; + + if (user is null) + return Unauthorized(); + + Db.DeleteUserPassword(user); + + return Redirect($"https://monitor.innov.energy/?username={user.Email}&reset=true"); // TODO: move to settings file + } + +} + + + diff --git a/csharp/App_backup/Backend/DataTypes/Configuration.cs b/csharp/App_backup/Backend/DataTypes/Configuration.cs new file mode 100644 index 000000000..76ac6edbe --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Configuration.cs @@ -0,0 +1,20 @@ +namespace InnovEnergy.App.Backend.DataTypes; + +public class Configuration +{ + public Double MinimumSoC { get; set; } + public Double GridSetPoint { get; set; } + public CalibrationChargeType CalibrationChargeState { get; set; } + public DateTime CalibrationChargeDate { get; set; } + public String GetConfigurationString() + { + return $"MinimumSoC: {MinimumSoC}, GridSetPoint: {GridSetPoint}, CalibrationChargeState: {CalibrationChargeState}, CalibrationChargeDate: {CalibrationChargeDate}"; + } +} + +public enum CalibrationChargeType +{ + RepetitivelyEvery, + AdditionallyOnce, + ChargePermanently +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Error.cs b/csharp/App_backup/Backend/DataTypes/Error.cs new file mode 100644 index 000000000..bbddb018a --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Error.cs @@ -0,0 +1,24 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.DataTypes; + +public abstract class LogEntry +{ + [PrimaryKey, AutoIncrement] + public Int64 Id { get; set; } + public Int64 InstallationId { get; set; } + public String Description { get; set; } = null!; + public String Date { get; set; } = null!; + public String Time { get; set; } = null!; + public String DeviceCreatedTheMessage{ get; set; } = null!; + public Boolean Seen { get; set; } +} + +// Derived class for errors +public class Error : LogEntry +{ +} + +public class Warning : LogEntry +{ +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Folder.cs b/csharp/App_backup/Backend/DataTypes/Folder.cs new file mode 100644 index 000000000..e953821bc --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Folder.cs @@ -0,0 +1,3 @@ +namespace InnovEnergy.App.Backend.DataTypes; + +public class Folder : TreeNode { } \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Installation.cs b/csharp/App_backup/Backend/DataTypes/Installation.cs new file mode 100644 index 000000000..19e174222 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Installation.cs @@ -0,0 +1,49 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.DataTypes; + +public enum ProductType +{ + Salimax = 0, + Salidomo = 1, + SodioHome =2 +} + +public enum StatusType +{ + Offline = -1, + Green = 0, + Warning = 1, + Alarm = 2 +} + +public class Installation : TreeNode +{ + //Each installation has 2 roles, a read role and a write role. + //There are 2 keys per role a public key and a secret + //Product can be 0 or 1, 0 for Salimax, 1 for Salidomo + public String Location { get; set; } = ""; + public String Region { get; set; } = ""; + public String Country { get; set; } = ""; + public String VpnIp { get; set; } = ""; + public String InstallationName { get; set; } = ""; + + public String S3Region { get; set; } = "sos-ch-dk-2"; + public String S3Provider { get; set; } = "exo.io"; + public String S3WriteKey { get; set; } = ""; + public String S3Key { get; set; } = ""; + public String S3WriteSecret { get; set; } = ""; + public String S3Secret { get; set; } = ""; + public int S3BucketId { get; set; } = 0; + public String ReadRoleId { get; set; } = ""; + public String WriteRoleId { get; set; } = ""; + public Boolean TestingMode { get; set; } = false; + public int Status { get; set; } = -1; + public int Product { get; set; } = (int)ProductType.Salimax; + public int Device { get; set; } = 0; + public string SerialNumber { get; set; } = ""; + + [Ignore] + public String OrderNumbers { get; set; } + public String VrmLink { get; set; } = ""; +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Methods/ExoCmd.cs b/csharp/App_backup/Backend/DataTypes/Methods/ExoCmd.cs new file mode 100644 index 000000000..56d3e991e --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Methods/ExoCmd.cs @@ -0,0 +1,445 @@ +using System.Text.Json; +using InnovEnergy.Lib.S3Utils; +using InnovEnergy.Lib.S3Utils.DataTypes; +using System.Diagnostics.CodeAnalysis; +using System.Net; +using System.Net.Http.Headers; +using System.Net.Sockets; +using System.Text; +using System.Text.Json.Nodes; +using InnovEnergy.App.Backend.Database; + +namespace InnovEnergy.App.Backend.DataTypes.Methods; + +public static class ExoCmd +{ + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + public static readonly S3Credentials S3Credentials = JsonSerializer.Deserialize(File.OpenRead("./Resources/exoscaleS3.json"))!; + + private static Byte[] HmacSha256Digest(String message, String secret) + { + var encoding = new UTF8Encoding(); + var keyBytes = encoding.GetBytes(secret); + var messageBytes = encoding.GetBytes(message); + var cryptographer = new System.Security.Cryptography.HMACSHA256(keyBytes); + + var bytes = cryptographer.ComputeHash(messageBytes); + return bytes; + } + + + private static String BuildSignature(String method, String path, String? data, Int64 time) + { + var messageToSign = ""; + messageToSign += method + " /v2/" + path + "\n"; + messageToSign += data + "\n"; + + // query strings + messageToSign += "\n"; + // headers + messageToSign += "\n"; + + messageToSign += time; + + //Console.WriteLine("Message to sign:\n" + messageToSign); + + + var hmac = HmacSha256Digest(messageToSign, S3Credentials.Secret); + return Convert.ToBase64String(hmac); + } + + private static String BuildSignature(String method, String path, Int64 time) + { + return BuildSignature(method, path, null, time); + } + + public static async Task GetAccessKeys() + { + + var url = "https://api-ch-dk-2.exoscale.com/v2/api-key"; + var method = "api-key"; + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()+60; + + var authheader = "credential="+S3Credentials.Key+",signed-query-args="+",expires="+unixtime+",signature="+BuildSignature("GET", method, unixtime); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + + var response = await client.GetAsync(url); + var responseString = await response.Content.ReadAsStringAsync(); + + var responseJson = JsonNode.Parse(responseString) ; + Console.WriteLine(responseJson["api-keys"].AsArray().Count); + + return responseJson["api-keys"].AsArray(); + } + + public static async Task<(String,String)> CreateReadKey(this Installation installation) + { + var readRoleId = installation.ReadRoleId; + + + if (String.IsNullOrEmpty(readRoleId) + ||! await CheckRoleExists(readRoleId)) + { + readRoleId = await installation.CreateReadRole(); + Thread.Sleep(4000); // Exoscale is to slow for us the role might not be there yet + } + return await CreateKey(installation, readRoleId); + } + + private static async Task CheckRoleExists(String roleId) + { + const String url = "https://api-ch-dk-2.exoscale.com/v2/iam-role"; + const String method = "iam-role"; + + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()+60; + + var authheader = "credential="+S3Credentials.Key+",signed-query-args="+",expires="+unixtime+",signature="+BuildSignature("GET", method, unixtime); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + + var response = await client.GetAsync(url); + var responseString = await response.Content.ReadAsStringAsync(); + return responseString.Contains(roleId); + } + + private static async Task<(String,String)> CreateKey(Installation installation, String roleName) + { + var url = "https://api-ch-dk-2.exoscale.com/v2/api-key"; + var method = "api-key"; + var contentString = $$"""{"role-id": "{{roleName}}", "name":"{{ installation.BucketName()}}"}"""; + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + 60; + + + var authheader = "credential=" + S3Credentials.Key + ",expires=" + unixtime + ",signature=" + + BuildSignature("POST", method, contentString, unixtime); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + var content = new StringContent(contentString, Encoding.UTF8, "application/json"); + + var response = await client.PostAsync(url, content); + if (response.StatusCode != HttpStatusCode.OK){ + Console.WriteLine("Fuck"); + } + //Console.WriteLine($"Created Key for {installation.InstallationName}"); + var responseString = await response.Content.ReadAsStringAsync(); + + var responseJson = JsonNode.Parse(responseString) ; + return (responseJson!["key"]!.GetValue(), responseJson!["secret"]!.GetValue()); + } + + + public static async Task CreateReadRole(this Installation installation) + { + const String url = "https://api-ch-dk-2.exoscale.com/v2/iam-role"; + const String method = "iam-role"; + String rolename = installation.Product==(int)ProductType.Salimax?Db.Installations.Count(f => f.Product == (int)ProductType.Salimax) + installation.Name:Db.Installations.Count(f => f.Product == (int)ProductType.Salidomo) + installation.Name; + + + var contentString = $$""" + { + "name" : "{{rolename}}", + "policy" : { + "default-service-strategy": "deny", + "services": { + "sos": { + "type": "rules", + "rules": [ + { + "expression": "operation == 'get-object' && resources.bucket.startsWith('{{installation.BucketName()}}')", + "action": "allow" + } + ] + } + } + } + } + """; + + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()+60; + var authheader = "credential="+S3Credentials.Key+",signed-query-args="+",expires="+unixtime+",signature="+BuildSignature("POST", method, contentString, unixtime); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + var content = new StringContent(contentString, Encoding.UTF8, "application/json"); + + + var response = await client.PostAsync(url, content); + + var responseString = await response.Content.ReadAsStringAsync(); + //Console.WriteLine(responseString); + + //Put Role ID into database + var id = JsonNode.Parse(responseString)!["reference"]!["id"]!.GetValue(); + installation.ReadRoleId = id; + Db.Update(installation); + return id; + } + + public static async Task RemoveReadRole(this Installation installation) + { + var roleId = installation.ReadRoleId; + var url = $"https://api-ch-dk-2.exoscale.com/v2/iam-role/{roleId}"; + var method = $"iam-role/{roleId}"; + + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + 60; + var authheader = "credential=" + S3Credentials.Key + ",expires=" + unixtime + ",signature=" + BuildSignature("DELETE", method, unixtime); + + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + + try + { + var response = await client.DeleteAsync(url); + + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Successfully deleted read role with ID {roleId}."); + return true; + } + + Console.WriteLine($"Failed to delete read role. HTTP Status: {response.StatusCode}. Response: {await response.Content.ReadAsStringAsync()}"); + return false; + } + catch (Exception ex) + { + Console.WriteLine($"Error occurred while deleting read role: {ex.Message}"); + return false; + } + } + + public static async Task RemoveWriteRole(this Installation installation) + { + var roleId = installation.WriteRoleId; + var url = $"https://api-ch-dk-2.exoscale.com/v2/iam-role/{roleId}"; + var method = $"iam-role/{roleId}"; + + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + 60; + var authheader = "credential=" + S3Credentials.Key + ",expires=" + unixtime + ",signature=" + BuildSignature("DELETE", method, unixtime); + + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + + try + { + var response = await client.DeleteAsync(url); + + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Successfully deleted write role with ID {roleId}."); + return true; + } + + Console.WriteLine($"Failed to delete write role. HTTP Status: {response.StatusCode}. Response: {await response.Content.ReadAsStringAsync()}"); + return false; + } + catch (Exception ex) + { + Console.WriteLine($"Error occurred while deleting write role: {ex.Message}"); + return false; + } + } + + + public static async Task RevokeReadKey(this Installation installation) + { + //Check exoscale documentation https://openapi-v2.exoscale.com/topic/topic-api-request-signature + + var url = $"https://api-ch-dk-2.exoscale.com/v2/access-key/{installation.S3Key}"; + var method = $"access-key/{installation.S3Key}"; + + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()+60; + + var authheader = "credential="+S3Credentials.Key+",expires="+unixtime+",signature="+BuildSignature("DELETE", method, unixtime); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + + var response = await client.DeleteAsync(url); + return response.IsSuccessStatusCode; + } + + public static async Task RevokeWriteKey(this Installation installation) + { + //Check exoscale documentation https://openapi-v2.exoscale.com/topic/topic-api-request-signature + + var url = $"https://api-ch-dk-2.exoscale.com/v2/access-key/{installation.S3WriteKey}"; + var method = $"access-key/{installation.S3WriteKey}"; + + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()+60; + + var authheader = "credential="+S3Credentials.Key+",expires="+unixtime+",signature="+BuildSignature("DELETE", method, unixtime); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + + var response = await client.DeleteAsync(url); + return response.IsSuccessStatusCode; + } + + public static async Task<(String, String)> CreateWriteKey(this Installation installation) + { + var writeRoleId = installation.WriteRoleId; + + if (String.IsNullOrEmpty(writeRoleId) + || !await CheckRoleExists(writeRoleId)) + { + writeRoleId = await installation.CreateWriteRole(); + Thread.Sleep(4000); // Exoscale is to slow for us the role might not be there yet + } + return await CreateKey(installation, writeRoleId); + } + + public static async Task CreateWriteRole(this Installation installation) + { + const String url = "https://api-ch-dk-2.exoscale.com/v2/iam-role"; + const String method = "iam-role"; + String rolename = installation.Product==(int)ProductType.Salimax?Db.Installations.Count(f => f.Product == (int)ProductType.Salimax) + installation.Name:Db.Installations.Count(f => f.Product == (int)ProductType.Salidomo) + installation.Name; + + var contentString = $$""" + { + "name" : "WRITE{{rolename}}", + "policy" : { + "default-service-strategy": "deny", + "services": { + "sos": { + "type": "rules", + "rules":[{ + "action" : "allow", + "expression": "resources.bucket.startsWith('{{installation.BucketName()}}')" + }] + } + } + } + } + """; + + var unixtime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()+60; + + var authheader = "credential="+S3Credentials.Key+",signed-query-args="+",expires="+unixtime+",signature="+BuildSignature("POST", method, contentString, unixtime); + + var client = new HttpClient(); + + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("EXO2-HMAC-SHA256", authheader); + var content = new StringContent(contentString, Encoding.UTF8, "application/json"); + + + var response = await client.PostAsync(url, content); + + var responseString = await response.Content.ReadAsStringAsync(); + //Console.WriteLine(responseString); + + //Put Role ID into database + var id = JsonNode.Parse(responseString)!["reference"]!["id"]!.GetValue(); + installation.WriteRoleId = id; + ; + Db.Update(installation); + + return id; + } + + public static async Task CreateBucket(this Installation installation) + { + var s3Region = new S3Region($"https://{installation.S3Region}.{installation.S3Provider}", S3Credentials!); + return await s3Region.PutBucket(installation.BucketName()) != null; + } + + public static async Task DeleteBucket(this Installation installation) + { + var s3Region = new S3Region($"https://{installation.S3Region}.{installation.S3Provider}", S3Credentials!); + return await s3Region.DeleteBucket(installation.BucketName()) ; + } + + + public static async Task SendConfig(this Installation installation, Configuration config) + { + + // This looks hacky but here we grab the vpn-Ip of the installation by its installation Name (e.g. Salimax0001) + // From the vpn server (here salidomo, but we use the vpn home ip for future-proofing) + // using var client = new HttpClient(); + // var webRequest = client.GetAsync("10.2.0.1/vpnstatus.txt"); + // var text = webRequest.ToString(); + // var lines = text!.Split(new [] { Environment.NewLine }, StringSplitOptions.None); + // var vpnIp = lines.First(l => l.Contains(installation.InstallationName)).Split(",")[1]; + // + // // Writing the config to a file and then sending that file with rsync sounds inefficient + // // We should find a better solution... + // // TODO The VPN server should do this not the backend!!! + // await File.WriteAllTextAsync("./config.json", config); + // var result = await Cli.Wrap("rsync") + // .WithArguments("./config.json") + // .AppendArgument($@"root@{vpnIp}:/salimax") + // .ExecuteAsync(); + + // return result.ExitCode == 200; + + var maxRetransmissions = 4; + UdpClient udpClient = new UdpClient(); + udpClient.Client.ReceiveTimeout = 2000; + int port = 9000; + + Console.WriteLine("Trying to reach installation with IP: " + installation.VpnIp); + //Try at most MAX_RETRANSMISSIONS times to reach an installation. + for (int j = 0; j < maxRetransmissions; j++) + { + //string message = "This is a message from RabbitMQ server, you can subscribe to the RabbitMQ queue"; + byte[] data = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(config)); + udpClient.Send(data, data.Length, installation.VpnIp, port); + + //Console.WriteLine($"Sent UDP message to {installation.VpnIp}:{port}: {config}"); + Console.WriteLine($"Sent UDP message to {installation.VpnIp}:{port}"+" GridSetPoint is "+config.GridSetPoint +" and MinimumSoC is "+config.MinimumSoC); + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(installation.VpnIp), port); + + try + { + byte[] replyData = udpClient.Receive(ref remoteEndPoint); + string replyMessage = Encoding.UTF8.GetString(replyData); + Console.WriteLine("Received " + replyMessage + " from installation " + installation.VpnIp); + return true; + } + catch (SocketException ex) + { + if (ex.SocketErrorCode == SocketError.TimedOut){Console.WriteLine("Timed out waiting for a response. Retry...");} + else + { + Console.WriteLine("Error: " + ex.Message); + return false; + } + } + } + + + return false; + + //var s3Region = new S3Region($"https://{installation.S3Region}.{installation.S3Provider}", S3Credentials!); + //var url = s3Region.Bucket(installation.BucketName()).Path("config.json"); + //return await url.PutObject(config); + + + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Methods/Folder.cs b/csharp/App_backup/Backend/DataTypes/Methods/Folder.cs new file mode 100644 index 000000000..e06fd2c91 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Methods/Folder.cs @@ -0,0 +1,100 @@ +using InnovEnergy.App.Backend.Database; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.Backend.DataTypes.Methods; + +public static class FolderMethods +{ + public static IEnumerable UsersWithAccess(this Folder folder) + { + var direct = folder.UsersWithDirectAccess(); + var inherited = folder.UsersWithInheritedAccess(); + + return direct.Concat(inherited); + } + + public static IEnumerable UsersWithDirectAccess(this Folder folder) + { + return Db + .FolderAccess + .Where(a => a.FolderId == folder.Id) + .Select(a => Db.GetUserById(a.UserId)) + .NotNull(); + } + + public static IEnumerable UsersWithInheritedAccess(this Folder folder) + { + return folder + .Ancestors() + .SelectMany(f => f.UsersWithDirectAccess()) + .NotNull(); + } + + private static IEnumerable ChildFolders(this Folder parent) + { + // Unsafe can give back loops + return Db + .Folders + .Where(f => f.ParentId == parent.Id); + } + + public static IEnumerable UniqueChildFolders(this Folder parent) + { + + //var set = new HashSet(Db.Folders, EqualityComparer.Default); + + return ChildFolders(parent); + } + + public static IEnumerable ChildInstallations(this Folder parent) + { + return Db + .Installations + .Where(f => f.ParentId == parent.Id); + } + + + public static IEnumerable DescendantFolders(this Folder parent) + { + + Console.WriteLine("Parent is "+parent.Id+" looking for descendant folders"); + return parent + .TraverseDepthFirstPreOrder(UniqueChildFolders) + .Skip(1); // skip self + } + + public static IEnumerable DescendantFoldersAndSelf(this Folder parent) + { + return parent + .TraverseDepthFirstPreOrder(UniqueChildFolders); + } + public static Boolean IsDescendantOf(this Folder folder, Folder ancestor) + { + return folder + .Ancestors() + .Any(u => u.Id == ancestor.Id); + } + + public static IEnumerable Ancestors(this Folder folder) + { + return folder + .Unfold(Parent) + .Skip(1); // skip self + } + + public static Folder? Parent(this Folder folder) + { + return IsRoot(folder) + ? null + : Db.GetFolderById(folder.ParentId); + } + + public static Boolean IsRoot(this Folder folder) + { + return folder.ParentId <= 0 + && Db.GetFolderById(folder.Id)?.Id == 0; // might have been 0 because it is a relative root + } + + +} + diff --git a/csharp/App_backup/Backend/DataTypes/Methods/Installation.cs b/csharp/App_backup/Backend/DataTypes/Methods/Installation.cs new file mode 100644 index 000000000..cc5ebda69 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Methods/Installation.cs @@ -0,0 +1,161 @@ +using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.Relations; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.Backend.DataTypes.Methods; + + +public static class InstallationMethods +{ + private static readonly String BucketNameSalt = + // Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "" + // ? "stage" :"3e5b3069-214a-43ee-8d85-57d72000c19d"; + "3e5b3069-214a-43ee-8d85-57d72000c19d"; + + private static readonly String SalidomoBucketNameSalt = "c0436b6a-d276-4cd8-9c44-1eae86cf5d0e"; + + public static String BucketName(this Installation installation) + { + if (installation.Product == (int)ProductType.Salimax) + { + return $"{installation.S3BucketId}-{BucketNameSalt}"; + } + + return $"{installation.S3BucketId}-{SalidomoBucketNameSalt}"; + + } + + public static async Task RenewS3Credentials(this Installation installation) + { + if(!installation.S3Key.IsNullOrEmpty()) + await installation.RevokeReadKey(); + + + var (key,secret) = await installation.CreateReadKey(); + + installation.S3Key = key; + installation.S3Secret = secret; + + if (installation.S3WriteKey == "" || installation.S3WriteSecret == "") + { + var (writeKey,writeSecret) = await installation.CreateWriteKey(); + installation.S3WriteSecret = writeSecret; + installation.S3WriteKey = writeKey; + } + + return Db.Update(installation); + } + + + public static IEnumerable UsersWithAccess(this Installation installation) + { + return installation + .UsersWithDirectAccess() + .Concat(installation.UsersWithInheritedAccess()); + } + + public static IEnumerable UsersWithDirectAccess(this Installation installation) + { + return Db + .InstallationAccess + .Where(a => a.InstallationId == installation.Id) + .Select(a => Db.GetUserById(a.UserId)) + .NotNull(); + } + + public static IEnumerable UsersWithInheritedAccess(this Installation installation) + { + return installation + .Ancestors() + .SelectMany(f => f.UsersWithDirectAccess()) + .NotNull(); + } + + public static IEnumerable Ancestors(this Installation installation) + { + var parentFolder = Parent(installation); + + if (parentFolder is null) + return Enumerable.Empty(); + + return parentFolder + .Ancestors() + .Prepend(parentFolder); + } + + public static Folder? Parent(this Installation installation) + { + if (installation.ParentId <= 0) // relative root + { + var i = Db.GetInstallationById(installation.Id); + if (i is null) + return null; + + installation = i; + } + + return Db.GetFolderById(installation.ParentId); + } + + public static Installation HideWriteKeyIfUserIsNotAdmin(this Installation installation, int userIsAdmin) + { + if(userIsAdmin==2) + return installation; + + installation.S3WriteKey = ""; + installation.S3WriteSecret = ""; + + return installation; + } + + public static Boolean WasMoved(this Installation installation) + { + var existingInstallation = Db.GetInstallationById(installation.Id); + + return existingInstallation is not null + && existingInstallation.ParentId != installation.ParentId; + } + + public static Boolean Exists(this Installation installation) + { + return Db.Installations.Any(i => i.Id == installation.Id); + } + + public static String GetOrderNumbers(this Installation installation) + { + return Db.OrderNumber2Installation + .Where(i => i.InstallationId == installation.Id) + .Select(i => i.OrderNumber) + .ToReadOnlyList().JoinWith(","); + } + + public static Installation FillOrderNumbers(this Installation installation) + { + installation.OrderNumbers = installation.GetOrderNumbers(); + return installation; + } + + public static Boolean SetOrderNumbers(this Installation installation) + { + var relations = Db.OrderNumber2Installation.Where(i => i.InstallationId == installation.Id).ToList(); + foreach (var orderNumber in installation.OrderNumbers.Split(",")) + { + var rel = relations.FirstOrDefault(i => i.OrderNumber == orderNumber); + if ( rel != null) {relations.Remove(rel); continue;} + var o2I = new OrderNumber2Installation + { + OrderNumber = orderNumber, + InstallationId = installation.Id + }; + Db.Create(o2I); + } + + foreach (var rel in relations) + { + Db.Delete(rel); + } + + return true; + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Methods/Session.cs b/csharp/App_backup/Backend/DataTypes/Methods/Session.cs new file mode 100644 index 000000000..5880891c6 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Methods/Session.cs @@ -0,0 +1,430 @@ +using System.Diagnostics; +using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.Relations; +using InnovEnergy.App.Backend.Websockets; +using InnovEnergy.Lib.Utils; +using Org.BouncyCastle.Asn1.X509; + +namespace InnovEnergy.App.Backend.DataTypes.Methods; + +public static class SessionMethods +{ + public static Boolean Create(this Session? session, Folder? folder) + { + var user = session?.User; + + return user is not null + && folder is not null + && user.UserType!=0 + && user.HasAccessTo(folder.Parent()) + && Db.Create(folder) // TODO: these two in a transaction + && Db.Create(new FolderAccess { UserId = user.Id, FolderId = folder.Id }); + } + + public static Boolean Update(this Session? session, Folder? folder) + { + var user = session?.User; + var original = Db.GetFolderById(folder?.Id); + + return user is not null + && folder is not null + && original is not null + && user.UserType !=0 + && user.HasAccessTo(folder) + && folder + .WithParentOf(original) // prevent moving + .Apply(Db.Update); + } + + public static Boolean MoveFolder(this Session? session, Int64 folderId, Int64 parentId) + { + var user = session?.User; + var folder = Db.GetFolderById(folderId); + var parent = Db.GetFolderById(parentId); + + return user is not null + && folder is not null + && user.UserType !=0 + && user.HasAccessTo(folder) + && user.HasAccessTo(parent) + && folder + .Do(() => folder.ParentId = parentId) + .Apply(Db.Update); + } + + public static Boolean MoveInstallation(this Session? session, Int64 installationId, Int64 parentId) + { + var user = session?.User; + var installation = Db.GetInstallationById(installationId); + var parent = Db.GetFolderById(parentId); + + if(installation == null || installation.ParentId == parentId) return false; + + return user is not null + && user.UserType !=0 + && user.HasAccessTo(installation) + && user.HasAccessTo(parent) + && installation + .Do(() => installation.ParentId = parentId) + .Apply(Db.Update); + } + + public static async Task RunScriptInBackground(this Session? session, String vpnIp, Int64 batteryNode,String version,Int64 product) + { + Console.WriteLine("-----------------------------------Start updating firmware-----------------------------------"); + string scriptPath = (product == (int)ProductType.Salimax) + ? "/home/ubuntu/backend/uploadBatteryFw/update_firmware_Salimax.sh" + : "/home/ubuntu/backend/uploadBatteryFw/update_firmware_Salidomo.sh"; + + await Task.Run(() => + { + var process = new Process(); + process.StartInfo.FileName = "/bin/bash"; + process.StartInfo.Arguments = $"{scriptPath} {vpnIp} {batteryNode} {version}"; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardOutput = true; + + process.Start(); + var output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + Console.WriteLine(output); + }); + Console.WriteLine("-----------------------------------Stop updating firmware-----------------------------------"); + } + + public static async Task RunDownloadLogScript(this Session? session, String vpnIp, Int64 batteryNode,Int64 product) + { + Console.WriteLine("-----------------------------------Start downloading battery log-----------------------------------"); + string scriptPath = (product == (int)ProductType.Salimax) + ? "/home/ubuntu/backend/downloadBatteryLog/download_bms_log_Salimax.sh" + : "/home/ubuntu/backend/downloadBatteryLog/download_bms_log_Salidomo.sh"; + + await Task.Run(() => + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "/bin/bash", + Arguments = $"{scriptPath} {vpnIp} {batteryNode}", + UseShellExecute = false, + RedirectStandardOutput = true + } + }; + + process.Start(); + var output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + Console.WriteLine(output); + }); + Console.WriteLine("-----------------------------------Stop downloading battery log-----------------------------------"); + } + + public static async Task SendInstallationConfig(this Session? session, Int64 installationId, Configuration configuration) + { + var user = session?.User; + var installation = Db.GetInstallationById(installationId); + + return user is not null + && installation is not null + && user.UserType !=0 + && user.HasAccessTo(installation) + && await installation.SendConfig(configuration); + } + + public static async Task InsertUserAction(this Session? session, UserAction action) + { + var user = session?.User; + + if (user is null || user.UserType == 0) + return false; + + action.UserName = user.Name; + + var installation = Db.GetInstallationById(action.InstallationId); + installation.TestingMode = action.TestingMode; + installation.Apply(Db.Update); + WebsocketManager.InformWebsocketsForInstallation(action.InstallationId); + + // Save the configuration change to the database + Db.HandleAction(action); + return true; + } + + public static async Task UpdateUserAction(this Session? session, UserAction action) + { + var user = session?.User; + + if (user is null || user.UserType == 0) + return false; + + var installation = Db.GetInstallationById(action.InstallationId); + if (installation.TestingMode != action.TestingMode) + { + installation.TestingMode = action.TestingMode; + installation.Apply(Db.Update); + WebsocketManager.InformWebsocketsForInstallation(action.InstallationId); + } + + Db.UpdateAction(action); + return true; + } + + + public static async Task DeleteUserAction(this Session? session, Int64 actionId) + { + var user = session?.User; + + if (user is null || user.UserType == 0) + return false; + var action = Db.GetActionById(actionId); + if (action.TestingMode) + { + var installation = Db.GetInstallationById(action.InstallationId); + installation.TestingMode = false; + installation.Apply(Db.Update); + WebsocketManager.InformWebsocketsForInstallation(action.InstallationId); + } + + Db.Delete(action); + Console.WriteLine("---------------Deleted the Action in the database-----------------"); + return true; + } + + public static Boolean Delete(this Session? session, Folder? folder) + { + var user = session?.User; + + return user is not null + && folder is not null + && user.UserType !=0 + && user.HasAccessTo(folder) + && Db.Delete(folder); + } + + + public static async Task Create(this Session? session, Installation? installation) + { + var user = session?.User; + + + + //Salimax installation + if (installation.Product == (int)ProductType.Salimax) + { + return user is not null + && user.UserType != 0 + && user.HasAccessToParentOf(installation) + && Db.Create(installation) // TODO: these two in a transaction + && installation.SetOrderNumbers() + && Db.Create(new InstallationAccess { UserId = user.Id, InstallationId = installation.Id }) + && await installation.CreateBucket() + && await installation.RenewS3Credentials(); + + } + + if (installation.Product == (int)ProductType.Salidomo) + { + return user is not null + && user.UserType != 0 + && user.HasAccessToParentOf(installation) + && Db.Create(installation) + && await installation.CreateBucket() + && await installation.RenewS3Credentials(); + } + + if (installation.Product == (int)ProductType.SodioHome) + { + return user is not null + && user.UserType != 0 + && user.HasAccessToParentOf(installation) + && Db.Create(installation); + } + + + + return false; + } + + + public static Boolean Update(this Session? session, Installation? installation) + { + var user = session?.User; + + var original = Db.GetInstallationById(installation?.Id); + //Salimax installation + if (installation.Product == (int)ProductType.Salimax) + { + + return user is not null + && installation is not null + && original is not null + && user.UserType !=0 + && user.HasAccessTo(installation) + && installation.SetOrderNumbers() + && installation + .WithParentOf(original) // prevent moving + .Apply(Db.Update); + } + + + return user is not null + && installation is not null + && original is not null + && user.UserType !=0 + && user.HasAccessToParentOf(installation) + && installation + .Apply(Db.Update); + + + } + + public static async Task Delete(this Session? session, Installation? installation) + { + var user = session?.User; + + if (user is not null + && installation is not null + && user.UserType != 0) + { + if (installation.Product is (int)ProductType.Salimax or (int)ProductType.Salidomo) + { + return + Db.Delete(installation) + && await installation.RevokeReadKey() + && await installation.RevokeWriteKey() + && await installation.RemoveReadRole() + && await installation.RemoveWriteRole() + && await installation.DeleteBucket(); + } + else + { + return Db.Delete(installation); + + } + } + + return false; + + } + + public static Boolean Create(this Session? session, User newUser) + { + var sessionUser = session?.User; + var userAlreadyExists = Db.GetUserByEmail(newUser.Email); + + return sessionUser is not null + && userAlreadyExists is null + && sessionUser.UserType !=0 + && newUser + .WithParent(sessionUser) + .Do(() => newUser.MustResetPassword = true) + .Do(() => newUser.Password = null) + .Apply(Db.Create); + // && Mailer.Mailer.SendVerificationMessage(newUser); + + // .Do(() => newUser.Password = newUser.SaltAndHashPassword(newUser.Password)) + + //Send Email to new user to verify email and set password + + } + + public static Boolean Update(this Session? session, User? editedUser) + { + var sessionUser = session?.User; + var originalUser = Db.GetUserById(editedUser?.Id); + + return editedUser is not null + && sessionUser is not null + && originalUser is not null + && sessionUser.UserType !=0 + && sessionUser.HasAccessTo(originalUser) + && editedUser + .WithParentOf(originalUser) // prevent moving + .WithNameOf(originalUser) + .WithPasswordOf(originalUser) + .Apply(Db.Update); + } + + public static Boolean UpdatePassword(this Session? session, String? newPassword) + { + var sessionUser = session?.User; + + return sessionUser is not null + && sessionUser + .Do(() => sessionUser.Password = sessionUser.SaltAndHashPassword(newPassword)) + .Do(() => sessionUser.MustResetPassword = false) + .Apply(Db.Update); + } + + public static Boolean Delete(this Session? session, User? userToDelete) + { + var sessionUser = session?.User; + + return sessionUser is not null + && userToDelete is not null + && sessionUser.UserType !=0 + && sessionUser.HasAccessTo(userToDelete) + && Db.Delete(userToDelete); + } + + + public static Boolean GrantUserAccessTo(this Session? session, User? user, Installation? installation) + { + var sessionUser = session?.User; + + return sessionUser is not null + && installation is not null + && user is not null + && user.IsDescendantOf(sessionUser) + && sessionUser.HasAccessTo(installation) + && !user.HasAccessTo(installation) + && Db.Create(new InstallationAccess { UserId = user.Id, InstallationId = installation.Id }); + } + + public static Boolean GrantUserAccessTo(this Session? session, User? user, Folder? folder) + { + var sessionUser = session?.User; + + return sessionUser is not null + && folder is not null + && user is not null + && user.IsDescendantOf(sessionUser) + && sessionUser.HasAccessTo(folder) + && !user.HasAccessTo(folder) + && Db.Create(new FolderAccess { UserId = user.Id, FolderId = folder.Id }); + } + + public static Boolean RevokeUserAccessTo(this Session? session, User? user, Installation? installation) + { + var sessionUser = session?.User; + + return sessionUser is not null + && installation is not null + && user is not null + && user.IsDescendantOf(sessionUser) + && sessionUser.HasAccessTo(installation) + && user.HasAccessTo(installation) + && Db.InstallationAccess.Delete(a => a.UserId == user.Id && a.InstallationId == installation.Id) > 0; + } + + public static Boolean RevokeUserAccessTo(this Session? session, User? user, Folder? folder) + { + var sessionUser = session?.User; + + return sessionUser is not null + && folder is not null + && user is not null + && user.IsDescendantOf(sessionUser) + && sessionUser.HasAccessTo(folder) + && user.HasAccessTo(folder) + && Db.FolderAccess.Delete(a => a.UserId == user.Id && a.FolderId == folder.Id) > 0; + } + + public static Boolean Logout(this Session? session) + { + return session is not null + && Db.Sessions.Delete(s => s.Token == session.Token) > 0; + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Methods/TreeNode.cs b/csharp/App_backup/Backend/DataTypes/Methods/TreeNode.cs new file mode 100644 index 000000000..ab3ea5091 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Methods/TreeNode.cs @@ -0,0 +1,48 @@ +using InnovEnergy.App.Backend.Database; + +namespace InnovEnergy.App.Backend.DataTypes.Methods; + +public static class TreeNodeMethods +{ + + public static T WithParentOf(this T treeNode, T other) where T: TreeNode + { + treeNode.ParentId = other.ParentId; + return treeNode; + } + + public static T WithNameOf(this T treeNode, T other) where T: TreeNode + { + treeNode.Name = other.Name; + return treeNode; + } + + public static T WithParent(this T treeNode, T other) where T: TreeNode + { + treeNode.ParentId = other.Id; + return treeNode; + } + + public static T HideParentIfUserHasNoAccessToParent(this T node, User? accessingUser) + { + if (accessingUser is not null && node is TreeNode treeNode && !accessingUser.HasAccessToParentOf(treeNode)) + { + treeNode.ParentId = 0; + } + + return node; + } + + public static TreeNode FillOrderNumbers(this TreeNode treeNode) + { + if (treeNode is Installation installation) + { + installation.FillOrderNumbers(); + } + + return treeNode; + } + + + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/Methods/User.cs b/csharp/App_backup/Backend/DataTypes/Methods/User.cs new file mode 100644 index 000000000..b20930562 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/Methods/User.cs @@ -0,0 +1,261 @@ +using System.Security.Cryptography; +using System.Web; +using InnovEnergy.App.Backend.Database; +using InnovEnergy.Lib.Mailer; +using InnovEnergy.Lib.Utils; +using Convert = System.Convert; +using static System.Text.Encoding; + + +namespace InnovEnergy.App.Backend.DataTypes.Methods; + + +public static class UserMethods +{ + public static IEnumerable AccessibleInstallations(this User user,int product) + { + var direct = user.DirectlyAccessibleInstallations().ToList().Where(f=>f.Product==product); + var fromFolders = user + .AccessibleFolders() + .SelectMany(u => u.ChildInstallations()).ToList().Where(f=>f.Product==product); + + return direct + .Concat(fromFolders) + .Distinct(); + } + + public static IEnumerable AccessibleInstallations(this User user) + { + var direct = user.DirectlyAccessibleInstallations().ToList(); + var fromFolders = user + .AccessibleFolders() + .SelectMany(u => u.ChildInstallations()).ToList(); + + return direct + .Concat(fromFolders) + .Distinct(); + } + + + public static IEnumerable AccessibleFolders(this User user) + { + return user + .DirectlyAccessibleFolders() + .SelectMany(f => f.DescendantFolders().Prepend(f)) + .Distinct(); + } + + public static IEnumerable AccessibleFoldersAndInstallations(this User user,int product) + { + var folders = user.AccessibleFolders() as IEnumerable; + + user.AccessibleInstallations(product).ForEach(i => i.FillOrderNumbers()); + var installations = user.AccessibleInstallations(product); + + return folders.Concat(installations); + } + + public static IEnumerable AccessibleFoldersAndInstallations(this User user) + { + var folders = user.AccessibleFolders() as IEnumerable; + + user.AccessibleInstallations().ForEach(i => i.FillOrderNumbers()); + var installations = user.AccessibleInstallations(); + + return folders.Concat(installations); + } + + public static IEnumerable DirectlyAccessibleInstallations(this User user) + { + return Db + .InstallationAccess + .Where(r => r.UserId == user.Id) + .Select(r => r.InstallationId) + .Select(i => Db.GetInstallationById(i)) + .NotNull() + .Do(i => i.HideParentIfUserHasNoAccessToParent(user)); // hide inaccessible parents from calling user + } + + public static IEnumerable DirectlyAccessibleFolders(this User user) + { + + return Db + .FolderAccess + .Where(r => r.UserId == user.Id) + .Select(r => r.FolderId) + .Select(i => Db.GetFolderById(i)) + .NotNull() + .Do(f => f.HideParentIfUserHasNoAccessToParent(user)); // hide inaccessible parents from calling user; + } + + public static IEnumerable ChildUsers(this User parent) + { + return Db + .Users + .Where(f => f.ParentId == parent.Id); + } + + public static IEnumerable DescendantUsers(this User parent) + { + return parent + .TraverseDepthFirstPreOrder(ChildUsers) + .Skip(1); // skip self + } + + public static Boolean IsDescendantOf(this User user, User ancestor) + { + return user + .Ancestors() + .Any(u => u.Id == ancestor.Id); + } + + private static IEnumerable Ancestors(this User user) + { + return user + .Unfold(Parent) + .Skip(1); // skip self + } + + public static Boolean VerifyPassword(this User user, String? password) + { + return password is not null + && Db.GetUserByEmail(user.Email)?.Password == user.SaltAndHashPassword(password); + } + + + public static String SaltAndHashPassword(this User user, String password) + { + var dataToHash = $"{password}{user.Salt()}"; + + return dataToHash + .Apply(UTF8.GetBytes) + .Apply(SHA256.HashData) + .Apply(Convert.ToBase64String); + } + + public static User? Parent(this User u) + { + return u.IsRoot() + ? null + : Db.GetUserById(u.ParentId); + } + + public static Boolean IsRoot(this User user) + { + return user.ParentId <= 0 + && Db.GetUserById(user.Id)?.Id == 0; // might have been 0 because it is a relative root + } + + public static Boolean HasDirectAccessTo(this User user, Folder folder) + { + return Db + .FolderAccess + .Any(r => r.FolderId == folder.Id && r.UserId == user.Id); + } + + public static Boolean HasAccessTo(this User user, Folder? folder) + { + if (folder is null) + return false; + + return user.HasDirectAccessTo(folder) + || folder + .Ancestors() + .Any(user.HasDirectAccessTo); + } + + public static Boolean HasDirectAccessTo(this User user, Installation installation) + { + return Db + .InstallationAccess + .Any(r => r.UserId == user.Id && r.InstallationId == installation.Id); + } + + public static Boolean HasAccessTo(this User user, Installation? installation) + { + if (installation is null) + return false; + + return user.HasDirectAccessTo(installation) + || installation + .Ancestors() + .Any(user.HasDirectAccessTo); + } + + + public static Boolean HasAccessTo(this User user, User? other) + { + if (other is null) + return false; + + return other.Id == user.Id + || other + .Ancestors() + .Contains(user); + } + + + public static Boolean HasAccessToParentOf(this User user, TreeNode? other) + { + + return other?.Type switch + { + "Installation" => user.HasAccessTo(Db.GetFolderById(other.ParentId)), + "User" => user.HasAccessTo(Db.GetUserById(other.ParentId)), + "Folder" => user.HasAccessTo(Db.GetFolderById(other.ParentId)), + _ => false + }; + } + + private static String Salt(this User user) + { + // + id => salt unique per user + // + InnovEnergy => globally unique + + return $"{user.Id}InnovEnergy"; + } + + public static User WithPasswordOf(this User user, User other) + { + user.Password = other.Password; + return user; + } + + public static User HidePassword(this User user) + { + user.Password = ""; + return user; + } + + public static Task SendEmail(this User user, String subject, String body) + { + return Mailer.Send(user.Name, user.Email, subject, body); + } + + public static Task SendPasswordResetEmail(this User user, String token) + { + const String subject = "Reset the password of your Inesco Energy Account"; + const String resetLink = "https://monitor.innov.energy/api/ResetPassword"; // TODO: move to settings file + var encodedToken = HttpUtility.UrlEncode(token); + + var body = $"Dear {user.Name}\n" + + $"To reset your password " + + $"please open this link:{resetLink}?token={encodedToken}"; + + return user.SendEmail(subject, body); + } + + public static Task SendNewUserWelcomeMessage(this User user) + { + const String subject = "Your new Inesco Energy Account"; + + var resetLink = $"https://monitor.innov.energy/?username={user.Email}"; // TODO: move to settings file + + var body = $"Dear {user.Name}\n" + + $"To set your password and log in to your " + + $"Inesco Energy Account open this link:{resetLink}"; + + return user.SendEmail(subject, body); + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/TreeNode.Equality.cs b/csharp/App_backup/Backend/DataTypes/TreeNode.Equality.cs new file mode 100644 index 000000000..e9c6767df --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/TreeNode.Equality.cs @@ -0,0 +1,23 @@ +using System.Diagnostics.CodeAnalysis; + +namespace InnovEnergy.App.Backend.DataTypes; + +public abstract partial class TreeNode +{ + public override Boolean Equals(Object? obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + + return Equals((TreeNode)obj); + } + + protected Boolean Equals(TreeNode other) => Id == other.Id; + + [SuppressMessage("ReSharper", "NonReadonlyMemberInGetHashCode")] + public override Int32 GetHashCode() => Id.GetHashCode(); + + public static Boolean operator ==(TreeNode? left, TreeNode? right) => Equals(left, right); + public static Boolean operator !=(TreeNode? left, TreeNode? right) => !Equals(left, right); +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/TreeNode.EqualityComparer.cs b/csharp/App_backup/Backend/DataTypes/TreeNode.EqualityComparer.cs new file mode 100644 index 000000000..c5bf974c8 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/TreeNode.EqualityComparer.cs @@ -0,0 +1,25 @@ +using System.Diagnostics.CodeAnalysis; + +namespace InnovEnergy.App.Backend.DataTypes; + +public abstract partial class TreeNode +{ + private sealed class IdEqualityComparer : IEqualityComparer + { + public Boolean Equals(TreeNode x, TreeNode y) + { + if (ReferenceEquals(x, y)) return true; + if (ReferenceEquals(x, null)) return false; + if (ReferenceEquals(y, null)) return false; + if (x.GetType() != y.GetType()) return false; + return x.Id == y.Id; + } + + public Int32 GetHashCode(TreeNode obj) + { + return obj.Id.GetHashCode(); + } + } + + public static IEqualityComparer IdComparer { get; } = new IdEqualityComparer(); +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/TreeNode.cs b/csharp/App_backup/Backend/DataTypes/TreeNode.cs new file mode 100644 index 000000000..a0dd788df --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/TreeNode.cs @@ -0,0 +1,19 @@ +using SQLite; +namespace InnovEnergy.App.Backend.DataTypes; + +public abstract partial class TreeNode +{ + //This is the parent class of each relation. It has an autoincrement Id, name, information, parent Id and Type. + //Ignore means: "Do not map this property to a database column." + [PrimaryKey, AutoIncrement] + public Int64 Id { get; set; } + public virtual String Name { get; set; } = ""; // overridden by User (unique) + public String Information { get; set; } = ""; // unstructured random info + + [Indexed] + public Int64 ParentId { get; set; } + + [Ignore] + public String Type => GetType().Name; + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/User.cs b/csharp/App_backup/Backend/DataTypes/User.cs new file mode 100644 index 000000000..4738c7f45 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/User.cs @@ -0,0 +1,17 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.DataTypes; + +public class User : TreeNode +{ + + [Unique] + public String Email { get; set; } = null!; + public int UserType { get; set; } = 0; + public Boolean MustResetPassword { get; set; } = false; + public String? Password { get; set; } = null!; + + [Unique] + public override String Name { get; set; } = null!; + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/UserAction.cs b/csharp/App_backup/Backend/DataTypes/UserAction.cs new file mode 100644 index 000000000..c546ced32 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/UserAction.cs @@ -0,0 +1,20 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.DataTypes; + +public class UserAction +{ + [PrimaryKey, AutoIncrement] + public Int64 Id { get; set; } // Primary key for the table, auto-incremented + + [Indexed] + public String UserName { get; set; } = null!;// User Name who made the configuration change + + public Int64 InstallationId { get; set; } // Installation ID where the configuration change is made + + public Boolean TestingMode { get; set; } + + public DateTime Timestamp { get; set; } // Timestamp of the configuration change + + public String Description { get; set; } = null!;// Serialized string representing the new configuration +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DataTypes/WebsocketMessage.cs b/csharp/App_backup/Backend/DataTypes/WebsocketMessage.cs new file mode 100644 index 000000000..fa8c93694 --- /dev/null +++ b/csharp/App_backup/Backend/DataTypes/WebsocketMessage.cs @@ -0,0 +1,10 @@ +namespace InnovEnergy.App.Backend.DataTypes; + +public class WebsocketMessage +{ + + public int id { get; set; } + public int status { get; set; } + public Boolean testingMode { get; set; } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Database/Create.cs b/csharp/App_backup/Backend/Database/Create.cs new file mode 100644 index 000000000..9263b0793 --- /dev/null +++ b/csharp/App_backup/Backend/Database/Create.cs @@ -0,0 +1,152 @@ +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.App.Backend.Relations; + + +namespace InnovEnergy.App.Backend.Database; + + +public static partial class Db +{ + + private static Boolean Insert(Object obj) + { + var success = Connection.Insert(obj) > 0; + if (success) Backup(); + return success; + } + + public static Boolean Create(Installation installation) + { + // The bucket Id it calculated as follows: It is 1 + the maximum bucket id of all the existing installations of the same product + // SQLite wrapper is smart and *modifies* t's Id to the one generated (autoincrement) by the insertion + installation.S3BucketId = Installations.Where(inst => inst.Product == installation.Product).Max(inst => (int?)inst.S3BucketId)+1 ?? 0; + return Insert(installation); + } + + public static Boolean Create(Error error) + { + return Insert(error); + } + + public static Boolean Create(Warning warning) + { + return Insert(warning); + } + + public static Boolean Create(Folder folder) + { + return Insert(folder); + } + + public static Boolean Create(User user) + { + return Insert(user); + } + + public static Boolean Create(Session session) + { + return Insert(session); + } + + public static Boolean Create(InstallationAccess installationAccess) + { + return Insert(installationAccess); + } + + public static Boolean Create(FolderAccess folderAccess) + { + return Insert(folderAccess); + } + + public static Boolean Create(OrderNumber2Installation o2i) + { + return Insert(o2i); + } + + public static Boolean Create(UserAction action) + { + return Insert(action); + } + + public static void HandleAction(UserAction newAction) + { + //Find the total number of actions for this installation + var totalActions = UserActions.Count(action => action.InstallationId == newAction.InstallationId); + + //If there are 100 actions, remove the one with the oldest timestamp + if (totalActions == 100) + { + var oldestAction = + UserActions.Where(action => action.InstallationId == newAction.InstallationId) + .OrderBy(action => action.Timestamp) + .FirstOrDefault(); + + //Remove the old action + Delete(oldestAction); + + //Add the new action + Create(newAction); + } + else + { + Console.WriteLine("---------------Added the new Action to the database-----------------"); + Create(newAction); + } + } + + //This function is called from the RabbitMQ manager when a new error arrives to the database. + //We keep only the last 100 errors for each installation. If we already have stored 100 errors, we delete the older one and we insert the new one. + + public static void HandleError(Error newError,int installationId) + { + //Find the total number of errors for this installation + var totalErrors = Errors.Count(error => error.InstallationId == installationId); + + //If there are 100 errors, remove the one with the oldest timestamp + if (totalErrors == 100) + { + var oldestError = + Errors.Where(error => error.InstallationId == installationId) + .OrderBy(error => error.Date) + .FirstOrDefault(); + + //Remove the old error + Delete(oldestError); + + //Add the new error + Create(newError); + } + else + { + Console.WriteLine("---------------Added the new Alarm to the database-----------------"); + Create(newError); + } + } + + public static void HandleWarning(Warning newWarning,int installationId) + { + //Find the total number of warnings for this installation + var totalWarnings = Warnings.Count(warning => warning.InstallationId == installationId); + + //If there are 100 warnings, remove the one with the oldest timestamp + if (totalWarnings == 100) + { + var oldestWarning = + Warnings.Where(warning => warning.InstallationId == installationId) + .OrderBy(warning => warning.Date) + .FirstOrDefault(); + + //Remove the old warning + Delete(oldestWarning); + + //Add the new warning + Create(newWarning); + } + else + { + Console.WriteLine("---------------Added the new Warning to the database-----------------"); + Create(newWarning); + } + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Database/Db.cs b/csharp/App_backup/Backend/Database/Db.cs new file mode 100644 index 000000000..39d11b9c5 --- /dev/null +++ b/csharp/App_backup/Backend/Database/Db.cs @@ -0,0 +1,310 @@ +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.App.Backend.DataTypes.Methods; +using InnovEnergy.App.Backend.Relations; +using InnovEnergy.Lib.S3Utils; +using InnovEnergy.Lib.S3Utils.DataTypes; +using InnovEnergy.Lib.Utils; +using SQLite; +using SQLiteConnection = SQLite.SQLiteConnection; + +namespace InnovEnergy.App.Backend.Database; + +//The methods of the Db class are located in multiple files (Create.cs, Read,cs, Delete.cs, Update.cs) +//That's why the class definition is partial + +public static partial class Db +{ + private static SQLiteConnection Connection { get; } = InitConnection(); + public static TableQuery Sessions => Connection.Table(); + public static TableQuery Folders => Connection.Table(); + public static TableQuery Installations => Connection.Table(); + public static TableQuery Users => Connection.Table(); + public static TableQuery FolderAccess => Connection.Table(); + public static TableQuery InstallationAccess => Connection.Table(); + public static TableQuery OrderNumber2Installation => Connection.Table(); + public static TableQuery Errors => Connection.Table(); + public static TableQuery Warnings => Connection.Table(); + public static TableQuery UserActions => Connection.Table(); + + + public static void Init() + { + //Used to force static constructor + //Since this class is static, we call Init method from the Program.cs to initialize all the fields of the class + //When a class is loaded, the fields are initialized before the constructor's code is executed. + //The TableQuery fields are lazy meaning that they will be initialized when they get accessed + //The connection searches for the latest backup and binds all the tables to it. + } + + //This is the constructor of the class + static Db() + { + Connection.RunInTransaction(() => + { + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + Connection.CreateTable(); + }); + + //UpdateKeys(); + CleanupSessions().SupressAwaitWarning(); + DeleteSnapshots().SupressAwaitWarning(); + } + + + private static SQLiteConnection InitConnection() + { + var latestDb = new DirectoryInfo("DbBackups") + .GetFiles() + .OrderBy(f => f.LastWriteTime) + .Last().Name; + + Console.WriteLine("latestdb is "+latestDb); + + //This is the file connection from the DbBackups folder + var fileConnection = new SQLiteConnection("DbBackups/" + latestDb); + + //Create a table if it does not exist + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + fileConnection.CreateTable(); + + return fileConnection; + //return CopyDbToMemory(fileConnection); + } + + public static void BackupDatabase() + { + var filename = "db-" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + ".sqlite"; + Connection.Backup("DbBackups/" + filename); + } + + //Delete all except 10 snapshots every 24 hours. + private static async Task DeleteSnapshots() + { + while (true) + { + try + { + var files = new DirectoryInfo("DbBackups") + .GetFiles() + .OrderByDescending(f => f.LastWriteTime); + + var filesToDelete = files.Skip(10); + + foreach (var file in filesToDelete) + { + Console.WriteLine("File to delete is " + file.Name); + file.Delete(); + } + + } + catch(Exception e) + { + Console.WriteLine("An error has occured when cleaning database snapshots, exception is:\n"+e); + } + + await Task.Delay(TimeSpan.FromHours(24)); + } + } + + //Delete all expired sessions every half an hour. An expired session is a session remained for more than 1 day. + private static async Task CleanupSessions() + { + while (true) + { + try + { + var deadline = DateTime.Now.AddDays(-Session.MaxAge.Days); + foreach (var session in Sessions) + { + if (session.LastSeen < deadline) + { + Console.WriteLine("Need to remove session of user id " + session.User.Name + "last time is "+session.LastSeen); + } + + } + + Sessions.Delete(s => s.LastSeen < deadline); + } + catch(Exception e) + { + Console.WriteLine("An error has occured when cleaning stale sessions, exception is:\n"+e); + } + + await Task.Delay(TimeSpan.FromHours(0.5)); + } + } + + private static async Task RemoveNonExistingKeys() + { + while (true) + { + try + { + var validReadKeys = Installations + .Select(i => i.S3Key) + .Distinct() + .ToList(); + + + + var validWriteKeys = Installations + .Select(i => i.S3WriteKey) + .Distinct() + .ToList(); + + Console.WriteLine("VALID READ KEYS"); + for (int i = 0; i < validReadKeys.Count; i++) + { + Console.WriteLine(validReadKeys[i]); + } + + Console.WriteLine("VALID WRITE KEYS"); + + for (int i = 0; i < validReadKeys.Count; i++) + { + Console.WriteLine(validWriteKeys[i]); + } + + + const String provider = "exo.io"; + var S3keys = await ExoCmd.GetAccessKeys(); + + foreach (var keyMetadata in S3keys) + { + if (keyMetadata["key"].ToString()!="EXOa0b53cf10517307cec1bf00e" && !validReadKeys.Contains(keyMetadata["key"].ToString()) && !validWriteKeys.Contains(keyMetadata["key"].ToString())) + { + //await ExoCmd.RevokeReadKey(keyMetadata["key"].ToString()); + Console.WriteLine("Deleted key "+keyMetadata["key"]); + } + + } + } + catch(Exception e) + { + Console.WriteLine("An error has occured when updating S3 keys, exception is:\n"+e); + } + + await Task.Delay(TimeSpan.FromHours(24)); + } + + } + + private static async Task UpdateKeys() + { + while (true) + { + try + { + await UpdateS3Urls(); + } + catch(Exception e) + { + Console.WriteLine("An error has occured when updating S3 keys, exception is:\n"+e); + } + + await RemoveNonExistingKeys(); + + await Task.Delay(TimeSpan.FromHours(24)); + } + } + + + + private static Boolean RunTransaction(Func func) + { + var savepoint = Connection.SaveTransactionPoint(); + var success = false; + + try + { + success = func(); + } + finally + { + if (success) + Connection.Release(savepoint); + else + Connection.RollbackTo(savepoint); + } + + return success; + } + + + private static async Task UpdateS3Urls() + { + var regions = Installations + .Select(i => i.S3Region) + .Distinct() + .ToList(); + + const String provider = "exo.io"; + Console.WriteLine("-----------------------UPDATED READ KEYS-------------------------------------------------------------------"); + + foreach (var region in regions) + { + var s3Region = new S3Region($"https://{region}.{provider}", ExoCmd.S3Credentials!); + var bucketList = await s3Region.ListAllBuckets(); + + var installations = from bucket in bucketList.Buckets + from installation in Installations + where installation.BucketName() == bucket.BucketName + select installation; + + foreach (var installation in installations) + { + await installation.RenewS3Credentials(); + } + + } + } + + public static async Task SendPasswordResetEmail(User user, String sessionToken) + { + try + { + await user.SendPasswordResetEmail(sessionToken); + return true; + } + catch + { + return false; + } + } + + public static async Task SendNewUserEmail(User user) + { + try + { + await user.SendNewUserWelcomeMessage(); + return true; + } + catch + { + return false; + } + } + + public static Boolean DeleteUserPassword(User user) + { + user.Password = ""; + user.MustResetPassword = true; + return Update(user); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Database/Delete.cs b/csharp/App_backup/Backend/Database/Delete.cs new file mode 100644 index 000000000..a4dd5a748 --- /dev/null +++ b/csharp/App_backup/Backend/Database/Delete.cs @@ -0,0 +1,144 @@ +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.App.Backend.DataTypes.Methods; +using InnovEnergy.App.Backend.Relations; +namespace InnovEnergy.App.Backend.Database; + +public static partial class Db +{ + //Since we do not want to stress the memory in the VM a lot, we make a snapshot of the database every 100 transactions. + private static int _backupCounter = 0; + private static void Backup() + { + _backupCounter++; + if (_backupCounter > 100) + { + _backupCounter = 0; + BackupDatabase(); + } + } + public static Boolean Delete(Folder folder) + { + var deleteSuccess= RunTransaction(DeleteFolderAndAllItsDependencies); + if (deleteSuccess) + { + Backup(); + } + + return deleteSuccess; + + Boolean DeleteFolderAndAllItsDependencies() + { + return folder + .DescendantFoldersAndSelf() + .All(DeleteDescendantFolderAndItsDependencies); + } + + Boolean DeleteDescendantFolderAndItsDependencies(Folder f) + { + FolderAccess .Delete(r => r.FolderId == f.Id); + Installations.Delete(r => r.ParentId == f.Id); + var delete = Folders.Delete(r => r.Id == f.Id); + + return delete>0; + } + } + + public static Boolean Delete(Error errorToDelete) + { + var deleteSuccess = RunTransaction(DeleteError); + + if (deleteSuccess) + Backup(); + return deleteSuccess; + + + Boolean DeleteError() + { + return Errors.Delete(error => error.Id == errorToDelete.Id) >0; + } + } + + public static Boolean Delete(UserAction actionToDelete) + { + var deleteSuccess = RunTransaction(DeleteAction); + + + if (deleteSuccess) + Backup(); + return deleteSuccess; + + + Boolean DeleteAction() + { + return UserActions.Delete(action => action.Id == actionToDelete.Id) >0; + + } + } + + public static Boolean Delete(Warning warningToDelete) + { + var deleteSuccess = RunTransaction(DeleteWarning); + if (deleteSuccess) + Backup(); + return deleteSuccess; + + + Boolean DeleteWarning() + { + return Warnings.Delete(warning => warning.Id == warningToDelete.Id) >0; + } + } + + public static Boolean Delete(Installation installation) + { + var deleteSuccess = RunTransaction(DeleteInstallationAndItsDependencies); + if (deleteSuccess) + Backup(); + return deleteSuccess; + + + Boolean DeleteInstallationAndItsDependencies() + { + InstallationAccess.Delete(i => i.InstallationId == installation.Id); + if (installation.Product == (int)ProductType.Salimax) + { + //For Salimax, delete the OrderNumber2Installation entries associated with this installation id. + OrderNumber2Installation.Delete(i => i.InstallationId == installation.Id); + } + + return Installations.Delete(i => i.Id == installation.Id) > 0; + } + } + + public static Boolean Delete(User user) + { + var deleteSuccess = RunTransaction(DeleteUserAndHisDependencies); + if (deleteSuccess) + Backup(); + return deleteSuccess; + + Boolean DeleteUserAndHisDependencies() + { + FolderAccess .Delete(u => u.UserId == user.Id); + InstallationAccess.Delete(u => u.UserId == user.Id); + return Users.Delete(u => u.Id == user.Id) > 0; + } + } + + + #pragma warning disable CS0618 + + // private!! + private static Boolean Delete(Session session) + { + var delete = Sessions.Delete(s => s.Id == session.Id) > 0; + if (delete) + Backup(); + return delete; + } + + public static void Delete(OrderNumber2Installation relation) + { + OrderNumber2Installation.Delete(s => s.InstallationId == relation.InstallationId && s.OrderNumber == relation.OrderNumber); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Database/Read.cs b/csharp/App_backup/Backend/Database/Read.cs new file mode 100644 index 000000000..f47298cb3 --- /dev/null +++ b/csharp/App_backup/Backend/Database/Read.cs @@ -0,0 +1,59 @@ +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.App.Backend.Relations; +namespace InnovEnergy.App.Backend.Database; + + +public static partial class Db +{ + //In this file, we provide all the methods that can be used in order to retrieve information from the database (read) + public static Folder? GetFolderById(Int64? id) + { + return Folders + .FirstOrDefault(f => f.Id == id); + } + + public static Installation? GetInstallationById(Int64? id) + { + return Installations + .FirstOrDefault(i => i.Id == id); + } + + public static UserAction? GetActionById(Int64? id) + { + return UserActions + .FirstOrDefault(i => i.Id == id); + } + + public static User? GetUserById(Int64? id) + { + return Users + .FirstOrDefault(u => u.Id == id); + } + + public static User? GetUserByEmail(String email) + { + return Users + .FirstOrDefault(u => u.Email == email); + } + + public static Session? GetSession(String token) + { + //This method is called in almost every controller function. + //After logging in, the frontend receives a session object which contains a token. For all the future REST API calls, this token is used for session authentication. + var session = Sessions + .FirstOrDefault(s => s.Token == token); + + if (session is null) + { + return null; + } + + if (!session.Valid) + { + Delete(session); + return null; + } + + return session; + } +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Database/Update.cs b/csharp/App_backup/Backend/Database/Update.cs new file mode 100644 index 000000000..88e748240 --- /dev/null +++ b/csharp/App_backup/Backend/Database/Update.cs @@ -0,0 +1,60 @@ +using InnovEnergy.App.Backend.DataTypes; +namespace InnovEnergy.App.Backend.Database; + + +public static partial class Db +{ + //We can execute the updates manually for each table, but we prefer the abstract way using Connection.Update method + //We pass an object as an argument and the Connection will connect this object with the corresponding table. + //The update is being done based on the primary id of the object. + + private static Boolean Update(Object obj) + { + var success = Connection.Update(obj) > 0; + if(success) Backup(); + return success; + } + + public static Boolean Update(Folder folder) + { + return Update(obj: folder); + } + + public static Boolean Update(Error error) + { + return Update(obj: error); + } + + public static Boolean Update(Warning warning) + { + return Update(obj: warning); + } + + public static Boolean Update(Installation installation) + { + return Update(obj: installation); + } + + public static Boolean Update(User user) + { + var originalUser = GetUserById(user.Id); + if (originalUser is null) return false; + + // these columns must not be modified! + user.ParentId = originalUser.ParentId; + user.Name = originalUser.Name; + + return Update(obj: user); + } + + public static void UpdateAction(UserAction updatedAction) + { + var existingAction = UserActions.FirstOrDefault(action => action.Id == updatedAction.Id); + + if (existingAction != null) + { + Update(updatedAction); + } + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/DbBackups/db-1701700887.sqlite b/csharp/App_backup/Backend/DbBackups/db-1701700887.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..3a52deccdcdb664557803a43f8aacaed773a0f7f GIT binary patch literal 122880 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 GzW+ZDgf^-G literal 0 HcmV?d00001 diff --git a/csharp/App_backup/Backend/DbBackups/db-1701787282.sqlite b/csharp/App_backup/Backend/DbBackups/db-1701787282.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..7926b9b77b71d2e6608b0b5db5e4385c14c66e6a GIT binary patch literal 122880 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 z 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 literal 0 HcmV?d00001 diff --git a/csharp/App_backup/Backend/DbBackups/db-1701797550.sqlite b/csharp/App_backup/Backend/DbBackups/db-1701797550.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..fc934d7a84dd55bd2609a9d3203d93366d3c0155 GIT binary patch literal 122880 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

+C*VC9TO>&`CV6Zd!&KrTbwM>q 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 YC*ltkdO+MX-T9AYDMejQ`P%pY1Daw5^#A|> literal 0 HcmV?d00001 diff --git a/csharp/App_backup/Backend/DbBackups/db-1702291326.sqlite b/csharp/App_backup/Backend/DbBackups/db-1702291326.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..47d8860df061252162d3c786427780059389bda6 GIT binary patch literal 122880 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 literal 0 HcmV?d00001 diff --git a/csharp/App_backup/Backend/DbBackups/db-1702291327.sqlite b/csharp/App_backup/Backend/DbBackups/db-1702291327.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..7074d72e2e828b10d5b5eb2d260b515ce27862f8 GIT binary patch literal 122880 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 literal 0 HcmV?d00001 diff --git a/csharp/App_backup/Backend/DbBackups/db-1702291328.sqlite b/csharp/App_backup/Backend/DbBackups/db-1702291328.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..f27d2b05134a6342865a6d87419adb273d3c43db GIT binary patch literal 139264 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

v41%{mKoa43meMH=%pHj~O}Dzr2^leuMTsFz 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 literal 0 HcmV?d00001 diff --git a/csharp/App_backup/Backend/Exceptions.cs b/csharp/App_backup/Backend/Exceptions.cs new file mode 100644 index 000000000..963a488a8 --- /dev/null +++ b/csharp/App_backup/Backend/Exceptions.cs @@ -0,0 +1,16 @@ +namespace InnovEnergy.App.Backend; + +public class Exceptions : Exception +{ + public String Type { get; set; } + public String Detail { get; set; } + public String Instance { get; set; } + public Int32? Status { get; set; } + public Exceptions(Int32? status, String type, String detail, String instance) + { + Type = type; + Detail = detail; + Instance = instance; + Status = status; + } +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/MailerConfig.json b/csharp/App_backup/Backend/MailerConfig.json new file mode 100644 index 000000000..b5de08366 --- /dev/null +++ b/csharp/App_backup/Backend/MailerConfig.json @@ -0,0 +1,8 @@ +{ + "SmtpServerUrl" : "mail.agenturserver.de", + "SmtpUsername" : "p518526p69", + "SmtpPassword" : "i;b*xqm4iB5uhl", + "SmtpPort" : 587, + "SenderName" : "InnovEnergy", + "SenderAddress" : "noreply@innov.energy" +} diff --git a/csharp/App_backup/Backend/Program.cs b/csharp/App_backup/Backend/Program.cs new file mode 100644 index 000000000..780ba91fa --- /dev/null +++ b/csharp/App_backup/Backend/Program.cs @@ -0,0 +1,92 @@ +using System.Diagnostics; +using Flurl.Http; +using Hellang.Middleware.ProblemDetails; +using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.Websockets; +using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.AspNetCore.Mvc; +using Microsoft.OpenApi.Models; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.Backend; + +public static class Program +{ + public static async Task Main(String[] args) + { + //First, we initialize the database. This is an empty constructor of the Db class that will be called. + //In addition, we initialize WatchDog in order to restart the backend service in case of failure. + //Finally, we start all the backend services. We call the InitializeEnvironment function of RabbitMqManager to create the queue (factory/connection) + //Then, we generate a consumer that binds to the queue. This is a separate async Task so it must not be awaited (it acts as a separate thread). + //Finally, we call the MonitorSalimaxInstallationTable and MonitorSalidomoInstallationTable from the WebsocketManager class. + //Those methods will build in-memory data structures to track the connected frontends and update them regarding the offline installations. + + Watchdog.NotifyReady(); + Db.Init(); + var builder = WebApplication.CreateBuilder(args); + + RabbitMqManager.InitializeEnvironment(); + RabbitMqManager.StartRabbitMqConsumer().SupressAwaitWarning(); + WebsocketManager.MonitorSalimaxInstallationTable().SupressAwaitWarning(); + WebsocketManager.MonitorSalidomoInstallationTable().SupressAwaitWarning(); + + builder.Services.AddControllers(); + builder.Services.AddProblemDetails(setup => + { + //This includes the stacktrace in Development Env + setup.IncludeExceptionDetails = (_, _) => builder.Environment.IsDevelopment() || builder.Environment.IsStaging(); + + //This handles our Exceptions + setup.Map(exception => new ProblemDetails + { + Detail = exception.Detail, + Status = exception.Status, + Type = exception.Type, + Instance = exception.Instance + }); + + }); + builder.Services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", OpenApiInfo); + c.UseAllOfToExtendReferenceSchemas(); + c.SupportNonNullableReferenceTypes(); + }); + + var app = builder.Build(); + + app.Use(async (context, next) => + { + context.Request.WriteLine(); + + await next(context); + }); + + + app.UseWebSockets(); + app.UseForwardedHeaders(new ForwardedHeadersOptions + { + ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto + }); + + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } + + app.UseCors(p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()) ; + //app.UseHttpsRedirection(); + app.MapControllers(); + app.UseProblemDetails(); + + app.Run(); + } + + private static OpenApiInfo OpenApiInfo { get; } = new OpenApiInfo + { + Title = "Innesco Backend API", + Version = "v1" + }; + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Properties/launchSettings.json b/csharp/App_backup/Backend/Properties/launchSettings.json new file mode 100644 index 000000000..760aaabab --- /dev/null +++ b/csharp/App_backup/Backend/Properties/launchSettings.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "$SdkResolverGlobalJsonPath": "", + "profiles": { + "Backend": { + "commandName": "Project", + "dotnetRunMessages": true, + + "launchUrl": "swagger", + "applicationUrl": "http://localhost:7087", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "HOME":"~/backend" + } + } + } +} diff --git a/csharp/App_backup/Backend/Relations/FolderAccess.cs b/csharp/App_backup/Backend/Relations/FolderAccess.cs new file mode 100644 index 000000000..545647a46 --- /dev/null +++ b/csharp/App_backup/Backend/Relations/FolderAccess.cs @@ -0,0 +1,9 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.Relations; + +public class FolderAccess : Relation +{ + [Indexed] public Int64 UserId { get => Left ; init => Left = value;} + [Indexed] public Int64 FolderId { get => Right; init => Right = value;} +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Relations/InstallationAccess.cs b/csharp/App_backup/Backend/Relations/InstallationAccess.cs new file mode 100644 index 000000000..c233ca953 --- /dev/null +++ b/csharp/App_backup/Backend/Relations/InstallationAccess.cs @@ -0,0 +1,9 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.Relations; + +public class InstallationAccess : Relation +{ + [Indexed] public Int64 UserId { get => Left ; init => Left = value;} + [Indexed] public Int64 InstallationId { get => Right; init => Right = value;} +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Relations/OrderNumber2Installation.cs b/csharp/App_backup/Backend/Relations/OrderNumber2Installation.cs new file mode 100644 index 000000000..a994f7fb7 --- /dev/null +++ b/csharp/App_backup/Backend/Relations/OrderNumber2Installation.cs @@ -0,0 +1,10 @@ +using SQLite; + +namespace InnovEnergy.App.Backend.Relations; + +public class OrderNumber2Installation : Relation +{ + [Indexed] public String OrderNumber { get => Left ; set => Left = value;} + [Indexed] public Int64 InstallationId { get => Right; set => Right = value;} + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Relations/Relation.cs b/csharp/App_backup/Backend/Relations/Relation.cs new file mode 100644 index 000000000..7e37b87ab --- /dev/null +++ b/csharp/App_backup/Backend/Relations/Relation.cs @@ -0,0 +1,34 @@ +using System.Diagnostics.CodeAnalysis; +using SQLite; + +namespace InnovEnergy.App.Backend.Relations; + +public abstract class Relation +{ + [PrimaryKey, AutoIncrement] + [Obsolete("Do not use for any business logic")] + public Int64 Id { get; set; } + + [Ignore] protected L Left { get; set; } = default!; + [Ignore] protected R Right { get; set; } = default!; + + protected Boolean Equals(Relation other) + { + return EqualityComparer.Default.Equals(Left, other.Left) + && EqualityComparer.Default.Equals(Right, other.Right); + } + + public override Boolean Equals(Object? obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + + return obj.GetType() == GetType() && Equals((Relation)obj); + } + + [SuppressMessage("ReSharper", "NonReadonlyMemberInGetHashCode")] + public override Int32 GetHashCode() => HashCode.Combine(Left, Right); + + public static Boolean operator ==(Relation? left, Relation? right) => Equals(left, right); + public static Boolean operator !=(Relation? left, Relation? right) => !Equals(left, right); +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Relations/Session.cs b/csharp/App_backup/Backend/Relations/Session.cs new file mode 100644 index 000000000..e87b762e4 --- /dev/null +++ b/csharp/App_backup/Backend/Relations/Session.cs @@ -0,0 +1,57 @@ +using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.App.Backend.DataTypes.Methods; +using SQLite; + +namespace InnovEnergy.App.Backend.Relations; + +public class Session : Relation +{ + public static TimeSpan MaxAge { get; } = TimeSpan.FromDays(1); + + [Unique ] public String Token { get => Left ; init => Left = value;} + [Indexed] public Int64 UserId { get => Right; init => Right = value;} + [Indexed] public DateTime LastSeen { get; set; } + public Boolean AccessToSalimax { get; set; } = false; + public Boolean AccessToSalidomo { get; set; } = false; + public Boolean AccessToSodioHome { get; set; } = false; + [Ignore] public Boolean Valid => DateTime.Now - LastSeen <=MaxAge ; + + // Private backing field + private User? _User; + + [Ignore] public User User + { + get => _User ??= Db.GetUserById(UserId)!; + set => _User =value; + } + + + [Obsolete("To be used only by deserializer")] + public Session() + {} + + //We need to return a session object to the frontend. Only the public fields can be included. + //For this reason, we use the public User User. It is a public field but ignored, so it can be included to the object returned + //to the frontend but it will not get inserted to the database. + //When we initialize it like that: User = Db.GetUserById(user.Id)!, the set will be called and the private member will be initialized as well. + //What if the getSession method is called from another function of the controller? + //GetSession will retrieve a session object from the database, but this does not have the metadata included (the private fields and the ignored public fields) + //Thus, the get will be called and the private field _User will be initialized on the fly. + public Session(User user) + { + User = Db.GetUserById(user.Id)!; + Token = CreateToken(); + UserId = user.Id; + LastSeen = DateTime.Now; + AccessToSalimax = user.AccessibleInstallations(product: (int)ProductType.Salimax).ToList().Count > 0; + AccessToSalidomo = user.AccessibleInstallations(product: (int)ProductType.Salidomo).ToList().Count > 0; + AccessToSodioHome = user.AccessibleInstallations(product: (int)ProductType.SodioHome).ToList().Count > 0; + } + + private static String CreateToken() + { + return Guid.NewGuid().ToString("N"); + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Resources/CORS b/csharp/App_backup/Backend/Resources/CORS new file mode 100644 index 000000000..171e6ce09 --- /dev/null +++ b/csharp/App_backup/Backend/Resources/CORS @@ -0,0 +1,9 @@ + + + + * + GET + HEAD + * + + diff --git a/csharp/App_backup/Backend/Resources/deploy.sh b/csharp/App_backup/Backend/Resources/deploy.sh new file mode 100644 index 000000000..0a142a00c --- /dev/null +++ b/csharp/App_backup/Backend/Resources/deploy.sh @@ -0,0 +1,4 @@ +#!/bin/bash +sudo systemctl restart backend +sudo cp -rf ~/frontend/build/* +sudo npm install -g serve/var/www/html/monitor.innov.energy/html/ \ No newline at end of file diff --git a/csharp/App_backup/Backend/Resources/exoscaleS3.json b/csharp/App_backup/Backend/Resources/exoscaleS3.json new file mode 100644 index 000000000..97008ddc7 --- /dev/null +++ b/csharp/App_backup/Backend/Resources/exoscaleS3.json @@ -0,0 +1,4 @@ +{ + "Key": "EXOa0b53cf10517307cec1bf00e", + "Secret": "7MbZBQbHDJ1-eRsZH47BEbRvPaTT7io8H7OGqFujdQ4" +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Resources/s3AdminKey.json b/csharp/App_backup/Backend/Resources/s3AdminKey.json new file mode 100644 index 000000000..ea6d3db68 --- /dev/null +++ b/csharp/App_backup/Backend/Resources/s3AdminKey.json @@ -0,0 +1,4 @@ +{ + "Key": "EXO1abcb772bf43ab72951ba1dc", + "Secret": "_ym1KsGBSp90S5dwhZn18XD-u9Y4ghHvyIxg5gv5fHw" +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Resources/s3ReadOnlyKey.json b/csharp/App_backup/Backend/Resources/s3ReadOnlyKey.json new file mode 100644 index 000000000..a55ff349c --- /dev/null +++ b/csharp/App_backup/Backend/Resources/s3ReadOnlyKey.json @@ -0,0 +1,4 @@ +{ + "Key": "EXOb6d6dc1880cdd51f1ebc6692", + "Secret": "kpIey4QJlQFuWG_WoTazcY7kBEjN2f_ll2cDBeg64m4" +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Resources/s3ReadWriteKey.json b/csharp/App_backup/Backend/Resources/s3ReadWriteKey.json new file mode 100644 index 000000000..c93b2a7c0 --- /dev/null +++ b/csharp/App_backup/Backend/Resources/s3ReadWriteKey.json @@ -0,0 +1,4 @@ +{ + "Key": "EXO87ca85e29dd412f1238f1cf0", + "Secret": "-T9TAqy9a3-0-xj7HKsFFJOCcxfRpcnL6OW5oOrOcWU" +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Resources/s3cmd.py b/csharp/App_backup/Backend/Resources/s3cmd.py new file mode 100755 index 000000000..6691d8797 --- /dev/null +++ b/csharp/App_backup/Backend/Resources/s3cmd.py @@ -0,0 +1,3380 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +## -------------------------------------------------------------------- +## s3cmd - S3 client +## +## Authors : Michal Ludvig and contributors +## Copyright : TGRMN Software - http://www.tgrmn.com - and contributors +## Website : http://s3tools.org +## License : GPL Version 2 +## -------------------------------------------------------------------- +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## -------------------------------------------------------------------- + +from __future__ import absolute_import, print_function, division + +import sys + +if sys.version_info < (2, 6): + sys.stderr.write(u"ERROR: Python 2.6 or higher required, sorry.\n") + # 72 == EX_OSFILE + sys.exit(72) + +PY3 = (sys.version_info >= (3, 0)) + +import codecs +import errno +import glob +import io +import locale +import logging +import os +import re +import shutil +import socket +import subprocess +import tempfile +import time +import traceback + +from copy import copy +from optparse import OptionParser, Option, OptionValueError, IndentedHelpFormatter +from logging import debug, info, warning, error + + +try: + import htmlentitydefs +except Exception: + # python 3 support + import html.entities as htmlentitydefs + +try: + unicode +except NameError: + # python 3 support + # In python 3, unicode -> str, and str -> bytes + unicode = str + +try: + unichr +except NameError: + # python 3 support + # In python 3, unichr was removed as chr can now do the job + unichr = chr + +try: + from shutil import which +except ImportError: + # python2 fallback code + from distutils.spawn import find_executable as which + +if not PY3: + # ConnectionRefusedError does not exist in python2 + class ConnectionError(OSError): + pass + class ConnectionRefusedError(ConnectionError): + pass + + +def output(message): + sys.stdout.write(message + "\n") + sys.stdout.flush() + +def check_args_type(args, type, verbose_type): + """NOTE: This function looks like to not be used.""" + for arg in args: + if S3Uri(arg).type != type: + raise ParameterError("Expecting %s instead of '%s'" % (verbose_type, arg)) + +def cmd_du(args): + s3 = S3(Config()) + if len(args) > 0: + uri = S3Uri(args[0]) + if uri.type == "s3" and uri.has_bucket(): + subcmd_bucket_usage(s3, uri) + return EX_OK + subcmd_bucket_usage_all(s3) + return EX_OK + +def subcmd_bucket_usage_all(s3): + """ + Returns: sum of bucket sizes as integer + Raises: S3Error + """ + cfg = Config() + response = s3.list_all_buckets() + + buckets_size = 0 + for bucket in response["list"]: + size = subcmd_bucket_usage(s3, S3Uri("s3://" + bucket["Name"])) + if size != None: + buckets_size += size + total_size, size_coeff = formatSize(buckets_size, cfg.human_readable_sizes) + total_size_str = str(total_size) + size_coeff + output(u"".rjust(12, "-")) + output(u"%s Total" % (total_size_str.ljust(12))) + return size + +def subcmd_bucket_usage(s3, uri): + """ + Returns: bucket size as integer + Raises: S3Error + """ + bucket_size = 0 + object_count = 0 + extra_info = u'' + + bucket = uri.bucket() + prefix = uri.object() + try: + for _, _, objects in s3.bucket_list_streaming(bucket, prefix=prefix, recursive=True): + for obj in objects: + bucket_size += int(obj["Size"]) + object_count += 1 + + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % bucket) + raise + + except KeyboardInterrupt as e: + extra_info = u' [interrupted]' + + total_size_str = u"%d%s" % formatSize(bucket_size, + Config().human_readable_sizes) + if Config().human_readable_sizes: + total_size_str = total_size_str.rjust(5) + else: + total_size_str = total_size_str.rjust(12) + output(u"%s %7s objects %s%s" % (total_size_str, object_count, uri, + extra_info)) + return bucket_size + +def cmd_ls(args): + cfg = Config() + s3 = S3(cfg) + if len(args) > 0: + uri = S3Uri(args[0]) + if uri.type == "s3" and uri.has_bucket(): + subcmd_bucket_list(s3, uri, cfg.limit) + return EX_OK + + # If not a s3 type uri or no bucket was provided, list all the buckets + subcmd_all_buckets_list(s3) + return EX_OK + +def subcmd_all_buckets_list(s3): + + response = s3.list_all_buckets() + + for bucket in sorted(response["list"], key=lambda b:b["Name"]): + output(u"%s s3://%s" % (formatDateTime(bucket["CreationDate"]), + bucket["Name"])) + +def cmd_all_buckets_list_all_content(args): + cfg = Config() + s3 = S3(cfg) + + response = s3.list_all_buckets() + + for bucket in response["list"]: + subcmd_bucket_list(s3, S3Uri("s3://" + bucket["Name"]), cfg.limit) + output(u"") + return EX_OK + +def subcmd_bucket_list(s3, uri, limit): + cfg = Config() + + bucket = uri.bucket() + prefix = uri.object() + + debug(u"Bucket 's3://%s':" % bucket) + if prefix.endswith('*'): + prefix = prefix[:-1] + try: + response = s3.bucket_list(bucket, prefix = prefix, limit = limit) + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % bucket) + raise + + # md5 are 32 char long, but for multipart there could be a suffix + if Config().human_readable_sizes: + # %(size)5s%(coeff)1s + format_size = u"%5d%1s" + dir_str = u"DIR".rjust(6) + else: + format_size = u"%12d%s" + dir_str = u"DIR".rjust(12) + if cfg.long_listing: + format_string = u"%(timestamp)16s %(size)s %(md5)-35s %(storageclass)-11s %(uri)s" + elif cfg.list_md5: + format_string = u"%(timestamp)16s %(size)s %(md5)-35s %(uri)s" + else: + format_string = u"%(timestamp)16s %(size)s %(uri)s" + + for prefix in response['common_prefixes']: + output(format_string % { + "timestamp": "", + "size": dir_str, + "md5": "", + "storageclass": "", + "uri": uri.compose_uri(bucket, prefix["Prefix"])}) + + for object in response["list"]: + md5 = object.get('ETag', '').strip('"\'') + storageclass = object.get('StorageClass','') + + if cfg.list_md5: + if '-' in md5: # need to get md5 from the object + object_uri = uri.compose_uri(bucket, object["Key"]) + info_response = s3.object_info(S3Uri(object_uri)) + try: + md5 = info_response['s3cmd-attrs']['md5'] + except KeyError: + pass + + size_and_coeff = formatSize(object["Size"], + Config().human_readable_sizes) + output(format_string % { + "timestamp": formatDateTime(object["LastModified"]), + "size" : format_size % size_and_coeff, + "md5" : md5, + "storageclass" : storageclass, + "uri": uri.compose_uri(bucket, object["Key"]), + }) + + if response["truncated"]: + warning(u"The list is truncated because the settings limit was reached.") + +def cmd_bucket_create(args): + cfg = Config() + s3 = S3(cfg) + + for arg in args: + uri = S3Uri(arg) + if not uri.type == "s3" or not uri.has_bucket() or uri.has_object(): + raise ParameterError("Expecting S3 URI with just the bucket name set instead of '%s'" % arg) + try: + response = s3.bucket_create(uri.bucket(), cfg.bucket_location, cfg.extra_headers) + output(u"Bucket '%s' created" % uri.uri()) + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % uri.bucket()) + raise + return EX_OK + +def cmd_website_info(args): + cfg = Config() + s3 = S3(cfg) + for arg in args: + uri = S3Uri(arg) + if not uri.type == "s3" or not uri.has_bucket() or uri.has_object(): + raise ParameterError("Expecting S3 URI with just the bucket name set instead of '%s'" % arg) + try: + response = s3.website_info(uri, cfg.bucket_location) + if response: + output(u"Bucket %s: Website configuration" % uri.uri()) + output(u"Website endpoint: %s" % response['website_endpoint']) + output(u"Index document: %s" % response['index_document']) + output(u"Error document: %s" % response['error_document']) + else: + output(u"Bucket %s: Unable to receive website configuration." % (uri.uri())) + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % uri.bucket()) + raise + return EX_OK + +def cmd_website_create(args): + cfg = Config() + s3 = S3(cfg) + for arg in args: + uri = S3Uri(arg) + if not uri.type == "s3" or not uri.has_bucket() or uri.has_object(): + raise ParameterError("Expecting S3 URI with just the bucket name set instead of '%s'" % arg) + try: + response = s3.website_create(uri, cfg.bucket_location) + output(u"Bucket '%s': website configuration created." % (uri.uri())) + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % uri.bucket()) + raise + return EX_OK + +def cmd_website_delete(args): + cfg = Config() + s3 = S3(cfg) + for arg in args: + uri = S3Uri(arg) + if not uri.type == "s3" or not uri.has_bucket() or uri.has_object(): + raise ParameterError("Expecting S3 URI with just the bucket name set instead of '%s'" % arg) + try: + response = s3.website_delete(uri, cfg.bucket_location) + output(u"Bucket '%s': website configuration deleted." % (uri.uri())) + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % uri.bucket()) + raise + return EX_OK + +def cmd_expiration_set(args): + cfg = Config() + s3 = S3(cfg) + for arg in args: + uri = S3Uri(arg) + if not uri.type == "s3" or not uri.has_bucket() or uri.has_object(): + raise ParameterError("Expecting S3 URI with just the bucket name set instead of '%s'" % arg) + try: + response = s3.expiration_set(uri, cfg.bucket_location) + if response["status"] == 200: + output(u"Bucket '%s': expiration configuration is set." % (uri.uri())) + elif response["status"] == 204: + output(u"Bucket '%s': expiration configuration is deleted." % (uri.uri())) + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % uri.bucket()) + raise + return EX_OK + +def cmd_bucket_delete(args): + cfg = Config() + s3 = S3(cfg) + + def _bucket_delete_one(uri, retry=True): + try: + response = s3.bucket_delete(uri.bucket()) + output(u"Bucket '%s' removed" % uri.uri()) + except S3Error as e: + if e.info['Code'] == 'NoSuchBucket': + if cfg.force: + return EX_OK + else: + raise + if e.info['Code'] == 'BucketNotEmpty' and retry and (cfg.force or cfg.recursive): + warning(u"Bucket is not empty. Removing all the objects from it first. This may take some time...") + rc = subcmd_batch_del(uri_str = uri.uri()) + if rc == EX_OK: + return _bucket_delete_one(uri, False) + else: + output(u"Bucket was not removed") + elif e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % uri.bucket()) + raise + return EX_OK + + for arg in args: + uri = S3Uri(arg) + if not uri.type == "s3" or not uri.has_bucket() or uri.has_object(): + raise ParameterError("Expecting S3 URI with just the bucket name set instead of '%s'" % arg) + rc = _bucket_delete_one(uri) + if rc != EX_OK: + return rc + return EX_OK + +def cmd_object_put(args): + cfg = Config() + s3 = S3(cfg) + + if len(args) == 0: + raise ParameterError("Nothing to upload. Expecting a local file or directory and a S3 URI destination.") + + ## Normalize URI to convert s3://bkt to s3://bkt/ (trailing slash) + destination_base_uri = S3Uri(args.pop()) + if destination_base_uri.type != 's3': + raise ParameterError("Destination must be S3Uri. Got: %s" % destination_base_uri) + destination_base = destination_base_uri.uri() + + if len(args) == 0: + raise ParameterError("Nothing to upload. Expecting a local file or directory.") + + local_list, single_file_local, exclude_list, total_size_local = fetch_local_list(args, is_src = True) + + local_count = len(local_list) + + info(u"Summary: %d local files to upload" % local_count) + + if local_count == 0: + raise ParameterError("Nothing to upload.") + + if local_count > 0: + if not single_file_local and '-' in local_list.keys(): + raise ParameterError("Cannot specify multiple local files if uploading from '-' (ie stdin)") + elif single_file_local and local_list.keys()[0] == "-" and destination_base.endswith("/"): + raise ParameterError("Destination S3 URI must not end with '/' when uploading from stdin.") + elif not destination_base.endswith("/"): + if not single_file_local: + raise ParameterError("Destination S3 URI must end with '/' (ie must refer to a directory on the remote side).") + local_list[local_list.keys()[0]]['remote_uri'] = destination_base + else: + for key in local_list: + local_list[key]['remote_uri'] = destination_base + key + + if cfg.dry_run: + for key in exclude_list: + output(u"exclude: %s" % key) + for key in local_list: + if key != "-": + nicekey = local_list[key]['full_name'] + else: + nicekey = "" + output(u"upload: '%s' -> '%s'" % (nicekey, local_list[key]['remote_uri'])) + + warning(u"Exiting now because of --dry-run") + return EX_OK + + seq = 0 + ret = EX_OK + for key in local_list: + seq += 1 + + uri_final = S3Uri(local_list[key]['remote_uri']) + try: + src_md5 = local_list.get_md5(key) + except IOError: + src_md5 = None + + extra_headers = copy(cfg.extra_headers) + full_name_orig = local_list[key]['full_name'] + full_name = full_name_orig + seq_label = "[%d of %d]" % (seq, local_count) + if Config().encrypt: + gpg_exitcode, full_name, extra_headers["x-amz-meta-s3tools-gpgenc"] = gpg_encrypt(full_name_orig) + attr_header = _build_attr_header(local_list[key], key, src_md5) + debug(u"attr_header: %s" % attr_header) + extra_headers.update(attr_header) + try: + response = s3.object_put(full_name, uri_final, extra_headers, extra_label = seq_label) + except S3UploadError as exc: + error(u"Upload of '%s' failed too many times (Last reason: %s)" % (full_name_orig, exc)) + if cfg.stop_on_error: + ret = EX_DATAERR + error(u"Exiting now because of --stop-on-error") + break + ret = EX_PARTIAL + continue + except InvalidFileError as exc: + error(u"Upload of '%s' is not possible (Reason: %s)" % (full_name_orig, exc)) + ret = EX_PARTIAL + if cfg.stop_on_error: + ret = EX_OSFILE + error(u"Exiting now because of --stop-on-error") + break + continue + if response is not None: + speed_fmt = formatSize(response["speed"], human_readable = True, floating_point = True) + if not Config().progress_meter: + if full_name_orig != "-": + nicekey = full_name_orig + else: + nicekey = "" + output(u"upload: '%s' -> '%s' (%d bytes in %0.1f seconds, %0.2f %sB/s) %s" % + (nicekey, uri_final, response["size"], response["elapsed"], + speed_fmt[0], speed_fmt[1], seq_label)) + if Config().acl_public: + output(u"Public URL of the object is: %s" % + (uri_final.public_url())) + if Config().encrypt and full_name != full_name_orig: + debug(u"Removing temporary encrypted file: %s" % full_name) + os.remove(deunicodise(full_name)) + return ret + +def cmd_object_get(args): + cfg = Config() + s3 = S3(cfg) + + ## Check arguments: + ## if not --recursive: + ## - first N arguments must be S3Uri + ## - if the last one is S3 make current dir the destination_base + ## - if the last one is a directory: + ## - take all 'basenames' of the remote objects and + ## make the destination name be 'destination_base'+'basename' + ## - if the last one is a file or not existing: + ## - if the number of sources (N, above) == 1 treat it + ## as a filename and save the object there. + ## - if there's more sources -> Error + ## if --recursive: + ## - first N arguments must be S3Uri + ## - for each Uri get a list of remote objects with that Uri as a prefix + ## - apply exclude/include rules + ## - each list item will have MD5sum, Timestamp and pointer to S3Uri + ## used as a prefix. + ## - the last arg may be '-' (stdout) + ## - the last arg may be a local directory - destination_base + ## - if the last one is S3 make current dir the destination_base + ## - if the last one doesn't exist check remote list: + ## - if there is only one item and its_prefix==its_name + ## download that item to the name given in last arg. + ## - if there are more remote items use the last arg as a destination_base + ## and try to create the directory (incl. all parents). + ## + ## In both cases we end up with a list mapping remote object names (keys) to local file names. + + ## Each item will be a dict with the following attributes + # {'remote_uri', 'local_filename'} + download_list = [] + + if len(args) == 0: + raise ParameterError("Nothing to download. Expecting S3 URI.") + + if S3Uri(args[-1]).type == 'file': + destination_base = args.pop() + else: + destination_base = "." + + if len(args) == 0: + raise ParameterError("Nothing to download. Expecting S3 URI.") + + try: + remote_list, exclude_list, remote_total_size = fetch_remote_list( + args, require_attribs = True) + except S3Error as exc: + if exc.code == 'NoSuchKey': + raise ParameterError("Source object '%s' does not exist." % exc.resource) + raise + + remote_count = len(remote_list) + + info(u"Summary: %d remote files to download" % remote_count) + + if remote_count > 0: + if destination_base == "-": + ## stdout is ok for multiple remote files! + for key in remote_list: + remote_list[key]['local_filename'] = "-" + elif not os.path.isdir(deunicodise(destination_base)): + ## We were either given a file name (existing or not) + if remote_count > 1: + raise ParameterError("Destination must be a directory or stdout when downloading multiple sources.") + remote_list[remote_list.keys()[0]]['local_filename'] = destination_base + else: + if destination_base[-1] != os.path.sep: + destination_base += os.path.sep + for key in remote_list: + local_filename = destination_base + key + if os.path.sep != "/": + local_filename = os.path.sep.join(local_filename.split("/")) + remote_list[key]['local_filename'] = local_filename + + if cfg.dry_run: + for key in exclude_list: + output(u"exclude: %s" % key) + for key in remote_list: + output(u"download: '%s' -> '%s'" % (remote_list[key]['object_uri_str'], remote_list[key]['local_filename'])) + + warning(u"Exiting now because of --dry-run") + return EX_OK + + seq = 0 + ret = EX_OK + for key in remote_list: + seq += 1 + item = remote_list[key] + uri = S3Uri(item['object_uri_str']) + ## Encode / Decode destination with "replace" to make sure it's compatible with current encoding + destination = unicodise_safe(item['local_filename']) + seq_label = "[%d of %d]" % (seq, remote_count) + + start_position = 0 + + if destination == "-": + ## stdout + dst_stream = io.open(sys.__stdout__.fileno(), mode='wb', closefd=False) + dst_stream.stream_name = u'' + file_exists = True + else: + ## File + try: + file_exists = os.path.exists(deunicodise(destination)) + try: + dst_stream = io.open(deunicodise(destination), mode='ab') + dst_stream.stream_name = destination + except IOError as e: + if e.errno != errno.ENOENT: + raise + basename = destination[:destination.rindex(os.path.sep)] + info(u"Creating directory: %s" % basename) + os.makedirs(deunicodise(basename)) + dst_stream = io.open(deunicodise(destination), mode='ab') + dst_stream.stream_name = destination + + if file_exists: + force = False + skip = False + if Config().get_continue: + start_position = dst_stream.tell() + item_size = item['size'] + if start_position == item_size: + skip = True + elif start_position > item_size: + info(u"Download forced for '%s' as source is " + "smaller than local file" % destination) + force = True + elif Config().force: + force = True + elif Config().skip_existing: + skip = True + else: + dst_stream.close() + raise ParameterError( + u"File '%s' already exists. Use either of --force /" + " --continue / --skip-existing or give it a new" + " name." % destination + ) + + if skip: + dst_stream.close() + info(u"Skipping over existing file: '%s'" % destination) + continue + + if force: + start_position = 0 + dst_stream.seek(0) + dst_stream.truncate() + + except IOError as e: + error(u"Creation of file '%s' failed (Reason: %s)" + % (destination, e.strerror)) + if cfg.stop_on_error: + error(u"Exiting now because of --stop-on-error") + raise + ret = EX_PARTIAL + continue + + try: + try: + response = s3.object_get(uri, dst_stream, destination, start_position = start_position, extra_label = seq_label) + finally: + dst_stream.close() + except S3DownloadError as e: + error(u"Download of '%s' failed (Reason: %s)" % (destination, e)) + # Delete, only if file didn't exist before! + if not file_exists: + debug(u"object_get failed for '%s', deleting..." % (destination,)) + os.unlink(deunicodise(destination)) + if cfg.stop_on_error: + error(u"Exiting now because of --stop-on-error") + raise + ret = EX_PARTIAL + continue + except S3Error as e: + error(u"Download of '%s' failed (Reason: %s)" % (destination, e)) + if not file_exists: # Delete, only if file didn't exist before! + debug(u"object_get failed for '%s', deleting..." % (destination,)) + os.unlink(deunicodise(destination)) + raise + + if "x-amz-meta-s3tools-gpgenc" in response["headers"]: + gpg_decrypt(destination, response["headers"]["x-amz-meta-s3tools-gpgenc"]) + response["size"] = os.stat(deunicodise(destination))[6] + if "last-modified" in response["headers"] and destination != "-": + last_modified = time.mktime(time.strptime(response["headers"]["last-modified"], "%a, %d %b %Y %H:%M:%S GMT")) + os.utime(deunicodise(destination), (last_modified, last_modified)) + debug("set mtime to %s" % last_modified) + if not Config().progress_meter and destination != "-": + speed_fmt = formatSize(response["speed"], human_readable = True, floating_point = True) + output(u"download: '%s' -> '%s' (%d bytes in %0.1f seconds, %0.2f %sB/s)" % + (uri, destination, response["size"], response["elapsed"], speed_fmt[0], speed_fmt[1])) + if Config().delete_after_fetch: + s3.object_delete(uri) + output(u"File '%s' removed after fetch" % (uri)) + return ret + +def cmd_object_del(args): + cfg = Config() + recursive = cfg.recursive + for uri_str in args: + uri = S3Uri(uri_str) + if uri.type != "s3": + raise ParameterError("Expecting S3 URI instead of '%s'" % uri_str) + if not uri.has_object(): + if recursive and not cfg.force: + raise ParameterError("Please use --force to delete ALL contents of %s" % uri_str) + elif not recursive: + raise ParameterError("File name required, not only the bucket name. Alternatively use --recursive") + + if not recursive: + rc = subcmd_object_del_uri(uri_str) + elif cfg.exclude or cfg.include or cfg.max_delete > 0: + # subcmd_batch_del_iterative does not support file exclusion and can't + # accurately know how many total files will be deleted, so revert to batch delete. + rc = subcmd_batch_del(uri_str = uri_str) + else: + rc = subcmd_batch_del_iterative(uri_str = uri_str) + if not rc: + return rc + return EX_OK + +def subcmd_batch_del_iterative(uri_str = None, bucket = None): + """ Streaming version of batch deletion (doesn't realize whole list in memory before deleting). + + Differences from subcmd_batch_del: + - Does not obey --exclude directives or obey cfg.max_delete (use subcmd_batch_del in those cases) + """ + if bucket and uri_str: + raise ValueError("Pass only one of uri_str or bucket") + if bucket: # bucket specified + uri_str = "s3://%s" % bucket + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(uri_str) + bucket = uri.bucket() + + deleted_bytes = deleted_count = 0 + + for _, _, to_delete in s3.bucket_list_streaming(bucket, prefix=uri.object(), recursive=True): + if not to_delete: + continue + if not cfg.dry_run: + response = s3.object_batch_delete_uri_strs([uri.compose_uri(bucket, item['Key']) for item in to_delete]) + deleted_bytes += sum(int(item["Size"]) for item in to_delete) + deleted_count += len(to_delete) + output(u'\n'.join(u"delete: '%s'" % uri.compose_uri(bucket, p['Key']) for p in to_delete)) + + if deleted_count: + # display summary data of deleted files + if cfg.stats: + stats_info = StatsInfo() + stats_info.files_deleted = deleted_count + stats_info.size_deleted = deleted_bytes + output(stats_info.format_output()) + else: + total_size, size_coeff = formatSize(deleted_bytes, Config().human_readable_sizes) + total_size_str = str(total_size) + size_coeff + info(u"Deleted %s objects (%s) from %s" % (deleted_count, total_size_str, uri)) + else: + warning(u"Remote list is empty.") + + return EX_OK + +def subcmd_batch_del(uri_str = None, bucket = None, remote_list = None): + """ + Returns: EX_OK + Raises: ValueError + """ + cfg = Config() + s3 = S3(cfg) + def _batch_del(remote_list): + to_delete = remote_list[:1000] + remote_list = remote_list[1000:] + while len(to_delete): + debug(u"Batch delete %d, remaining %d" % (len(to_delete), len(remote_list))) + if not cfg.dry_run: + response = s3.object_batch_delete(to_delete) + output(u'\n'.join((u"delete: '%s'" % to_delete[p]['object_uri_str']) for p in to_delete)) + to_delete = remote_list[:1000] + remote_list = remote_list[1000:] + + if remote_list is not None and len(remote_list) == 0: + return False + + if len([item for item in [uri_str, bucket, remote_list] if item]) != 1: + raise ValueError("One and only one of 'uri_str', 'bucket', 'remote_list' can be specified.") + + if bucket: # bucket specified + uri_str = "s3://%s" % bucket + if remote_list is None: # uri_str specified + remote_list, exclude_list, remote_total_size = fetch_remote_list(uri_str, require_attribs = False) + + if len(remote_list) == 0: + warning(u"Remote list is empty.") + return EX_OK + + if cfg.max_delete > 0 and len(remote_list) > cfg.max_delete: + warning(u"delete: maximum requested number of deletes would be exceeded, none performed.") + return EX_OK + + _batch_del(remote_list) + + if cfg.dry_run: + warning(u"Exiting now because of --dry-run") + return EX_OK + +def subcmd_object_del_uri(uri_str, recursive = None): + """ + Returns: True if XXX, False if XXX + Raises: ValueError + """ + cfg = Config() + s3 = S3(cfg) + + if recursive is None: + recursive = cfg.recursive + + remote_list, exclude_list, remote_total_size = fetch_remote_list(uri_str, require_attribs = False, recursive = recursive) + + remote_count = len(remote_list) + + info(u"Summary: %d remote files to delete" % remote_count) + if cfg.max_delete > 0 and remote_count > cfg.max_delete: + warning(u"delete: maximum requested number of deletes would be exceeded, none performed.") + return False + + if cfg.dry_run: + for key in exclude_list: + output(u"exclude: %s" % key) + for key in remote_list: + output(u"delete: %s" % remote_list[key]['object_uri_str']) + + warning(u"Exiting now because of --dry-run") + return True + + for key in remote_list: + item = remote_list[key] + response = s3.object_delete(S3Uri(item['object_uri_str'])) + output(u"delete: '%s'" % item['object_uri_str']) + return True + +def cmd_object_restore(args): + cfg = Config() + s3 = S3(cfg) + + if cfg.restore_days < 1: + raise ParameterError("You must restore a file for 1 or more days") + + # accept case-insensitive argument but fix it to match S3 API + if cfg.restore_priority.title() not in ['Standard', 'Expedited', 'Bulk']: + raise ParameterError("Valid restoration priorities: bulk, standard, expedited") + else: + cfg.restore_priority = cfg.restore_priority.title() + + remote_list, exclude_list, remote_total_size = fetch_remote_list(args, require_attribs = False, recursive = cfg.recursive) + + remote_count = len(remote_list) + + info(u"Summary: Restoring %d remote files for %d days at %s priority" % (remote_count, cfg.restore_days, cfg.restore_priority)) + + if cfg.dry_run: + for key in exclude_list: + output(u"exclude: %s" % key) + for key in remote_list: + output(u"restore: '%s'" % remote_list[key]['object_uri_str']) + + warning(u"Exiting now because of --dry-run") + return EX_OK + + for key in remote_list: + item = remote_list[key] + + uri = S3Uri(item['object_uri_str']) + if not item['object_uri_str'].endswith("/"): + try: + response = s3.object_restore(S3Uri(item['object_uri_str'])) + output(u"restore: '%s'" % item['object_uri_str']) + except S3Error as e: + if e.code == "RestoreAlreadyInProgress": + warning("%s: %s" % (e.message, item['object_uri_str'])) + else: + raise e + else: + debug(u"Skipping directory since only files may be restored") + return EX_OK + + +def subcmd_cp_mv(args, process_fce, action_str, message): + cfg = Config() + if action_str == 'modify': + if len(args) < 1: + raise ParameterError("Expecting one or more S3 URIs for " + + action_str) + destination_base = None + else: + if len(args) < 2: + raise ParameterError("Expecting two or more S3 URIs for " + + action_str) + dst_base_uri = S3Uri(args.pop()) + if dst_base_uri.type != "s3": + raise ParameterError("Destination must be S3 URI. To download a " + "file use 'get' or 'sync'.") + destination_base = dst_base_uri.uri() + + scoreboard = ExitScoreboard() + + remote_list, exclude_list, remote_total_size = \ + fetch_remote_list(args, require_attribs=False) + + remote_count = len(remote_list) + + info(u"Summary: %d remote files to %s" % (remote_count, action_str)) + + if destination_base: + # Trying to mv dir1/ to dir2 will not pass a test in S3.FileLists, + # so we don't need to test for it here. + if not destination_base.endswith('/') \ + and (len(remote_list) > 1 or cfg.recursive): + raise ParameterError("Destination must be a directory and end with" + " '/' when acting on a folder content or on " + "multiple sources.") + + if cfg.recursive: + for key in remote_list: + remote_list[key]['dest_name'] = destination_base + key + else: + for key in remote_list: + if destination_base.endswith("/"): + remote_list[key]['dest_name'] = destination_base + key + else: + remote_list[key]['dest_name'] = destination_base + else: + for key in remote_list: + remote_list[key]['dest_name'] = remote_list[key]['object_uri_str'] + + if cfg.dry_run: + for key in exclude_list: + output(u"exclude: %s" % key) + for key in remote_list: + output(u"%s: '%s' -> '%s'" % (action_str, + remote_list[key]['object_uri_str'], + remote_list[key]['dest_name'])) + + warning(u"Exiting now because of --dry-run") + return EX_OK + + seq = 0 + for key in remote_list: + seq += 1 + seq_label = "[%d of %d]" % (seq, remote_count) + + item = remote_list[key] + src_uri = S3Uri(item['object_uri_str']) + dst_uri = S3Uri(item['dest_name']) + src_size = item.get('size') + + extra_headers = copy(cfg.extra_headers) + try: + response = process_fce(src_uri, dst_uri, extra_headers, + src_size=src_size, + extra_label=seq_label) + output(message % {"src": src_uri, "dst": dst_uri, + "extra": seq_label}) + if Config().acl_public: + info(u"Public URL is: %s" % dst_uri.public_url()) + scoreboard.success() + except (S3Error, S3UploadError) as exc: + if isinstance(exc, S3Error) and exc.code == "NoSuchKey": + scoreboard.notfound() + warning(u"Key not found %s" % item['object_uri_str']) + else: + scoreboard.failed() + error(u"Copy failed for: '%s' (%s)", item['object_uri_str'], + exc) + + if cfg.stop_on_error: + break + return scoreboard.rc() + +def cmd_cp(args): + s3 = S3(Config()) + return subcmd_cp_mv(args, s3.object_copy, "copy", + u"remote copy: '%(src)s' -> '%(dst)s' %(extra)s") + +def cmd_modify(args): + s3 = S3(Config()) + return subcmd_cp_mv(args, s3.object_modify, "modify", + u"modify: '%(src)s' %(extra)s") + +def cmd_mv(args): + s3 = S3(Config()) + return subcmd_cp_mv(args, s3.object_move, "move", + u"move: '%(src)s' -> '%(dst)s' %(extra)s") + +def cmd_info(args): + cfg = Config() + s3 = S3(cfg) + + while (len(args)): + uri_arg = args.pop(0) + uri = S3Uri(uri_arg) + if uri.type != "s3" or not uri.has_bucket(): + raise ParameterError("Expecting S3 URI instead of '%s'" % uri_arg) + + try: + if uri.has_object(): + info = s3.object_info(uri) + output(u"%s (object):" % uri.uri()) + output(u" File size: %s" % info['headers']['content-length']) + output(u" Last mod: %s" % info['headers']['last-modified']) + output(u" MIME type: %s" % info['headers'].get('content-type', 'none')) + output(u" Storage: %s" % info['headers'].get('x-amz-storage-class', 'STANDARD')) + md5 = info['headers'].get('etag', '').strip('"\'') + try: + md5 = info['s3cmd-attrs']['md5'] + except KeyError: + pass + output(u" MD5 sum: %s" % md5) + if 'x-amz-server-side-encryption' in info['headers']: + output(u" SSE: %s" % info['headers']['x-amz-server-side-encryption']) + else: + output(u" SSE: none") + + else: + info = s3.bucket_info(uri) + output(u"%s (bucket):" % uri.uri()) + output(u" Location: %s" % (info['bucket-location'] + or 'none')) + output(u" Payer: %s" % (info['requester-pays'] + or 'none')) + expiration = s3.expiration_info(uri, cfg.bucket_location) + if expiration and expiration['prefix'] is not None: + expiration_desc = "Expiration Rule: " + if expiration['prefix'] == "": + expiration_desc += "all objects in this bucket " + elif expiration['prefix'] is not None: + expiration_desc += "objects with key prefix '" + expiration['prefix'] + "' " + expiration_desc += "will expire in '" + if expiration['days']: + expiration_desc += expiration['days'] + "' day(s) after creation" + elif expiration['date']: + expiration_desc += expiration['date'] + "' " + output(u" %s" % expiration_desc) + else: + output(u" Expiration Rule: none") + + try: + policy = s3.get_policy(uri) + output(u" Policy: %s" % policy) + except S3Error as exc: + # Ignore the exception and don't fail the info + # if the server doesn't support setting ACLs + if exc.status == 403: + output(u" Policy: Not available: GetPolicy permission is needed to read the policy") + elif exc.status == 405: + output(u" Policy: Not available: Only the bucket owner can read the policy") + elif exc.status not in [404, 501]: + raise exc + else: + output(u" Policy: none") + + try: + cors = s3.get_cors(uri) + output(u" CORS: %s" % cors) + except S3Error as exc: + # Ignore the exception and don't fail the info + # if the server doesn't support setting ACLs + if exc.status not in [404, 501]: + raise exc + output(u" CORS: none") + + try: + acl = s3.get_acl(uri) + acl_grant_list = acl.getGrantList() + for grant in acl_grant_list: + output(u" ACL: %s: %s" % (grant['grantee'], grant['permission'])) + if acl.isAnonRead(): + output(u" URL: %s" % uri.public_url()) + except S3Error as exc: + # Ignore the exception and don't fail the info + # if the server doesn't support setting ACLs + if exc.status not in [404, 501]: + raise exc + else: + output(u" ACL: none") + + if uri.has_object(): + # Temporary hack for performance + python3 compatibility + if PY3: + info_headers_iter = info['headers'].items() + else: + info_headers_iter = info['headers'].iteritems() + for header, value in info_headers_iter: + if header.startswith('x-amz-meta-'): + output(u" %s: %s" % (header, value)) + + except S3Error as e: + if e.info["Code"] in S3.codes: + error(S3.codes[e.info["Code"]] % uri.bucket()) + raise + return EX_OK + +def filedicts_to_keys(*args): + keys = set() + for a in args: + keys.update(a.keys()) + keys = list(keys) + keys.sort() + return keys + +def cmd_sync_remote2remote(args): + cfg = Config() + s3 = S3(cfg) + + # Normalise s3://uri (e.g. assert trailing slash) + destination_base = S3Uri(args[-1]).uri() + + destbase_with_source_list = set() + for source_arg in args[:-1]: + if source_arg.endswith('/'): + destbase_with_source_list.add(destination_base) + else: + destbase_with_source_list.add(os.path.join(destination_base, + os.path.basename(source_arg))) + + stats_info = StatsInfo() + + src_list, src_exclude_list, remote_total_size = fetch_remote_list(args[:-1], recursive = True, require_attribs = True) + dst_list, dst_exclude_list, _ = fetch_remote_list(destbase_with_source_list, recursive = True, require_attribs = True) + + src_count = len(src_list) + orig_src_count = src_count + dst_count = len(dst_list) + deleted_count = 0 + + info(u"Found %d source files, %d destination files" % (src_count, dst_count)) + + src_list, dst_list, update_list, copy_pairs = compare_filelists(src_list, dst_list, src_remote = True, dst_remote = True) + + src_count = len(src_list) + update_count = len(update_list) + dst_count = len(dst_list) + + print(u"Summary: %d source files to copy, %d files at destination to delete" % (src_count + update_count, dst_count)) + + ### Populate 'target_uri' only if we've got something to sync from src to dst + for key in src_list: + src_list[key]['target_uri'] = destination_base + key + for key in update_list: + update_list[key]['target_uri'] = destination_base + key + + if cfg.dry_run: + keys = filedicts_to_keys(src_exclude_list, dst_exclude_list) + for key in keys: + output(u"exclude: %s" % key) + if cfg.delete_removed: + for key in dst_list: + output(u"delete: '%s'" % dst_list[key]['object_uri_str']) + for key in src_list: + output(u"remote copy: '%s' -> '%s'" % (src_list[key]['object_uri_str'], src_list[key]['target_uri'])) + for key in update_list: + output(u"remote copy: '%s' -> '%s'" % (update_list[key]['object_uri_str'], update_list[key]['target_uri'])) + warning(u"Exiting now because of --dry-run") + return EX_OK + + # if there are copy pairs, we can't do delete_before, on the chance + # we need one of the to-be-deleted files as a copy source. + if len(copy_pairs) > 0: + cfg.delete_after = True + + if cfg.delete_removed and orig_src_count == 0 and len(dst_list) and not cfg.force: + warning(u"delete: cowardly refusing to delete because no source files were found. Use --force to override.") + cfg.delete_removed = False + + # Delete items in destination that are not in source + if cfg.delete_removed and not cfg.delete_after: + subcmd_batch_del(remote_list = dst_list) + deleted_count = len(dst_list) + + def _upload(src_list, seq, src_count): + file_list = src_list.keys() + file_list.sort() + ret = EX_OK + total_nb_files = 0 + total_size = 0 + for file in file_list: + seq += 1 + item = src_list[file] + src_uri = S3Uri(item['object_uri_str']) + dst_uri = S3Uri(item['target_uri']) + src_size = item.get('size') + seq_label = "[%d of %d]" % (seq, src_count) + extra_headers = copy(cfg.extra_headers) + try: + response = s3.object_copy(src_uri, dst_uri, extra_headers, + src_size=src_size, + extra_label=seq_label) + output(u"remote copy: '%s' -> '%s' %s" % + (src_uri, dst_uri, seq_label)) + total_nb_files += 1 + total_size += item.get(u'size', 0) + except (S3Error, S3UploadError) as exc: + ret = EX_PARTIAL + error(u"File '%s' could not be copied: %s", src_uri, exc) + if cfg.stop_on_error: + raise + return ret, seq, total_nb_files, total_size + + # Perform the synchronization of files + timestamp_start = time.time() + seq = 0 + ret, seq, nb_files, size = _upload(src_list, seq, src_count + update_count) + total_files_copied = nb_files + total_size_copied = size + + status, seq, nb_files, size = _upload(update_list, seq, src_count + update_count) + if ret == EX_OK: + ret = status + total_files_copied += nb_files + total_size_copied += size + + n_copied, bytes_saved, failed_copy_files = remote_copy( + s3, copy_pairs, destination_base, None, False) + total_files_copied += n_copied + total_size_copied += bytes_saved + + #process files not copied + debug("Process files that were not remotely copied") + failed_copy_count = len(failed_copy_files) + for key in failed_copy_files: + failed_copy_files[key]['target_uri'] = destination_base + key + status, seq, nb_files, size = _upload(failed_copy_files, seq, src_count + update_count + failed_copy_count) + if ret == EX_OK: + ret = status + total_files_copied += nb_files + total_size_copied += size + + # Delete items in destination that are not in source + if cfg.delete_removed and cfg.delete_after: + subcmd_batch_del(remote_list = dst_list) + deleted_count = len(dst_list) + + stats_info.files = orig_src_count + stats_info.size = remote_total_size + stats_info.files_copied = total_files_copied + stats_info.size_copied = total_size_copied + stats_info.files_deleted = deleted_count + + total_elapsed = max(1.0, time.time() - timestamp_start) + outstr = "Done. Copied %d files in %0.1f seconds, %0.2f files/s." % (total_files_copied, total_elapsed, seq / total_elapsed) + if cfg.stats: + outstr += stats_info.format_output() + output(outstr) + elif seq > 0: + output(outstr) + else: + info(outstr) + + return ret + +def cmd_sync_remote2local(args): + cfg = Config() + s3 = S3(cfg) + + def _do_deletes(local_list): + total_size = 0 + if cfg.max_delete > 0 and len(local_list) > cfg.max_delete: + warning(u"delete: maximum requested number of deletes would be exceeded, none performed.") + return total_size + for key in local_list: + os.unlink(deunicodise(local_list[key]['full_name'])) + output(u"delete: '%s'" % local_list[key]['full_name']) + total_size += local_list[key].get(u'size', 0) + return len(local_list), total_size + + destination_base = args[-1] + source_args = args[:-1] + fetch_source_args = args[:-1] + + if not destination_base.endswith(os.path.sep): + if fetch_source_args[0].endswith(u'/') or len(fetch_source_args) > 1: + raise ParameterError("Destination must be a directory and end with '/' when downloading multiple sources.") + + stats_info = StatsInfo() + + remote_list, src_exclude_list, remote_total_size = fetch_remote_list(fetch_source_args, recursive = True, require_attribs = True) + + + # - The source path is either like "/myPath/my_src_folder" and + # the user want to download this single folder and Optionally only delete + # things that have been removed inside this folder. For this case, we only + # have to look inside destination_base/my_src_folder and not at the root of + # destination_base. + # - Or like "/myPath/my_src_folder/" and the user want to have the sync + # with the content of this folder + destbase_with_source_list = set() + for source_arg in fetch_source_args: + if source_arg.endswith('/'): + if destination_base.endswith(os.path.sep): + destbase_with_source_list.add(destination_base) + else: + destbase_with_source_list.add(destination_base + os.path.sep) + else: + destbase_with_source_list.add(os.path.join(destination_base, + os.path.basename(source_arg))) + local_list, single_file_local, dst_exclude_list, local_total_size = fetch_local_list(destbase_with_source_list, is_src = False, recursive = True) + + local_count = len(local_list) + remote_count = len(remote_list) + orig_remote_count = remote_count + + info(u"Found %d remote files, %d local files" % (remote_count, local_count)) + + remote_list, local_list, update_list, copy_pairs = compare_filelists(remote_list, local_list, src_remote = True, dst_remote = False) + + local_count = len(local_list) + remote_count = len(remote_list) + update_count = len(update_list) + copy_pairs_count = len(copy_pairs) + + info(u"Summary: %d remote files to download, %d local files to delete, %d local files to hardlink" % (remote_count + update_count, local_count, copy_pairs_count)) + + def _set_local_filename(remote_list, destination_base, source_args): + if len(remote_list) == 0: + return + + if destination_base.endswith(os.path.sep): + if not os.path.exists(deunicodise(destination_base)): + if not cfg.dry_run: + os.makedirs(deunicodise(destination_base)) + if not os.path.isdir(deunicodise(destination_base)): + raise ParameterError("Destination is not an existing directory") + elif len(remote_list) == 1 and \ + source_args[0] == remote_list[remote_list.keys()[0]].get(u'object_uri_str', ''): + if os.path.isdir(deunicodise(destination_base)): + raise ParameterError("Destination already exists and is a directory") + remote_list[remote_list.keys()[0]]['local_filename'] = destination_base + return + + if destination_base[-1] != os.path.sep: + destination_base += os.path.sep + for key in remote_list: + local_filename = destination_base + key + if os.path.sep != "/": + local_filename = os.path.sep.join(local_filename.split("/")) + remote_list[key]['local_filename'] = local_filename + + _set_local_filename(remote_list, destination_base, source_args) + _set_local_filename(update_list, destination_base, source_args) + + if cfg.dry_run: + keys = filedicts_to_keys(src_exclude_list, dst_exclude_list) + for key in keys: + output(u"exclude: %s" % key) + if cfg.delete_removed: + for key in local_list: + output(u"delete: '%s'" % local_list[key]['full_name']) + for key in remote_list: + output(u"download: '%s' -> '%s'" % (remote_list[key]['object_uri_str'], remote_list[key]['local_filename'])) + for key in update_list: + output(u"download: '%s' -> '%s'" % (update_list[key]['object_uri_str'], update_list[key]['local_filename'])) + + warning(u"Exiting now because of --dry-run") + return EX_OK + + # if there are copy pairs, we can't do delete_before, on the chance + # we need one of the to-be-deleted files as a copy source. + if len(copy_pairs) > 0: + cfg.delete_after = True + + if cfg.delete_removed and orig_remote_count == 0 and len(local_list) and not cfg.force: + warning(u"delete: cowardly refusing to delete because no source files were found. Use --force to override.") + cfg.delete_removed = False + + if cfg.delete_removed and not cfg.delete_after: + deleted_count, deleted_size = _do_deletes(local_list) + else: + deleted_count, deleted_size = (0, 0) + + def _download(remote_list, seq, total, total_size, dir_cache): + original_umask = os.umask(0) + os.umask(original_umask) + file_list = remote_list.keys() + file_list.sort() + ret = EX_OK + for file in file_list: + seq += 1 + item = remote_list[file] + uri = S3Uri(item['object_uri_str']) + dst_file = item['local_filename'] + is_empty_directory = dst_file.endswith('/') + seq_label = "[%d of %d]" % (seq, total) + + dst_dir = unicodise(os.path.dirname(deunicodise(dst_file))) + if not dst_dir in dir_cache: + dir_cache[dst_dir] = Utils.mkdir_with_parents(dst_dir) + if dir_cache[dst_dir] == False: + if cfg.stop_on_error: + error(u"Exiting now because of --stop-on-error") + raise OSError("Download of '%s' failed (Reason: %s destination directory is not writable)" % (file, dst_dir)) + error(u"Download of '%s' failed (Reason: %s destination directory is not writable)" % (file, dst_dir)) + ret = EX_PARTIAL + continue + + try: + chkptfname_b = '' + if not is_empty_directory: # ignore empty directory at S3: + debug(u"dst_file=%s" % dst_file) + # create temporary files (of type .s3cmd.XXXX.tmp) in the same directory + # for downloading and then rename once downloaded + # unicode provided to mkstemp argument + chkptfd, chkptfname_b = tempfile.mkstemp(u".tmp", u".s3cmd.", + os.path.dirname(dst_file)) + with io.open(chkptfd, mode='wb') as dst_stream: + dst_stream.stream_name = unicodise(chkptfname_b) + debug(u"created chkptfname=%s" % dst_stream.stream_name) + response = s3.object_get(uri, dst_stream, dst_file, extra_label = seq_label) + + # download completed, rename the file to destination + if os.name == "nt": + # Windows is really a bad OS. Rename can't overwrite an existing file + try: + os.unlink(deunicodise(dst_file)) + except OSError: + pass + os.rename(chkptfname_b, deunicodise(dst_file)) + debug(u"renamed chkptfname=%s to dst_file=%s" % (dst_stream.stream_name, dst_file)) + except OSError as exc: + allow_partial = True + + if exc.errno == errno.EISDIR: + error(u"Download of '%s' failed (Reason: %s is a directory)" % (file, dst_file)) + elif os.name != "nt" and exc.errno == errno.ETXTBSY: + error(u"Download of '%s' failed (Reason: %s is currently open for execute, cannot be overwritten)" % (file, dst_file)) + elif exc.errno == errno.EPERM or exc.errno == errno.EACCES: + error(u"Download of '%s' failed (Reason: %s permission denied)" % (file, dst_file)) + elif exc.errno == errno.EBUSY: + error(u"Download of '%s' failed (Reason: %s is busy)" % (file, dst_file)) + elif exc.errno == errno.EFBIG: + error(u"Download of '%s' failed (Reason: %s is too big)" % (file, dst_file)) + elif exc.errno == errno.ENAMETOOLONG: + error(u"Download of '%s' failed (Reason: File Name is too long)" % file) + + elif (exc.errno == errno.ENOSPC or (os.name != "nt" and exc.errno == errno.EDQUOT)): + error(u"Download of '%s' failed (Reason: No space left)" % file) + allow_partial = False + else: + error(u"Download of '%s' failed (Reason: Unknown OsError %d)" % (file, exc.errno or 0)) + allow_partial = False + + try: + # Try to remove the temp file if it exists + if chkptfname_b: + os.unlink(chkptfname_b) + except Exception: + pass + + if allow_partial and not cfg.stop_on_error: + ret = EX_PARTIAL + continue + + ret = EX_OSFILE + if allow_partial: + error(u"Exiting now because of --stop-on-error") + else: + error(u"Exiting now because of fatal error") + raise + except S3DownloadError as exc: + error(u"Download of '%s' failed too many times (Last Reason: %s). " + "This is usually a transient error, please try again " + "later." % (file, exc)) + try: + os.unlink(chkptfname_b) + except Exception as sub_exc: + warning(u"Error deleting temporary file %s (Reason: %s)", + (dst_stream.stream_name, sub_exc)) + if cfg.stop_on_error: + ret = EX_DATAERR + error(u"Exiting now because of --stop-on-error") + raise + ret = EX_PARTIAL + continue + except S3Error as exc: + warning(u"Remote file '%s'. S3Error: %s" % (exc.resource, exc)) + try: + os.unlink(chkptfname_b) + except Exception as sub_exc: + warning(u"Error deleting temporary file %s (Reason: %s)", + (dst_stream.stream_name, sub_exc)) + if cfg.stop_on_error: + raise + ret = EX_PARTIAL + continue + + try: + # set permissions on destination file + if not is_empty_directory: # a normal file + mode = 0o777 - original_umask + else: + # an empty directory, make them readable/executable + mode = 0o775 + debug(u"mode=%s" % oct(mode)) + os.chmod(deunicodise(dst_file), mode) + except: + raise + + # because we don't upload empty directories, + # we can continue the loop here, we won't be setting stat info. + # if we do start to upload empty directories, we'll have to reconsider this. + if is_empty_directory: + continue + + try: + if 's3cmd-attrs' in response and cfg.preserve_attrs: + attrs = response['s3cmd-attrs'] + if 'mode' in attrs: + os.chmod(deunicodise(dst_file), int(attrs['mode'])) + if 'mtime' in attrs or 'atime' in attrs: + mtime = ('mtime' in attrs) and int(attrs['mtime']) or int(time.time()) + atime = ('atime' in attrs) and int(attrs['atime']) or int(time.time()) + os.utime(deunicodise(dst_file), (atime, mtime)) + if 'uid' in attrs and 'gid' in attrs: + uid = int(attrs['uid']) + gid = int(attrs['gid']) + os.lchown(deunicodise(dst_file),uid,gid) + elif 'last-modified' in response['headers']: + last_modified = time.mktime(time.strptime(response["headers"]["last-modified"], "%a, %d %b %Y %H:%M:%S GMT")) + os.utime(deunicodise(dst_file), (last_modified, last_modified)) + debug("set mtime to %s" % last_modified) + except OSError as e: + ret = EX_PARTIAL + if e.errno == errno.EEXIST: + warning(u"%s exists - not overwriting" % dst_file) + continue + if e.errno in (errno.EPERM, errno.EACCES): + warning(u"%s not writable: %s" % (dst_file, e.strerror)) + if cfg.stop_on_error: + raise e + continue + raise e + except KeyboardInterrupt: + warning(u"Exiting after keyboard interrupt") + return + except Exception as e: + ret = EX_PARTIAL + error(u"%s: %s" % (file, e)) + if cfg.stop_on_error: + raise OSError(e) + continue + finally: + try: + os.remove(chkptfname_b) + except Exception: + pass + + speed_fmt = formatSize(response["speed"], human_readable = True, floating_point = True) + if not Config().progress_meter: + output(u"download: '%s' -> '%s' (%d bytes in %0.1f seconds, %0.2f %sB/s) %s" % + (uri, dst_file, response["size"], response["elapsed"], speed_fmt[0], speed_fmt[1], + seq_label)) + total_size += response["size"] + if Config().delete_after_fetch: + s3.object_delete(uri) + output(u"File '%s' removed after syncing" % (uri)) + return ret, seq, total_size + + size_transferred = 0 + total_elapsed = 0.0 + timestamp_start = time.time() + dir_cache = {} + seq = 0 + ret, seq, size_transferred = _download(remote_list, seq, remote_count + update_count, size_transferred, dir_cache) + status, seq, size_transferred = _download(update_list, seq, remote_count + update_count, size_transferred, dir_cache) + if ret == EX_OK: + ret = status + + n_copies, size_copies, failed_copy_list = local_copy(copy_pairs, destination_base) + _set_local_filename(failed_copy_list, destination_base, source_args) + status, seq, size_transferred = _download(failed_copy_list, seq, len(failed_copy_list) + remote_count + update_count, size_transferred, dir_cache) + if ret == EX_OK: + ret = status + + if cfg.delete_removed and cfg.delete_after: + deleted_count, deleted_size = _do_deletes(local_list) + + total_elapsed = max(1.0, time.time() - timestamp_start) + speed_fmt = formatSize(size_transferred / total_elapsed, human_readable = True, floating_point = True) + + stats_info.files = orig_remote_count + stats_info.size = remote_total_size + stats_info.files_transferred = len(failed_copy_list) + remote_count + update_count + stats_info.size_transferred = size_transferred + stats_info.files_copied = n_copies + stats_info.size_copied = size_copies + stats_info.files_deleted = deleted_count + stats_info.size_deleted = deleted_size + + # Only print out the result if any work has been done or + # if the user asked for verbose output + outstr = "Done. Downloaded %d bytes in %0.1f seconds, %0.2f %sB/s." % (size_transferred, total_elapsed, speed_fmt[0], speed_fmt[1]) + if cfg.stats: + outstr += stats_info.format_output() + output(outstr) + elif size_transferred > 0: + output(outstr) + else: + info(outstr) + + return ret + +def local_copy(copy_pairs, destination_base): + # Do NOT hardlink local files by default, that'd be silly + # For instance all empty files would become hardlinked together! + saved_bytes = 0 + failed_copy_list = FileDict() + for (src_obj, dst1, relative_file, md5) in copy_pairs: + src_file = os.path.join(destination_base, dst1) + dst_file = os.path.join(destination_base, relative_file) + dst_dir = os.path.dirname(deunicodise(dst_file)) + try: + if not os.path.isdir(deunicodise(dst_dir)): + debug("MKDIR %s" % dst_dir) + os.makedirs(deunicodise(dst_dir)) + debug(u"Copying %s to %s" % (src_file, dst_file)) + shutil.copy2(deunicodise(src_file), deunicodise(dst_file)) + saved_bytes += src_obj.get(u'size', 0) + except (IOError, OSError) as e: + warning(u'Unable to copy or hardlink files %s -> %s (Reason: %s)' % (src_file, dst_file, e)) + failed_copy_list[relative_file] = src_obj + return len(copy_pairs), saved_bytes, failed_copy_list + +def remote_copy(s3, copy_pairs, destination_base, uploaded_objects_list=None, + metadata_update=False): + cfg = Config() + saved_bytes = 0 + failed_copy_list = FileDict() + seq = 0 + src_count = len(copy_pairs) + for (src_obj, dst1, dst2, src_md5) in copy_pairs: + seq += 1 + debug(u"Remote Copying from %s to %s" % (dst1, dst2)) + dst1_uri = S3Uri(destination_base + dst1) + dst2_uri = S3Uri(destination_base + dst2) + src_obj_size = src_obj.get(u'size', 0) + seq_label = "[%d of %d]" % (seq, src_count) + extra_headers = copy(cfg.extra_headers) + if metadata_update: + # source is a real local file with its own personal metadata + attr_header = _build_attr_header(src_obj, dst2, src_md5) + debug(u"attr_header: %s" % attr_header) + extra_headers.update(attr_header) + extra_headers['content-type'] = \ + s3.content_type(filename=src_obj['full_name']) + try: + s3.object_copy(dst1_uri, dst2_uri, extra_headers, + src_size=src_obj_size, + extra_label=seq_label) + output(u"remote copy: '%s' -> '%s' %s" % (dst1, dst2, seq_label)) + saved_bytes += src_obj_size + if uploaded_objects_list is not None: + uploaded_objects_list.append(dst2) + except Exception: + warning(u"Unable to remote copy files '%s' -> '%s'" % (dst1_uri, dst2_uri)) + failed_copy_list[dst2] = src_obj + return (len(copy_pairs), saved_bytes, failed_copy_list) + +def _build_attr_header(src_obj, src_relative_name, md5=None): + cfg = Config() + attrs = {} + if cfg.preserve_attrs: + for attr in cfg.preserve_attrs_list: + val = None + if attr == 'uname': + try: + val = Utils.urlencode_string(Utils.getpwuid_username(src_obj['uid']), unicode_output=True) + except (KeyError, TypeError): + attr = "uid" + val = src_obj.get('uid') + if val: + warning(u"%s: Owner username not known. Storing UID=%d instead." % (src_relative_name, val)) + elif attr == 'gname': + try: + val = Utils.urlencode_string(Utils.getgrgid_grpname(src_obj.get('gid')), unicode_output=True) + except (KeyError, TypeError): + attr = "gid" + val = src_obj.get('gid') + if val: + warning(u"%s: Owner groupname not known. Storing GID=%d instead." % (src_relative_name, val)) + elif attr != "md5": + try: + val = getattr(src_obj['sr'], 'st_' + attr) + except Exception: + val = None + if val is not None: + attrs[attr] = val + + if 'md5' in cfg.preserve_attrs_list and md5: + attrs['md5'] = md5 + + if attrs: + attr_str_list = [] + for k in sorted(attrs.keys()): + attr_str_list.append(u"%s:%s" % (k, attrs[k])) + attr_header = {'x-amz-meta-s3cmd-attrs': u'/'.join(attr_str_list)} + else: + attr_header = {} + + return attr_header + +def cmd_sync_local2remote(args): + cfg = Config() + s3 = S3(cfg) + + def _single_process(source_args): + for dest in destinations: + ## Normalize URI to convert s3://bkt to s3://bkt/ (trailing slash) + destination_base_uri = S3Uri(dest) + if destination_base_uri.type != 's3': + raise ParameterError("Destination must be S3Uri. Got: %s" % destination_base_uri) + destination_base = destination_base_uri.uri() + return _child(destination_base, source_args) + + def _parent(source_args): + # Now that we've done all the disk I/O to look at the local file system and + # calculate the md5 for each file, fork for each destination to upload to them separately + # and in parallel + child_pids = [] + ret = EX_OK + + for dest in destinations: + ## Normalize URI to convert s3://bkt to s3://bkt/ (trailing slash) + destination_base_uri = S3Uri(dest) + if destination_base_uri.type != 's3': + raise ParameterError("Destination must be S3Uri. Got: %s" % destination_base_uri) + destination_base = destination_base_uri.uri() + child_pid = os.fork() + if child_pid == 0: + os._exit(_child(destination_base, source_args)) + else: + child_pids.append(child_pid) + + while len(child_pids): + (pid, status) = os.wait() + child_pids.remove(pid) + if ret == EX_OK: + ret = os.WEXITSTATUS(status) + + return ret + + def _child(destination_base, source_args): + def _set_remote_uri(local_list, destination_base, single_file_local): + if len(local_list) > 0: + ## Populate 'remote_uri' only if we've got something to upload + if not destination_base.endswith("/"): + if not single_file_local: + raise ParameterError("Destination S3 URI must end with '/' (ie must refer to a directory on the remote side).") + local_list[local_list.keys()[0]]['remote_uri'] = destination_base + else: + for key in local_list: + local_list[key]['remote_uri'] = destination_base + key + + def _upload(local_list, seq, total, total_size): + file_list = local_list.keys() + file_list.sort() + ret = EX_OK + for file in file_list: + seq += 1 + item = local_list[file] + src = item['full_name'] + try: + src_md5 = local_list.get_md5(file) + except IOError: + src_md5 = None + uri = S3Uri(item['remote_uri']) + seq_label = "[%d of %d]" % (seq, total) + extra_headers = copy(cfg.extra_headers) + try: + attr_header = _build_attr_header(local_list[file], + file, src_md5) + debug(u"attr_header: %s" % attr_header) + extra_headers.update(attr_header) + response = s3.object_put(src, uri, extra_headers, extra_label = seq_label) + except S3UploadError as exc: + error(u"Upload of '%s' failed too many times (Last reason: %s)" % (item['full_name'], exc)) + if cfg.stop_on_error: + ret = EX_DATAERR + error(u"Exiting now because of --stop-on-error") + raise + ret = EX_PARTIAL + continue + except InvalidFileError as exc: + error(u"Upload of '%s' is not possible (Reason: %s)" % (item['full_name'], exc)) + if cfg.stop_on_error: + ret = EX_OSFILE + error(u"Exiting now because of --stop-on-error") + raise + ret = EX_PARTIAL + continue + speed_fmt = formatSize(response["speed"], human_readable = True, floating_point = True) + if not cfg.progress_meter: + output(u"upload: '%s' -> '%s' (%d bytes in %0.1f seconds, %0.2f %sB/s) %s" % + (item['full_name'], uri, response["size"], response["elapsed"], + speed_fmt[0], speed_fmt[1], seq_label)) + total_size += response["size"] + uploaded_objects_list.append(uri.object()) + return ret, seq, total_size + + + stats_info = StatsInfo() + + local_list, single_file_local, src_exclude_list, local_total_size = fetch_local_list(args[:-1], is_src = True, recursive = True) + + # - The source path is either like "/myPath/my_src_folder" and + # the user want to upload this single folder and optionally only delete + # things that have been removed inside this folder. For this case, + # we only have to look inside destination_base/my_src_folder and not at + # the root of destination_base. + # - Or like "/myPath/my_src_folder/" and the user want to have the sync + # with the content of this folder + # Special case, "." for current folder. + destbase_with_source_list = set() + for source_arg in source_args: + if not source_arg.endswith('/') and os.path.basename(source_arg) != '.' \ + and not single_file_local: + destbase_with_source_list.add(os.path.join(destination_base, + os.path.basename(source_arg))) + else: + destbase_with_source_list.add(destination_base) + + remote_list, dst_exclude_list, remote_total_size = fetch_remote_list(destbase_with_source_list, recursive = True, require_attribs = True) + + local_count = len(local_list) + orig_local_count = local_count + remote_count = len(remote_list) + + info(u"Found %d local files, %d remote files" % (local_count, remote_count)) + + if single_file_local and len(local_list) == 1 and len(remote_list) == 1: + ## Make remote_key same as local_key for comparison if we're dealing with only one file + remote_list_entry = remote_list[remote_list.keys()[0]] + # Flush remote_list, by the way + remote_list = FileDict() + remote_list[local_list.keys()[0]] = remote_list_entry + + local_list, remote_list, update_list, copy_pairs = compare_filelists(local_list, remote_list, src_remote = False, dst_remote = True) + + local_count = len(local_list) + update_count = len(update_list) + copy_count = len(copy_pairs) + remote_count = len(remote_list) + upload_count = local_count + update_count + + info(u"Summary: %d local files to upload, %d files to remote copy, %d remote files to delete" % (upload_count, copy_count, remote_count)) + + _set_remote_uri(local_list, destination_base, single_file_local) + _set_remote_uri(update_list, destination_base, single_file_local) + + if cfg.dry_run: + keys = filedicts_to_keys(src_exclude_list, dst_exclude_list) + for key in keys: + output(u"exclude: %s" % key) + for key in local_list: + output(u"upload: '%s' -> '%s'" % (local_list[key]['full_name'], local_list[key]['remote_uri'])) + for key in update_list: + output(u"upload: '%s' -> '%s'" % (update_list[key]['full_name'], update_list[key]['remote_uri'])) + for (src_obj, dst1, dst2, md5) in copy_pairs: + output(u"remote copy: '%s' -> '%s'" % (dst1, dst2)) + if cfg.delete_removed: + for key in remote_list: + output(u"delete: '%s'" % remote_list[key]['object_uri_str']) + + warning(u"Exiting now because of --dry-run") + return EX_OK + + # if there are copy pairs, we can't do delete_before, on the chance + # we need one of the to-be-deleted files as a copy source. + if len(copy_pairs) > 0: + cfg.delete_after = True + + if cfg.delete_removed and orig_local_count == 0 and len(remote_list) and not cfg.force: + warning(u"delete: cowardly refusing to delete because no source files were found. Use --force to override.") + cfg.delete_removed = False + + if cfg.delete_removed and not cfg.delete_after and remote_list: + subcmd_batch_del(remote_list = remote_list) + + size_transferred = 0 + total_elapsed = 0.0 + timestamp_start = time.time() + ret, n, size_transferred = _upload(local_list, 0, upload_count, size_transferred) + status, n, size_transferred = _upload(update_list, n, upload_count, size_transferred) + if ret == EX_OK: + ret = status + # uploaded_objects_list reference is passed so it can be filled with + # destination object of succcessful copies so that they can be + # invalidated by cf + n_copies, saved_bytes, failed_copy_files = remote_copy( + s3, copy_pairs, destination_base, uploaded_objects_list, True) + + #upload file that could not be copied + debug("Process files that were not remotely copied") + failed_copy_count = len(failed_copy_files) + _set_remote_uri(failed_copy_files, destination_base, single_file_local) + status, n, size_transferred = _upload(failed_copy_files, n, upload_count + failed_copy_count, size_transferred) + if ret == EX_OK: + ret = status + + if cfg.delete_removed and cfg.delete_after and remote_list: + subcmd_batch_del(remote_list = remote_list) + total_elapsed = max(1.0, time.time() - timestamp_start) + total_speed = total_elapsed and size_transferred / total_elapsed or 0.0 + speed_fmt = formatSize(total_speed, human_readable = True, floating_point = True) + + + stats_info.files = orig_local_count + stats_info.size = local_total_size + stats_info.files_transferred = upload_count + failed_copy_count + stats_info.size_transferred = size_transferred + stats_info.files_copied = n_copies + stats_info.size_copied = saved_bytes + stats_info.files_deleted = remote_count + + + # Only print out the result if any work has been done or + # if the user asked for verbose output + outstr = "Done. Uploaded %d bytes in %0.1f seconds, %0.2f %sB/s." % (size_transferred, total_elapsed, speed_fmt[0], speed_fmt[1]) + if cfg.stats: + outstr += stats_info.format_output() + output(outstr) + elif size_transferred + saved_bytes > 0: + output(outstr) + else: + info(outstr) + + return ret + + def _invalidate_on_cf(destination_base_uri): + cf = CloudFront(cfg) + default_index_file = None + if cfg.invalidate_default_index_on_cf or cfg.invalidate_default_index_root_on_cf: + info_response = s3.website_info(destination_base_uri, cfg.bucket_location) + if info_response: + default_index_file = info_response['index_document'] + if len(default_index_file) < 1: + default_index_file = None + + results = cf.InvalidateObjects(destination_base_uri, uploaded_objects_list, default_index_file, cfg.invalidate_default_index_on_cf, cfg.invalidate_default_index_root_on_cf) + for result in results: + if result['status'] == 201: + output(u"Created invalidation request for %d paths" % len(uploaded_objects_list)) + output(u"Check progress with: s3cmd cfinvalinfo cf://%s/%s" % (result['dist_id'], result['request_id'])) + + # main execution + uploaded_objects_list = [] + + if cfg.encrypt: + error(u"S3cmd 'sync' doesn't yet support GPG encryption, sorry.") + error(u"Either use unconditional 's3cmd put --recursive'") + error(u"or disable encryption with --no-encrypt parameter.") + sys.exit(EX_USAGE) + + for arg in args[:-1]: + if not os.path.exists(deunicodise(arg)): + raise ParameterError("Invalid source: '%s' is not an existing file or directory" % arg) + + destinations = [args[-1]] + if cfg.additional_destinations: + destinations = destinations + cfg.additional_destinations + + if 'fork' not in os.__all__ or len(destinations) < 2: + ret = _single_process(args[:-1]) + destination_base_uri = S3Uri(destinations[-1]) + if cfg.invalidate_on_cf: + if len(uploaded_objects_list) == 0: + info("Nothing to invalidate in CloudFront") + else: + _invalidate_on_cf(destination_base_uri) + else: + ret = _parent(args[:-1]) + if cfg.invalidate_on_cf: + error(u"You cannot use both --cf-invalidate and --add-destination.") + return(EX_USAGE) + + return ret + +def cmd_sync(args): + cfg = Config() + if (len(args) < 2): + syntax_msg = '' + commands_list = get_commands_list() + for cmd in commands_list: + if cmd.get('cmd') == 'sync': + syntax_msg = cmd.get('param', '') + break + raise ParameterError("Too few parameters! Expected: %s" % syntax_msg) + if cfg.delay_updates: + warning(u"`delay-updates` is obsolete.") + + for arg in args: + if arg == u'-': + raise ParameterError("Stdin or stdout ('-') can't be used for a source or a destination with the sync command.") + + if S3Uri(args[0]).type == "file" and S3Uri(args[-1]).type == "s3": + return cmd_sync_local2remote(args) + if S3Uri(args[0]).type == "s3" and S3Uri(args[-1]).type == "file": + return cmd_sync_remote2local(args) + if S3Uri(args[0]).type == "s3" and S3Uri(args[-1]).type == "s3": + return cmd_sync_remote2remote(args) + raise ParameterError("Invalid source/destination: '%s'" % "' '".join(args)) + +def cmd_setacl(args): + cfg = Config() + s3 = S3(cfg) + + set_to_acl = cfg.acl_public and "Public" or "Private" + + if not cfg.recursive: + old_args = args + args = [] + for arg in old_args: + uri = S3Uri(arg) + if not uri.has_object(): + if cfg.acl_public != None: + info("Setting bucket-level ACL for %s to %s" % (uri.uri(), set_to_acl)) + else: + info("Setting bucket-level ACL for %s" % (uri.uri())) + if not cfg.dry_run: + update_acl(s3, uri) + else: + args.append(arg) + + remote_list, exclude_list, _ = fetch_remote_list(args) + + remote_count = len(remote_list) + + info(u"Summary: %d remote files to update" % remote_count) + + if cfg.dry_run: + for key in exclude_list: + output(u"exclude: %s" % key) + for key in remote_list: + output(u"setacl: '%s'" % remote_list[key]['object_uri_str']) + + warning(u"Exiting now because of --dry-run") + return EX_OK + + seq = 0 + for key in remote_list: + seq += 1 + seq_label = "[%d of %d]" % (seq, remote_count) + uri = S3Uri(remote_list[key]['object_uri_str']) + update_acl(s3, uri, seq_label) + return EX_OK + +def cmd_setpolicy(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[1]) + policy_file = args[0] + + with open(deunicodise(policy_file), 'r') as fp: + policy = fp.read() + + if cfg.dry_run: + return EX_OK + + response = s3.set_policy(uri, policy) + + #if retsponse['status'] == 200: + debug(u"response - %s" % response['status']) + if response['status'] == 204: + output(u"%s: Policy updated" % uri) + return EX_OK + +def cmd_delpolicy(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + if cfg.dry_run: return EX_OK + + response = s3.delete_policy(uri) + + #if retsponse['status'] == 200: + debug(u"response - %s" % response['status']) + output(u"%s: Policy deleted" % uri) + return EX_OK + +def cmd_setcors(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[1]) + cors_file = args[0] + + with open(deunicodise(cors_file), 'r') as fp: + cors = fp.read() + + if cfg.dry_run: + return EX_OK + + response = s3.set_cors(uri, cors) + + #if retsponse['status'] == 200: + debug(u"response - %s" % response['status']) + if response['status'] == 204: + output(u"%s: CORS updated" % uri) + return EX_OK + +def cmd_delcors(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + if cfg.dry_run: return EX_OK + + response = s3.delete_cors(uri) + + #if retsponse['status'] == 200: + debug(u"response - %s" % response['status']) + output(u"%s: CORS deleted" % uri) + return EX_OK + +def cmd_set_payer(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + + if cfg.dry_run: return EX_OK + + response = s3.set_payer(uri) + if response['status'] == 200: + output(u"%s: Payer updated" % uri) + return EX_OK + else: + output(u"%s: Payer NOT updated" % uri) + return EX_CONFLICT + +def cmd_setlifecycle(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[1]) + lifecycle_policy_file = args[0] + + with open(deunicodise(lifecycle_policy_file), 'r') as fp: + lifecycle_policy = fp.read() + + if cfg.dry_run: + return EX_OK + + response = s3.set_lifecycle_policy(uri, lifecycle_policy) + + debug(u"response - %s" % response['status']) + if response['status'] == 200: + output(u"%s: Lifecycle Policy updated" % uri) + return EX_OK + +def cmd_getlifecycle(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + + response = s3.get_lifecycle_policy(uri) + + output(u"%s" % getPrettyFromXml(response['data'])) + return EX_OK + +def cmd_dellifecycle(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + if cfg.dry_run: return EX_OK + + response = s3.delete_lifecycle_policy(uri) + + debug(u"response - %s" % response['status']) + output(u"%s: Lifecycle Policy deleted" % uri) + return EX_OK + +def cmd_setnotification(args): + s3 = S3(Config()) + uri = S3Uri(args[1]) + notification_policy_file = args[0] + + with open(deunicodise(notification_policy_file), 'r') as fp: + notification_policy = fp.read() + + response = s3.set_notification_policy(uri, notification_policy) + + debug(u"response - %s" % response['status']) + if response['status'] == 200: + output(u"%s: Notification Policy updated" % uri) + return EX_OK + +def cmd_getnotification(args): + s3 = S3(Config()) + uri = S3Uri(args[0]) + + response = s3.get_notification_policy(uri) + + output(getPrettyFromXml(response['data'])) + return EX_OK + +def cmd_delnotification(args): + s3 = S3(Config()) + uri = S3Uri(args[0]) + + response = s3.delete_notification_policy(uri) + + debug(u"response - %s" % response['status']) + output(u"%s: Notification Policy deleted" % uri) + return EX_OK + +def cmd_multipart(args): + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + + #id = '' + #if(len(args) > 1): id = args[1] + + upload_list = s3.get_multipart(uri) + output(u"%s" % uri) + debug(upload_list) + output(u"Initiated\tPath\tId") + for mpupload in upload_list: + try: + output(u"%s\t%s\t%s" % ( + mpupload['Initiated'], + "s3://" + uri.bucket() + "/" + mpupload['Key'], + mpupload['UploadId'])) + except KeyError: + pass + return EX_OK + +def cmd_abort_multipart(args): + '''{"cmd":"abortmp", "label":"abort a multipart upload", "param":"s3://BUCKET Id", "func":cmd_abort_multipart, "argc":2},''' + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + id = args[1] + response = s3.abort_multipart(uri, id) + debug(u"response - %s" % response['status']) + output(u"%s" % uri) + return EX_OK + +def cmd_list_multipart(args): + '''{"cmd":"abortmp", "label":"list a multipart upload", "param":"s3://BUCKET Id", "func":cmd_list_multipart, "argc":2},''' + cfg = Config() + s3 = S3(cfg) + uri = S3Uri(args[0]) + id = args[1] + + part_list = s3.list_multipart(uri, id) + output(u"LastModified\t\t\tPartNumber\tETag\tSize") + for mpupload in part_list: + try: + output(u"%s\t%s\t%s\t%s" % (mpupload['LastModified'], + mpupload['PartNumber'], + mpupload['ETag'], + mpupload['Size'])) + except KeyError: + pass + return EX_OK + +def cmd_accesslog(args): + cfg = Config() + s3 = S3(cfg) + bucket_uri = S3Uri(args.pop()) + if bucket_uri.object(): + raise ParameterError("Only bucket name is required for [accesslog] command") + if cfg.log_target_prefix == False: + accesslog, response = s3.set_accesslog(bucket_uri, enable = False) + elif cfg.log_target_prefix: + log_target_prefix_uri = S3Uri(cfg.log_target_prefix) + if log_target_prefix_uri.type != "s3": + raise ParameterError("--log-target-prefix must be a S3 URI") + accesslog, response = s3.set_accesslog(bucket_uri, enable = True, log_target_prefix_uri = log_target_prefix_uri, acl_public = cfg.acl_public) + else: # cfg.log_target_prefix == None + accesslog = s3.get_accesslog(bucket_uri) + + output(u"Access logging for: %s" % bucket_uri.uri()) + output(u" Logging Enabled: %s" % accesslog.isLoggingEnabled()) + if accesslog.isLoggingEnabled(): + output(u" Target prefix: %s" % accesslog.targetPrefix().uri()) + #output(u" Public Access: %s" % accesslog.isAclPublic()) + return EX_OK + +def cmd_sign(args): + string_to_sign = args.pop() + debug(u"string-to-sign: %r" % string_to_sign) + signature = Crypto.sign_string_v2(encode_to_s3(string_to_sign)) + output(u"Signature: %s" % decode_from_s3(signature)) + return EX_OK + +def cmd_signurl(args): + expiry = args.pop() + url_to_sign = S3Uri(args.pop()) + if url_to_sign.type != 's3': + raise ParameterError("Must be S3Uri. Got: %s" % url_to_sign) + debug("url to sign: %r" % url_to_sign) + signed_url = Crypto.sign_url_v2(url_to_sign, expiry) + output(signed_url) + return EX_OK + +def cmd_fixbucket(args): + def _unescape(text): + ## + # Removes HTML or XML character references and entities from a text string. + # + # @param text The HTML (or XML) source text. + # @return The plain text, as a Unicode string, if necessary. + # + # From: http://effbot.org/zone/re-sub.htm#unescape-html + def _unescape_fixup(m): + text = m.group(0) + if not 'apos' in htmlentitydefs.name2codepoint: + htmlentitydefs.name2codepoint['apos'] = ord("'") + if text[:2] == "&#": + # character reference + try: + if text[:3] == "&#x": + return unichr(int(text[3:-1], 16)) + else: + return unichr(int(text[2:-1])) + except ValueError: + pass + else: + # named entity + try: + text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) + except KeyError: + pass + return text # leave as is + text = text.encode('ascii', 'xmlcharrefreplace') + return re.sub(r"&#?\w+;", _unescape_fixup, text) + + cfg = Config() + cfg.urlencoding_mode = "fixbucket" + s3 = S3(cfg) + + count = 0 + for arg in args: + culprit = S3Uri(arg) + if culprit.type != "s3": + raise ParameterError("Expecting S3Uri instead of: %s" % arg) + response = s3.bucket_list_noparse(culprit.bucket(), culprit.object(), recursive = True) + r_xent = re.compile(r"&#x[\da-fA-F]+;") + data = decode_from_s3(response['data']) + keys = re.findall("(.*?)", data, re.MULTILINE | re.UNICODE) + debug("Keys: %r" % keys) + for key in keys: + if r_xent.search(key): + info("Fixing: %s" % key) + debug("Step 1: Transforming %s" % key) + key_bin = _unescape(key) + debug("Step 2: ... to %s" % key_bin) + key_new = replace_nonprintables(key_bin) + debug("Step 3: ... then to %s" % key_new) + src = S3Uri("s3://%s/%s" % (culprit.bucket(), key_bin)) + dst = S3Uri("s3://%s/%s" % (culprit.bucket(), key_new)) + if cfg.dry_run: + output(u"[--dry-run] File %r would be renamed to %s" % (key_bin, key_new)) + continue + try: + resp_move = s3.object_move(src, dst) + if resp_move['status'] == 200: + output(u"File '%r' renamed to '%s'" % (key_bin, key_new)) + count += 1 + else: + error(u"Something went wrong for: %r" % key) + error(u"Please report the problem to s3tools-bugs@lists.sourceforge.net") + except S3Error: + error(u"Something went wrong for: %r" % key) + error(u"Please report the problem to s3tools-bugs@lists.sourceforge.net") + + if count > 0: + warning(u"Fixed %d files' names. Their ACL were reset to Private." % count) + warning(u"Use 's3cmd setacl --acl-public s3://...' to make") + warning(u"them publicly readable if required.") + return EX_OK + +def resolve_list(lst, args): + retval = [] + for item in lst: + retval.append(item % args) + return retval + +def gpg_command(command, passphrase = ""): + debug(u"GPG command: " + " ".join(command)) + command = [deunicodise(cmd_entry) for cmd_entry in command] + p = subprocess.Popen(command, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, + close_fds = True) + p_stdout, p_stderr = p.communicate(deunicodise(passphrase + "\n")) + debug(u"GPG output:") + for line in unicodise(p_stdout).split("\n"): + debug(u"GPG: " + line) + p_exitcode = p.wait() + return p_exitcode + +def gpg_encrypt(filename): + cfg = Config() + tmp_filename = Utils.mktmpfile() + args = { + "gpg_command" : cfg.gpg_command, + "passphrase_fd" : "0", + "input_file" : filename, + "output_file" : tmp_filename, + } + info(u"Encrypting file %s to %s..." % (filename, tmp_filename)) + command = resolve_list(cfg.gpg_encrypt.split(" "), args) + code = gpg_command(command, cfg.gpg_passphrase) + return (code, tmp_filename, "gpg") + +def gpg_decrypt(filename, gpgenc_header = "", in_place = True): + cfg = Config() + tmp_filename = Utils.mktmpfile(filename) + args = { + "gpg_command" : cfg.gpg_command, + "passphrase_fd" : "0", + "input_file" : filename, + "output_file" : tmp_filename, + } + info(u"Decrypting file %s to %s..." % (filename, tmp_filename)) + command = resolve_list(cfg.gpg_decrypt.split(" "), args) + code = gpg_command(command, cfg.gpg_passphrase) + if code == 0 and in_place: + debug(u"Renaming %s to %s" % (tmp_filename, filename)) + os.unlink(deunicodise(filename)) + os.rename(deunicodise(tmp_filename), deunicodise(filename)) + tmp_filename = filename + return (code, tmp_filename) + +def run_configure(config_file, args): + cfg = Config() + options = [ + ("access_key", "Access Key", "Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables."), + ("secret_key", "Secret Key"), + ("bucket_location", "Default Region"), + ("host_base", "S3 Endpoint", "Use \"s3.amazonaws.com\" for S3 Endpoint and not modify it to the target Amazon S3."), + ("host_bucket", "DNS-style bucket+hostname:port template for accessing a bucket", "Use \"%(bucket)s.s3.amazonaws.com\" to the target Amazon S3. \"%(bucket)s\" and \"%(location)s\" vars can be used\nif the target S3 system supports dns based buckets."), + ("gpg_passphrase", "Encryption password", "Encryption password is used to protect your files from reading\nby unauthorized persons while in transfer to S3"), + ("gpg_command", "Path to GPG program"), + ("use_https", "Use HTTPS protocol", "When using secure HTTPS protocol all communication with Amazon S3\nservers is protected from 3rd party eavesdropping. This method is\nslower than plain HTTP, and can only be proxied with Python 2.7 or newer"), + ("proxy_host", "HTTP Proxy server name", "On some networks all internet access must go through a HTTP proxy.\nTry setting it here if you can't connect to S3 directly"), + ("proxy_port", "HTTP Proxy server port"), + ] + ## Option-specfic defaults + if getattr(cfg, "gpg_command") == "": + setattr(cfg, "gpg_command", which("gpg")) + + if getattr(cfg, "proxy_host") == "" and os.getenv("http_proxy"): + autodetected_encoding = locale.getpreferredencoding() or "UTF-8" + re_match=re.match(r"(http://)?([^:]+):(\d+)", + unicodise_s(os.getenv("http_proxy"), autodetected_encoding)) + if re_match: + setattr(cfg, "proxy_host", re_match.groups()[1]) + setattr(cfg, "proxy_port", re_match.groups()[2]) + + try: + # Support for python3 + # raw_input only exists in py2 and was renamed to input in py3 + global input + input = raw_input + except NameError: + pass + + try: + while True: + output(u"\nEnter new values or accept defaults in brackets with Enter.") + output(u"Refer to user manual for detailed description of all options.") + for option in options: + prompt = option[1] + ## Option-specific handling + if option[0] == 'proxy_host' and getattr(cfg, 'use_https') == True and sys.hexversion < 0x02070000: + setattr(cfg, option[0], "") + continue + if option[0] == 'proxy_port' and getattr(cfg, 'proxy_host') == "": + setattr(cfg, option[0], 0) + continue + + try: + val = getattr(cfg, option[0]) + if type(val) is bool: + val = val and "Yes" or "No" + if val not in (None, ""): + prompt += " [%s]" % val + except AttributeError: + pass + + if len(option) >= 3: + output(u"\n%s" % option[2]) + + val = unicodise_s(input(prompt + ": ")) + if val != "": + if type(getattr(cfg, option[0])) is bool: + # Turn 'Yes' into True, everything else into False + val = val.lower().startswith('y') + setattr(cfg, option[0], val) + output(u"\nNew settings:") + for option in options: + output(u" %s: %s" % (option[1], getattr(cfg, option[0]))) + val = input("\nTest access with supplied credentials? [Y/n] ") + if val.lower().startswith("y") or val == "": + try: + # Default, we try to list 'all' buckets which requires + # ListAllMyBuckets permission + if len(args) == 0: + output(u"Please wait, attempting to list all buckets...") + S3(Config()).bucket_list("", "") + else: + # If user specified a bucket name directly, we check it and only it. + # Thus, access check can succeed even if user only has access to + # to a single bucket and not ListAllMyBuckets permission. + output(u"Please wait, attempting to list bucket: " + args[0]) + uri = S3Uri(args[0]) + if uri.type == "s3" and uri.has_bucket(): + S3(Config()).bucket_list(uri.bucket(), "") + else: + raise Exception(u"Invalid bucket uri: " + args[0]) + + output(u"Success. Your access key and secret key worked fine :-)") + + output(u"\nNow verifying that encryption works...") + if not getattr(cfg, "gpg_command") or not getattr(cfg, "gpg_passphrase"): + output(u"Not configured. Never mind.") + else: + if not getattr(cfg, "gpg_command"): + raise Exception("Path to GPG program not set") + if not os.path.isfile(deunicodise(getattr(cfg, "gpg_command"))): + raise Exception("GPG program not found") + filename = Utils.mktmpfile() + with open(deunicodise(filename), "w") as fp: + fp.write(os.sys.copyright) + ret_enc = gpg_encrypt(filename) + ret_dec = gpg_decrypt(ret_enc[1], ret_enc[2], False) + hash = [ + Utils.hash_file_md5(filename), + Utils.hash_file_md5(ret_enc[1]), + Utils.hash_file_md5(ret_dec[1]), + ] + os.unlink(deunicodise(filename)) + os.unlink(deunicodise(ret_enc[1])) + os.unlink(deunicodise(ret_dec[1])) + if hash[0] == hash[2] and hash[0] != hash[1]: + output(u"Success. Encryption and decryption worked fine :-)") + else: + raise Exception("Encryption verification error.") + + except S3Error as e: + error(u"Test failed: %s" % (e)) + if e.code == "AccessDenied": + error(u"Are you sure your keys have s3:ListAllMyBuckets permissions?") + val = input("\nRetry configuration? [Y/n] ") + if val.lower().startswith("y") or val == "": + continue + except Exception as e: + error(u"Test failed: %s" % (e)) + val = input("\nRetry configuration? [Y/n] ") + if val.lower().startswith("y") or val == "": + continue + + + val = input("\nSave settings? [y/N] ") + if val.lower().startswith("y"): + break + val = input("Retry configuration? [Y/n] ") + if val.lower().startswith("n"): + raise EOFError() + + ## Overwrite existing config file, make it user-readable only + old_mask = os.umask(0o077) + try: + os.remove(deunicodise(config_file)) + except OSError as e: + if e.errno != errno.ENOENT: + raise + try: + with io.open(deunicodise(config_file), "w", encoding=cfg.encoding) as fp: + cfg.dump_config(fp) + finally: + os.umask(old_mask) + output(u"Configuration saved to '%s'" % config_file) + + except (EOFError, KeyboardInterrupt): + output(u"\nConfiguration aborted. Changes were NOT saved.") + return + + except IOError as e: + error(u"Writing config file failed: %s: %s" % (config_file, e.strerror)) + sys.exit(EX_IOERR) + +def process_patterns_from_file(fname, patterns_list): + try: + with open(deunicodise(fname), "rt") as fn: + for pattern in fn: + pattern = unicodise(pattern).strip() + if re.match("^#", pattern) or re.match(r"^\s*$", pattern): + continue + debug(u"%s: adding rule: %s" % (fname, pattern)) + patterns_list.append(pattern) + except IOError as e: + error(e) + sys.exit(EX_IOERR) + + return patterns_list + +def process_patterns(patterns_list, patterns_from, is_glob, option_txt = ""): + r""" + process_patterns(patterns, patterns_from, is_glob, option_txt = "") + Process --exclude / --include GLOB and REGEXP patterns. + 'option_txt' is 'exclude' / 'include' / 'rexclude' / 'rinclude' + Returns: patterns_compiled, patterns_text + Note: process_patterns_from_file will ignore lines starting with # as these + are comments. To target escape the initial #, to use it in a file name, one + can use: "[#]" (for exclude) or "\#" (for rexclude). + """ + + patterns_compiled = [] + patterns_textual = {} + + if patterns_list is None: + patterns_list = [] + + if patterns_from: + ## Append patterns from glob_from + for fname in patterns_from: + debug(u"processing --%s-from %s" % (option_txt, fname)) + patterns_list = process_patterns_from_file(fname, patterns_list) + + for pattern in patterns_list: + debug(u"processing %s rule: %s" % (option_txt, patterns_list)) + if is_glob: + pattern = glob.fnmatch.translate(pattern) + r = re.compile(pattern) + patterns_compiled.append(r) + patterns_textual[r] = pattern + + return patterns_compiled, patterns_textual + +def get_commands_list(): + return [ + {"cmd":"mb", "label":"Make bucket", "param":"s3://BUCKET", "func":cmd_bucket_create, "argc":1}, + {"cmd":"rb", "label":"Remove bucket", "param":"s3://BUCKET", "func":cmd_bucket_delete, "argc":1}, + {"cmd":"ls", "label":"List objects or buckets", "param":"[s3://BUCKET[/PREFIX]]", "func":cmd_ls, "argc":0}, + {"cmd":"la", "label":"List all object in all buckets", "param":"", "func":cmd_all_buckets_list_all_content, "argc":0}, + {"cmd":"put", "label":"Put file into bucket", "param":"FILE [FILE...] s3://BUCKET[/PREFIX]", "func":cmd_object_put, "argc":2}, + {"cmd":"get", "label":"Get file from bucket", "param":"s3://BUCKET/OBJECT LOCAL_FILE", "func":cmd_object_get, "argc":1}, + {"cmd":"del", "label":"Delete file from bucket", "param":"s3://BUCKET/OBJECT", "func":cmd_object_del, "argc":1}, + {"cmd":"rm", "label":"Delete file from bucket (alias for del)", "param":"s3://BUCKET/OBJECT", "func":cmd_object_del, "argc":1}, + #{"cmd":"mkdir", "label":"Make a virtual S3 directory", "param":"s3://BUCKET/path/to/dir", "func":cmd_mkdir, "argc":1}, + {"cmd":"restore", "label":"Restore file from Glacier storage", "param":"s3://BUCKET/OBJECT", "func":cmd_object_restore, "argc":1}, + {"cmd":"sync", "label":"Synchronize a directory tree to S3 (checks files freshness using size and md5 checksum, unless overridden by options, see below)", "param":"LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR or s3://BUCKET[/PREFIX] s3://BUCKET[/PREFIX]", "func":cmd_sync, "argc":2}, + {"cmd":"du", "label":"Disk usage by buckets", "param":"[s3://BUCKET[/PREFIX]]", "func":cmd_du, "argc":0}, + {"cmd":"info", "label":"Get various information about Buckets or Files", "param":"s3://BUCKET[/OBJECT]", "func":cmd_info, "argc":1}, + {"cmd":"cp", "label":"Copy object", "param":"s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]", "func":cmd_cp, "argc":2}, + {"cmd":"modify", "label":"Modify object metadata", "param":"s3://BUCKET1/OBJECT", "func":cmd_modify, "argc":1}, + {"cmd":"mv", "label":"Move object", "param":"s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]", "func":cmd_mv, "argc":2}, + {"cmd":"setacl", "label":"Modify Access control list for Bucket or Files", "param":"s3://BUCKET[/OBJECT]", "func":cmd_setacl, "argc":1}, + + {"cmd":"setpolicy", "label":"Modify Bucket Policy", "param":"FILE s3://BUCKET", "func":cmd_setpolicy, "argc":2}, + {"cmd":"delpolicy", "label":"Delete Bucket Policy", "param":"s3://BUCKET", "func":cmd_delpolicy, "argc":1}, + {"cmd":"setcors", "label":"Modify Bucket CORS", "param":"FILE s3://BUCKET", "func":cmd_setcors, "argc":2}, + {"cmd":"delcors", "label":"Delete Bucket CORS", "param":"s3://BUCKET", "func":cmd_delcors, "argc":1}, + + {"cmd":"payer", "label":"Modify Bucket Requester Pays policy", "param":"s3://BUCKET", "func":cmd_set_payer, "argc":1}, + {"cmd":"multipart", "label":"Show multipart uploads", "param":"s3://BUCKET [Id]", "func":cmd_multipart, "argc":1}, + {"cmd":"abortmp", "label":"Abort a multipart upload", "param":"s3://BUCKET/OBJECT Id", "func":cmd_abort_multipart, "argc":2}, + + {"cmd":"listmp", "label":"List parts of a multipart upload", "param":"s3://BUCKET/OBJECT Id", "func":cmd_list_multipart, "argc":2}, + + {"cmd":"accesslog", "label":"Enable/disable bucket access logging", "param":"s3://BUCKET", "func":cmd_accesslog, "argc":1}, + {"cmd":"sign", "label":"Sign arbitrary string using the secret key", "param":"STRING-TO-SIGN", "func":cmd_sign, "argc":1}, + {"cmd":"signurl", "label":"Sign an S3 URL to provide limited public access with expiry", "param":"s3://BUCKET/OBJECT ", "func":cmd_signurl, "argc":2}, + {"cmd":"fixbucket", "label":"Fix invalid file names in a bucket", "param":"s3://BUCKET[/PREFIX]", "func":cmd_fixbucket, "argc":1}, + + ## Website commands + {"cmd":"ws-create", "label":"Create Website from bucket", "param":"s3://BUCKET", "func":cmd_website_create, "argc":1}, + {"cmd":"ws-delete", "label":"Delete Website", "param":"s3://BUCKET", "func":cmd_website_delete, "argc":1}, + {"cmd":"ws-info", "label":"Info about Website", "param":"s3://BUCKET", "func":cmd_website_info, "argc":1}, + + ## Lifecycle commands + {"cmd":"expire", "label":"Set or delete expiration rule for the bucket", "param":"s3://BUCKET", "func":cmd_expiration_set, "argc":1}, + {"cmd":"setlifecycle", "label":"Upload a lifecycle policy for the bucket", "param":"FILE s3://BUCKET", "func":cmd_setlifecycle, "argc":2}, + {"cmd":"getlifecycle", "label":"Get a lifecycle policy for the bucket", "param":"s3://BUCKET", "func":cmd_getlifecycle, "argc":1}, + {"cmd":"dellifecycle", "label":"Remove a lifecycle policy for the bucket", "param":"s3://BUCKET", "func":cmd_dellifecycle, "argc":1}, + + ## Notification commands + {"cmd":"setnotification", "label":"Upload a notification policy for the bucket", "param":"FILE s3://BUCKET", "func":cmd_setnotification, "argc":2}, + {"cmd":"getnotification", "label":"Get a notification policy for the bucket", "param":"s3://BUCKET", "func":cmd_getnotification, "argc":1}, + {"cmd":"delnotification", "label":"Remove a notification policy for the bucket", "param":"s3://BUCKET", "func":cmd_delnotification, "argc":1}, + + ## CloudFront commands + {"cmd":"cflist", "label":"List CloudFront distribution points", "param":"", "func":CfCmd.info, "argc":0}, + {"cmd":"cfinfo", "label":"Display CloudFront distribution point parameters", "param":"[cf://DIST_ID]", "func":CfCmd.info, "argc":0}, + {"cmd":"cfcreate", "label":"Create CloudFront distribution point", "param":"s3://BUCKET", "func":CfCmd.create, "argc":1}, + {"cmd":"cfdelete", "label":"Delete CloudFront distribution point", "param":"cf://DIST_ID", "func":CfCmd.delete, "argc":1}, + {"cmd":"cfmodify", "label":"Change CloudFront distribution point parameters", "param":"cf://DIST_ID", "func":CfCmd.modify, "argc":1}, + #{"cmd":"cfinval", "label":"Invalidate CloudFront objects", "param":"s3://BUCKET/OBJECT [s3://BUCKET/OBJECT ...]", "func":CfCmd.invalidate, "argc":1}, + {"cmd":"cfinvalinfo", "label":"Display CloudFront invalidation request(s) status", "param":"cf://DIST_ID[/INVAL_ID]", "func":CfCmd.invalinfo, "argc":1}, + ] + +def format_commands(progname, commands_list): + help = "Commands:\n" + for cmd in commands_list: + help += " %s\n %s %s %s\n" % (cmd["label"], progname, cmd["cmd"], cmd["param"]) + return help + + +def update_acl(s3, uri, seq_label=""): + cfg = Config() + something_changed = False + acl = s3.get_acl(uri) + debug(u"acl: %s - %r" % (uri, acl.grantees)) + if cfg.acl_public == True: + if acl.isAnonRead(): + info(u"%s: already Public, skipping %s" % (uri, seq_label)) + else: + acl.grantAnonRead() + something_changed = True + elif cfg.acl_public == False: # we explicitely check for False, because it could be None + if not acl.isAnonRead() and not acl.isAnonWrite(): + info(u"%s: already Private, skipping %s" % (uri, seq_label)) + else: + acl.revokeAnonRead() + acl.revokeAnonWrite() + something_changed = True + + # update acl with arguments + # grant first and revoke later, because revoke has priority + if cfg.acl_grants: + something_changed = True + for grant in cfg.acl_grants: + acl.grant(**grant) + + if cfg.acl_revokes: + something_changed = True + for revoke in cfg.acl_revokes: + acl.revoke(**revoke) + + if not something_changed: + return + + retsponse = s3.set_acl(uri, acl) + if retsponse['status'] == 200: + if cfg.acl_public in (True, False): + set_to_acl = cfg.acl_public and "Public" or "Private" + output(u"%s: ACL set to %s %s" % (uri, set_to_acl, seq_label)) + else: + output(u"%s: ACL updated" % uri) + +class OptionMimeType(Option): + def check_mimetype(self, opt, value): + if re.compile(r"^[a-z0-9]+/[a-z0-9+\.-]+(;.*)?$", re.IGNORECASE).match(value): + return value + raise OptionValueError("option %s: invalid MIME-Type format: %r" % (opt, value)) + +class OptionS3ACL(Option): + def check_s3acl(self, opt, value): + permissions = ('read', 'write', 'read_acp', 'write_acp', 'full_control', 'all') + try: + permission, grantee = re.compile(r"^(\w+):(.+)$", re.IGNORECASE).match(value).groups() + if not permission or not grantee: + raise OptionValueError("option %s: invalid S3 ACL format: %r" % (opt, value)) + if permission in permissions: + return { 'name' : grantee, 'permission' : permission.upper() } + else: + raise OptionValueError("option %s: invalid S3 ACL permission: %s (valid values: %s)" % + (opt, permission, ", ".join(permissions))) + except OptionValueError: + raise + except Exception: + raise OptionValueError("option %s: invalid S3 ACL format: %r" % (opt, value)) + +class OptionAll(OptionMimeType, OptionS3ACL): + TYPE_CHECKER = copy(Option.TYPE_CHECKER) + TYPE_CHECKER["mimetype"] = OptionMimeType.check_mimetype + TYPE_CHECKER["s3acl"] = OptionS3ACL.check_s3acl + TYPES = Option.TYPES + ("mimetype", "s3acl") + +class MyHelpFormatter(IndentedHelpFormatter): + def format_epilog(self, epilog): + if epilog: + return "\n" + epilog + "\n" + else: + return "" + +def main(): + cfg = Config() + commands_list = get_commands_list() + commands = {} + + ## Populate "commands" from "commands_list" + for cmd in commands_list: + if 'cmd' in cmd: + commands[cmd['cmd']] = cmd + + optparser = OptionParser(option_class=OptionAll, formatter=MyHelpFormatter()) + #optparser.disable_interspersed_args() + + autodetected_encoding = locale.getpreferredencoding() or "UTF-8" + + config_file = None + if os.getenv("S3CMD_CONFIG"): + config_file = unicodise_s(os.getenv("S3CMD_CONFIG"), + autodetected_encoding) + elif os.name == "nt" and os.getenv("USERPROFILE"): + config_file = os.path.join( + unicodise_s(os.getenv("USERPROFILE"), autodetected_encoding), + os.getenv("APPDATA") + and unicodise_s(os.getenv("APPDATA"), autodetected_encoding) + or 'Application Data', + "s3cmd.ini") + else: + from os.path import expanduser + config_file = os.path.join(expanduser("~"), ".s3cfg") + + optparser.set_defaults(config = config_file) + + optparser.add_option( "--configure", dest="run_configure", action="store_true", help="Invoke interactive (re)configuration tool. Optionally use as '--configure s3://some-bucket' to test access to a specific bucket instead of attempting to list them all.") + optparser.add_option("-c", "--config", dest="config", metavar="FILE", help="Config file name. Defaults to $HOME/.s3cfg") + optparser.add_option( "--dump-config", dest="dump_config", action="store_true", help="Dump current configuration after parsing config files and command line options and exit.") + optparser.add_option( "--access_key", dest="access_key", help="AWS Access Key") + optparser.add_option( "--secret_key", dest="secret_key", help="AWS Secret Key") + optparser.add_option( "--access_token", dest="access_token", help="AWS Access Token") + + optparser.add_option("-n", "--dry-run", dest="dry_run", action="store_true", help="Only show what should be uploaded or downloaded but don't actually do it. May still perform S3 requests to get bucket listings and other information though (only for file transfer commands)") + + optparser.add_option("-s", "--ssl", dest="use_https", action="store_true", help="Use HTTPS connection when communicating with S3. (default)") + optparser.add_option( "--no-ssl", dest="use_https", action="store_false", help="Don't use HTTPS.") + optparser.add_option("-e", "--encrypt", dest="encrypt", action="store_true", help="Encrypt files before uploading to S3.") + optparser.add_option( "--no-encrypt", dest="encrypt", action="store_false", help="Don't encrypt files.") + optparser.add_option("-f", "--force", dest="force", action="store_true", help="Force overwrite and other dangerous operations.") + optparser.add_option( "--continue", dest="get_continue", action="store_true", help="Continue getting a partially downloaded file (only for [get] command).") + optparser.add_option( "--continue-put", dest="put_continue", action="store_true", help="Continue uploading partially uploaded files or multipart upload parts. Restarts parts/files that don't have matching size and md5. Skips files/parts that do. Note: md5sum checks are not always sufficient to check (part) file equality. Enable this at your own risk.") + optparser.add_option( "--upload-id", dest="upload_id", help="UploadId for Multipart Upload, in case you want continue an existing upload (equivalent to --continue-put) and there are multiple partial uploads. Use s3cmd multipart [URI] to see what UploadIds are associated with the given URI.") + optparser.add_option( "--skip-existing", dest="skip_existing", action="store_true", help="Skip over files that exist at the destination (only for [get] and [sync] commands).") + optparser.add_option("-r", "--recursive", dest="recursive", action="store_true", help="Recursive upload, download or removal.") + optparser.add_option( "--check-md5", dest="check_md5", action="store_true", help="Check MD5 sums when comparing files for [sync]. (default)") + optparser.add_option( "--no-check-md5", dest="check_md5", action="store_false", help="Do not check MD5 sums when comparing files for [sync]. Only size will be compared. May significantly speed up transfer but may also miss some changed files.") + optparser.add_option("-P", "--acl-public", dest="acl_public", action="store_true", help="Store objects with ACL allowing read for anyone.") + optparser.add_option( "--acl-private", dest="acl_public", action="store_false", help="Store objects with default ACL allowing access for you only.") + optparser.add_option( "--acl-grant", dest="acl_grants", type="s3acl", action="append", metavar="PERMISSION:EMAIL or USER_CANONICAL_ID", help="Grant stated permission to a given amazon user. Permission is one of: read, write, read_acp, write_acp, full_control, all") + optparser.add_option( "--acl-revoke", dest="acl_revokes", type="s3acl", action="append", metavar="PERMISSION:USER_CANONICAL_ID", help="Revoke stated permission for a given amazon user. Permission is one of: read, write, read_acp, write_acp, full_control, all") + + optparser.add_option("-D", "--restore-days", dest="restore_days", action="store", help="Number of days to keep restored file available (only for 'restore' command). Default is 1 day.", metavar="NUM") + optparser.add_option( "--restore-priority", dest="restore_priority", action="store", choices=['standard', 'expedited', 'bulk'], help="Priority for restoring files from S3 Glacier (only for 'restore' command). Choices available: bulk, standard, expedited") + + optparser.add_option( "--delete-removed", dest="delete_removed", action="store_true", help="Delete destination objects with no corresponding source file [sync]") + optparser.add_option( "--no-delete-removed", dest="delete_removed", action="store_false", help="Don't delete destination objects [sync]") + optparser.add_option( "--delete-after", dest="delete_after", action="store_true", help="Perform deletes AFTER new uploads when delete-removed is enabled [sync]") + optparser.add_option( "--delay-updates", dest="delay_updates", action="store_true", help="*OBSOLETE* Put all updated files into place at end [sync]") # OBSOLETE + optparser.add_option( "--max-delete", dest="max_delete", action="store", help="Do not delete more than NUM files. [del] and [sync]", metavar="NUM") + optparser.add_option( "--limit", dest="limit", action="store", help="Limit number of objects returned in the response body (only for [ls] and [la] commands)", metavar="NUM") + optparser.add_option( "--add-destination", dest="additional_destinations", action="append", help="Additional destination for parallel uploads, in addition to last arg. May be repeated.") + optparser.add_option( "--delete-after-fetch", dest="delete_after_fetch", action="store_true", help="Delete remote objects after fetching to local file (only for [get] and [sync] commands).") + optparser.add_option("-p", "--preserve", dest="preserve_attrs", action="store_true", help="Preserve filesystem attributes (mode, ownership, timestamps). Default for [sync] command.") + optparser.add_option( "--no-preserve", dest="preserve_attrs", action="store_false", help="Don't store FS attributes") + optparser.add_option( "--exclude", dest="exclude", action="append", metavar="GLOB", help="Filenames and paths matching GLOB will be excluded from sync") + optparser.add_option( "--exclude-from", dest="exclude_from", action="append", metavar="FILE", help="Read --exclude GLOBs from FILE") + optparser.add_option( "--rexclude", dest="rexclude", action="append", metavar="REGEXP", help="Filenames and paths matching REGEXP (regular expression) will be excluded from sync") + optparser.add_option( "--rexclude-from", dest="rexclude_from", action="append", metavar="FILE", help="Read --rexclude REGEXPs from FILE") + optparser.add_option( "--include", dest="include", action="append", metavar="GLOB", help="Filenames and paths matching GLOB will be included even if previously excluded by one of --(r)exclude(-from) patterns") + optparser.add_option( "--include-from", dest="include_from", action="append", metavar="FILE", help="Read --include GLOBs from FILE") + optparser.add_option( "--rinclude", dest="rinclude", action="append", metavar="REGEXP", help="Same as --include but uses REGEXP (regular expression) instead of GLOB") + optparser.add_option( "--rinclude-from", dest="rinclude_from", action="append", metavar="FILE", help="Read --rinclude REGEXPs from FILE") + + optparser.add_option( "--files-from", dest="files_from", action="append", metavar="FILE", help="Read list of source-file names from FILE. Use - to read from stdin.") + optparser.add_option( "--region", "--bucket-location", metavar="REGION", dest="bucket_location", help="Region to create bucket in. As of now the regions are: us-east-1, us-west-1, us-west-2, eu-west-1, eu-central-1, ap-northeast-1, ap-southeast-1, ap-southeast-2, sa-east-1") + optparser.add_option( "--host", metavar="HOSTNAME", dest="host_base", help="HOSTNAME:PORT for S3 endpoint (default: %s, alternatives such as s3-eu-west-1.amazonaws.com). You should also set --host-bucket." % (cfg.host_base)) + optparser.add_option( "--host-bucket", dest="host_bucket", help="DNS-style bucket+hostname:port template for accessing a bucket (default: %s)" % (cfg.host_bucket)) + optparser.add_option( "--reduced-redundancy", "--rr", dest="reduced_redundancy", action="store_true", help="Store object with 'Reduced redundancy'. Lower per-GB price. [put, cp, mv]") + optparser.add_option( "--no-reduced-redundancy", "--no-rr", dest="reduced_redundancy", action="store_false", help="Store object without 'Reduced redundancy'. Higher per-GB price. [put, cp, mv]") + optparser.add_option( "--storage-class", dest="storage_class", action="store", metavar="CLASS", help="Store object with specified CLASS (STANDARD, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER or DEEP_ARCHIVE). [put, cp, mv]") + optparser.add_option( "--access-logging-target-prefix", dest="log_target_prefix", help="Target prefix for access logs (S3 URI) (for [cfmodify] and [accesslog] commands)") + optparser.add_option( "--no-access-logging", dest="log_target_prefix", action="store_false", help="Disable access logging (for [cfmodify] and [accesslog] commands)") + + optparser.add_option( "--default-mime-type", dest="default_mime_type", type="mimetype", action="store", help="Default MIME-type for stored objects. Application default is binary/octet-stream.") + optparser.add_option("-M", "--guess-mime-type", dest="guess_mime_type", action="store_true", help="Guess MIME-type of files by their extension or mime magic. Fall back to default MIME-Type as specified by --default-mime-type option") + optparser.add_option( "--no-guess-mime-type", dest="guess_mime_type", action="store_false", help="Don't guess MIME-type and use the default type instead.") + optparser.add_option( "--no-mime-magic", dest="use_mime_magic", action="store_false", help="Don't use mime magic when guessing MIME-type.") + optparser.add_option("-m", "--mime-type", dest="mime_type", type="mimetype", metavar="MIME/TYPE", help="Force MIME-type. Override both --default-mime-type and --guess-mime-type.") + + optparser.add_option( "--add-header", dest="add_header", action="append", metavar="NAME:VALUE", help="Add a given HTTP header to the upload request. Can be used multiple times. For instance set 'Expires' or 'Cache-Control' headers (or both) using this option.") + optparser.add_option( "--remove-header", dest="remove_headers", action="append", metavar="NAME", help="Remove a given HTTP header. Can be used multiple times. For instance, remove 'Expires' or 'Cache-Control' headers (or both) using this option. [modify]") + + optparser.add_option( "--server-side-encryption", dest="server_side_encryption", action="store_true", help="Specifies that server-side encryption will be used when putting objects. [put, sync, cp, modify]") + optparser.add_option( "--server-side-encryption-kms-id", dest="kms_key", action="store", help="Specifies the key id used for server-side encryption with AWS KMS-Managed Keys (SSE-KMS) when putting objects. [put, sync, cp, modify]") + + optparser.add_option( "--encoding", dest="encoding", metavar="ENCODING", help="Override autodetected terminal and filesystem encoding (character set). Autodetected: %s" % autodetected_encoding) + optparser.add_option( "--add-encoding-exts", dest="add_encoding_exts", metavar="EXTENSIONs", help="Add encoding to these comma delimited extensions i.e. (css,js,html) when uploading to S3 )") + optparser.add_option( "--verbatim", dest="urlencoding_mode", action="store_const", const="verbatim", help="Use the S3 name as given on the command line. No pre-processing, encoding, etc. Use with caution!") + + optparser.add_option( "--disable-multipart", dest="enable_multipart", action="store_false", help="Disable multipart upload on files bigger than --multipart-chunk-size-mb") + optparser.add_option( "--multipart-chunk-size-mb", dest="multipart_chunk_size_mb", type="int", action="store", metavar="SIZE", help="Size of each chunk of a multipart upload. Files bigger than SIZE are automatically uploaded as multithreaded-multipart, smaller files are uploaded using the traditional method. SIZE is in Mega-Bytes, default chunk size is 15MB, minimum allowed chunk size is 5MB, maximum is 5GB.") + + optparser.add_option( "--list-md5", dest="list_md5", action="store_true", help="Include MD5 sums in bucket listings (only for 'ls' command).") + + optparser.add_option( "--list-allow-unordered", dest="list_allow_unordered", action="store_true", help="Not an AWS standard. Allow the listing results to be returned in unsorted order. This may be faster when listing very large buckets.") + + optparser.add_option("-H", "--human-readable-sizes", dest="human_readable_sizes", action="store_true", help="Print sizes in human readable form (eg 1kB instead of 1234).") + + optparser.add_option( "--ws-index", dest="website_index", action="store", help="Name of index-document (only for [ws-create] command)") + optparser.add_option( "--ws-error", dest="website_error", action="store", help="Name of error-document (only for [ws-create] command)") + + optparser.add_option( "--expiry-date", dest="expiry_date", action="store", help="Indicates when the expiration rule takes effect. (only for [expire] command)") + optparser.add_option( "--expiry-days", dest="expiry_days", action="store", help="Indicates the number of days after object creation the expiration rule takes effect. (only for [expire] command)") + optparser.add_option( "--expiry-prefix", dest="expiry_prefix", action="store", help="Identifying one or more objects with the prefix to which the expiration rule applies. (only for [expire] command)") + + optparser.add_option( "--progress", dest="progress_meter", action="store_true", help="Display progress meter (default on TTY).") + optparser.add_option( "--no-progress", dest="progress_meter", action="store_false", help="Don't display progress meter (default on non-TTY).") + optparser.add_option( "--stats", dest="stats", action="store_true", help="Give some file-transfer stats.") + optparser.add_option( "--enable", dest="enable", action="store_true", help="Enable given CloudFront distribution (only for [cfmodify] command)") + optparser.add_option( "--disable", dest="enable", action="store_false", help="Disable given CloudFront distribution (only for [cfmodify] command)") + optparser.add_option( "--cf-invalidate", dest="invalidate_on_cf", action="store_true", help="Invalidate the uploaded filed in CloudFront. Also see [cfinval] command.") + # joseprio: adding options to invalidate the default index and the default + # index root + optparser.add_option( "--cf-invalidate-default-index", dest="invalidate_default_index_on_cf", action="store_true", help="When using Custom Origin and S3 static website, invalidate the default index file.") + optparser.add_option( "--cf-no-invalidate-default-index-root", dest="invalidate_default_index_root_on_cf", action="store_false", help="When using Custom Origin and S3 static website, don't invalidate the path to the default index file.") + optparser.add_option( "--cf-add-cname", dest="cf_cnames_add", action="append", metavar="CNAME", help="Add given CNAME to a CloudFront distribution (only for [cfcreate] and [cfmodify] commands)") + optparser.add_option( "--cf-remove-cname", dest="cf_cnames_remove", action="append", metavar="CNAME", help="Remove given CNAME from a CloudFront distribution (only for [cfmodify] command)") + optparser.add_option( "--cf-comment", dest="cf_comment", action="store", metavar="COMMENT", help="Set COMMENT for a given CloudFront distribution (only for [cfcreate] and [cfmodify] commands)") + optparser.add_option( "--cf-default-root-object", dest="cf_default_root_object", action="store", metavar="DEFAULT_ROOT_OBJECT", help="Set the default root object to return when no object is specified in the URL. Use a relative path, i.e. default/index.html instead of /default/index.html or s3://bucket/default/index.html (only for [cfcreate] and [cfmodify] commands)") + optparser.add_option("-v", "--verbose", dest="verbosity", action="store_const", const=logging.INFO, help="Enable verbose output.") + optparser.add_option("-d", "--debug", dest="verbosity", action="store_const", const=logging.DEBUG, help="Enable debug output.") + optparser.add_option( "--version", dest="show_version", action="store_true", help="Show s3cmd version (%s) and exit." % (PkgInfo.version)) + optparser.add_option("-F", "--follow-symlinks", dest="follow_symlinks", action="store_true", default=False, help="Follow symbolic links as if they are regular files") + optparser.add_option( "--cache-file", dest="cache_file", action="store", default="", metavar="FILE", help="Cache FILE containing local source MD5 values") + optparser.add_option("-q", "--quiet", dest="quiet", action="store_true", default=False, help="Silence output on stdout") + optparser.add_option( "--ca-certs", dest="ca_certs_file", action="store", default=None, help="Path to SSL CA certificate FILE (instead of system default)") + optparser.add_option( "--ssl-cert", dest="ssl_client_cert_file", action="store", default=None, help="Path to client own SSL certificate CRT_FILE") + optparser.add_option( "--ssl-key", dest="ssl_client_key_file", action="store", default=None, help="Path to client own SSL certificate private key KEY_FILE") + optparser.add_option( "--check-certificate", dest="check_ssl_certificate", action="store_true", help="Check SSL certificate validity") + optparser.add_option( "--no-check-certificate", dest="check_ssl_certificate", action="store_false", help="Do not check SSL certificate validity") + optparser.add_option( "--check-hostname", dest="check_ssl_hostname", action="store_true", help="Check SSL certificate hostname validity") + optparser.add_option( "--no-check-hostname", dest="check_ssl_hostname", action="store_false", help="Do not check SSL certificate hostname validity") + optparser.add_option( "--signature-v2", dest="signature_v2", action="store_true", help="Use AWS Signature version 2 instead of newer signature methods. Helpful for S3-like systems that don't have AWS Signature v4 yet.") + optparser.add_option( "--limit-rate", dest="limitrate", action="store", type="string", help="Limit the upload or download speed to amount bytes per second. Amount may be expressed in bytes, kilobytes with the k suffix, or megabytes with the m suffix") + optparser.add_option( "--no-connection-pooling", dest="connection_pooling", action="store_false", help="Disable connection re-use") + optparser.add_option( "--requester-pays", dest="requester_pays", action="store_true", help="Set the REQUESTER PAYS flag for operations") + optparser.add_option("-l", "--long-listing", dest="long_listing", action="store_true", help="Produce long listing [ls]") + optparser.add_option( "--stop-on-error", dest="stop_on_error", action="store_true", help="stop if error in transfer") + optparser.add_option( "--content-disposition", dest="content_disposition", action="store", help="Provide a Content-Disposition for signed URLs, e.g., \"inline; filename=myvideo.mp4\"") + optparser.add_option( "--content-type", dest="content_type", action="store", help="Provide a Content-Type for signed URLs, e.g., \"video/mp4\"") + + optparser.set_usage(optparser.usage + " COMMAND [parameters]") + optparser.set_description('S3cmd is a tool for managing objects in '+ + 'Amazon S3 storage. It allows for making and removing '+ + '"buckets" and uploading, downloading and removing '+ + '"objects" from these buckets.') + optparser.epilog = format_commands(optparser.get_prog_name(), commands_list) + optparser.epilog += ("\nFor more information, updates and news, visit the s3cmd website:\n%s\n" % PkgInfo.url) + + (options, args) = optparser.parse_args() + + ## Some mucking with logging levels to enable + ## debugging/verbose output for config file parser on request + logging.basicConfig(level=options.verbosity or Config().verbosity, + format='%(levelname)s: %(message)s', + stream = sys.stderr) + + if options.show_version: + output(u"s3cmd version %s" % PkgInfo.version) + sys.exit(EX_OK) + debug(u"s3cmd version %s" % PkgInfo.version) + + if options.quiet: + try: + f = open("/dev/null", "w") + sys.stdout = f + except IOError: + warning(u"Unable to open /dev/null: --quiet disabled.") + + ## Now finally parse the config file + if not options.config: + error(u"Can't find a config file. Please use --config option.") + sys.exit(EX_CONFIG) + + try: + cfg = Config(options.config, options.access_key, options.secret_key, options.access_token) + except ValueError as exc: + raise ParameterError(unicode(exc)) + except IOError as e: + if options.run_configure: + cfg = Config() + else: + error(u"%s: %s" % (options.config, e.strerror)) + error(u"Configuration file not available.") + error(u"Consider using --configure parameter to create one.") + sys.exit(EX_CONFIG) + + # allow commandline verbosity config to override config file + if options.verbosity is not None: + cfg.verbosity = options.verbosity + logging.root.setLevel(cfg.verbosity) + ## Unsupported features on Win32 platform + if os.name == "nt": + if cfg.preserve_attrs: + error(u"Option --preserve is not yet supported on MS Windows platform. Assuming --no-preserve.") + cfg.preserve_attrs = False + if cfg.progress_meter: + error(u"Option --progress is not yet supported on MS Windows platform. Assuming --no-progress.") + cfg.progress_meter = False + + ## Pre-process --add-header's and put them to Config.extra_headers SortedDict() + if options.add_header: + for hdr in options.add_header: + try: + key, val = unicodise_s(hdr).split(":", 1) + except ValueError: + raise ParameterError("Invalid header format: %s" % unicodise_s(hdr)) + # key char restrictions of the http headers name specification + key_inval = re.sub(r"[a-zA-Z0-9\-.!#$%&*+^_|]", "", key) + if key_inval: + key_inval = key_inval.replace(" ", "") + key_inval = key_inval.replace("\t", "") + raise ParameterError("Invalid character(s) in header name '%s'" + ": \"%s\"" % (key, key_inval)) + debug(u"Updating Config.Config extra_headers[%s] -> %s" % + (key.strip().lower(), val.strip())) + cfg.extra_headers[key.strip().lower()] = val.strip() + + # Process --remove-header + if options.remove_headers: + cfg.remove_headers = options.remove_headers + + ## --acl-grant/--acl-revoke arguments are pre-parsed by OptionS3ACL() + if options.acl_grants: + for grant in options.acl_grants: + cfg.acl_grants.append(grant) + + if options.acl_revokes: + for grant in options.acl_revokes: + cfg.acl_revokes.append(grant) + + ## Process --(no-)check-md5 + if options.check_md5 == False: + if "md5" in cfg.sync_checks: + cfg.sync_checks.remove("md5") + if "md5" in cfg.preserve_attrs_list: + cfg.preserve_attrs_list.remove("md5") + elif options.check_md5 == True: + if "md5" not in cfg.sync_checks: + cfg.sync_checks.append("md5") + if "md5" not in cfg.preserve_attrs_list: + cfg.preserve_attrs_list.append("md5") + + ## Update Config with other parameters + for option in cfg.option_list(): + try: + value = getattr(options, option) + if value != None: + if type(value) == type(b''): + value = unicodise_s(value) + debug(u"Updating Config.Config %s -> %s" % (option, value)) + cfg.update_option(option, value) + except AttributeError: + ## Some Config() options are not settable from command line + pass + + ## Special handling for tri-state options (True, False, None) + cfg.update_option("enable", options.enable) + if options.acl_public is not None: + cfg.update_option("acl_public", options.acl_public) + + ## Check multipart chunk constraints + if cfg.multipart_chunk_size_mb < MultiPartUpload.MIN_CHUNK_SIZE_MB: + raise ParameterError("Chunk size %d MB is too small, must be >= %d MB. Please adjust --multipart-chunk-size-mb" % (cfg.multipart_chunk_size_mb, MultiPartUpload.MIN_CHUNK_SIZE_MB)) + if cfg.multipart_chunk_size_mb > MultiPartUpload.MAX_CHUNK_SIZE_MB: + raise ParameterError("Chunk size %d MB is too large, must be <= %d MB. Please adjust --multipart-chunk-size-mb" % (cfg.multipart_chunk_size_mb, MultiPartUpload.MAX_CHUNK_SIZE_MB)) + + ## If an UploadId was provided, set put_continue True + if options.upload_id: + cfg.upload_id = options.upload_id + cfg.put_continue = True + + if cfg.upload_id and not cfg.multipart_chunk_size_mb: + raise ParameterError("Must have --multipart-chunk-size-mb if using --put-continue or --upload-id") + + ## CloudFront's cf_enable and Config's enable share the same --enable switch + options.cf_enable = options.enable + + ## CloudFront's cf_logging and Config's log_target_prefix share the same --log-target-prefix switch + options.cf_logging = options.log_target_prefix + + ## Update CloudFront options if some were set + for option in CfCmd.options.option_list(): + try: + value = getattr(options, option) + if value != None: + if type(value) == type(b''): + value = unicodise_s(value) + if value != None: + debug(u"Updating CloudFront.Cmd %s -> %s" % (option, value)) + CfCmd.options.update_option(option, value) + except AttributeError: + ## Some CloudFront.Cmd.Options() options are not settable from command line + pass + + if options.additional_destinations: + cfg.additional_destinations = options.additional_destinations + if options.files_from: + cfg.files_from = options.files_from + + ## Set output and filesystem encoding for printing out filenames. + try: + # Support for python3 + # That don't need codecs if output is the + # encoding of the system, but just in case, still use it. + # For that, we need to use directly the binary buffer + # of stdout/stderr + sys.stdout = codecs.getwriter(cfg.encoding)(sys.stdout.buffer, "replace") + sys.stderr = codecs.getwriter(cfg.encoding)(sys.stderr.buffer, "replace") + # getwriter with create an "IObuffer" that have not the encoding attribute + # better to add it to not break some functions like "input". + sys.stdout.encoding = cfg.encoding + sys.stderr.encoding = cfg.encoding + except AttributeError: + sys.stdout = codecs.getwriter(cfg.encoding)(sys.stdout, "replace") + sys.stderr = codecs.getwriter(cfg.encoding)(sys.stderr, "replace") + + ## Process --exclude and --exclude-from + patterns_list, patterns_textual = process_patterns(options.exclude, options.exclude_from, is_glob = True, option_txt = "exclude") + cfg.exclude.extend(patterns_list) + cfg.debug_exclude.update(patterns_textual) + + ## Process --rexclude and --rexclude-from + patterns_list, patterns_textual = process_patterns(options.rexclude, options.rexclude_from, is_glob = False, option_txt = "rexclude") + cfg.exclude.extend(patterns_list) + cfg.debug_exclude.update(patterns_textual) + + ## Process --include and --include-from + patterns_list, patterns_textual = process_patterns(options.include, options.include_from, is_glob = True, option_txt = "include") + cfg.include.extend(patterns_list) + cfg.debug_include.update(patterns_textual) + + ## Process --rinclude and --rinclude-from + patterns_list, patterns_textual = process_patterns(options.rinclude, options.rinclude_from, is_glob = False, option_txt = "rinclude") + cfg.include.extend(patterns_list) + cfg.debug_include.update(patterns_textual) + + ## Set socket read()/write() timeout + socket.setdefaulttimeout(cfg.socket_timeout) + + if cfg.encrypt and cfg.gpg_passphrase == "": + error(u"Encryption requested but no passphrase set in config file.") + error(u"Please re-run 's3cmd --configure' and supply it.") + sys.exit(EX_CONFIG) + + if options.dump_config: + cfg.dump_config(sys.stdout) + sys.exit(EX_OK) + + if options.run_configure: + # 'args' may contain the test-bucket URI + run_configure(options.config, args) + sys.exit(EX_OK) + + ## set config if stop_on_error is set + if options.stop_on_error: + cfg.stop_on_error = options.stop_on_error + + if options.content_disposition: + cfg.content_disposition = options.content_disposition + + if options.content_type: + cfg.content_type = options.content_type + + if len(args) < 1: + optparser.print_help() + sys.exit(EX_USAGE) + + ## Unicodise all remaining arguments: + args = [unicodise(arg) for arg in args] + + command = args.pop(0) + try: + debug(u"Command: %s" % commands[command]["cmd"]) + ## We must do this lookup in extra step to + ## avoid catching all KeyError exceptions + ## from inner functions. + cmd_func = commands[command]["func"] + except KeyError as e: + error(u"Invalid command: %s", command) + sys.exit(EX_USAGE) + + if len(args) < commands[command]["argc"]: + error(u"Not enough parameters for command '%s'" % command) + sys.exit(EX_USAGE) + + rc = cmd_func(args) + if rc is None: # if we missed any cmd_*() returns + rc = EX_GENERAL + return rc + +def report_exception(e, msg=u''): + alert_header = u""" +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + An unexpected error has occurred. + Please try reproducing the error using + the latest s3cmd code from the git master + branch found at: + https://github.com/s3tools/s3cmd + and have a look at the known issues list: + https://github.com/s3tools/s3cmd/wiki/Common-known-issues-and-their-solutions-(FAQ) + If the error persists, please report the + %s (removing any private + info as necessary) to: + s3tools-bugs@lists.sourceforge.net%s +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +""" + sys.stderr.write(alert_header % (u"following lines", u"\n\n" + msg)) + tb = traceback.format_exc() + try: + s = u' '.join([unicodise(a) for a in sys.argv]) + except NameError: + # Error happened before Utils module was yet imported to provide + # unicodise + try: + s = u' '.join([(a) for a in sys.argv]) + except UnicodeDecodeError: + s = u'[encoding safe] ' + u' '.join([('%r'%a) for a in sys.argv]) + sys.stderr.write(u"Invoked as: %s\n" % s) + + e_class = str(e.__class__) + e_class = e_class[e_class.rfind(".")+1 : -2] + try: + sys.stderr.write(u"Problem: %s: %s\n" % (e_class, e)) + except UnicodeDecodeError: + sys.stderr.write(u"Problem: [encoding safe] %r: %r\n" + % (e_class, e)) + try: + sys.stderr.write(u"S3cmd: %s\n" % PkgInfo.version) + except NameError: + sys.stderr.write(u"S3cmd: unknown version." + "Module import problem?\n") + sys.stderr.write(u"python: %s\n" % sys.version) + try: + sys.stderr.write(u"environment LANG=%s\n" + % unicodise_s(os.getenv("LANG", "NOTSET"), + 'ascii')) + except NameError: + # Error happened before Utils module was yet imported to provide + # unicodise + sys.stderr.write(u"environment LANG=%s\n" + % os.getenv("LANG", "NOTSET")) + sys.stderr.write(u"\n") + if type(tb) == unicode: + sys.stderr.write(tb) + else: + sys.stderr.write(unicode(tb, errors="replace")) + + if type(e) == ImportError: + sys.stderr.write("\n") + sys.stderr.write("Your sys.path contains these entries:\n") + for path in sys.path: + sys.stderr.write(u"\t%s\n" % path) + sys.stderr.write("Now the question is where have the s3cmd modules" + " been installed?\n") + + sys.stderr.write(alert_header % (u"above lines", u"")) + +if __name__ == '__main__': + try: + ## Our modules + ## Keep them in try/except block to + ## detect any syntax errors in there + from S3.ExitCodes import * + from S3.Exceptions import * + from S3 import PkgInfo + from S3.S3 import S3 + from S3.Config import Config + from S3.SortedDict import SortedDict + from S3.FileDict import FileDict + from S3.S3Uri import S3Uri + from S3 import Utils + from S3 import Crypto + from S3.BaseUtils import (formatDateTime, getPrettyFromXml, + encode_to_s3, decode_from_s3) + from S3.Utils import (formatSize, unicodise_safe, unicodise_s, + unicodise, deunicodise, replace_nonprintables) + from S3.Progress import Progress, StatsInfo + from S3.CloudFront import Cmd as CfCmd + from S3.CloudFront import CloudFront + from S3.FileLists import * + from S3.MultiPart import MultiPartUpload + except Exception as e: + report_exception(e, "Error loading some components of s3cmd (Import Error)") + # 1 = EX_GENERAL but be safe in that situation + sys.exit(1) + + try: + rc = main() + sys.exit(rc) + + except ImportError as e: + report_exception(e) + sys.exit(EX_GENERAL) + + except (ParameterError, InvalidFileError) as e: + error(u"Parameter problem: %s" % e) + sys.exit(EX_USAGE) + + except (S3DownloadError, S3UploadError, S3RequestError) as e: + error(u"S3 Temporary Error: %s. Please try again later." % e) + sys.exit(EX_TEMPFAIL) + + except S3Error as e: + error(u"S3 error: %s" % e) + sys.exit(e.get_error_code()) + + except (S3Exception, S3ResponseError, CloudFrontError) as e: + report_exception(e) + sys.exit(EX_SOFTWARE) + + except SystemExit as e: + sys.exit(e.code) + + except KeyboardInterrupt: + sys.stderr.write("See ya!\n") + sys.exit(EX_BREAK) + + except (S3SSLError, S3SSLCertificateError) as e: + # SSLError is a subtype of IOError + error("SSL certificate verification failure: %s" % e) + sys.exit(EX_ACCESSDENIED) + + except ConnectionRefusedError as e: + error(e) + sys.exit(EX_CONNECTIONREFUSED) + # typically encountered error is: + # ERROR: [Errno 111] Connection refused + + except socket.gaierror as e: + # gaierror is a subset of IOError + # typically encountered error is: + # gaierror: [Errno -2] Name or service not known + error(e) + error("Connection Error: Error resolving a server hostname.\n" + "Please check the servers address specified in 'host_base', 'host_bucket', 'cloudfront_host', 'website_endpoint'") + sys.exit(EX_IOERR) + + except IOError as e: + if e.errno == errno.ECONNREFUSED: + # Python2 does not have ConnectionRefusedError + error(e) + sys.exit(EX_CONNECTIONREFUSED) + + if e.errno == errno.EPIPE: + # Fail silently on SIGPIPE. This likely means we wrote to a closed + # pipe and user does not care for any more output. + sys.exit(EX_IOERR) + + report_exception(e) + sys.exit(EX_IOERR) + + except OSError as e: + error(e) + sys.exit(EX_OSERR) + + except MemoryError: + msg = """ +MemoryError! You have exceeded the amount of memory available for this process. +This usually occurs when syncing >750,000 files on a 32-bit python instance. +The solutions to this are: +1) sync several smaller subtrees; or +2) use a 64-bit python on a 64-bit OS with >8GB RAM + """ + sys.stderr.write(msg) + sys.exit(EX_OSERR) + + except UnicodeEncodeError as e: + lang = unicodise_s(os.getenv("LANG", "NOTSET"), 'ascii') + msg = """ +You have encountered a UnicodeEncodeError. Your environment +variable LANG=%s may not specify a Unicode encoding (e.g. UTF-8). +Please set LANG=en_US.UTF-8 or similar in your environment before +invoking s3cmd. + """ % lang + report_exception(e, msg) + sys.exit(EX_GENERAL) + + except Exception as e: + report_exception(e) + sys.exit(EX_GENERAL) + +# vim:et:ts=4:sts=4:ai diff --git a/csharp/App_backup/Backend/Resources/smtpConfig.json b/csharp/App_backup/Backend/Resources/smtpConfig.json new file mode 100644 index 000000000..0e22daa3a --- /dev/null +++ b/csharp/App_backup/Backend/Resources/smtpConfig.json @@ -0,0 +1,6 @@ +{ + "Url": "mail.agenturserver.de", + "Port": 587, + "Username": "p518526p69", + "Password": "i;b*xqm4iB5uhl" +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Resources/urlAndKey.json b/csharp/App_backup/Backend/Resources/urlAndKey.json new file mode 100644 index 000000000..137c8e690 --- /dev/null +++ b/csharp/App_backup/Backend/Resources/urlAndKey.json @@ -0,0 +1,6 @@ +{ + "ReadOnlyS3Key": "EXO44d2979c8e570eae81ead564", + "ReadOnlyS3Secret": "55MAqyO_FqUmh7O64VIO0egq50ERn_WIAWuc2QC44QU" , + "ReadWriteS3Key": "EXO87ca85e29dd412f1238f1cf0", + "ReadWriteS3Secret": "-T9TAqy9a3-0-xj7HKsFFJOCcxfRpcnL6OW5oOrOcWU" +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Websockets/AlarmOrWarning.cs b/csharp/App_backup/Backend/Websockets/AlarmOrWarning.cs new file mode 100644 index 000000000..6f737032b --- /dev/null +++ b/csharp/App_backup/Backend/Websockets/AlarmOrWarning.cs @@ -0,0 +1,11 @@ + + +namespace InnovEnergy.App.Backend.Websockets; + +public class AlarmOrWarning +{ + public required String Date { get; set; } + public required String Time { get; set; } + public required String Description { get; set; } + public required String CreatedBy { get; set; } +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Websockets/InstallationInfo.cs b/csharp/App_backup/Backend/Websockets/InstallationInfo.cs new file mode 100644 index 000000000..df816607b --- /dev/null +++ b/csharp/App_backup/Backend/Websockets/InstallationInfo.cs @@ -0,0 +1,10 @@ +using System.Net.WebSockets; +namespace InnovEnergy.App.Backend.Websockets; + +public class InstallationInfo +{ + public int Status { get; set; } + public DateTime Timestamp { get; set; } + public int Product { get; set; } + public List Connections { get; } = new List(); +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Websockets/RabbitMQManager.cs b/csharp/App_backup/Backend/Websockets/RabbitMQManager.cs new file mode 100644 index 000000000..7dd73116c --- /dev/null +++ b/csharp/App_backup/Backend/Websockets/RabbitMQManager.cs @@ -0,0 +1,179 @@ +using System.Text; +using System.Text.Json; +using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.Lib.Utils; +using RabbitMQ.Client; +using RabbitMQ.Client.Events; + +namespace InnovEnergy.App.Backend.Websockets; + +public static class RabbitMqManager +{ + public static ConnectionFactory Factory = null!; + public static IConnection Connection = null!; + public static IModel Channel = null!; + + //This function will be called from the Backend/Program.cs + public static void InitializeEnvironment() + { + string vpnServerIp = "10.2.0.11"; + + //Subscribe to RabbitMq queue as a consumer + Factory = new ConnectionFactory + { + HostName = vpnServerIp, + Port = 5672, + VirtualHost = "/", + UserName = "consumer", + Password = "faceaddb5005815199f8366d3d15ff8a", + + }; + + Connection = Factory.CreateConnection(); + Channel = Connection.CreateModel(); + Console.WriteLine("Middleware subscribed to RabbitMQ queue, ready for receiving messages"); + Channel.QueueDeclare(queue: "statusQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); + } + + public static async Task StartRabbitMqConsumer() + { + //Wait to receive a message from an installation + var consumer = new EventingBasicConsumer(Channel); + consumer.Received += (_, ea) => + { + var body = ea.Body.ToArray(); + var message = Encoding.UTF8.GetString(body); + //A message can be an alarm, a warning or a heartbit + StatusMessage? receivedStatusMessage = JsonSerializer.Deserialize(message); + + lock (WebsocketManager.InstallationConnections) + { + //Consumer received a message + if (receivedStatusMessage != null) + { + Installation installation = Db.Installations.FirstOrDefault(f => f.Product == receivedStatusMessage.Product && f.S3BucketId == receivedStatusMessage.InstallationId); + int installationId = (int)installation.Id; + + //This is a heartbit message, just update the timestamp for this installation. + //There is no need to notify the corresponding front-ends. + //Every 15 iterations(30 seconds), the installation sends a heartbit message to the queue. + if (receivedStatusMessage.Type == MessageType.Heartbit) + { + //Do not do anything here, just for debugging purposes. + } + else + { + //Traverse the Warnings list, and store each of them to the database + if (receivedStatusMessage.Warnings != null) + { + foreach (var warning in receivedStatusMessage.Warnings) + { + Warning newWarning = new Warning + { + InstallationId = installationId, + Description = warning.Description, + Date = warning.Date, + Time = warning.Time, + DeviceCreatedTheMessage = warning.CreatedBy, + Seen = false + }; + //Create a new warning and add it to the database + //Console.WriteLine("Add a warning for installation "+installationId); + Db.HandleWarning(newWarning, installationId); + } + } + + + //Traverse the Alarm list, and store each of them to the database + if (receivedStatusMessage.Alarms != null) + { + + string monitorLink; + if (installation.Product == (int)ProductType.Salimax) + { + monitorLink = + $"https://monitor.innov.energy/installations/list/installation/{installation.S3BucketId}/batteryview"; + } + else + { + monitorLink = + $"https://monitor.innov.energy/salidomo_installations/list/installation/{installation.S3BucketId}/batteryview"; + } + + foreach (var alarm in receivedStatusMessage.Alarms) + { + Error newError = new Error + { + InstallationId = installation.Id, + Description = alarm.Description, + Date = alarm.Date, + Time = alarm.Time, + DeviceCreatedTheMessage = alarm.CreatedBy, + Seen = false + }; + + //Console.WriteLine("Add an alarm for installation "+installationId); + + // Send replace battery email to support team if this alarm is "NeedToReplaceBattery" + if (alarm.Description == "2 or more string are disabled") + { + Console.WriteLine("Send replace battery email to the support team for installation "+installationId); + string recipient = "support@innov.energy"; + string subject = $"Battery Alarm from {installation.InstallationName}: 2 or more strings broken"; + string text = $"Dear InnovEnergy Support Team,\n" + + $"\n"+ + $"Installation Name: {installation.InstallationName}\n"+ + $"\n"+ + $"Installation Monitor Link: {monitorLink}\n"+ + $"\n"+ + $"Please exchange: {alarm.CreatedBy}\n"+ + $"\n"+ + $"Error created date and time: {alarm.Date} {alarm.Time}\n"+ + $"\n"+ + $"Thank you for your great support:)"; + //Disable this function now + //Mailer.Send("InnovEnergy Support Team", recipient, subject, text); + } + //Create a new error and add it to the database + Db.HandleError(newError, installationId); + } + } + } + + Int32 prevStatus; + + //This installation id does not exist in our in-memory data structure, add it. + if (!WebsocketManager.InstallationConnections.ContainsKey(installationId)) + { + prevStatus = -2; + //Console.WriteLine("Create new empty list for installation: " + installationId); + WebsocketManager.InstallationConnections[installationId] = new InstallationInfo + { + Status = receivedStatusMessage.Status, + Timestamp = DateTime.Now, + Product = installation.Product + }; + } + else + { + prevStatus = WebsocketManager.InstallationConnections[installationId].Status; + WebsocketManager.InstallationConnections[installationId].Status = receivedStatusMessage.Status; + WebsocketManager.InstallationConnections[installationId].Timestamp = DateTime.Now; + } + + installation.Status = receivedStatusMessage.Status; + installation.Apply(Db.Update); + + //Console.WriteLine("----------------------------------------------"); + //If the status has changed, update all the connected front-ends regarding this installation + if(prevStatus != receivedStatusMessage.Status && WebsocketManager.InstallationConnections[installationId].Connections.Count > 0) + { + WebsocketManager.InformWebsocketsForInstallation(installationId); + } + } + } + }; + Channel.BasicConsume(queue: "statusQueue", autoAck: true, consumer: consumer); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/Websockets/StatusMessage.cs b/csharp/App_backup/Backend/Websockets/StatusMessage.cs new file mode 100644 index 000000000..0d2571811 --- /dev/null +++ b/csharp/App_backup/Backend/Websockets/StatusMessage.cs @@ -0,0 +1,19 @@ + +namespace InnovEnergy.App.Backend.Websockets; + +public class StatusMessage +{ + public required Int32 InstallationId { get; set; } + public required Int32 Product { get; set; } + public required Int32 Status { get; set; } + public required MessageType Type { get; set; } + public List? Warnings { get; set; } + public List? Alarms { get; set; } + public Int32 Timestamp { get; set; } +} + +public enum MessageType +{ + AlarmOrWarning, + Heartbit +} diff --git a/csharp/App_backup/Backend/Websockets/WebsockerManager.cs b/csharp/App_backup/Backend/Websockets/WebsockerManager.cs new file mode 100644 index 000000000..5568f66c7 --- /dev/null +++ b/csharp/App_backup/Backend/Websockets/WebsockerManager.cs @@ -0,0 +1,238 @@ +using System.Net; +using System.Net.Sockets; +using System.Net.WebSockets; +using System.Text; +using System.Text.Json; +using InnovEnergy.App.Backend.Database; +using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.Backend.Websockets; + +public static class WebsocketManager +{ + public static Dictionary InstallationConnections = new Dictionary(); + + //Every 1 minute, check the timestamp of the latest received message for every installation. + //If the difference between the two timestamps is more than two minutes, we consider this Salimax installation unavailable. + public static async Task MonitorSalimaxInstallationTable() + { + while (true){ + lock (InstallationConnections){ + Console.WriteLine("MONITOR SALIMAX INSTALLATIONS\n"); + foreach (var installationConnection in InstallationConnections){ + + if (installationConnection.Value.Product==(int)ProductType.Salimax && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(2)){ + + // Console.WriteLine("Installation ID is "+installationConnection.Key); + // Console.WriteLine("installationConnection.Value.Timestamp is "+installationConnection.Value.Timestamp); + // Console.WriteLine("diff is "+(DateTime.Now-installationConnection.Value.Timestamp)); + + installationConnection.Value.Status = (int)StatusType.Offline; + Installation installation = Db.Installations.FirstOrDefault(f => f.Product == (int)ProductType.Salimax && f.Id == installationConnection.Key); + installation.Status = (int)StatusType.Offline; + installation.Apply(Db.Update); + if (installationConnection.Value.Connections.Count > 0){InformWebsocketsForInstallation(installationConnection.Key);} + } + } + Console.WriteLine("FINISHED MONITORING SALIMAX INSTALLATIONS\n"); + } + + await Task.Delay(TimeSpan.FromMinutes(1)); + } + } + + //Every 1 minute, check the timestamp of the latest received message for every installation. + //If the difference between the two timestamps is more than 1 hour, we consider this Salidomo installation unavailable. + public static async Task MonitorSalidomoInstallationTable() + { + while (true){ + Console.WriteLine("TRY TO LOCK FOR MONITOR SALIDOMO INSTALLATIONS\n"); + lock (InstallationConnections){ + Console.WriteLine("MONITOR SALIDOMO INSTALLATIONS\n"); + foreach (var installationConnection in InstallationConnections) + { + //Console.WriteLine("Installation ID is "+installationConnection.Key); + if (installationConnection.Value.Product == (int)ProductType.Salidomo && (DateTime.Now - installationConnection.Value.Timestamp) < TimeSpan.FromMinutes(60)){ + Console.WriteLine("Installation ID is "+installationConnection.Key + " diff is "+(DateTime.Now-installationConnection.Value.Timestamp)); + } + + if (installationConnection.Value.Product==(int)ProductType.Salidomo && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(60)) + { + + //Console.WriteLine("installationConnection.Value.Timestamp is "+installationConnection.Value.Timestamp); + //Console.WriteLine("timestamp now is is "+(DateTime.Now)); + + Installation installation = Db.Installations.FirstOrDefault(f => f.Product == (int)ProductType.Salidomo && f.Id == installationConnection.Key); + Console.WriteLine("Installation ID is "+installation.Name + " diff is "+(DateTime.Now-installationConnection.Value.Timestamp)); + installation.Status = (int)StatusType.Offline; + installation.Apply(Db.Update); + + installationConnection.Value.Status = (int)StatusType.Offline; + if (installationConnection.Value.Connections.Count > 0){InformWebsocketsForInstallation(installationConnection.Key);} + else{Console.WriteLine("NONE IS CONNECTED TO THAT INSTALLATION-------------------------------------------------------------");} + } + } + Console.WriteLine("FINISHED WITH UPDATING\n"); + } + await Task.Delay(TimeSpan.FromMinutes(1)); + } + } + + //Inform all the connected websockets regarding installation "installationId" + public static void InformWebsocketsForInstallation(Int64 installationId) + { + var installation = Db.GetInstallationById(installationId); + var installationConnection = InstallationConnections[installationId]; + Console.WriteLine("Update all the connected websockets for installation " + installation.Name); + + var jsonObject = new + { + id = installationId, + status = installationConnection.Status, + testingMode = installation.TestingMode + }; + + string jsonString = JsonSerializer.Serialize(jsonObject); + byte[] dataToSend = Encoding.UTF8.GetBytes(jsonString); + + foreach (var connection in installationConnection.Connections) + { + connection.SendAsync( + new ArraySegment(dataToSend, 0, dataToSend.Length), + WebSocketMessageType.Text, + true, // Indicates that this is the end of the message + CancellationToken.None + ); + } + } + + public static async Task HandleWebSocketConnection(WebSocket currentWebSocket) + { + var buffer = new byte[4096]; + try + { + while (currentWebSocket.State == WebSocketState.Open) + { + //Listen for incoming messages on this WebSocket + var result = await currentWebSocket.ReceiveAsync(buffer, CancellationToken.None); + + if (result.MessageType != WebSocketMessageType.Text) + continue; + + var message = Encoding.UTF8.GetString(buffer, 0, result.Count); + var installationIds = JsonSerializer.Deserialize(message); + + //This is a ping message to keep the connection alive, reply with a pong + if (installationIds[0] == -1) + { + var jsonObject = new + { + id = -1, + status = -1 + }; + + var jsonString = JsonSerializer.Serialize(jsonObject); + var dataToSend = Encoding.UTF8.GetBytes(jsonString); + currentWebSocket.SendAsync(dataToSend, + WebSocketMessageType.Text, + true, + CancellationToken.None + ); + + continue; + } + + //Received a new message from this websocket. + //We have a HandleWebSocketConnection per connected frontend + lock (InstallationConnections) + { + List dataToSend = new List(); + + //Each front-end will send the list of the installations it wants to access + //If this is a new key (installation id), initialize the list for this key and then add the websocket object for this client + //Then, report the status of each requested installation to the front-end that created the websocket connection + foreach (var installationId in installationIds) + { + var installation = Db.GetInstallationById(installationId); + if (!InstallationConnections.ContainsKey(installationId)) + { + //Since we keep all the changes to the database, in case that the backend reboots, we need to update the in-memory data structure. + //Thus, if the status is -1, we put an old timestamp, otherwise, we put the most recent timestamp. + //We store everything to the database, because when the backend reboots, we do not want to wait until all the installations send the heartbit messages. + //We want the in memory data structure to be up to date immediately. + InstallationConnections[installationId] = new InstallationInfo + { + Status = installation.Status, + Timestamp = installation.Status==(int)StatusType.Offline ? DateTime.Now.AddDays(-1) : DateTime.Now, + Product = installation.Product + }; + } + + InstallationConnections[installationId].Connections.Add(currentWebSocket); + + var jsonObject = new WebsocketMessage + { + id = installationId, + status = InstallationConnections[installationId].Status, + testingMode = installation.TestingMode + }; + + dataToSend.Add(jsonObject); + + } + var jsonString = JsonSerializer.Serialize(dataToSend); + var encodedDataToSend = Encoding.UTF8.GetBytes(jsonString); + + + currentWebSocket.SendAsync(encodedDataToSend, + WebSocketMessageType.Text, + true, // Indicates that this is the end of the message + CancellationToken.None + ); + + + Console.WriteLine("Printing installation connection list"); + Console.WriteLine("----------------------------------------------"); + foreach (var installationConnection in InstallationConnections) + { + Console.WriteLine("Installation ID: " + installationConnection.Key + " Number of Connections: " + installationConnection.Value.Connections.Count); + } + Console.WriteLine("----------------------------------------------"); + } + } + + lock (InstallationConnections) + { + //When the front-end terminates the connection, the following code will be executed + Console.WriteLine("The connection has been terminated"); + foreach (var installationConnection in InstallationConnections) + { + if (installationConnection.Value.Connections.Contains(currentWebSocket)) + { + installationConnection.Value.Connections.Remove(currentWebSocket); + } + } + } + + await currentWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Connection closed by server", CancellationToken.None); + lock (InstallationConnections) + { + //Print the installationConnections dictionary after deleting a websocket + Console.WriteLine("Print the installation connections list after deleting a websocket"); + Console.WriteLine("----------------------------------------------"); + foreach (var installationConnection in InstallationConnections) + { + Console.WriteLine("Installation ID: " + installationConnection.Key + " Number of Connections: " + installationConnection.Value.Connections.Count); + } + + Console.WriteLine("----------------------------------------------"); + } + } + catch (Exception ex) + { + Console.WriteLine("WebSocket error: " + ex.Message); + } + } + +} \ No newline at end of file diff --git a/csharp/App_backup/Backend/db-1733849565.sqlite b/csharp/App_backup/Backend/db-1733849565.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..f3b3e33a38cb5bcfe35c74dd9882cb82cc75d3ec GIT binary patch literal 4579328 zcmeFa349dA);2yfJ<~JYJ>3O?5LOAuDiCJP%%DKn_eB;FL||43ganhYDS{IeS;D3w zpooZo$d<5^nIx-YWN@4okK@}r)r>N<6*o;p?C zRbACH`2N1B+5W^pM&?9!cA`~PO{G?=QW6tYDwSHL(vDK8G{xX2G_2AB-uegEtNf={ zC5^7DgJf#*3np$&ev#B-zHmV3&u``jaXYylhKS)V{Yv&%_90fKdtKL8JCiA88feVw zj%r7h`TxI4z}8`9)xnI~`hU0^@t<#Whi9Zu=> zc^?d22|DEHzV57S>_X9S%{wXmYbr`#G!`27mUQEmL*v+lmi5$=@5p>;mOrzXFPgl@ zKhBz_`D@0}*p|bqvkA@Xsb}4h?U0NKw+kE>&2?!1UiS~}mKZhOTjiEh{xxqJ*)n)n zHF<2zsUbIRR3r-3?`*ngtlU!3JSz-jx2kY!5Q4V3O-!OEbu7foL*&2MUctIVpD@6z z4tA1jU(pgedA-nnf9Z;`398*md2E8eSzGbLNua8%^OZMl((IkCE!>ee~x2sn%(r_mc6))XRA3J2+LCWljtZWQVH;_rGm_ z!+?5g*@TAiYM6Dv6Rs?PZHOLSG_yPJ{I`?bk)Pb|E&DNSLZf(f)}MKGo9IqWLlNyi z&rD8pM{YExIo}y%?y&E_Tx^jJHEIo#Epv!k zpAa9feo`&xi3P*|nmeTByPw=Eq9vd%xFRK#?lf8D_TYaaVX}O|TVL)L(VL)L(VL)L(VL)L(Vc@@y0eF$-M*hhu+5XH-ch>Z*Z2!b8i0;^k>7j<#OJiZ`o0R7E!z9`biN|GR z7vdamoX6*sC?I?Ge8Y9`OH*zdQxVF zKYLtSY8Jd4ftOk-Fiis%F#i^qe`kMYI=q$gCG~S>dawXcr0i7pSSVrh224kF!0o|I zCT75F%wkIMq)qluO-+ZZ&FV5PwFll$(Q8oUNlEUpnW=E8DPBUZqn9RTjDy!$-f?iL ziP%LIcPD)bj8#236Q-tjR-!Lv;)AK%M0fgMF7;~0+#e+-$?wU8G*GXpso8SUHe)k0 zCQrip-6dwK5^m+3o-rlbXVE6$mCS-gfy@;NFgOM-PDuddRA5%@}K6Pke!)v zD+~#QR?I_S3EAUP-C0TF{N4#*0GQB|)h3!4$xBb2kmU2%mBy$Npovm5;B}zcmNGVK zEOi)%+MPbu5AA$st@>ka)3Q>)fHGjEZ=5@=joi2#X{o9eHSa&UX>b?QNu8RN@n{Ng z>YgwzV{(?ijmJGMeOyKWO3EV@<0bkLc)6ODx#cc#s|~=gSj=EhD!$G2CG~;Yr&Y8F(uC=!?wbLf_0gn((9D5AT53!d ziD(qvIuA}7_`pAI=y;LzQ3)hoO&%g2lLGPznN6mU`^ZTWAuUL}B)_!(?;AlCO$q}F z0}2BQ0}2BQ0}2BQ0}2BQ0}2BQ0}2EG*BPiy7^|k@=9SUDv7@smPEzGoCrr~jt}uL@ z#585PWKF>>)UXkI;v~`}LFAZvOmtUwvwF{vR8=)KZYSvE#jV)0jB2KyCc3eaT}p1M zL`^jDEWyAeF!By*vi|q_dZxX)!uHfVw!X&KVqsmcVkzm?gD%x{OjC8mO$gRB; zN#aeFwi-;<2KqrTaj?7#q&L1d?oPK(Bn~>fr^42W7Wfvr7ruG!Chr|d><1e&K(Lc< zVrn`n=to~`%VooN!_6`C?(znT#D2JeqM5`rf*ludz(Ni-#b8g^CqaWvq#sqf{vy** z-9Ocv0fnD5sWZO4@9j=+Gib6eBQ22FHM$?77uKA-2rhI<~GpnPD|{En;ZIN zVov?s(-Mc`=8C>?OiL^vY#d1JL^lfbC(PaIPVnYDaj^XAyiaOYLUpFOdPoLr`N)FG z7s6Y3QI3&chbPk4;Vi}smiI#>_K^2O#9>VIeR!h$KAa#OgXpe^#9`505fT;<4(!4K zq{P0dlY2Z`6Kerm?Y&Uu?uXaO`y&K0SjF~F#a4{91dQ!RH%cV-ytPrHF6!z#c>)x9 zuy@?yJ@O_84zs2&;S+DYgij=4RgJ%t0r%#>Yxu-&bXP|7C4W3-*%fv&_|p=5+}g}w z#4Njv%S_FJ{W0l@J#iaEJxqwEh|LZ5Aa85XgY7qxd4+RLQ($XCqrVVc9qr!Q8rec#BVqC^SxBC~_4l{Br6Qy-pfI2?pfI2?pfI2?pfI2? zpfI2?pfI2?@NdZgS*y}@(lVSn1)YxQv_&TgonGj)K&Lr6&CqFzP7`!GqthFm9_ZYq zW7KL*yzJJ%i2mr*L#Hk}J<;ilP9JpQ$Tuoob@cT^hoB>&BcfwOM?i;1heIb39X&eu z-8vpWL^uZ^Nbg9mOVgwtQZ4aA zahEt-93(a}er4QmTx5LM*jo5SI3cVQ#t9CAriP4gGU^uim0pv**~C*>tu&Yt+4~+oYSW>#0l7ex%*4eNsDE+nD*9IlwGt zMlo$PziLiuUeKg!oKVQ}4GlVt8$HZove?>~lG~UaCRaPVrJcpx z*_{pRWz*s7c|L!l1q9rc3Yc9n0%Ix{aKs3Vu3W$#BQUCR0c(uF!<7rfR(fQm0;a!I z8b0&*_-%n91G@Z$*5r1k7!51$xh)Xe4z_l-7?xJHtXv?5rIjrz7l>hLW%J4fV(ZYX zQUU8Uw2w2f!In*l?%jH zTC7yS7F%g!4}vK z#8x`3a)H=NPpDKN_ECDp_{s%hE1g=oKy0PQRW1-)>9Lgy#8x^`sX*-Ly~1C)Ky0Ob zl?%jH+FQB6Un;GEd9|8+2d?H}@*VjU-t}K1=Sc~C0pJa?AHE2%lWc|e`>&7}$uhE- z%!BU(JWi&PN5}-?hy4J<$zalt^nm>U_Yym4OInh0{}A z>0K!T-xGXOIxH1Qd!_BtW@)|jvb0iqR$3@MEd`~=q{&i-lqz|phoxcC{Zb#Po77Qq zNmi+i)Ld#L)sx~SB5@KU{wDq)ehuFr{7`&Pydai|r^RF9K`|`u7W2f{#aG3b#O2~r zae?@hI15fNJR*)4z2Zo5sMufZA*P5f(IU1In}`j>S|Sk*qT2Yg@uu-}vKX<5=Su<8b33V;^Hz_#$Gmv8}O%v5~Q^ zv4+uT)Cs=}KL}q5p9)uncZG7{v~X0|FYFVx3!8*jg;l~bVUh5(@Psg3$P^|BKH*{E z0bzj9Q|KhL6RbjOp{a0}kRVhOI6=ez!hg%(;6LKu_!InLzL4L|Z{uI%*YGR( zXZQvDll-;M9UJ9rb{l5fn{<7@J8ri1%~`;q&ayUtzXE^-m> z40nt>z!h*ixXs);?j`PdZZS8P3v!QgSzH?D=SFeExPe?Rt}}NpXXDy%&A5hKZLT`U zbBy6v!*_-+3?Cb=7%mt}4JQpp3`K@LhCIVY!z+dt49^;J4NnfO!ECt4aJQkpA>JSv;PFfUll~k1XZjEHm-KJx&+3os59&kuo%${M_4?KN z<@zQ1dHNjvWBP3UM14R%TK}N_etmC!7yW&DyFN+ZT%V|~qmR=IdM*1K`#t+5`w9C# z`wm;io?_o%i`l(wKKnYmmVJ?Zj$O#kVP~<^*hkp$td||h4rTkZJ=hf1#ah@_Y!kKt zTZ<*EfmQ2%*4@;7uKQ4TS$AG{PWPtnkS?s-rQ538pnF-jLbp^mUpHGfLpNEMt{bbX zr>m(Gb*%Oe?bq7t+H2a2+KBdy_L%m7_D5}jc87MecAfSm?ep5j+PT`G_EBw?Hcji- zj?xa(4%GJ2cGljjwQ1XEn`s+rYip}(VSSGImHCeOg87)a!d!sgy*SAnVTzbNOrFlI z8=)Jl>#OUg>!5S!OuCl3#?VPwMy+AhUs3py!WR^7Q23m}XB4he_>{sY6h5Z#5rq#a zd_dtEg{u_ar*MVBdlW8HxJ2P1g?A`ipzt<@^Az5q5TQ^`p^QQ)g%S$qD4eBmhQetI zrzo7HaDu{{6pm3iO5qI(M<^VoaEQV|3I`}0r%+6xh(ee`h(ZB^Q9X^qR0>llOs0@U zA(KJ|h29i;;hHYj6a%b!ABDXX_E6YOVHbs+6n0S9P9dK{9))cbwo=$aVKaqI6keyW zk-}>fHc(hkVI756DXgXN3WYTkUZ${`!b=oZQFxKU3lvsTSV3Vqh36?OqwpMsXDK{G zVJU?r6c$rhL}4L?TnY;)%%?Dq!dwbZQpXicFN zg?lKpq|kywa|+EUG^Nml!rc@aQ)omXkwQZXcTs3Sp+1Fr6zWo_L!mZ>1PZk%#8aqA zp$3IG3e_o8qd+J~6hsO}3IYY50!P6>K~I6DprfFrz);XoP*YIJp!$Qt?-YKc@GFI1 zDEvg>dkWuC_?E&=3g1xpn!;BUzNGL4g&Pz;r|=nt>l8kv@Ck*FDSSlXLkb^IxJKbB zh4(33q3|As%M>nAxJcn$3hz+3K;dl)=PA5JAwr>?LK%fp3MCZIQ8-KC429DaPEj~X z;RJ;@DIBM8jKWb0Z%{Zw;V^|m6b@22Kw&?HVhTkR3Mqss?4z)k!X65{DeR)Klfn)P z+bQHz$fK~0!d41fC~T&%iNfm?Hd5F?VLgR)6kesUmclC()=+qv!fFaHQCLOcMG7xa zSV>_8h2<2Ur?8B|a}=JX@C=2e6c$rhNFkTP0t)jf%%d=u!qXJyPMlN4rC$e|FV z@B}^`u(M=$rtCg0yEA0>G1+}ocBjkkG})ahyHjL$vg~HdZkFt(%Wj(NPLSR4vYRTq z<79WN>;`1lFS|b3^~$bCcHOc&Ms`Qb?kL%PSawIs?nAOWLUxDC?t`*BOm-iT-666& zSat`=?)|bmP<98%ZhzVBC%b)Rw~y@hmR~@yjPO_UK zyB%e>gY34K-TP$sUfFFYyDr&v%C19plV#T~yEfUi%C1Fr&9ZBf-L|ruB)e^7x3%oH zlHC@v+gx^=$?n~<+gNrR$!?gaPtwbsNk|yYY=-t_d?uV;|`g zoNXF)j$>OPB?(fw_4NDWB{#e#jR}ZwT$Aq0;*>%kCuXCtHkL zr6&9{@C||n{7RvzRLs9-tShcCc7=Tmuk#Bewa}Wx@l(X%;)i6t;VJ`nPoQYV%yQN3O z^Za0vZ4C1cDMg&mcMv!-QEWgS6PNNWg=*qW-XxAC4+_7Fm&J4v;Ohw!j4NRMp^4}s z_wypGpY-Ny!m5JNcpi3EwBr6C^TaXSk37rY5H#c`lF0u8YZhwq4R>9*DjpJNh`Y#V zqz?Br|1HelFT%RSQqtTwNctY;^4G`*uyXU3kZEkeEjCUTzA}!1+5H*#o2wh68=~u_ zYp*lwn(FGn{8g>}PW!3$lD1TPR2$N6)2@XX>wN7@ZKgJ$eMmb%+ePcpwt_io4XvK} zh53s4fO(ra1-mkKF&mjx%o65FW;!#GaWg}iUQBz&3}42m!$^!q^S$P}=CY<#b5s-3 zY}34|S*}^2nWf3nj8$~C)epI!Z%c+lkRJDT3sfT`4^*onT7yYPe371m`{irI}kW)LVYA%w0dbpf8^rPC5TuycLquLQ%PBrwS+96yHK|iV; zXvmSGYWs3IB1WUy&RmWW{iw>qd!RhEnwIMDz z4gIKg9~Yd8epI`Q3r;~l5Sy}%3rKZ5kIGkA74;o(ra; zAJzJ};5hW7+A)UU*r?i(TrhyqsCEz+^rIiucIJXU^rNc#xS$vPs4AHYdeD!mOkB{7 zepHpj1;?NtRkh%PqtTD5niztkqN)i7;99E^TY z)e+ir5c)w?$0JHepHpi1$&?$Rn6dn-O-P#pl!RMA5~>@!LH~>Rg(Ts`w4E^;RY7xhLO-g4c1uA&s_M%HJE9*|b?1T|&=025u`3sBkA75}!UgX`KdSA( z1@A>as&#U~cIZd7Hbc-ARSV7R#AsC8j0-x@k6AY6g30K|B0ziE(T_!_#szKY$0G1t z(29OktL1_g^rNhX3!2f7MF77E{ZNDszj8r&$cG|y_|XuAAs>hE4$%Dahz~{RaGeXv zBR*u);VKuDM|>zk2WV#)@#P|PDCdImkPk)ZaE1%YLp~It!*MPs5BZ?B!%;3M5BZqS zAucEn`B;PlTu>hJu?U5RAPo6(5x^|u5g&`NjSIqvFW02QS}rIL`B(&Ke|g9U7CNlp zg7T1$MRo(4~2?FzSI?A?W{;kTF7Jqt>bA@p9s-tiFXRgl*VLaPh5 z#siEkc*O&e_JS8XLTF6k(LMm5>^p4$NGe>D2-of}%&Q5ZZwu#70hm>|aw0%^_`Ci9 zS>Z41L6Vg452GP;IeZZw4^=OPucE%(@M-*9RQ|qs%^`^+ycZR@!o{FgT`jz>7l1Cj zX$BRJ%m8TxK8gp$I`y%0(bU2O*;bLbP)9uA$D1+Z}MoGt(# zguYCKYi#HcQqU~4F$3UyC=b`XZ-$=4avl!t9ttph&;AhrzlCzz13VpCY6JMR;L9ce zTMBM=hg_Nz{4fqeWd#=nfPQ=CprVnx&m*6Ygnya@P*V8fOh}nfm;>VKPT^ni$E<%3 zZxsRdh6}PFvQ6j%BywKpcc_^9p3rtHK+Dk4hXEQDT&@q$G_>piNOC;1x-P(u^;_@< zt2@0mdn7>4%db`kcx`)U#|x6dT3ogfX<;gqXAwCuXO@+o&N%uqN-?qE;NqnM0oz=04Kwrq(auV z@RPkER2o`*H$ZUylV}r53qBeH@Z`K-P|=yfIcQnO=3U47Et>ZY7@t}U{WKXMIlR3s zM1B>HU<2G2zQIH2!*CfAvLJlk4Uuu7%e4V&7CzYxB74p|ISzJjp{>0WI*mnsHhi-^ zz@+d2=(Oti@NwwEsy9Pln<3;ZT-p*s?}x8H3ZeetjS~O{hIii&k*7ihQvt4peq{l^ z3(t87U`^;c8g7@uXQ3~tUR zTJRLMZ?Dj1aMkKi8T4Is+wca|H+cTfSol_<^H3z!>Cp1A0DB6G(coVQ-RunTYQfib zfVaXcvjHZ~{|ejb?EH^WTwkyedY$U|f}_YOS8x@qM73}JWpGui!V5vIS_mCLL*hdV z)BuSE-(e^EF|@NQgc^jNMfMjLM9_YF6r5xLOraYDB7LEi(;(EnU^7;FTj+__5UN|a z3H7<>N16j1C^!$sqM8sY#;&0c9Zv`7TDTm0^7XT}s^{d>MLyS`$72-9|kioOc&o`y#vs)T&kC zohcCdHT-NRfc@dGv1HotGEk(pgr8^u&@XfaEJR&BRAPZ7Ux(J-2e37?Fb?4Df?v@b z&lUVM9pJNqLL97rDcIQ)U|`{H7z6L#90}2BQ0}2BQ0}2BQ0}2BQ0}2BQ0}2BQ0}2Cwi-ANV ztLiAKRrqPgw8{7j0a=Og>xS9z9X_`lV(W9P$^j|hE0p;2o{1H|`k%$tV|6N*$PIR< zrTQ`^X54wTu1*J{^2LepEyg<}p|nE0$OSSoEY;LH_}agr!q+8v@&nBO-^cI&eFI+r z{FuBC0p*{$jPSuHRqE)L^DI9w@VnIIL+EeR#c4UUiqjDURwp6obZzir51j>}udXdZFI^HsPhAUy&N?eXKV4H4 zz%v4%RHKD6dz^|V*J1v@2H*c5gE@Z@Swl9%Z2tpt3f2JLCVSyG0KX?+ky7x#@bAK! zQVxXyg#m>Dg#m>Dg#m>Dg#m>Dg#m>Dg#m?u{~QL$Wfj{={_Vh~`1U?U{>ooR`TK!= z$Pc8DoFT_yO<)sQ2m1h4lfwTTZk3uS3@8jJ3@8jJ z3@8jJ3@8jJ3@8jJ3@8jJ4E#GWfHQidJpJe7=|6Wj&i2i9bqMnG-zNX804IO^pCyT_S*d&fvRfJRB&BEq;wJITwg-!Ho z)m>V)K4J|$sDu6Ujo3yQtjn==5aSGNZA4-q(^b_tm4jouXgQ5a^E=xZR1Vp)vzKW2R~)2sS-&Y-2eZB`~|>I z5=(fEN-K2ZT z02N!k9r|0i&~5HSx0wUorpf3wv4d<}7kTr2f(i3!)Dh!r)R$kxqqlA&bmQuvOKPKA zuQ7REWptzfqilk_y+0m*HPh(mgjXBOd-eJ1=$ERYYn0#evl99_5#765peqXK3Ou@r z@}7Ua0oCf!pi}P2{P6lY2>T728Cf`fKE=zeb+=$H`Ow zIC<(HXD1#N8)w4Vcbt6gUMtVa_4Of7UB`MD&&hLtgFN>))F#iUj43RmQEPthB42GR zyEREzCD?#RHeOx;VCAX5L7w{Sws$8!pxU%=M!*+_X>? z6|uSfUcc4vOZHkVHml#_w7ESdvnyb6TU-uLzzbU9f62WjjWjKkqIEG@+|b4!xE%al7MD&liN#RD$0)#mboGLy&Y^Z4w6fX#1r2ONO_Fcx2J&scr0 zwhLK(Klnjijx+hZ4x2gPclbR4o73*~K=Odq?J&E%5U`n`_NL_5ZVWKxW=Cu9_nQN5 zr{C>Jc9?B$pWWki+w5+O-{A~c0$#hRiQ!Vst;3(0lx51zii$X)#XJsg09w;#^LgCv zfW_>FLfQR3x6SMh=s{%p`|DfuHsxkUtKxBc?Vf-s*$b7h0kKYVvdLs}+e|i7zy~5w zm6|#I7i*`Q78;`>E~nMwb^@z5f3nTyhZeMZOLUc0X^)aC2tvrlw3<$9tb zPN&~zvU$yJr^{u7IyilHi`|{EPjj43@vT* z`z;=z+!XM7%^trWIJbjH&Gx_dT2^Ap9TOGtnVcTG!{;+wtPZ&)y&hMx$(w9-`@kk0 zHmFP7wHI5j%xRlDD%vd8fFF#?2mc*loi>}x3INsj`M_LE0UJnM`RXH|&y@S{?Q;2{ zMKIfBGgwQ&ZS|Rw11>LEzQybbn894)E}viP+F{Ba85OZPtgd8-%i}P)-8QEUn0C4C z$xge?Y_gh?ZFX7YxVYv4(?SCkF(kVz$);q77b@ekL9L($9xrIHIFl^_pVKV?$M=N{ zC&rs{M?^&&zJSN+F?s#Te(1&lr`wZkvv_PCtJmTV*xgp>Epcb+)jO;=pQ9HPY{OGmS|^(pa#0bB-R|^Rd{(Q) z>$ln5PN&xj7V2@^p*LIXE_-KStnd8z3on~;yG08I-QET*XY$xxFamjcqB*p%BgDiW}|EGD?Ey1|@bthBp4aI*v!9A@Zh=H!4Z^1NmSh%}6fzzF6@ zwnJIGemnF_zY{8MaafbhX1BxZv%G#|m zY|FqZYe%)X15S(01ALmTZX4X`U3R$zy~%!`#Rb+~({M?8r*Iv&ylrlqs8u>#ZlA-6 zcNVZsmknxVg-3v7FFa%b=XMVg*1z_Zvvp0miMI-7ad|vWD-6JJ|Aw2a8(YZh3_x2s z>@FMH7?~%sBHZ+=M@4MO{$w-U3VO(S)Nx6Q2= zEf}=E#pIUYZn!mA;I0gudR&EBBHQW(n6QQnvlG8xCQhMtBi+#vFfutPj5egA*( z;H-!$3@8jJ3@8jJ3@8lzH!;wZ>8Gh`or+z8sj6Cp$!`OjXsA4?6}^Rkg~)j-nbXU)f|9J$)shW6 z0#jABO2ZD3Q&q7r!}gaoRE(X zRn_VXI}lS443_R8>v=*_N`# zDi)#GhM20VH37CMrmAWIlKMek1dKCg#m>Dg#m>Dg#m>Dg#m>Dg#m>Dg#m?ue`^L< zMy=`1EA*b1=|^%|_6(S@cpSLSHr)p%3e! zFpgduBa4l~Ku`8z3L_CDb}m9Qb_9hX2prp=hWa7&VuvAgX6Mn!ZU{};fi%>G!VFo# zd>Uv^VJ1Q!b~Hi{b|D29LT}beubC*cMM!2FB52qK2+i215NfjU(EzA%8$u%!5hQl0 z99hqZA&#w!(1Ud%G-Y!T`mjj|-Px81&Df?0)!D}K{9mlAf|>hjn5RDov-kkn0(17` z@Wuc8ND`dxkApA$e=il2Z=^X=eYwhUB9z>`WS>XJy#- zG(^u%uusttJ>kNRj$V@wudoZFa`L$p))fuO#{pPpG$bEDVXe`Se71x&-3sBc5w`8E z5N_~ilWv9ZPzBp28j_EGunnRi`S1jrNJI3%23wnk=qU+yX*8vL0)nj}mpcw4fK)v2)}HFz=}=Kt`6hrg2Uq!awg-y$-EoFgB>ZvS<}3cLOL{I6+nrJ@Q0 z3IhrQ3IhrQ3IhrQ3IhrQ3IhrQ3IhrQ6&VnjhU(kP0yVXasIGxdoPmi~NBK-beDa`+O ztKirEJ|)-4QSv4Ej+`Rr;k^F=@(Zj2Y^zvx#jh}+FrYA?FrYA?FrYA?FrYA?FrYA? zFrYA?F!29B129?FYkrT{GMu_5{+wTv8tBHwp{tdD{!fqV3_1}b4Dzr4aq_SKG4ikf zY2;u3(=m9J)o2+tS3^fkYJ*{oR;6M(kqP8Q@&$Q?6i7dkZsa6cOs0}Yh@bpS29plb zK(U{+j)zaflc%))yt?2U0WRXW~q; z)Og&u)41NaTzbj4#5m8GW6U-_C_ZEyZ48L_7$=GsjQ1OR8y^$iF*Y{}Vv*4>Pp;5FVSj5NjxYlS(+Z=^?s9>QL7MNkX@;~z{gh%-Hd|SQ+UzcyhZ{>CT=f)5} zh`VY`GM<$#a=&w5NoR!Lj9a7~d@}zb_XBsA=oH3FSzIPJLA;yuai_V~TvN`cR0 z`}scHKCayGHdl>%S7;)7xJ7&oZWT8`G;^HsEp9qLR(O%q7``>UX4qyZ5xzIwT55BJzP&Nfj5fXC0 zYvBJg+5XJw_jNU>)SVhNsAtgh8$7IAV!OnC?$q?etf{Hl-f@WmcWT?v9>Xr z+rUp*S=!m1?X2d`?rd4Q%ioZ;IBrRI{yWmQb$9w3(q{WD-6?-V+T^+=-SJ+I-vAoPR^wblcV( z|FX2bo$a>nPXCJfw4e3Aa-1aX^+uGS~*W3Cxq|LW&&GIixTig9PI+*{4wE1?) zP5-jArJd<^A8Y$BOPku+lW*C1(%+G`+>&ndH>Cfx)Ykv1w9VDde!JeS{)Y6Q)^bl} z($Y1RzIb6fG8|wooIcd7FFx8BU`^rdF7RyArEq>GJghV=+$^b7+8%`;c7khH3x691 zk*=Z*jZ`XiM&UDqAW|ECMgaJrXpIi8)hwEy4d5(1Ylg_r!#8I^%Kb&}IUtu-;Tw>r z#u`5NASB5QKi3l!-B)yD6od{HZSY zwdIB9`$Fi4@ayRSiN)dCkV~U*ejH>yqsC9w+-2yzxQ`6pkeQ~P(Ss$g4xK~D|lukMA=?&8HQ00!+^(h4HChF`&7%3itixC27Nc7BGfGQ0RFHen7*k`%VlWNO{O#XD3ia0ohm8<TMRB7ZF^f=V+t ziV7_NOLi1O+p6>Td^H&0yS#nSnpz?JStf*1ckGx3uyoI-^&q8o`#Vrgb^9IPRD)bj zZ4W0y=$GwhpiwpZcNJonX}WzoSdZqJ{3|oz+STGck3s0U?XP3W%C;|u#$g5(t_4e0 zkKFeS*e4TL^bWM2`jh-WfDoqNjt$d6d)MOiKnQcLcmXuACO`i=G^3{OzN-?X9KU@D zWTx4$BiIWEi)5b9FG~c-$bYjwT>CCRgjLy|zaOkl9m+p|ZEMRv0!cKB^Y>w? z-^ss-%zN|qrU5@|^LL?rKAXPMi5suFV4p#_43z4_f_xQ_dS;Sr~I`*tNPl$ zlTD$V#^P0Y?dkj#Z9)5}eIF-*Kv}p1O08a#w+WeeEAP9z;ac^)pTV-!dv_edapH~Q zLbT5>i?@#l*j1bdDb@bG8#Mtw%qz!Aznpg!v;MWr_yJO$TU|zqlbldj8S=aLrk?5zLLbS-i6cu)D;TuKl^4QX1{R&c z!6Rw=MJK@A;@MCYO{3x+&^Ogvir;|3Gug#UaCUfK-j9BWJes#-BIG%|s1yXWV)4#6 zh+J5F5)E1?&YuD`GUdHE0Yat42ha-IY~O}*8}qh-VQLeKU$jDIjSJocInB@=hoJ7- zQN>%)_>SalftJ<|Dn2$8La*j+LG9J@Uk^ZNblz&{;i@Uc+khpe-oBqa5IH#SH8iki z^ELvJ%+Bp^Hi0}3@B0#%*Y+$%eVR@CK1qZmyNiplfX?E*P-;!H;=BQnS&PEQ?t{?p z+qbD9NlEdWpk2Kv@8ud0`DpQWFe3Ho;{Dh-_43wW9d;D&7%AVD4m%(eC_a=9xpaGK zdltZ5#Ur2)>KF1}9u1+nA19N?Rl1KLCR}_JvRBRd5Q?L!n}g#`|I6*b?Q_vimZ@+o zly?0BS*VMPPk@c8o;jFBUQ@BfphHz}9vFXJ^Y%$a%qV) zPs))Vld`3WQa~ClJt*BT^_IFw_epjsNop=7N_C_-NszSSZ{qjjm*OYl`{FxdnRrTk zLo62eiuvN};#%=V@i}p!I7gf%P7@yy$BSNZq&QUUFZK{qM3-n0TZv7?24XFdhz3z@ z{MmTZ__^^z<7MM{<2mD-#zV%iahGwcaf9(?;|k+a<9y?6;|$|uW4dvyag1@eagec( zv8%DYG1=JG*uvPzSl3v?Xf*2J7ZQIEz7jqat_tr8<-%#i?0HLSQNoXfnh1Nn-;VvOTs3vfNhW~~CmcPM&#J|VC&6n^e z_``f5znkC2zs9fOSMtyB3-~Ab$N4FI20xB>^CS4dd|$pB-+_1VCcY)#n6Jmz;|_2I+zxItw~l*>d!Ad&&E$_|@>8;S0mZhAV~(hEl^x!x2M~VUHotu+i{};RVC9hFrr_ zhM9(`hDnB0gU9fYVThrhp}V1@!D%oX?lIhLsBefjNCv$@rT@%({f+&e{gVBJeV=`YEn`oyZ?MJeUN)b7on6bm$UX-j(VWB1f^UI7!j5OX>_~Pf ze5tbso5H$S3)_lq0-w&T#S+%Qs&zl>Zt6bQeW<&vJFh#ZdsBBv7uN04ZPjhiy{ucI zTdJF{o2{Fno2*OMjn$3O4c86Q_0e_Jwbv!<+Ui>98tLllYUqqQo%VO_58AJ^pK7ma z-_@3DPiv2A_iOiQw`(_PU)8SCF4Hd3KCOL1J6)TpouKt;AJ#sg9iZ*0?WAp|wQ5^y zn`-aUCTOc^Ijx5Ih544b!FI0EifL10mvSti~+>teSTWk_}xhsSgL{`J?l&KS0-5f%1 zM_vM2)q5f@aiF1oWEI>))Hfq9rUCpAd9eYcJQ;Zbcww?4FMz#hx@{c^ay&`8+ZQSYj4Mp28lG8+nq2$Oe(w0IDgGU;wVIk30e9ran>r2Qug?{{soh zEdL#mH#RL^eX@PQAoL~{HF;J+Fbr4c9LNEk67sg*OlV#$-wY%(Ys)u6an)a! zufH22KQ3R3hO)Q(W$4>4L>?TI0mt6-6nC)dBfOh7Qvdd^8r0hKAa=z>Yn2n}>*)icd)=DpHAXu_9Ew`1Wilx~I0n6agsV9a7hmu~C~ zP*%FZ3v%z5u0wdY^c5(z`lZsBJrFup`Vum+xpWm8yRmd75UDv+x*S@Jxw~{3Hu2Wd zXU9V1?$RY7r{PK$=^=7V=>jZ7V(DDGwzl*sRQqh{6VPupk&>T#0!%DHW7pIu`209z44j%hTu1$rIwd86;2$h#y0h3}5m%N7-sV=z$rl|R}No1*R$q5l)T*)z@PW^4k zQ3x@YN{*Nz@?r@-i!%pH4%UHdvr6`(*(@t5h61X;DJir<=$VpGO@KBf`=CZlUdbLT z{J@f(qd`2kBp+B}W|eFMk~PI8TUtQqiIUe*AgyFQw%@K2TmWD!C99kOvrCpg0uW#F zOd}BZretA%2$h!1s}1@hB~N0<<4T^G4520GenE3S?pG^m7b?yVq z%zf^H8sONu5-@M(^tsc}-+3+^g7(8_zun=El5s_6tkz;yBztow75tuh#{Ly!j5Y zG~&${hQqa~$1j0tXnGv|ybZv$qi3+;4jkQ%7Ww_r1<FaY2QtyMNLB0CS3O z4g^RpzJeXLf3ds_w551)SCCs&RE9RuuxMu=2&ELg)(=X3s%SBRl&g!La09e1{I(8U zTT%EaGzT-U@PZ4H{8m_iiQd>eP7%V6qf-(!2p>pt0a;=frNxCKyZOcGD#-egqiHF5Jhlr zYgKSV>sGhAOWJ_8ww2mNE17Dowbt6!pSAvMYsHFf-|xB4^UTaMGfAFju122MzuTg$X+L6p7!u> zsME=R_#n}ZJoG+^W6eX`p)bn29%RY(K6n?^*@F-K1wvH?AGn9|(s=)e5Qlp8{ZCO% zRNVLJB7C{-d%qE1XW#cKWpL?zHz7-^-`xB6E}#?dy{Z>qif=rD4qo+#d+sg9*EjF} zBU+B?^1Yv-3RI1EOrh#j9k)Gi!B^#Nd(gO48~1z+o~njDKi`TheY$6|9$&BQc@A8Z zyZ3wx4MDYR&po8V=kB?iR3mrK9i%pCy7B5T)$_`hQp{$nB-ScOONsKWlH{b_r#YD)E}s$W&5vM7JAJfOTq z*{`fpE>s**Oer44p7AHPpW5!XU55F(3%k+3vrejSP&Z=^exWtfs<8YL^XPyj-(ohu zhq>^8xy*c`>3=bwz06c+T44MfbJDAYkM3jXA7oVcw`iLWI|p+YoI1y7%yK&Oym1@O z9_&WtyS+uNrLBv$ZJ8ySlZ&=_=4dXS+l8}4i`G1IG;c0N%ip#U(MnkLmbO+0`nv1=J-*SB;9yVN+TcL3zoaJ^_P2>E-I?#@ z)7UUe8Z27=w)N?x;o;M0nmG+FTK=}ibkcCMG}O;3Dre9!XMQx=0?r}AnA#!2vz;WE zg~~J-D?)*`@{oV)puewmv@sa040Lp&7QM@zuH~*gCpOmd@|`(MQriWA8loDWBAUHZ zJC%l{T&#rf54vT>5(?3b_oR`AlQkNJ!swqdjcBw&xoLP%T|yel>C=ddW_UA=G`uVg zU7O;X8PnjR>CacRrICh*rJ;XAan_7!aM4y?3Vk9EoM{v;(F4bm?{T9;QiJ>yM^6ig~IT*Y-*?A4Fc-D@~GXp`L5h(&J8W`)Qh&0g9n)qgDKI3Uw*K>4e^VPxO@?fa8 z-yiY~1cH5WohTTHYGg*{P8U}|^|~3NdGfRP0;IGtn*E-XSGAhO@k++YvpDLK6c{(ta?Qw$MVfW!u}NWlNBBtHkKM zq+29L=Os-;{j>@#NLrW#B#op7s4a8m65Np{L+22LAf2Cq8(**6NY`hG=4AcxqHUz(GezU) zIi%auMsvaCjA`&TL4#8k0V9<>E*fd@4BWhYqNKSqL=$Ekq_HzZb2D4I=rlf-!5|(` zZM^JBDt=fOHQGyj4=RaRUy@(i9fnlS!cw4GdlXNbm)Bt6^7 z*H>blM#rCvwv&(V49vNaq-Q%h^GavVsFsZ@Ks0NA4`*lA-xqGb4AIlDiNt^#2+$mo zl_k~aM~Jp;`y~>y#Z2|G?H5an?&60t7o}SY7eAaCo4FKRv}M~zrDe;>o9YoM(cPHy za6`UfY0*8rWgn6lotN|=qNgEgmE1z0+_O|(b*X2^_Pvb`u%NeZ-C3S8=}RA47ag>bZ+3%iH&|!N9#-{9ZxPl(M3A^N@}Wf zqR~pnX<)yOmQszC8_H^Mn6c6qY8&>2{EmLy_w8?`6*|X2DA3<86bXkKT^LOT$eAYl4A_G;mxA)g)?V| zi&i+kAgy$~xsWFtM2tITNGBStaQyW2(!rRTn^%oTCsrw{*DFLT9G{m~I*=s4Ix;?Y zhVn$C6^`4}O2?Ta%-Y6nGo%xZwrt#rXtRz9k$cW0k6WZgcX8_%<7SD`-89NsG;W$H z&u9#6?z3#%D2*#O)G8b|AbJ|38>GiKDfk#qKe`d3EgRQK$rdf&vLW3#&8ugvdGu@C z2ymPx*b<_1Bf!FOHKM0cXv}cA#f@tNFe;U+yx(j{4A_*3j0`&KA0|tTlu`A9WyVEM0rj!2^L#~jWdqK z0}>BrUjj){=jMb|l1Y|tyY&{DZ?TMBoQlFN>~Zml5Cu)WIEs>z;&O3Gu(~6raI3CS zcrg3o3x8#*L|npgQ@-%1uUjw!<4HbDBB67h!a43Z63n^y!cV0nNs$WXUwkTGq$Ckn zv0J@C;lUh?Pvu}r65+^jT*fdDo2e|GgjA^bn2QM{NwP=rQ;}dk#*;jqDr3>J%zVal zmn)ak42(%KKS`2gCB=2@(Kr-sG#TS4lG8|{aD&24^D&Mhxgg0DRCa7K@deqPDiKdY zwse;(+GwMRB{DxHg|OAi7hV6J!c99%97U>Zc@iinTi9gcv-QuEiHKXUhgu44G_gcn zsVEX#3MGQQrs;*43uDG_8pmlDR@eoSR7FWeg83LnqTG=xW6{Ioaj9VColoV-WRe^V z5|cBARd|6UIb*3wup%#zBx__c3Dq&J&QDjzG_Xm|7Z&RIL_SSbl<0K@g0@_$@L56}PxIV(LO;{^^Sny$~QyD%gSI6ZvzhL|iGPf;}gm>*uTMqf{i( z3oW=rJVb(Nzd({IUx_4CcADr=|z%-p>A^H zf?pe7k`yfk9up}@8loi6Cl{VpV8p3VQR=5J3dU2;6pemeG?C|0C6cK2B$T=sNwOR< zf=_5E)?UTUwL-p9*db6PC?u6+tw3=`$~43!@mLQj+%-{(lm$tkpn_Bj1yTMunFMnS zaaZIfk~J}svNUBX2~|vGsfdxJOeFiIIr&m70VUtT>vl>YBQ^838Deuc#Lq z-|FpZ#mhxPB8rd2iJ)nDu>&JqOe2tFD{fg8BM}#6T9USNg?y#xiLvIIP+#_Jg}X3H zkt&Tu3aa6PXtq)eT9OkXl9e$Msi~Y3BS{{#q)sJ2N^&Gs6(^PjlgpR$VkA;B29jHH z1(H-2mDaVBJJuYbj#G4CbYYs90*Sb@qZG;6N~WMH#s)5LB2rB4u8qe!e+4k$a=MPjn!iLspWc0t>qZ=L7ZhT!ddkfaTdJ{XU$*2S@Kne&kTo} z8#u{bsaNRs>H2j`wC~^?b)D9rc|kLxajM_PDdvspV^jxKm#cD>A1fb>`&^{FNU<~i zGw!z>qgtUbW-U1NEQ8C@fTh>I4o4vDXbXgWWxHr~scFHfCmH5t@>P^s>K_WU`oo#7 z%niO!A7YpH_&UOwQF%MFmpeVw1Tmea${D}GN#Ohw!d@vQ}8+F-ETJn=tuH^jWVAQ~uYbPxPO5>BD zKPVR_bb|iuB<;RsL)DIRXCGts?pBNwVAdx2bl=%_b=}ub4l*T7zexiJ6aZ?(f zlNyUmOQ2LNzP9^AM&=B#wR&Hn4?AWL#w0G_$22i#%JYD3_+y~2J$edaihNx zZ3N`3+==06+T>X)cY39f=en}#2!eR1iqs{JWKxnN^##&W&&Dn(4)=IP>sv_OaTMfP zvW8*gY$_V2=d8TSEiH8##U+tvm0fi@$eI3}Fq<6=l-6*|aL%mdE-%*Lh@GH^SDltV zAJnOnAGfT$ipH5)G!CC}Q0j6*6S6SN6)l3IHfVU6E_v3<9kg>WJGnE5Rv2vl zR_?$yLfYg=9gEje$g|*~3YQ#LLL1!Cb`<1DofaJ>lpUv@^T|avq2`&NQM%+v9m|n2 zQjZ?bW9t;Cc`Qw)O^(#DOevWhJMiK*2Hz#~h7U7@r7YZYDmXPGBmyKKJ(In_p4}XqQd9%XE zyceSmivD}x@LyQpuY^pBBF57)cImHmPPe9t~>`C(<9*nCM!pO#P1!7Md8W~{#)IChc~ zfvA;G{%J-miJlIpogTDYovCcK|y&2`V(5|0`1(SR<@NGwVLYRe9j0>BfjIQC0WTsZ6Q#Xm?5JcgvtBXLND?8}?%lUAYx2env-%K@syj z=GOaWR74N0$K+y^!c83-_6NQ+uCal8!+z|r(Yqwz-bip~1zxVkgt)Bt=K!h zVL$EXe<}4U;!4A&X}HSFE5?-kgt1{iji#pI>XKIj@m%3KFdbK!dBs>DDlKv@_;T_Z z&lL^`Uj|p&u!cDiS^<0%z9g>b=cAehH-;~XEBy8NycX_1&H znFb%&H__e^@o~uElXn2#98_H(IS_2s(OGE>L|p71jr{$zS0N|mIO4+nv_T=a+>8Nt2TT5b+L@4@I!9c% zpSC09r|u;8VUltFB<(}UOFc?lI7yoiX{FBHF_b?^yAHBb7l>)Aff3JsWQ@t2j`w3J zgUW6DDXyX~I6#7zFz(F3A}HGgitivDZcHBk#^*pSLF-)EbbOo^Qz!=@epVos(AtuS zN7En{u9rb4LzfiIF{tUd9QLZ&H9>e$t*WDCpcqH4I{cpK{FKi%M_aI;*5@TuSr)1c zgSI5UD)ny_4%IU%(+>T+I)^rbd(h9-46AQeuTkTMSpBW~4t=)nPrALvkB#>kHyMvH zEVtZ*m-e>dU4U+_P4jEhIhNIShb@xw^O5Z%>jT_J5srQo3j1|%Qou}XsX@7S_Nf@> z$WIemNJ=E|oQebc&iHazWrNkiFNakYSYbi?%P621tgyKKWw7#89@vMaW@42gui9bw zMFSd#%ZY4ZxjBt&CGpAwt5fB&0u5YE`Q%@fu0go0A;B})4OSSHd>O1fVAU+JQoJN1 zS9F$3q}P-ya$4n@$lqnKLj8)Hh+FeL#mxdM#m6#Op>s}H767X?Uk)p(E37y31+>Y^ zm3ZgN;nsC2=7ZH7cKqiJxZxE=U6q#~m~f(ZWI>H^Vs=MEoLDL(Z#(fCkp~2satKIJ z@RsGup?X(FIk0n*EOTc%&dzV6|ur3m1CuRMS5A>Sj$Xk z3Cj=cqnYV6ibdOLqN$q$inWhsqLK;RsCV+ems{`D!zJi6id~gXv9Vp5cqjs_Fh1mK zP)5ItIdK9jkJD`Wd3qg_2YbK?;sC3(I;Lb+r0=wLE4SXkDZxmRy3wH~#z{`s09Faw zL+u%hVSFQyVOf&4n_1U@6)-+m%cM5~PvSBHv6?6qSjp+Iur{A1?i;9ps{~dm8M(q9 zbmBIPWv=3Jft4J4M?0zsY6VtU+2pHThUrXZdq1$&`exra($MhXFre6u&jJ5p01a?ehw;Y<2h=(lHaxjnO%W+iQ z3}%GNPla+Q+mnU>Sg(uTkjpvTV>?#)eOVMUB;|1IafIfG=%8z zSx$EXf0o4V1gzke!DUM!qj{2RjJP|2T2I6#O)|zGC}HA(Gqg2Kn&h`NEUk;R!DCh7 zV7qdI0)GCvs$o^8@{h{9lp9PRn;tZ6G0ii+D&ODVz7OvMF0s91yVX{Q69q5ebv~!% zeakm3U6zHa=T*?h;80_;SYdihBMU&hLv4xVe z462#D?VVZZ6mVyN`0S1cdn+QFRl%tC@&AV$t~2@~(`xQmZA&~@z z*mZ@sM$~VgCV**G6!x94oahz=hyMB~_&B5f?aPmX5B9$Wzw}+pB=boS9Lj~|@u=W3 zB=bqCXAz&XCG$y@AD7@Sy=$ptKB@8(L-EEBFTJ`^8@`6&Nb}9f^B;30{MyOgVox!`9NOLdM4jvY3)6^TyRv1 zcGOs>mB=T#p5ysokv45UxF9Clk72BlE+06eIHT>I1{!JBj~8yTQ9h?g=95%EB0gB` zJBs``qx}ZvV-oqK%1?~XNs{>_=@0BqRy05JB=bqmPduNw>GQ$!7w%|&PCP0;u>k{l zU8bo&7zjoE+jn7>ERj!A{fPJ+FPTr0yhH;t%%NC*W*=`P^TBR!v|V7zE|E`ixng`U zeBLCLPpbUHLdvoPEO&BCpvyB%3&7v^s(tEoM>CQONxs)_JzqQ5-zw| zqV@5dmAj<4h)+kJRko{Gaw)|1Lr#Qrd$(YhizM?A)dq7$jOT*|FNw99DnHKXxb9rZ zd{X5n#wSPMGwXy!oFDjG;gX)L=(smqG9Ph%68U6F=98QstmQ@RvR5*nyv7H=CQyr{KN%drW@Q662qYj~Pesio6zY#ovYZ;FlS+c=3`E3d@X5qUZ!o=gJSC%o^4X;#OLEb=wV#x)3nm(v8zi_Q)pYPDkWV&|F78F}s1daDpZ{%*RN=8w2p}Vl~bx zjk~-ve}ZN1PydkzdDjD2{p1c_wH!A~nwfRsICcJ!IxtAa>H?rZSUBrm3$j z`ea(%rQf_*=r$eZT$#@nF=eI~Bc=(3Y+~+7ocsxzMaU-R-4iEh>L8z(FEh;-WD|4u z?B-90X3ZsF)Y+}y!H)n!I`vpuX zIfuZ~K$v?~t*I|C5O;+=ubVUo;cJT)aOEebhQ7 zBo^LtSu{bbvFvJLdiKSg#rYZvbs|LbOwgQ1Vy^;s4(|T*eA<+hn=^sfIbjCz?7a$Y zk?`p`Cujzff+Y4b04rD=iD$wnwP0~n`4i;dEvL%kh&>bJ+byXsL6sBLN^d-B5sDqSg1&0Pz`4bxXDPy|BIdo5`(<0_O0987~oDY8fgfcB+z7J5OMa)&$zRS`f zc5@X*8{l%~4A&p7!pKQSKCz3Pm?_*xPTX>b9!ycVXLs`VU6fYpEbE2)#?nolbBE5~ zH=0iB9C6{kk@Qlh4MWyQ_6^HVT_DccHw0qIwhC2_!$!Qe45pJTN9^1;0OAzgW$dvQ zzPqF|y{uh0_k~lFB=xXSlFWS}kg(TU;@>l?j=k@am`MJXc=PYBERTi}=TeV$Pq|&H=tG-v=syz!Z8pGI(mecjNJ563(n`lVNG;`J-h6xO4QR|=_#67 z-thTSA45Wlr!rTKROik!chM|nrdNy-^HR8rrY@|5mUbpGkpUb&j^oUOQCl=P66gu! z@7o|-f#{`dwh~deZ@rKo8S4RXM4|grxK6VvozyvE?FK~$cXY-$>(LoFg=Awf7v6bU zEMd@Q@ODx=%W0u}I&UD;q>?KxUqhSHtsyR>`E;&8Zt5^AeClw8N~2$j3b^iCn%G}J z_a+z{8tco@{`gnT9ld^E7>AU4{e1(D)*#(P{F$OObwm5t!x(mr1gr=)eka9|)Xzy=3} zS$5;u#I3}npuin8$rP~yrl6=!MG+eUq@XyNS46(K@oLl<4B{EO@?fZzoqEI5ThkRw z^-H0>QfpP0@YXKjkY)m0E18(&*KQQnxU>xlKgprF?w zaS0Ij61Vjs<%OvzV%<{;ie;%NV%<|Rh2nEr-BSt%6MUU$rPN762^AMBlx2xMe|ew> zU4MzM-`5%#2!^WpL%=DLE|fsc9e;BsQs+MtUE7r;%xs7T`)3}uiJ^zI z&Ujil5mTqqI@toK)GKR!AHf_WzZ~s?Ju}|7QP#{g?Ki*q^sQ zX}`~YtNj}LrS`4%Hv0zqYI}j*X+Oh$qTOiw!uG$mcX8JLpzS-h$82}oZn9lv8?*J= zw%8hM<+eQAGMmG8yiI5QhxJ42Z>+Cbe_-8beb{=Z^()pZti#qW>jl<2Yl$`6y3~4# z)oxW;{*IFYzq0(y@?Fc*mIo|*EZ12sw}dV2mS#(}XzMm_9Q7)-+{$$@Fd0qo%#4ubFn3 zMom4Y&8B+1UXW|bFr98X&ZISd2H%CZjXyVj-}s#IA>$p!8;#?}A!ERJzOmL=Y|Jt) zG0r#Ij7q~NhCdqKH2l=?g5fE{{f6C!YYmqfLI%HKqhXEVT!Y)N*f7sv*8dB4Bfh79 zUH`Ivzy5LkH}p5_cj+(I2lXxRgs9Y?qhFz4pg%#c*L|-0v+f<;A>9vk6S_xqcj>;W zyHYoz>(*`7)$7W1xw;J9X}V)|8tq|tP5fH>s`f?gv)XTJZ`a;{mlX%Ko!axXYqdpM zul6kM$y%#cfwh%CXnv{riRO8%%-pBBRdbEzQq5LPn`WbCjiylJ(k#-<)tJ=(RDZ1g z9lS1nq@GlNOMMT#FLtUgQunES>PB^iI$yn9?NA@D)~WuX`cU;7)oZFBsP?HIR^6%k zis}lS2kBN_s9L8gRpqG8HcsAY*C>=4ZTllX`Ut>AKo9UCfR(`MJg^X04)6g&%mmZ~ z43l@7Gzz1J4=_@I8{mD!G7wk{@CN`rfzx=PBQTE#S_0Vs?;x6nzyg4G0n`NM@*ye$ z^8wyMh?2lEfVTk@1ai1&cU(pwg9n!qF!JCM0xAG7xZ`31a{%4|xQM`+0B-_}5m>~7 zQ39C&QwSL$;NZb9f#U#vfsi2r9)MQ?1_|i+XafYY0A52#n7|5vp8$jioCNSPz*YiY z9`qA93*h?*2@*I1;01s_0#1N^0KEhZ0FwYc1abkM2IwY`2k^5+ zBtViU&_Q4cz~cbz1V{}C_z932JZ6}@qm38#V+d%a08)uZ09pu;}vs56CgF%2~b6VB)l_LoHRuD#CqQb@1CU36)SwF>mjI~&fgA#)1_ZJRkgz)evIvk)v;%kv zkWRD#cnFZNTL9byNDTD3JmJuKY*#wY5 zfYjhZfU^mZuqoP70;CfJmJlGF*a&bI0h0WBfHMh@POJr3On}sYz#;;q26X^u5Fj<6 zkc9+D4JrW^5Fj-m;2=PfF9kTA0O`akfYS(&8W1>@07*U{;1mKRYy$HMkb-0boJ@d( zoeOXh0a6ezz&rvZc`xKUmzOV*oJawrEKYzq1V{_q04ES2{h*NJ36L5PIF10R!3uz5 z36SKM0USesbbfL00GRQC zKOlq|AM_IpFyjMZGr)`wbmHK{75Wk?IDp8V77;}v;nd&}0A_qh@{|rUKBN;AjTs+Og9iba z@gX%Jz>E*60YziRha^uS%=nN_+zY^r4@v$W0A_qhC-wp`<3nn2Cjc`(qy_|-@gX(1 z9e^1hQiGcTnDHSsAi#_dsliPE%=nOeZvp59tH}W_(Buwg52WLux>P86T4Tg#gU>kWNqtGd?8wjR4H}kWMrLFyljN zK!6z^QUe0a_>dZ`1z^U9gk1-~j1TEVH2^a{B<$73$=jImAq6S7n$A`fXwFsGU$yVW zx&2l4V{mf+aogoMyYH}mjMMu!TDMr8R)ytN%U;W3^WV)sFn`_bH)ol(rikf2)1dKl zjn9&1Rx*#xZe1XhY0BwTwu5XTJo zJ2|9W#3HbQbAb3=VUM~hmMf(kR!JA7QLbzkHEVqAXbAji!%9kgfj^xBkPzQ1 z@F)L&De(pV3Gt))NzVIH;tS;^fBjkGW4lWzFS+PTi7%9wyz-^QXXUjt zv3pi4*gdP_ffKr7I-%J1e4)JL!6zZUU9WzsSxy&T=JyEXZ)?& zEef~Vp|owXEwz4TeaU*W)o=A$)t1*RcU$_g2XC{#V!zYgYhP(M8}=Hu7##X{^n3MN z%s(?CWG2LLQHQ9}?7;nJdxgGo4dv#mzj=($Gy;_In9nD_N7WF&oz1U;kqH*B= z_^94d?Nx12Ih5}x_bRt29g24pd(E|qY5p1BQC*Jm;55cr2JQ6s_T|9k1^zBHnG)Sg z>Rox&SIPUD(a-RpX&k+1UWW%wze>*6>C$JdymIPXfqsVkXD|0S>0w`Z8Hv*OuDtRt z8YRtE{%m;6(FNK#qLWbmEAOQKO#(e#i$ITCif*k$`gc-)H(U9UzCbT>_09o3^?&Ko zqyFwBH%m$R$L(O`Z63d}LiwjztEBWf`h;s|uDp{REz_l^{2y)l4bszRFTuo@pX$H< zDCjBwM=QT7iRt6^MBKY6zUq|nPp5XI)PE{^%72ACdeL$krC)v&^jUg`VwFHYWBYe! zQ~!kvXhj#alK!3}(9h6+q5bjn;>(mN|M^EjPxa@ON>8`bBrN<<`ktepr}W)2=%GKN z{)^HlS7izMLvF3;f5r4!hIgdP57&+0x~l~Fjqk3Nl)ft$D_igsO_bmG?zKljpS5y) zca3y<^#7iO{%?GD^-<7M`dEOJQ2(s_cmm9w(Ei4EuRaR;EQ~BN1$zDT;|Dz6mqYKa zL0y&z(PwFHFxR+WUwln4sTAOKsi>y-VaSSl2xzeI*y7ZKPT7;EBFB)!9{n4Uqy7XDLYZMsn&2~LCMw?!`X@oA; zh_}}6mE-@Wg%JtKJ87tkb7KkFAOE-FDCo16kMGU^{T!OOpBjJtm@9{FbHPi&qTa#b z2Eo};g7|yJI09P0i7y}{z?Kr9LP`RWLNfwtkzAHi5+v*+AWPH)XCO!}12%zXAn=IZ zy<}NhJTpOZp%=|ekX&fGbZYuCh#!GxS)yf?83>XKO&!hj1n%TQQ_nI3L2{v~E17{H zq0pECUIv1!S*CidtHz=yhDsvI;~fSmZ4cz^m=;mo3Fc;aw#{{I>B{QrMp z`;l$Z_AT2zwy)cE+Agy7*?hJ}TZJv(wp^nB|Jl}4t;b-M;Zw{1Sl+@7gWt0}V|mbW z8*UohW*M+_ST&vjPUi~fbe7Hp4uW!|_*H`IR>NE8V^>g$F-4WeK zy5H)ibT8??t$P&fBwy3*(2eSP68!(Q+RwCq(!QSWtx!2&-?$oHH$U#G-ma`)PGUG zr+!`ivUpdKMz`Xoc0K5#qy!;jsFns$# zc=^G7=;6=4j{xT6=K+`mU`~D~@qjt`9S86NLYR}^=>P`+n3JED2h7P&%>(A-r{e*0 z@^b?00}XTXo5us@&6%Uw`-vWS#5W<}NP6K!l zfI0bjdBB|fmhgZ%`7P%GbMiX_;C|3BC%-cR?gd~@e)D<2oc!kUfI0as1Gp2>n3JCa z;C2A!w9A;6sc zNTinoFeg8fB84y~KT?B>0aj54NI}K`n3ErgbOeAo`H@H|ggN<<6bAs9lOM@91i+m9 zNTmG$%*l^LN+Hb2k3`x7z?}R@q+I~a$&W-zfI0b*NC_|}KN2Yc=Hy2rZ3kdZek3>o z%*l`BOMp4~k$hVKn3ErgbPE7;@*^n{U`~D{-wOellOKt6699AaBavPJSfPWdO{{k3>pGU7NQ!3yFeg6}_96i06v8|CJ^Yyi zfI0b*NKXM^PJSfPlL45M9|>+A0CVyq!BGfv@*`nW2y^lyVV?-Vocu^|Cjc-fKa%e; z0L;mcq<9RZsNfqW0v_Of{2uY!6A1qA}Y;@+H7*4@r>#Y!4mXdiZc305d)$(oO(od`P720L=K16bYP8G$c3z z%=nPt+5njGA<4G@Fyli~B*2UhNpTARGd`pS7XmQjLn5URW_(Db=L0a~Ln1vNB8Bl` zBBcOkdq||~0hsL}k!}QFwueMYAY!3;0EdaAUB*oPL%=VCcO97be zAt{yvFxx}&r4VL&NTe$PnC&5v5@5E6L`s0!9ujFb0JA+L(p&&$dq|`d!fX#o(F?$A z4@r>#vppm@HvqFeBvJy*_K+Gl0bqN$h6$ScFB3$Hko%eOA(5U9z>E)xbO``6J|sm7 zVaA7~NFmJlkgy3b<3mzh1i*|B$%+6oJ|xnG0L=K1$r=I~Z+k-~N0JA-iFN?-(52X0%r#OSJn5X!M!Zu}j$#RLsZPuA4jpc?Th9BwQ z*FUSfTDMVmrskmLW}GQksGm{iD!;3|L0Jj{;q#axozFD8{j>dy%wjh|Rl$7Fq`k)I z%)>%CT{Wc;RuUgeBUz~k8N z<6j1CsKj+^ob$7LIY)uJd=nOMkT^E@xGItO)+NV^yd}iTQ|hj`LkN;<7v;c1>It>0 z?uxmvOLF%Y3WyzngjF`}jWL-Y9V?P~woq3RUjS!yg*!UM+j>k;Su+Rex|$FROMtYU3YOCbMgTJR0;N1dG(R@fIXKhdZS0IK468dR{5Gp zuY-%#hnfMFV)+% zlHXs!NhERmt^B~_wC&BtCG`?cK?ya2H{282zj5V0?Z!vj`n*#akyswNDgtQVvwz+_e=K%BFZ-;;oqGht5|0z5tq0Xh@C%vkq! zTr^Y5q_;q@N*GDF?Wf1yw3j77Y!Hi^jmK7)jsWRE4{oUz4>9bgrz5~rtVn=32*xYB zw0Gz+>H;e`JSB|NkgKSMO7FkP4!~7#`T`yuD=Hv-rscL~2IT~q#Rpj zJv&%o!kIAs2dn7ZReE=viWL>mAmmEAih>oc-W4}NkJb8xqEN9{VSnEGy!BFR5l;HQ zXxVNlvlz@T;g-EBv&Hmd)Agnr(=ot-QOr2WTegERgKHbHs&{ zbTBB5)MbcTo{j=MQ@IQDnkouP@u zg_Crkh?Sd9d6s*|V+{B=WG1`QNu7T~W|EE@$xj_Of;+iOttUzQ<&`~3TsYY&q;8=1 zN=kxl{`x?hzp*nE9PH?94D|ZTMq2&;Hb4KC2rD}b7jC3r_r&H;(&;2Q8W%@gI7vs9 z0)-MaacbaqKj*+s-{@`%Yt3$tcE<>*!7nwXYVPOou94DVZBWOS9djBNA7 z+y(BFzO;zhO~(0?Thbx+au1MBZcdAsudoZ#A?7b`pS&O~V!p!8Pm7qZu=CO(=5KtT zq@!fAQUmt$*MF`XPZDm z2T>_A^*G|fNjl{wx8|{=0>jVuFm%jKPT57oWwME}Am`>AOKDnJCkA|&;!ucV@IpEG$8@*#Jkge^!m&ncW76RJVln`Zow9nTx^Z;DUSeHKi6rBCt%;&UeH zatrx+=aMd*q&FW~%afOPnvQcK9Fm`Rfw*uoTS#5pTYV71 zXk%dsw2W_ju!wV%h9`9d`Uds}}% zu~ebZ`q8mOAX-{AUpM#kIm+G` zKPnwX((t^R)>f@+Ds#lKq!?m$^vlxflXY_!%u#NQu`27ugL%YDH7zd|Ma+!-v~+v# zN&2~S<|wZ$V6Bh1(0>`?)hph@(yrD^C>VE(%W47;)C()Pbi@S2e2=l~0_IAogf3g+iK^ zZVS%S&z(PCIiAJpdxJ037wGHYzfKa@I{)iJ#}d=Rs#`uzrJ>`x5XcF$BScgJg91$F4|naBDg+b;dIdwxGi*``5&;hJGObP`nfKbAj0Ih$-mh6)Kd)X zxk_cNQOJQ{R?yGKvq~@l@lZl{zqH??pPRE-x$Rh1b>+bx^xM2dIZ)LW|D#o0Vevtm zh4`H0;)764(ZHo$X8l|bQZy!~$Q3o7(lSGOLd8&vil>Pe$|)v2&9Jsz#M)JStoXmp zVnM_QO(y~_PJC^XT;$o>r5lX8xfv%ZN8@TDI@;zEFr_MgG){a?qtwFSYas^liVNqS zbdqxW{J3&+9F3{U%1S9Y_uD)MJ>y>VpWx1BN@P=LOq*bTq7xs{@6mEchh8b>I!l+< zsZiS)%4U}7@YWtoFE@w%TL=Ap81IOoT2x61flK<3v1OoKYE|hK*~(oC?dh6#HTP*c z@%|s}%xi2f+IHBgY!>S;th=qP)`g}b;}PRC#-MR2UX#0D9Z)Y*{jcgt)u7=+!?*Az zo=g9U{we*CewALW`ySr4E7j>OzqQ|~dj z+p2{?E9EJM#|1|}cp!>gmb3FG=pqxA3Dc}?GmCt9upI{V;`R|I=u#6o#BR9t<$Jj8 zfr*TCi1{tw3A)}$cFNqwgsDsMu#CDxuaJiZiQP2u+Y;H}(<+ZoE?OphI>d)oh|m0K z_~cK*_g;pMWK%}*5(B?{PZuu9?R~%i>;L=`I9>XSy<(Lt1%{uOpmUxuL9v6MNQjmzVa=FjB~E7!42j zdrKzB=O!&KZuF^n0vB?=NtcV$C2%1xoV2*WW6SO3xSTmb?l^O~dO->MVOi$5tFz2G^L)zo{3yAU?##ey@^Pq%Ad#)1TAsEBubLD zg(W75#>~4)Pei96l9P-hrYQ(hOum}x{XM=>Y|Zwxtql$o`%8L)VZrT`6&C#&-ABio z#6+|!keG5Dap6R?E07@|#=y-f=R~wCkdrz`TsT2p0kelPQb)lt9N<%rb_Wtuk0UOe zpzc6^>d~RKRr!eG48?nD`;E5UwoL0!t(}&CS#Gs>;QilXy32HiF~iVcn5VDM{Zdj1d<|><{&!W{)!%=PRfj zXBL}WN@IP6DN|`s_!r=pp1|O$Kp!>-gDd=f{!quLYIJDrXl;MFzsX-;oY7W3*4j|o z=5Ymk8``qR+{~o})T2xM8&^i+C;u&v1XhKQNZSwzRrC zyfqwzBvv=(=B}^k&&%@luJ7z-1X{HPyC17o9oLg7^! z6;_gURMO%cCyDOdOj89FnP}i{&;f6V6+J%quZMiCovS*71GIa-0u|0nk&ol37UFcS zFqM#OmV?1SXRsIBi{aMJKnNZNDabce`_?)GtsTYXBaO~sZ%41MtE{4>Y@oI{nANws zxvHXXjb5N+d;uTTa`G8egb|gn%j^2>3c; zdfuPYS{w>&Ezc@lotfL;w7zreCVy*XXWm#ir>-Vk+tFLpzOiDsu5w*VRRPb0sW)+L zIn#75m5-FK-Pc0J>xJ0}xt*(8dItT&fxcKen=*$>i;9MZ2YdTm&YY^X{hcjavvZ4E zR&OlzmesEIHhAm0Gb+}XxhkCn<&2l3hIn1D*px?UP@`$VUO1NmT5SIcUq>hqOCXq? zxqfYv+m|sgyr!hNtZT%xF5Hqg7OD(nb&sqaYH+UG)Y`nJCAYZQTTl!}Jo`naJR{GZ zIy0VqZ?F^F?ya3M_8Hk5hKl_41H%n#yq>Z_fAMHmV{TX1+L4XHfvmdr%IxxzOqZ*2 zV-}icB^Yt+_0K7q&|}t9`-irjjzaYK`uh_!tz@vhvS!5N%L+FSj1^~8b!V1u8eKgy zxYb#{&edPt+q$v6drfm@YfD*E!P-FUEZo`}>zhYAHkD=-uO94Oo7vj8G1%DS>~Cuf zXFL1qR`++0Hn$g7tZiMr!AsnNXny_uOKMCWG+$s0K%qt) zO~j+eVX7f1Q)gKnL~|coQP=MCx3~8MIF%(~^aZ-(8cKIgusW}{x3j6t>8;K4X7#pa zW{sAuuUk_#Sl?IN(^lM@y|$-ob>;9tRRPD+A+YQ_&9qKPjq7Gs_*+6~w`h>VfdSST zEbqV}oc_4qs_IO>asSjD-Le*_h!K4j1K37H+GGcRksSg zO&QPB@Up^4cJuW0Yq;L}3=}i$gJJ7RsOG%V;)be{viADkKyFR-+VbYks^N@^zM+ln zC9bUA-j>`h|AzLylJ#A!!GfXzf4ifBamkyHhREBR&Ovl7EBt}JFl+GbA^3=(A8x}J zGtMQQp+FdYK%b+MVh)~cI*;mt>$3+s1HSNzPJe4Rx@zj4TEffyJ^t>2P*9LSlu_sU zlF^z$f6j0?T)rW@uPI#Zs_DssBS_Es-VK@V-u|4t=1^{Kac@-<1kE@*Dh1BQ?<=&% zO>0d#q)JOs9q>l-qgza!QK+ZtknzoLXjWvDU!{NHF_MxJx;fA$qoedaW zz%-TxTPTfCAQ*NOag4T|ILA~*1#>BU%Ch2y6?N-pEKQ)j-<_RZ*5KSUxTem#E->UD zEAI*S=46a`T87ISx2~@BhAON3Hnj(83c$`$CaRU{!M5Q*$8u(6mNyK9RyaI)%N(U; z%X72vv@vy<9o+$VNc#I!xCm@BDTByj_XUT9aR4u-j^e@E-0qx#HLck>*-h?Hup~It zx4tiX?dq|NvEj<~9qTGGb1};5AMuLp_So@UpS)C&qx5kjpA{|e@(i@E3i;c@gQ50V zpH|uGZ5e9I3o2#0-M>;mT`|J8fyFH!F(NR<};{_MK zHh*6yMm(90#$lK`Xi|r&^*Ao=vzU7K4*Gjmz{VkHRR@+D{Gpz>@zqvm(fa0wp0eVi z&i1Zhzq_HVd~mqFv$bNdYio0VsH|>eI4gJ4h^MEfrl7$`yc`vbm+f`Mg;al{Hk4d{ z%^eM!Dpu!ta@q%a21^IC-JO}$?ctHy=C;<3!P0?X{aEv0S1`M((mx#El3MMtBGd=S zrL}Fv8Z@Au6h$aqKis;ZXEfmThoKrxxxU&p)xDWb!_7kt7*{n9db^>yzUE+aaZ>@$ z%fWbc*)UE*5onkb^0lL*>sc}E545pC$kxF?Yj+PuS}{4*j^+(D40wCW8;3XfhZ;w` zgQ2>%;JVR`C4Jq2O#x?vYfX)FtR|~`LrpG$<64-NYL z9UZHNeb{^t$BhNb-D4f=M?1Smoqd}sd+I|T_xk>NUu{d!-R0ccH<(-J$sP{$WL6A~ zVL%mxy$@sPF$q>}7SlOGf!ch1fe!R6J*+esl!=CX8{5}4RaH4_)>n8dH*KtKEGg;q z_N*?>^^LWx?(nt`Wt29Ixa9-9qapQqOGV3Ot%9pCD{D*3K87WsExY zv5_EJAvY4l2r%_Xu*KieTpkQJ7Yzs7GRoGEdaJtX{e87Xu9{I_)wB}h!k;(crv%v4sWf_bZ*+v*fiv;&&U{b`#e>pYe$a8iLBGNK8B}C=Yki=2c24`j;{m-iZuEMN2S7ATF zw$SpVrOk4Z`A4Re`VHm4Ppg}4@$F@#Y=tq2F3S5j-_i)!O@QY9(ojx7*ii5w9Nk=dUQCFhLb|y&5sxp zkK78T@4ts0{p`>q``qi_g+g6vUT^=%{zv;e z_FtMq_V3&G+n=?6%l@GKZu=hl*X-BYue4ukAGY_~1NIjCd6w7h<@R&!xptTRZ2KAZ zQ|wq9H#u#8vb|^fwe1(SSBy{E9$SDpHrqDZ*4b8@_S#mMeAa(j zKQ(<~{jK#))6cCpS+6r4v9_8vS>2`v|T7HCA0l#CKZ;Y6(Fm+l=O+%&^ zO$*JH##-EuAjlVN~hFAWqrX17DrazmOnwObJEo)5I;QfLZjDImbV|>Z@gQvmRJ^8PPQCxdD`-*<$lXumRn5^ zm`<>4vDBNdxBSh#*mQ}x&AQc`Z=5inW}a)YShVKD=8w()V}95CEAy232}^~GvhJ{CTMwCkXnoH5xb>UXd(6*U-#0&G`VD$m!@f$BRZon&tRmNiDIYzH>x$#Wn>Bf1+V~r-G+VBNlJp9P;N5eaY zUm9LB{Mhh)!+yiFIN$N0;cndd_%*||hAR!18io!1hJc~PaGs&jP-7^^ONhA!m*H%~ z8HQ5~a|||v-k{L`L;qL(pY-qPf35$8{uTW}{de`>#`%y(^!MrS#QTUh>UZh4>o3v| z=zI0;`px={`gQu%`VzdAn5AE#KTGe>pQJxdZ`Nyc|I~eo`z7DUyNPe=4(WcP`+@F& z?m6A#x^L?4(cPxINp~IIP`pexqT8zL(zWW&*EQ+Z>MC@rba^_rE(3$gQ*|fm>^g%^ zsr_90H|>Yo-{WP)*R`)|f294M_B-0AwU27=*WRVQRr?j~)p%v`V(p-|Purp0qHWgJ zYuDf|%K~k-HWM!{F3_H=Jzi_kYBm4T9M*iS`5&B?`ITl0uP^>k^SoxC<_XP1nr~=s z*L+=bz2+*-<(g5v#MrHA(_Elguc_5kYKk=Z8joff-ef#YGgotr#;8%LkElOU|5^P9 z^>5T~sDF<48DCUS;)RXJ)DNils&`{FtXmQJZ5@X9uSb51=BeBkdB=@bIvV*+8-9Ev z@|!vMaU$||Indt7uSXEJB=T#_2h^F7w>II&!;!ZvK;Mb{su1YR$eaB@C6PB5fbP7= zFB^dNMt-Tm*Y?O8*@*H`dx8b1z2ewqb>M)Q^k&h`Z{!Io`*7s(^YB#|d7NH0eJ1iPD*Ne?$Ab7#6?u$O|19z-rT$Xn zQ5C|DL>}?rYeD2;s@8pxhfhS<-I0eXK;Vgd6Vm&BM*SJ zG8nlZ)vCNbazCn7^_9qd^~g&}RIQ&!zR`)Vosn;#V9KvX?pcGcUq$Y| z1Ya*i?nbq$Ly^5(fP9g?$06pT$X%sC*F^3dLfA=>JI?}oBXS3-Rrze>4(zEbPKn%} z5A?UlZ9Vup9J%dO#Qbq&59&o7j_iTHsLCR{sbD3MTd81YMQ%mG)QcmxRO0KI$jzuv z&tG7u6GyucBb;QzKtN z!PL2t8&NRzb&(rSM%ezy4OFm)BiBP;RF25?%kgz~a#Q3w=!@+>Zm$3GLA3BP-I&>!tRS)4s}z$JoRs?!Mv$|Q-y@4{)M8bFPZu$ zYC`qxsV~gSOw9pZW-Dqi{|A8DdmFHud50;LRqI+?w@+62tPhQ^)^&kdF9kwl=|CKZz4Ta_SEYnzuTvNL5+FO)D&8P zdePKtRKEY2`Z=mceah4;RA)C&{rEzBy*PES96!D@^%Awe8>YTbvb|&KyAZhQZ&S}V z0{v-f5-xh`tEVP>`0=T!XTe(a+0;|S?E6#Hj#RfyJ&Kx8ePiljRI>V>sRxl=GxAB(V>s zc2H>-OkIx4gVcXGbfgMj?;iRa{n&Tt15|c2uJnrL;HIWGw0BEsC?!_`_N=mcOH6rJ<#tCJx=L; z<wjJ2Xxi zyy&%m68VPLj!+Z5_qBhxk%?cw_V-KiA z-#HOQ_u6mfnjiW0aL;{rsK6=-(6GHC97D~Er9cO_pP*Q zE2~-t5^NK|KnRdR4K1{Qfj~k+hzsB(U_d^FQDJ zoDXp<&3kWdnVCB?_ujd8ILFIRs3pre$A>?j$A0~2p!oNkW7jj|?AN2A;`=$r&i|AY zUC%jw^?4L{@=L#^=6>?>ePj5=|9Mv#ejR%YDG2L--n|>LWc$Y-uLa+2_r0(Q?6AG~ z^dIofW_#?eIrw$jQ-AT`%jciDjKt=~moF#sh=05Xl4a|9W(SRc&$n+@0iC(y;UnZPOLqJR5@IX*!v-+g_QLZQ63M%6*fbl^8PEP6GGSZt^c&DU*1D^I zN#ecr>1_uA(trPNYD@RSe<3CC*aM%O2I%R>-lQ@1i@%&rMelh0)h;}2eEUDdoSMfT zU5JN2e*SUl-?@L;OpR!`{aGk#Tj#HCjp5fpZ#?YBug9O+S%6=czHkLPZN2l4-vz5| zzkB?jI)1(R+#L=)?0N7iYVOzzJ5iYBPrL4|DgH0#c<{U81WWfnNzzK3uZb2fla)O2D@E)1QX%>!Qc6A?dl2S?z*@-u%wKB^Th!O{lM6|Gz!e zi28p1+2%9x$sa$v?>PK&d`2eOs(yCK0f6rL^gX@gFF<&XKDqew&zkY>wb%cP+6xYR z{T&RTf?2OW4iXgDU;jx3ewDrUE^+$TJ4n-7p4ssh>51(-UV(twezxN|7aqQF<(G9O zJ2}Uj_YtkDcH99zSerll{Yij+{P&kcH{8_Ef4vW&m7hOgcOTBp+WCkGXzrKWPy-tA zABeX#cI#6k?ph4Wx2d@ge)bn)>NUT8h5GR17nf6~U;5$#*}a-O7oBY$_p%C+=$*5?Dx)JYu#6KrC+>E!{XL29{na{qT`F7N`Ul- zZbGN68z1~!aBo4i=Pt*?AMRWW=GadD*L%dA%73k+VZZCk*J|7!a^QjA}9JMRtF(7{AWA^D2_8;Kq;U0(yJn6L0}+3pZZRmtM;qvh#05`M>Ra z^#DMnJ6}Gl^ij0z&l5nn?zS)LfpFVx*ZE3+&XwN!aWA0QtvBMKO}OQ~Q%gVL4%xLH zg>j2_es~BTj_>?O4IVmnzI801V{ZNdnq>X!O`p+#-T$WZ`tghV$vxD+vv0hqqO6IV zyX(r9vQJUU4|V*Swd=B8{3_k`y(qrivg-m2U+c1~KElYcwqN!1Dm3Zyt2VXa*OOQM z3Z+=Cyz1_GcsK8=8)xCy$yeP_i(f@o{n%Uf7)rTS!Y{|J>tK>CH(q%j#){>vD<1E| zuh8YMlC*yB@+WKXYuV+$M9a9IA6@`$YWe05H=xzr55E6$6@Go^l9%_xuS+g@sTIG1 z7yqdYzrJzt4)m5=dhvD$3U~ZP*MZ@jyy45^@avQf@9xX`@GBCx(5|}#JhZRB5;}wn ztiJ-ffK%6B0)}&*4Nw|f$p(D3ZP%6q+^BnR>#4&ASmp)(mXz6cC?<&2a^arKqm98lrDAh_kN^46O zmU>G)rTdoJ-T!jG=l-kv8Taqp_q*?KU+ccqeU5t^v*FX+E$&LU>ORJOh`S8A2R|!$ zyX2*kCrTc|{QK6Dt4h9Ga(2lGX3;B3no3S7kxGs%nT^{B|5yA;@teheDt@eZOYuF$ zHx*xw%mil@4;F`tmmovI3B?PFzg|46*jcoz=!2ryik>Tar09X7JBzL_`hL;5MQe)s zi@sUZUQ|;QD4JJvSkXR3g|07M@4EitdfN3{*RNc+V|CyX*Lv5OE9yGcwHWha#dWmn zU{@*PD?i0t_(kU*oDVvG?z{yv;O{!mb`Cou&gITV%z8!V5zYgh#g6|vKE_P<1;-A@ zX2;JQKXLpBv)eNrF-OqR>8NuYj~VS8$9@ineW(3>`>UA6K4O2sey9C<`}Z+-ov`=W zSK8a`)pkGTt6#J4Z7(SNqVS!*>~3Yn9b!J=V49dJkpwJTS8Hu`2+u46H{2_z?h>fprdm9{^w(SPuYj832}nwJ-s& z46Mf`0G5GuUIJhlSZx3<1`f->It#!B&P~@N11l1F#$O--E9IKr_}IDlie+H+05~52 z%fPAtI0pdBz&bYpunerO1i&(|`T=|kpRo+Ab^z-Dlu^<16K|jjD5lykQwwj|LD1z%sBNoOr`Bu&MyQi8maz`mi`~9m~La1c1|Bo33LS zSe=PCECZ`A@rGq!^(Fw8fmH&q0yr!Ks{_EP09XdruO;5F46Gyu^cl;*IvcNP5l>~$UmV%XJqRqMKx>!OC+VEn4 zN+$Ve1i&(|k{HwhU>R6RKxzQ646Gy*1h5ROBnI>u%fL#Ur#CDED@jWQ0G5H3I9~;T zWnd+lI0XR9z)GTX5&)Kgl{imtSO!)S5PHKhulXjvoNaz)Au_ zZ%(H-Bp^J1(+D5|q0&wzfCOY7fNu~$0z$wF0!Su~1hAX{k`@nuWdsnj4+pT60FoAZ zvxESWmahZoB!HxafDQtP+4NaE0VFyEv=Kl8LO?44BsyOM&_V!-!65(^6F>q&Kr;a( zM+X6DB7nqzfJOpHKn?_el(LlfdE;aI16V`=$Iop3pf_~{kW3IzO8|)u6;ML} z3CR8skm`hh&{tLTf&`=#KqUbrAVmNw2p};i0Z>i=i2=Pig#eNkCxDX)AUU!EIEes~ z33_uP0mOMbfD;HH0in;1CxGOLfQ1B*7!VL3fCPjC;3oibwBz3Zd;~y17@!gWnb@%t zZxjL`EjvC3AQJ!q+3^toi2%sNjt>Bc1VAPjAP@kV*zq>r@B}~%7_fiWykWKnoM!;DJ&=hVkK+xqJrIK(PXJ)H2V$^e2LRX} z#(DM`Gd|$_jz{r^86R+d$8P~J;{$2g@h|{pe8Bk~zX!mK4>-@>FyjLOVE{8e#Q81w zj2R!2iTeRC<3nPw2>>%bBnH0(z>E)x!Os9N<3nOV05d)$26q8q#)mk+5dbqjBons- zV8(~U;1&SP_z<&i0>F$9$;9;lnDHT*xDfy|KEy==nDHTI(`U^1kbn@tj1M#j0oO9) zLt;PxGd?6O*8*V1hveug=ca36e8{x37tHn$5Ws8?$;1x;Fxx|7KyR4sApyA<0BlcO z3@!n{j1LLOMF5!bA(O1pt`wAptoT05d)$2Il}^#)qWkYye5)vtu0qW_(B{ zz6F389})uslE!Dp7yxE`NG1qi#)o8L2mmuaBnE>3nDHSoAb=Sk5`#Vf%=nNPbOT_< zhxi)-z>E*c1Od$W5KF@VnDHT*2m)Znhs1yYW_*a*1Tf=6a`a6AN#nx+W_*ajL2w?% zhjE@znC&5EpALZ89ugJ;nC&6Xp9+B49+I3T0GRC|F`zfh_K+A5khDEJ;6Yr=Y!8XS zG62l>5VHwjwui)kK1LoaNKdE$nDHSo zkO45`Lt-ETV8(|yPj8stL4Au%`>05d)$1_UtUL!3Vv05d)$69lA; z&yfI_@gbQw8~`&uBohQM<3r4*&zSKc0XZC;hw)*Yrx(ojkg#|FFxx}g z2?Ch$A(?OjV8(~UzzTpF9}*A(nDK$q*#2(-%=kbIwto(Q86Plv`W5?H?2s{hGVIVA)=!&z9a&I#J4F{=S#{!_ps>ZY$eS_CVR~ z*!#brY)x5DS$*02?%UnpbAKDV^7jY7;0WLds zk^km=*7>mW9_J~}1`x)UlzYud|&a2SOJ(Q-nZzp zqN|HmA!1;OGv;iyJBnT?+)%K(w72v$_y0;8OFt}IUJ@#4EjhWwTijLh{ld=*-za># zaBIPB1wV2>fLsT!mu@KirTaR^z9nCGcf0G{C%Q$qtK>f=H<#>RvbOje$a}c8=zAp} z7adXLbp6|PwDV@?mCo^q3Fj`E0XiDrnHRe8$~M$aNw9Knyb&F>x95S5 z3ndLwhuSF#R<5-h(93Ldtdn<2SV~NA@u9X8ty3LLvJ~xYJHncNb%e#0@x-~8ZLT%# zz_P_*eqc90C@i+kPBh9=koLDN?Qd(^-=T zzyFo?_m|TVg!?@0%YUZ*{jr%W+=m%YKFE0Te#Vpcrmg*56Ct^G%n$xye(<*W!Qagf z-ZDRU)BNCX<_B+>AG~gU@S6F-tL6uPH9z=^`N1niw%L}r=uW(Be)*F5!Hebxe>Ok( zllj35<_CW?KX~5!;5qYyXUz|uF+X_P{NO3`gD1@oo-jZ7gZaVZ<_C|NAMBV`k{+G* z?IUTDy*=&k-=+QiTXTim%nu$mKX}Oe;6d|)t>yEuT*N<>hH#-jJbjubLM3%4y$T zG40#$mwcCVz_d>L(Ph)Vy)>=q=TEA`H5tA5UdEG)GoE}m@6Skk{85>0t|iTh88yKplW60nS3{GpdZufyZSuQ5%W_j82k&J&!jkT29bo!k ze-k{*1n)OldarIS>{PeyFiYw}o_!3^-ll@~nk=YaA2PjcFu|phAICC2ZZv&dQs&`` zO*mH5Cv;7myWl16>jiZd`Wy{>FcwSM=isSlr7Qzs}wFHeHgr zySwT|8JCgAF>#e|;y&`XQx|3CTx|-u`fa)>vzDy{MQ8&wxp1vfYB5-3%p5-9n z0B(^M43j*y`fa*CGq3hg(pyZF6+?S`Z__QBIg-;S_>ulHc`x(ZsoQjOBBu#Cb$wiJZDkH}{%xC9+62o+A7P3ykc#)ZA;HM7BPXAE}Wq zmR+=pK&9{QLA8lnTHmItbmMI{r^u+@cmpNU%~_26UO|8?;vQ1ju-c>6+@Ho|DL0i%xKav&iWin!VS-gAD2X@OSWhJ-QR;~TW3*0+=Y|Z zd!uTR?xY5SVMuwzn!A2W87^4W{@kh-1-AO67^{}5Z+yBXKf3Y(kV8SU4CGL&Z@9WR z--1Y6QreAlYN$1LUrpD?=hrtG$rzw^(+l!QHQ)J?GVkV55-*}XXq9nw)FU}g=5XrB z!k_7 zj!Jgn_^BBUn$i8&dGr*LMLB+vBf&_s>KiuL;w51rdFl#NE6QjvC6$mAB&$g;NiEu! zn}vdm`Wo$An0Gsohym>NrI!xg-hDMG^}Ks5nbu!fNu+1Bpvwsh~?Edr}ZKSB#3eWFM{u1sMk-u5QC^$9m^LbcAJ= zh$mIRU{=9>DED~wclUZr^4@f?zc=2ToXw^P0^xrX`^A!5_K5v3o5o!uCX&s`Hsx#u zvHwJQWzuQwk=*O|s7(@5E*RL4HeK?aggrgRc~))%PUYdGV3-(2u1BoCWc>;G3ILS^ zGjBAgnDrog=A!LqCi$b}Mhlh-1|n=6=u*u^KXxTc z(sC^c`4K=1!%idkbI}#F+sD*cjw(ZeLm(qnl!2aBIQ|%e8axdXN(eu9H!XxeLF+ zc?$QkIDcQyX`E)Uz^;E4Md6SR_u5xe6z1pLkG`6sWE9o#)f9!3BNpTiO3Y>c z)Y#Ng&P+=hbp_MduHAAC{I585xj*H_s4PXL7{$GxM^P|TCX0Yp!J|&J>Z3f0!e}xU zC8DTfznY>X45Ue+elovSnG_+4B3i{Komm(K_tubl(IXXXoRpHh7?oKRNOEM7B$m(e z=m!+KQGAHH$j=sMl=b!8i-NY|O(elmEPS^tB(eW`vgf(i5!b63&Ask`WOKRAxi%N` zWcY{%zs@5T-ohc@SVAosi0IvN{a!EwjJF+2D*DB=F$fLq%W$NfJQq$D#eF~bR>5!> z^DufO6osXUM61$8bpDnbd+;JIaCaFrLjZ;vev8Q|muk1%7)=(%-IZIbrYLIumTM8A z6tCRUUf0o9Z6FB`>Y7IF{4Lj~#)oBp0|wQB^&n#)k4N%??0Zj3cJqj;-Ev)O7~~@i zm{ghln%XVbBT-<2>^aI6>qiFJ#ra#VL-xQaX(houGr1k894QXJipnL|-cyRtPq3bl zwN;Gg@as);IIDk?_}$HoU%$&3>-spLTJtbB_i&k`BAOs)YHh0T#f z2Xk^*KwVD?BjC|K1D?Q=tlwN^_Wt%3?SnN)PJB-z1y1dgq}8K?^_ zdOf02pQmipr(Z-{j9) zQcDVj1{;Y8wKO@@aS;uj6=mK6^-xi% z306K1qyk67q{z^Z%49!Gaz&MA*X`Ik%a66$iy|VH=T*7rwtd1KXWL@8Jy_aTGFWmF zPTRj&d|UBYaaHj?xT9{u^{VSG*O{(Gt^=KKIe+0?=WIbF|F0eA;a0Xy_9cZM7hY7j z94FBqLT13z3XZe=tMJIeE%v#Nj-q{wHkR5af4GPC_y^3H=0D4KIf-n4+;6?7ynE%+ zly_l z%0yot%cNLVl!Ai8EgDpRe4^8mSrP3^85D}*MR#EI5*V5FWMIgIk@D(Wa=;J?BQ^cX zrBzbF;oOzjen<$+`I#NbT*m}o9vM!d{3jcVX_uL5k@iobSf0w(6=Qt9M=V%EouPd^ zCS|#FU$SrD9Q!#rAZ|Y~g=lIY<}aA>8Ksjby`5IPvsN`F#_=hP9O@w6Y^NQ_oa#P!5Xpc8510$1I3af=?d<=y%3xI-<0VJX}2){&~ zr}X9wr8lD%EKVEu^f9Fc1|}uBlS^S;NeRq&MkTaOpQTxt$K+m#L|SP(2IbV9$99U5 z#FAqUCr#Qe^B7~|Woj6!1=|jZTF%Sp3xz2eYhk@dez+UFFBNxzLlyZ zvt5`L37I;1`=k$$$$EIBrl}$^@=@sIDcgl?#YRoZFrZ)(81P@yZ5TXG>|~f+da7e6 zg^@w6Obn^0hLfeo5!BAbfV=#G~RH-I%Wvhc>OltZZ zFqk|}+ANcFWvhc>Oz9G2!(j3_rAsg+#*{8WHVmmWUorm@^aiuKENpQOo^m;Fo#F;3> zm4i|!pXX8wrm&aKPIl$YY#3(42n_we6h>ubMU8P{ixoqYg$IU2yH||!mZx&4M8y4n zTrt-zHcdFFF-3zsmpCePeCyfrrkTJ3MFZ?8?eesI!xE zyDhE*tQMzb#kQN)M3D=W@<6sDW%3#%cSW|@cy3`jsW8uz{A58zwdYJqmpgzgke=H9 zV4de^kcRj2JTEH82>g6;zA#@h#R=sSoriOw(Ipp_6RF&5> zImk=AAZbCo5+z*>tD2&RLpm?ZyvpmMCWuO3f9J4&c=d2af3>79ZeH2s>lqZ*wDm3z zh%19*b+XbIXb+8cEDeR0_k~9ld8D$V(Ocb9>1|m(G}^bKcdRF}VrxGcmfld0eZ~ItIfdHU3^c)?ZoIAT6&b=cS3IL3vc` ztqq9*U&QYZ@m@ieKx0)4c|mj0>k~yaEGd#t4~k(~1+_KZ>kIo;udGWEujW%EuOjmP zpezPLsw&&jXFu=fHiF2j*VfHmaPZu<`yOTxVn*fiP-sX)dRe5q^3+jo*IIpG+ihcd zI=y29o{HFTC^pZN@%4gQB6~T+dSF2F)Wk*y!Wv}_n zL;_*K2VSTlnGchE2ZMfH4+YT2a5xx(YzHMp3kZ=FovnS<)$*Fa;$=1UiZ3)??`^9Z z3Pmexm(?y)s|FV-D;s-4172ylu(Z0Of1)806y$nE>s92X{6JGvO;vQMw|-f7OSCz* z%-g=SVe#sTSU3>yg_Vfn)xtp?bcO5&q=4WJXo4&VlB_5}J_NdIYC!fze0VK~#faAr zc6e1@l7vtI;x7k5dtOy!?hfn!)}6k#>cE2!&8k1j`vwQJQ1{{>%R!v3LYkvGBEgY4 z7MY_#^!RrR7B3}I_vs-dA|FVIw-6u|!Y3%q&&RmRCf<60*FvfgRMm(Y^aXjpqA7wJ zQHaEXD*GVbiY_Q(K#?^;Qw5(W4X+xnY!s?`y1QCCItHp*x^?g9pzKu|dMXE+8=?~v z9A3w#7}8%9<1jFRMveR^)7i4uu6Z>=Q%5uo6~9iPvx&NGKEzfY6}` z1S%MeXo0Y*fWSdjfo73?i(7{}#`^ju0;`u-Dg9zq_v)cmp|@(0w`2K0xM8$=aX{_W zJC^7}YVX9F=883)gDZNW_$T^1#9;GErLEVuDl*>UZ*L8cb&0LW2j4m@^fsxYPYI~J z;MJk5A*cQT^l*Up`oLv1tcC(A6o_B;L7|1cvPAy~5y2abD7se-gcKjI^M0Qeu?u`a z=4I|CPH~#2bHAObteuUTr*hjbMs%+>y4qW_?Wg*1vp$L(%r}nceQBzsGX6x1 z4$SjpqAX};R#F?D@D7irsSq)xK+u?MR1d2`O$r2Lzox4GfDn*^P@>S)pgOFPu7#nv z1Cs9dNiabnvQ?3)=$fjrk*@B*z>2oI zak(wLsIt3H9#uP~`f@+NvNAZfvc9J~qC`4F^$p$Sy`gHYZiQAg7LX-g(Ss46>WxS~ zpH~hv*i#>Pgjh}$BJPg}5s9?7DEYYC ztm}H#o^s%vBj%o!jp*Bc**$<;dGrCKyGF|MZVmd|AmDvboqYf;(wO>qK|AT}vFKRL zGaT#FhCE&U!R|?gtxVcV$(N1VL0OR$Uh+YoK!gH8L5nD1MI&1&h4oNS3Pl7oK7^5~ zU@YkH0mP-Ncs|fwQxnn~#fo92x29uJ(67}GX}UPJW^hrZ(6K5~(;Qtg77KRuR`#s$ zjWtX9X!YPgL~U=4D+Ka#`v-2zHv>21d9>X>kH@sC=;Id`gK+E zsu5n{BT#X&toxwrV6EY4$pJrc1Trpb&^jSqk>p?q!&R{hk`z!C?kCoDE7mSL@PH%c z_8OH5xqGg6} zT@FVe5aBSd`8ALi3P=+nA3>krr^CMrXquu$f_x3%5v>xIG_GkLX$p=s4UTD*gTCsX zzP75Ra(JM3C|K9t+r%&Ls+W4j#?j?beu?Uz7?2iE46R(GG%OQ_dseRMU%q-!3s(!H z%{8s%-YTu3*QaYDAJAp5m`gXH+ZRCrY>sPKL$Y@SynEf9ioR=lDjLxqF|$r}jZ z!;tC^`k~%LpQzXae%bHi?zFB8t*tq5&S7)MjnpMS#96Uz(=bRlg{F@C)X>zauXd-X z15%R80X~}$hy5X062*Yz3;N+Z3BHi5_;g($D(gPY7edEjbQGT-Laqzpa3H8ukF<_X zG^o9OO>KI#2VTG2QWI;`n$_Xzj(WW!P*XFps5$Ci6zcLWZCy1S9_^`$tzJ_VtQ}lD zArC0a``36oheykW>iWLbk#M7;RW+4&NfCI|@O-=xC^rbG&U=GCC~DOgia>v>;cx_k zDkz#92qK=?FM`Ut0xGMbHxhs#@IfUQ6jZw)K=sMoPp#|v*H+G+JA3ZhG9#Tyik;2d zHVx?m!{OLaWX0%E6ozqf=CW9a%gtPlw67MdAZ?+~*XM^~{T{tf?}huJ4fNrR+JHyv zO6d)r_a`YXW;Km!7=|w(_~3a65jhMYl0!lyLZ(rX_<%noz;zNssth+=3i#pk`C1k) zt_)Xso3yItF21t0bH&ou9j&hjcN< z!ha6wVgM2zR-iT@=8*jWoI+6yc|&2Dmjo3fl$Y%R=s_QM3+d>J*#{pscda9fl5W@g z)=VMQEgDS+=XnyJ#6`N6Iez5cVY*1P_8jM_#$=}}s;6izOu8Y0q+}CsNeTJ=QaBWe z@Nz_y{Cq$G?foK%9q_{x@oFd}VqOt}^NNWX^t9aNUs+YbM`Npmrd8!DmigAih8kOz z)h=m``pdgkv{r>yhP3KvQ+-AI@~$OS6W%3@hr=CitRCzdksH7Ltcq8gv?m1S8<;u*F^SDEpXt3KJTYf5?C}gEjpF; z7i>==%rPJY5aUAufTp!DAY3s$f@$s0K4AMv62aJ{039dJIIkcAA+-;a9l^NQLkOw$ zDqf*0<- zdhGKU@MZ6Yj|Y?VImE~Th&M&Fn3xTOSUw065Kf;Ofi8(KEvf#m}8U%!B8D*Ogu!%lp4G<*b)(V>R{*)Sk zZ3~;Igc{zTQUfpqqlP2NdoQ(ZXQmQ%VbBMoY!d=@RkHU1f`ol5qg)U|DwM@sLpB8T z;XUlAOjUz`le|VwQw^#8l*}3k!AMrBA+?>71p%DS&@t~}H)YBuWgt)u2;iC$0h{0% zs{6fEEKZgtWgt)uh~3Iw12fOYp`%aHw0hJh=M4T?0rVkki)FgyaPDLdI`DEck$+QS2dqp)APlJH*klAT$uuj>e37Q;5q~sW~j<{5nz^`tcb$I z%@f8ZflBXAX+^Ukpbzh!IZX|?y(P0rXXJxGHKfAV%w&z99n7TC#MCulo?*Ooh&fB+ zQzJlHGqv}-h=RyQR=Ri!2ct6W!@I{!gOCw5L7hH&Y6SGbq&0|fsb~fxmDpWa;6nzL zKAh4A&E~YCNgqrpOGML!yit}U+W&9je#Mpj0XO}3mC0q6(kDuT*>wx@%b((MBU|3B&QWKj zb1!6mzuhtJsCMj&yZ!IPo&L4<{R&?zysPkx!n(p)$ew<8!I=g11^Xj6-Op@i*%sLj zu)b;ix%F&oll36W-z~qeth2OO4&~lK)3W_Hf9(|;5k{1V*|;t>O~NrGfu}hVO&W|- z3__WVBf2g<%wswf#1SQG`A%jnS^OT1SeVKG;1RFXZhJem!~BpD1vPNH!4W};vOnH(mnWilk{-psyaN0|(Xx;H(_CC-&h z6fbH?tx=qrtzEp?0|!QG9&~25I!qX>^K{^n8AtBptd$tKf>6UNHexE2K>0&f6eCv{ z3LSxs*J21Ei+3J6#}uqYwalAD$s}=h6in(8wQR_281# z*a-ERsO8_;YRN`qD9{9o;lM+(7Srh}MloEtmPE-~i_ynsD0GTDPGmy>cf1yyY%}tO zasP-Uisi}7TFlp|;P@ISc6eSWtYLE}Q8L9cdo5p2qHtLh5>T?Jy*VkAEZhf*$&;kM zcv2|WWb1xr0O1uI51T~E6ib|ZGxCK|4AFpbzGPELK*=JOFrW!mevq{mWA_=6C*uJ> z$l4bZ3h9^B-1UrX7#Y(CV5BCmXJl)Z8G}fS*=wTnkDE}iE{)C`g_89I^VcMbsa;c| zUkO4!wWMz zl8HfmpFDc`NoFM&Dp^=xm?RhXNoFnCQ80;4P&msN&N!&Yx{{hkFUV{c=G~?tOkKe| zI#Ed$g9nr>!h)G}9w?0Sm`le|xUJb5X0rDr#dlyfoj|!SD~gfz3Lf}IwNPK~z??dPl4V3@uLZN}BucIg!@N3J-YZtSFg+d%Ww)M)1{&V`&q;V8@LIsWR4aYTU?oD;*M1*luXM)C?_Xu^g{z7#PX2J`=k{ayhvjxluVo(h zK6lsT)ZX@*^+m9{bIzf&orf$)49^8s`dBoi4=)fFEY*f6_O1qzGQ*Q9jaR*b4?DQH z6j1QDPYjRf{V3?tnH8j_3aXn~L2|Mn%l~FpkeDjymoqDfPZfj>@);1DPZ8UKNzY6Q zN)elTX=Vkbh|OI#vw~8@X1B-hxj^zMV&@bO07<4RzY&pORBG}G8)%_aq4@mJl)RHR!6=+q=5RH2SGU|s_%Bg-_3XY4)jTVR64->V=_>e=|%E)0j zWEEq`VM_DuRt{5+P+Sh-(ZNb5G+*_GJ~U&G5%%~hOp{=Sn zL~|}DlRgkwA=#epoXatdchD!j96E)+r*y{fPxXt==I?1a*bYtgi=v43v>dv%ElHp7 z9+m^`OfiKC!&$w7VvcfakC9)Aa#HjO=3I`EU&eBZ_vgNq7@m%)gWsUn{m?EHb!G5J zPgr*&mIULYdz#oe=Jip42cq}VXL54&hLwBP3(C5T2JyZ)cZ#3j{JBy!of=SXv@@aX z)>x-(y?yud>a=W1;!l%iI^k6Owe>1Lqq%)Cnm<`^g_< z?Vp~1h&H87I%5!nj5V%*C(yGuA1$RwSSIg#*3!hdK}|F96KPXEE-EOfer7F7IGiVZ z{EZ~(ruFmUOL3T$8rE=pCw#nO2IvY-+JBj#{Iug1wPW)fL)WlVEuV0K8?0%X5h0SM z6-`Om=sn`GlHf54n#t@0YXu1&W12dX*$E0t@E8TnOzM=xKtn+@l)8i;EZ5A+z+}hcAx4#w&brRca{W878JkXI;HS8 z#WwB*?ATvzZM8d`HI7|H_gjuATxM^}_QSo9_2*_T`7^l;ko~X1Wmbe#C)Qi8pS&=e z_acHDP9|0-4PL%St-1I22SXUy&9q15aOEf~2@w@A&<2g{5iNsULG8VdFGv0HTm>6) zERJr>gheqJD34Tl0rzUEs9SO@iX3q)^BP+w+25YLw9+!8qQshe|A39yIJt62m4*X= zxUw8nM+y&v{q~3wD38tNJSop?xp`{^CDHKBkB2N++#E(zd++aQ+c3_*T(0p=iUR_q zjYJpg?%jr+D=O+ZrzMyx|8P|nLZ^-Ui~_&l-ff9JEh;NRth1ri-n(s|R8MA9y?_3_ z+a~wAa;cp#Qd?a)wbuuX)J|7U7%DJQ8(leJD8O)oB(o?xUrrb@FjCuGIble^nB3*c zg;wJHd!I}N9atWoyq=zo94yk{j(?+MN%m_ePu|p<5V8$5jI`gO<9Ut`NHi`UG)kiA z=WFkMg!ba&BV=8UVvSsUxP;mql39E2lN6y5FY4jkiV_j}pM@k2=W5Go$u7=FFG(ng z##+2pIV(#FKFYWe&~*X#=vPyeh@xoUiM1-HgeYLtqZDTm$5@*iburnXg&gBT3@(Dd z_YpX3@uI9J=Ux;}U6>W@{Cgj1L{V%ET2D3zFIAoeBSFOYsJ$f<1D3_$-+Clq{3zMn zoXs6oo^kga71i+76a~xqTj;C22O)w(&4D__O_uqoM&*(aDPg3LFRc)yym zDEH9oUrkYTR_OA0QLuOU^blT|ararkIM|-B!_fMr*PhkXXVxA-<;`DB<>dX4x}3_-$gG?&Qd%*K zpOJ|{{t|IL_d3X5T9g+C`Ae8O=1~XvOV|m`1B3jf+PpAu1HXkr5aRYZAKd`$Zj^Uu ztUXkI8AXxCN+`cPHCBdB7I>63X}|L6VMbX26qQmAc`4G2qWo^_&$v0(5v$|ELc4XO zV7qlw!G^MJW$VfomVQ!td*R~Jfzo;I|GFP`pX*-aF2y;3AC)XAIjH!V;tPtKi)R=8 zx#+f{@uKRYeO-@D@w2Zh^<$lv{=@yy^n+fd{wwR{Tr8{QZZk4tEz^%BDJ%mh3VnRy z77>TH8z=>IJV*JGcnau_SgbKNUK1NyJcx@?=vFm$n<7OJB=BX1AJ~Ew+`Q|KQtY2~^$uK4R!+qviS zuRDc%WnQ>oAO)2t>OCz<``tS?7+Io3i^cG749<-zIv(TpGZ%E?R;(?=1(Zv=xE#E+1*1 z#bf$VXmkko1C2CFb=pvP97&T>!bDLL2=W$Hs$TFp9RP%oM4Q+uj6EwI# z-@0KylDKE)T{k;1FD3fTosd`EX}BkDNo)WegeehD+)932K7OFF zh2mE76IB;Zx@?ak(`{q4#wR-Ek zJj?Ns2$5rx9!sGHwjKupkJ*E|lepN*inlv% zy4v(UZK5(Z+81t)ja2BBeYjn6(yL1tVkJ>8mag;cGrXe&E*AXr#*KTUfvq@hn0K2c zHuwTtu}hYBy>Z;*w&DPy>!{=~Ot~v5={C42CvW{azFtgUr|HFnXVWqi!}WVKuPVna zos-_Xp@hKJIeXC7xRX@96${^ajSs4t7Fi4%Ef^n(o#C9vnGb^l8y&`LdQi?mdAA1v zOR(FHp4an}22JRTEl`F9p|GIdv z_^6`46#cNMvB>6nz_rSCwDYgdA32+x1&-f1h8)M>B>(01W_w}bro!REV+&p@_*ucX z3z`cKwY_KijqL*4a@*0?FRZ_}{?Hn>O4e!q>mOwS5P>b69hx5J zhIkb$wd3+YFl%==!X?6@ATq{jDWPNiELU{Im>PU>LdRlS9_WTG zc|xz54&A%{3i3O%kd97PV8UzO;s*kS8cl;>hz-Kk9qX@vcR3w`VT3XSxRlc&7?=F0 z1`6t)s!13r29mNG;5<%;U?3tx=$sxQv(p{ZBV=~EeR_n?94Z;_CUAzy##?3oobNo?|EX3(NZV$+QRGbm`1*a-WWK|#rrZeai3Gb?D4*jTlm zNsA_l?Veddlf*8bSwWM;cI|mV6y!K5*^ZeNG)Zh6x8GA@Q;Q~vO(*L2P#~$GNn+DF z^$ZG15&M#F�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 MM#-F7l(h}29)AObe%ze$} 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Χz)*jJ2 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ⅈb$m`d8`}|E5W6Dw+1S@(Gh&a$?u^|M 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

`^BZID4eD1aS69w!qmVr2_zG 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

@vV_E=$rbKqEyYX=lLi?@72$ zLG@C<(=6fI19R0(`nCo9o}iQ$_*F+qD)1|al2kBTeI#j{boEkRva?n#3HTj5$$JuT zty)RZ=73+xl-A9Fs}+%?Er6K|;YrDlHFOp<1R%M_8=0>7Ur6$O4DSSqH0 zN;Q-6F~G0nf;P?NKblX8-v?55#cZ$_Z{mLwo@||M!(ou>asljgsBB^1d zB1mfB-8!F(e5Y8w)UOF59A6+-FCDH3lJcEl_0nMi#5VW^LL_ywA&MX=pEFi39h{ex zuMw-44pIOW`IxYJ=|BNm@y%iNQonPER*qb(2+D8UN~FI4;T*Y0fN+L>0+csgC?F^J z%&>ZCUjdSC+XDEdMI_}j!|J7eX%R`cy$XCy&5)Gu2dkI%7NC{k0s;DNdx1zV0s8VW zVf9kKERDW~9*Q98whcti7a*y@uU;dm!7m0PDc>AcFZElGNXjRJ)l0vsK1j-EhSf{E z3Xqh~46B!(Cy=D;fO7?sRDHf8kXBCuWdf;K4V)v8*i}Fmfy7=7oGp-wj{<%xl~dN> zw<{%_A~qih_XuF~k=PFaHXn)o0Fq)pI!m`bM8Mu774HY^JyP*Lz}_RV?*;5V5>An} znvEnC*n1@Qa=_jrN!7>RBNbNy_8#eb7hvy^q;~`M9!aW*y+^+inDPZrBqyl@7BwY;HdnBpA-Xlo`_8v)kD`4-DiVFdIk5rrw;5~U2Zvt#SQgI$& z^HCbi0c<{!R1uqxBvr)bBjIKNHXlhUu=z;rnSjklDk@_0k-paeHXlhk6X7r)3pbsB zy+`s+0_;7KSCG@BCFx|q-XlpBvG+(gfxSnP3hX@+djeqZk&2aoy+r zk%|I)k5n89*n1@QFu>j;Nh<(*k0c!uR4=jjNYX)oy+kHU?Bxx_e<|9c3HXogsJph}JgcI0&q;EN3^O1^O0h^D+E(2^nlJs1_ z<|E+*HXrHR1+e)@MS;ynDheiRqEfyzUA+YJv80^{*n1>gd%)f!;o1TA9*Nxsu=hws zMeIFNQDE;;8ng!NJ(5&l?~#fv0eg@1Z3WnSq+)Zx-Xj%H0_;5!`*^_KBNY{~_ekHS zfW1eO9t+reB&opOBNdwf_8#dgu=hyCqX2u4^lc2-dnBm<@5xJ=18hE$G!58%B&opW zBNYWUAL*L}Y(A1S0oZ&bTmfM7k-h?(k5m-ce9)@qAYk)B`I^0e%?C+q_5(H_#ID(g zikOd7tl3Av-h;d~?*jH7B(2#4*n5z)W;bB(K}CbT2NezW9>lJBhi3L3R5aLo(6{Do zBK966t$7o$_aLdk-h-qyHAL(^NLsTMu=k*%BlaHjt$CG*y$4BaUIFYqNa~2a2T2{V z_n@M|-h;jddk-qsyvzXh9`vnw39$DdsR8e?q%|9e*nE(*<~hLTgNlyWe9+esn-7xK zJWDg150chA1K50!wB~8R=7Xd)>j9e&k~(7Zk)(>)e5B%&2#5JtxF-qNd!*=Uz}_R_ zRu?t;Q$eSKUlx=+Rx-8ZwBpx`zgyg=xDl)NO)F}Z`*Us?tJcS|kF(a^moi&2-^=vP z#DnVK%Aj@n4ZiokFr7#}k(!Y@optTLpX|qP*Cz|FDr}SZ3#-vxlt}W6b7uU@v6|Qq zV*MK}ZFE7wK{lj+|J(oddaHB(Cd%pQ6F=8;+tN~=2%J^QP4bW5;%i>o>#ehnU?A=U zl^%8vR0DN7f`LkPxBZhd(#;(14>f4l7^w8HyP(bW*6HWI2k*nvfjhE(U_#I6{?_Mt zCVhD4UT^W>qrvmnEv`?zT+{2VGml^(-P-@ef#~&CyM_(a;T#S{C+?Sj;$@s(Z=G=j z1L+;KPrRhl>#ep&Fc8mpIv#e1T3PqyBN?a@PXRxfb#0Dhpi(mClLMXJ;DLC;(d84* zuC!~dk7S^ZbzW-k_12e;WFVe&)H%iVn7aXICV9mB0z99nbBdpK1Ow@&f1S*3c?1KI z-0ka}Yo{K`Kzcg$N%>nG!9cu`Qg@(J8axp1c=4J;9o3p2!9dj0x~Is=M>fzWJ{Kdi zPdb8ucmnXr_Z54+b>a~W)Sg{C>`{WwwPr^$P=`-BMNVk&K)esjvxqwN==dWTh%!>Q zLWa-MKd+r~(o!C|QmAvT>Fc$Io&5~NgSI*Y>8rMe4y5;;>Rh|%Yqy3DL}quWGmyT5 zYv@3fkxza<)axyM9oNu-IQ#3Kv`061AZiE?$?BBa#z!&`Z&TD6NMG4CY}c4kX`K&g zdcCEu?;1Q1Pd)26t-i`@=s>)VQ@8l*YrTdJq$iSxy>6m1qObTGJP-+4XCQsu*U*95 zbJEs1M*8ZnVFMujaaw(CcmxC0{ZXc`5F0!Yr(2yFC5~Vq3R_*L5^p75OFYk)8NW!}m-s>Aw#1Ez8Hw?q z{XgPP{^M5;og(nSu6u?@Oh`R-r7fOjjS| zQ2_U<_-_I{3Giyw06z*~F;YkTD1bFS9r2?8 zRtzoY=KVoG3Sf;-gC7O3UZ=s20$6gid>GCAD1a3<9r2?8)^IK79{)i<3Sgbo@*#j9 z1+f08!H)u1^wi)-0j&O6J}9XE$d3Y8B(!`0;70*0>siii{g3=8fR#zhdjWnFz)GIw zJpexnVExhZa=?!QSjn@z8{kI)ENxoO{rZpmD1fz5%ew%66u^qG<)wfh1+d_5IrrN? z@}mHj9CgHx0$3=uoV)5D`B8u*RWm;dkct973Xr~S0Y3_mq^$ry3Xr4%KMIhftpPs@ zkfg2C)gSRFz>+G!lYqRWEdf6YkfZ`X3XpIDKMIh(EdW0Xkc!O#KMIhF+@k-;j{>Bk zz>fly2F(CJ3Xr6V_)&mV)Bt`IAQjcjj{>A3cmF>M9|b&A-W2eo07lJe0E!s=C;)xC*U-n00?@bnR=|$}(AVHc0Z3}_qX2~KzJ+Ff6o8}#KMEiXy1!1u zj{*?R5kCq*QiC4_aGH1LPX0%J6o91NUj_Uq07<*^kl-Uf3P4gf^P>PH?Y@zS9|a(3 zckb7JfkX={mrV0yr1DR{?$$AQe{weiR@T9|im< zKw>`v_)&mVTm|@1fK*(Ca6AgIa0>WIfP{Yl@RI{b3+{6p)YjQGoQl zkI1Q!zJeA4sdztdia`1*(p(@(1t$w6shXW6kfiqlCkmwEJwP*o^c9>Skfeg+1(H;7 zoIqL$nhK<%z}_RVR|57PiG3GvjG9SBfxSm6-U--yq~aZby+_I~1?)YN^mYL6@gM!@ zek)+}k)#WOVnrnBe8A=-6>kD;KGJs{VDpiRa{!x<^qmFRd?e{LfXzq3@wi)mXxzfh zBw+86yfXlMkA$BN*n4!63G6+RbShx)k=PRfdymd#y!az~kA#~PR3EVSNFE{w>^)ME zJ_qbQQhowp?~$a6*n24U-75imkK|D^dyn*0#NH!)1@<24E3o%SMfI`wNJW9YN6M?2 zy+@Lc1?)XiaU@{xk%|?7y+>jX1MEGLR4`TYNW~$5y+``?1Mr@_q^)Lm zVDFJUYG&_|zKYm;q_4odj|FT#k~9a{d{lS^HXliv0c<{!RABRwiV48xBYl&A%}0_dV)H@LZo2`S z50Z8}fQp!pRP2TqAF%fzZ@2w`y$4CV?E~yRNZJi!K49-bMGt20K}ARGJ&4_HC(Z0V z$kS~XVDCX+gS`i>4E7!*bsu{V${XxGXys=19<=KAHlx{l$cb+60QMe)bHv_*a0Yu1 z%6EH{X6^(^8KK33Y?Y5N&-s8W<(+$f#VDmvzgUyE% zvl}*jz~+Ob-ChA~KB(AjBVhAEID^dxNxN+zV)H@yZqEWXA0+Me3}Ev?MMrEt=A9(Qrdyn)L*n6bnBY?d} z!U^m>l1E_gk-n<{dyiCn7_j$9UxB?x3GxtN?~$Yr0QMdUC$RTOQh~ik!U^m>lJq{n z-lH_QAF%gGIDx%KlHLR0J$iHVp>8YlzyI6(@BjW^^#1?n|NZ~zfB!H4{{QFy{r_2i z|1bak|L6bx|5<l#6REf{{^vGu`6PuVi(7H#LkYj2_9eXYRHQ`E5`z^ zhP=13awOnt$XhTgM**&eysl$#HRLUrl@&x>4S6ldeOwKB6KLfiBCdwK__A^s;A+TA zMvk}|^6rko)sVMf+|1RG*Bn>&r;n>4FaN9@0Js|Ry3WdefU6;I+ZbF8d3R@JUm~uC zyezY_58!IZyGSd`0ars_KU#S%;A+UbI|f%n-Z)y>g@~&m@8PWM1h^XVHr2{@fU6NkQc>V)D1Dm&u7*rLQ8chEnlZz|~Ot z9tF4>N>YKVp(GW!8cNb)z|~Na<^WeiNtys$4W%M~$a1}_A^NU32)G&|>5Bb8Qilpj zSL_1{1*o`U50DTboFOhi(iOXj!~`h6Vkgi@fTSzlMbd)2q$}PH9)Ida1&~y&o|-E_ z9>Wa+Bwg_ikvRh7FZ(_Dz12&X4eULziq{vz$^i2V7OL58my=xa*Y73R%{2Z z7NGBnt-wqH`nuUw0`zrch5$)dY@yke0wi7W8Zcdeq=sn%v@%Q;AnA&iX*NZG*ehNF zCJPYGaD@O#SG+)Ek^mJQxm-XRI5JUyq=w4`NV;MpeI^Kybj35kcma~Gcp9h_NYZt{ zIDsU65*RCxq=GR5NxB*sEs&(uz@-97`e^#`r$&XsJxbsb1*GUBz(|3FTLp{|NYaOa z3W0PRR9sq_3q@p521rqxqV2D7H-VY2GNX7erK>`V<$UuR_z6Tf}kcxtf1yb=| zpua%MuLLd^+jS6tMS5(sqEoN5ZuS>^;)AEnx4FzO4Xzk5m-cd!%A(z}_RV z6|wh7xR!vuM_MUj?~&Ne0eg?cJ_)e*NZ%HKy+^*2@u=gPL@~uSdJ?QI*y$9u&Zy|#BxV$dMa@W~>(AQw|;ly12 z3K5$R!YzLpu=ybA@|OUc4`Lf^K1k|jHXl@6zL91&AM{=R3}Ev?xaAuFn-9V*e-^O$ zps&H^gNnJJ<|6{z}_QC zR|EDQsVK1bNZ%^J-XlpL0qi}JbQNIlk#G+K_8#f`0ATNtz7GNR9tn3pVDFK>_W|}E z>3c6=?~$Yedyga)*n6a+z}_Q$R|0sC&3O4;fX#;!bNStX%}0_7Y(A3oPQd0PN$&t` zJ`zq5n~(He2H1S0?^3|#BS{4|AE_v?`AEgv0Gp45TMXEIBtILhToFc0T(cCeJyzvZ~^1Cp1}o-yMIewCgK9d&8j8O0xn?O z3S6=QZ~^1C-jZhk7cg%48C<})bG2k05f?CSa4lI6xPWn2ZOQud6Mv+DQGfCQ*Dr4P zxr^%;x7(IHNtdvGJ+!16aQ))$p(E5UKj>VtnurS+H{#sP1&mvP1{W~y*SVPs7Am!E0h6Tn04`vXbS2;d zCQ0uCT)-r$zy(Z_-T}CPNyVjr3z+o18E^rUinjtTVAA(yw4#7ntAzwyzoh7V!1YUt z3S7S={5-(*OOoCMw3Aj6PLVSN+znka8)%y^!Fl+yKq@NIMj)-`0;dZk=^UW7K$5E2 zmjv82U2+Z3N+97BIZYr*6=^AuiZg*z1rkosLLf;6rwAmRpt(Q^G8H&kAbn>5CkZ5} z;6#D65;PM?U-dabAbkbL3#9L4;5dO)tOS}0q_5zM0!b=3Rv<}70>=m>si28Kk`4oo z7D&<4^7AboqG;!&ZBeF&5&AbEQO#R5s%3n&su(jGugAmIdAfg}}V1QPpP zAP`8aav&{`R$YOVK$5CiQXt_3g#u}%W(k3Eq6-igr~n9J0;woyB#=CU0)Zs$96a&L zjRK`XCt$8Xk}7h8Kw=B#2qc`~dVwTWpVNKM{KmA{gvFh`o3(5ql4kF5U;&dr-v9>^&rio7sEN z*Ujub=xea|AgP<#d&r5!yBW>igQNz$$C4UsKB%~O7tL%w=)3qGz~+OBi+2JxAM{=P zHemBX#l>3zn-BULY(7Y8u=ybA;@4?r^Fh+ZuK_k6BwhRpl43q8uZv$IVDCZ2#Tx*7 z5BeJHJxIFvIU@ERR9yTlVDCXigS`h8-OS#D@{6CQnY{-|7e52odr)!ldcfWzeb)i@ z9!V;&_ee#7y+^{W0qi}J^hv zk&1HwdymAP4cL1msUr3sNh+}SNK!S!dtB2O&jf5f67Cwn<|9c3HXohlYG(71Z~~i; zB%KP_d?fZHz~&=KCj&MgNm>cmd?cyB<|9eR0yZBBr-;o*l8y#!J`#HrVDpirqmUHy zv7{9Q>^+inQ1HYidygc=emB{BBxygu-XpC9_8#dgu=hyPzJR?)V)p^;JyNkZVDFJU zy#RZUBo)|uq^)NPT)^HV6$SPlsVKmE zZ2F7w-%U0j2`8}mNK%2#N5TngK9aN(VDr(LT?*KIBq_$a$>t*!+W|Ho>Dvad`AE`M zfXzpe3T!@7u{B`xk-jYfn~x-I0oZ(`VvF<>n=l`%coG47kF;(E*n1>tQ^4LMNsk5W zJyNkTVDFK>#els>Dhlj9QZWbEdnC3Z_8v*9h`mRWW&nGS)`9;?jO)9#isDIJ;HZB@Bg1?@6CQc zdu#Rv)+8909g@vI|NpG@|33To|CZpz;OXG8;DO*jgQdYY13mx$^!5Mh|NWm$9ZbEK z+MfDj>bX?({QuL}|Eur!|DpH)qv!vhz5d^4|NhUv{~ta7|LpbuKKu9o$KU_g^Z&!v z|9j$j7fljx;eEjq&%0=H>MX>@o_EpYG+1~K;G)Ud;)shTXUoFn=_j72XzB!6xSUq5 znVb^~?*v>kDfDDa)KAo+nzbZV8 z1k$=0@Ku3SJPGJ3kc!6x=LsZS6X0BdBs~iFia^3)V;jl@(n@fSpfqgOMIhmdiJUFa zxtIew3nVuFwBam)R1|a)NJT+MfmBQYr2?s#1Ud+$q9W}D(n@fqK$6CQb^=LS0GuI^ zih{NRR9tWn__6>M4Q&KmWh~f3=xG)Xk0)AgLow1*o{-6`FlffQp7=1&F=i1tP}?kaWRIKobFy zI&!oCNf&G+(pZ3`3!VkOAVAUu&jCjXkkn8jKt(qz7NGBfXJ}R=KvILf2T9$`-h-qI zo~D_-2T2#K2kbpaYDjAUNxF^*-jkP9VDpi1)qu@MlCB19K2lL&^O0~>fXzo~unMsG zNX170n~%f>esA-Uq>rSZ_&w&My1C$C0`?xMct2q8k-iTA_8v*9h`mRW-Urxwq@uvy zBYl?x_8zHt4`A<+igyF{9;tX2VDFLgcL4StNvepwM=CA@>^)NPcEH{vu@?jO9!a_s zu=hyCTLF8IRK#+BZ|{*j0(*}nRWo~!(%@#m-Xlo`6C<$~0`?wBDzNuR()j@1K2mWeVDpi1*8nyjNjd`+F(0cq zgMht9Suho__ei+OfW1fhP6F&b(pO;bk)#s=dygbl#NHznCjj;ysW=+2_ekstz}_QC zM*;R8sVK1bNZ&z#y+@J`0qi}JR1tfRRO}Dfd!%n)z}_R_6tVY6Uq$Ra(pO;bk)#59 zk5udf*n6aJF97dxtzFO?u=(g@R>bBbNd-0^ouvYsk0k8@*nA|Zz~&=Ky8<>JsVK1d zNZ)e-n~#Jm18hFhw=-b#k-nW#5%aN%3fOz3VmrXzBNf{N_8ti@u=hyPwt&4y!l{qF zNBSya?~%T30DF%l71(zMH$P=&YhG#ouD(fqxeM zyl_V{m%Kl9c4}+-mh{2ku1vGc8`RK#wt4n@xvshA zikgIN%rXMw%m-O;-YJcUgUnt0oGjDQ1WKs_X}?*99Q_Y!ZQoc zEgVufz3|q;dy5_`?p3^rl^Fi3uti}yu`BU%qB`+g)>-^l;V~s^6F*I?Onf)7FmYXC za^lj&fJDzkm&BJ7CndhX-)sCJ{!XmT|HZ#}?*g9_r%iaEdu9A9d1wwyh%LxNM_?4- zT6CtG1y%Rjdyf}H&5i|z#ct2{A##4Z_|F?j^w<^K zTDzSd+lgG2&+i9%Yz3wW+SBYcz#C--J=QbY{n2Po60t{XJJm!ME25zvj&_b+=y4Ct z?1RSv%K^KchQ1T9y=drp3~-?a0M73MbPKn0e&@p01+EzM=^j-5#Ma4XdQJ!2ijjL( z(!~dqZT758%qaM^`qQQ7NSfJ17`bOJz?Gg!_v}iuyTi@&JeNpwfrf4mxU_2M7KzNE zp<5DBHRMFMn=#I^7lOyWWj7Nn1w0W!|KPEO6E&#dDB%1MzDu8luH;0%OP>WZqewr% zS00KK1NI-__KiS6*zESj!DI7%y`%_z=G!#|^qKDi27G5j@Ypvm3;TTMHo(^kiu3`z zkAh6_*f;FK0Phq$_Kj%hCC>pa%Zl_49=j>Zt)=vtHz6FFXP1xNWOJq2(mq7248Vh~ z$8Pd9mLd#2FWT+JHwRVu&sm8qS{GF1KUW5BixF`)C~^~#Xx6ut6NwJUA|Su|f%?$w zfa|*Y6a-ZVZD)$C532q(BAn>0Z0De_V~Bh^8C2z;?*mtC399lh)B(dd3D()`1*Gj- zdx3y_`lGL;fXOEXRr%L*f#GB6b4|FN;mv6_E`-UWY33_`HG32ARi5D9pz6g@VYAEF zpO=ym%nz#acf@Emu4_=0|271uXdP5NYu^PfB~^D{8TR>R-=J!uBf^ZGx(|qM@&2qp#cF=`(FlP*rnkIGw8pu^pet+RhrL<10vDat#ypH9as9eSSSK z>@#8#qxnQ8GQD$9_4nh#$XpIpjcW{%tCul@=+wOK0cL$k*z8g!`g%0<^w~kx@1k_M zbT`wP8aAseU9^hFkZzPXg` zL?_1RPC?Zld^Jd9;>|(THeaOy*ED5+qElw>26mw$9QwLR*9>ETDC1{OX4cVx zA3c-p^bY%sWavLcF!4EN9o4rRk7A?kqK)3iMx!HoC5g1LER0mn3#zt6IeO(f4plUR zZ@$C~`h?A9Kg`^s6uagwrV}0O(T_5NDPgnAGt4c5k<9w-tD^yS1y$R938}-2jr}Rw zpDAw#Rez0={CdukUD4saaR77Uca7`y4Dw*(r6E)@(JhhmGdNFQjs(8EFWZUI^4exW z)qnf4lZ}pNfPKCs2EIjx{ApG=+SE2d)fnJCQ|N_smvfs*fBF1I?`tjCE$$#;b>PSm|JuZ zr*f$FLXjE$ERdPTs3I`ZJkI|yyeN`{E6RACC7R{op8o!SHiM-@y zPNq$f(@rA&|1mNgZQlLt!kHmlvMQ+hTU6HPR0mc0A5HA`n5v*^>j}{=EM%flhRhlp zRJ|J|(mYDQo~WeF=UjL#QhVyVLDh%RS%32!wi8_i%-PS}qCS%b5g8J0=Z3Bf?H|R= z;2S8nCn}Khw**x$MAcnQogpy@M%qMc&~??x(ogY11jn)L#X^@mYG zxta9e+AZ4CXV}j9Ax!ATM2Ckk=?*4(LkKs_WjoPXKdLEDZo@Qu|BeQgN0NbTq> znM9KRHaZtZO=o{D51UQ63Ez&+?XgJmUQ`pmaS%U^D#gsj%?&6aAY+ zejS}z6&#%pqFq?Hhv`I;+`@s+KZ#=KvB1Bh6P*_~sy>LWEx*;7E7d5n^f@jXqZ)E+ zS1zR@E2y}iNL12poy)AJhdX!0-9_=s3P!{$3gQ*y6`W_bCc7PKTn;O>YMsD zzk|ExT4tZ*SMdeeGcs>vR%a%~zY%{saem_I#J1C9gw#O}=ZX%2KI;%liE0tUdRxY4(ue`)O1{4IqOfdRA{ ztZg;}<`VG)P5@fPXBI3`MBAJP+$7L!=EnY=Z>9;%VSq7;XfrcuW^dF4W)iU-YP3q= zt7@i=HUYW{w9&5gaplt<@=WiTnJHajQdNa&(SmXHn`Tlen#>hK;eZgP@%K=~e(0`x~uFISD?NK5&XJFvO z;Ff=+!@V9dB+uZEE$?|p zfr?VPcr%PVtPg|PBDAA>=+ivfw>uck*Xr8q`wJWAcSo~%hCaut8Kd<-K%Y~?sSUY@ z?aT-VsOVMLt9Gx4adiLw#jx4HYIf(mu-P!=`J1nU*qw`Wg;Vl&Y)fpWqEF$=hYrDQZ03w; zYWwKZIh@*%R|BkSi&}Yy%>yEN2en|HzCfbcu*FQxGtj>EP2Ny@ z3@a7`kqAT64DD+onhoOY{f95&fgv>v5N-70=?pz2oanG+^f72UmC4`dZ%Ikg4MbcR z*zG~18SQJ~F&LVoSv1j$XVGkUING3@Y^Qe!7vGvHE$ArVlvhqgnKNi56Bri`HjF&p z?bKCHX=+o#{=;4d+((Ci-PHXm;@`noSEw8}vwO zUTw4Cq{QDY4I>vn%h3Hp7}`8_*P(r@q89j6)WNAqZ9Jsa0U$aAgSLQljy+#Q6wTX8c}za)YT;Nq*%(&=B-4lsNV zP&)tz?>*lPU^~OflJ|TCNT1=)rQbW$rwWMrxLNyfJHr>#$Cr@mb8B$gp+2*K+CI0@ z%(YM3;q-p5X}G7u`v!dv^(g~t`}C!m6;q$a!6C_qv2*Vp9nN6rYk+?^GJ~Py+3r4J zWJG!JXx>anNA5&DTDzU0&j8VOMz9OJzaCD9KB3A;GW0pJX->4AyMftZv!PVN-8MSr zHez1p^h4X32t-wW=*>Xwc3z;5PZcIQ;wDDBEE;-L=KR`bLy_?xQL~{#GS}An;m|=u zyircVp&XrEE?!J@2&c-fsK^d!n)yxMfoL}5SR%e4Rl#dQ#I}c54`~c|qLjrUX_|RD z*z;iO_pWH?2EU!znQw*(58g_|DW;98k1d`38T?wdtahV=Um;SVonxbeUm+50bnweS zw9&yF-d#RfwNYxvE~~&19sEFcQ2u~uqxTTGAUyDc@6P_Lpr3#l41P9yeZCocI`~eS z`4@*adMC|lH@Xa{-6)y3t4srEqj>EupQqaB`jFM&>%?uVl2H3LKh|8f4r~Q@1}6h8=u@F) zq}agbfX#)84(!1I)~6}JbavXen9jhXhJTe>ic0saxlLlgz> zvmWpg5ns15>j5tjiDvB?oT~wt^?;{oRwmG_*A)-Uo3duTnuvWtvt9+*U^VN9Y39*5 zyaOI05@q6mhl-yqn5fY>)>({#1~yU@KZ~M=8J>&XKKlL zwV61el4dU6nhvMTPA9BpJ&!)MbJKR5usVo6O71)~opXt#qUn?ZPGud$QkvBs#P&oQ zshOtJu4F_0fRL60TH)l^E20^2%KUA%Kr`qDTqDp%ll(lhSSWY#K_XF6y?751pIICb zL$uM0cYo&l|F@OgSTdtze95qq|K0chj~6{uw4&(tqW{JB|G9$fKeKOU|CHU3U7J1f z@Bhm(XJndZj?N^54}+b-k$wOFjr7d)W$6n3@?p1h$8@Xoap{JA|6h~blzcY%MDpR} z50lH1-%8F-PDzeV4oo)W`~TAmn-!K6#uD!*-cD>zY)m|rcr@|j#9fJRCmQno|G4;& z_}Aj+#?Oqmh#wPA$Nm-D75hu9-tYe(&wrA_8Xv262ao4JNnwqSRl5KeN7lhG_>!2V zJXW!UO8%1+mdjYR9dM;&#gJ93fRg_tg{3?kaoJ=kk5#OivdNaqQXYnjl;Es`;XXE2 zme^SJI?XOrgrz)Iu~5n;S63GKSoJF4>dFckt5_&yldrZ|%ERDN%R(A%<{u9%|6#a5 zqp@~|!B?EDow16=RW|vGlhr#6HgFcw@MvKXesC4bu55AFkp_ElD=(5T8A6XY<6^pBE>a1og__3-Q@Z|(+qZnK< zBT;3(=D!@MhCF#R}%ey3H)s#)`HJXHDp_EO&(2%|YUuZ~0mP6TehMGx5feXJ> z6nt3`r2z}2Y-%Hrq%4QB$(A5V1->|uq%5Jb$(A7DSPo@VEA^3Ziulg4gi{~;gM?Ev zU&BZ%fz3iW!4fK)PSF6$34!k(NMDv++2kKMtj^+yuX`lvGE~GKMNZ*@)CIaa@4>(#NNd=7sQgJR| zgOa{;02`Dfy#^>zGf6rFC>BV?senyD`U-4al5`@FRWnH{$Ot5yAP`932|!vPeJcSw zoFp9y*x@9ppis>u=_nu}kfe&l1rlyF5EDo^MQnr;PT=3`5*v8=Mm19!Q~+}Y5^fl9 zgFwO!0prF+FJqn-POa>n%7OvFb!w$75cp=9gc}50tB54+57=U*qMG@lQYs2& zs+rQDA8?gGDhm8tNBZ^!u2e*lb^~n7Qn4JErik=C7nmxLq>4-tNYbvrWPv2@0$d@G zq@93C0!i8)xLhDf1-=NAaBYFh6p_AdfC&QW+Zq@zkfef2fh27Oj1x$nmcUqnSYFwj7T<{~vSj0%uiy-)oO^-FvRa7@|fE z0x`xYf#EhFA|e7BF2)cw#u)EWgGi95F~(Yt#~K}sMXLyeC>Zc45evk6#Y+vf##n2t z72|7_W2nbkk5TKf9*;fG^WA#}W`M~cdEd7spHF>0zx7{x@Aa(p|E~G1z1R9iS&xO| zEvR=7;Ol}$cLt6VbZzBWLA|>H$sWZC$sS$x0j9f{u7qTd=9__|t>||bAlc(?;OiuN zv}h&Squ)j#*`rcdknGV_Es*R{X*H1SLH5dzfMgFA1IZp_uY8|MvInIrKLCOiPDv?QAzlqG?4H?>B?8B zBz&;AawCxN!Q#r7frJmTS8f0jK3H7&65am1GY}S3U(Kdl0ws zX&~9dZm{x6AlZZ8l}`Z49+U=>Jt$qdj!Lpeiw^_I9{oN5Bzv?dBzv@Y50LCp_8K7B zqeUUvqhBG}qtd&8WRFVk1d=@}y&WKXa+I!I0VI4lN>fSrsMJcrN2Rv`2_KaT2_G%q z3M72=y9A4bPb^wU_Nez}AlaiHA=#sm#Xz!0zl(rmk4lAPkFH!S*`v}0K(fajWImAW zQJj@zk2}Z>K(a@_Lb6At*8|BOEzSdyJ^H-{NcO0-9Z2?Q(MqyMzgGdt9+h4RBzshP z8IbHz=|w=YN2Qkl$sUzb`AxD%ix&dP9xa{^Bzu%S8%XwOaTY-KWJ*pY;p2fhlS;xz zaW0ndQRxgI;iGvW;iFO^;iJ--g?oQP_(a^96p}saJp)MgsP{A=*`v}^fMkzKtt5L? zY9-mDI3d}i-xGmkkA8(@kK%-6kA6=8l0Eu821xd(bUKjiQR#6&vPY#Zmh4ffizRy$ zcQlaf(eGp+*`wbhfn<+Lg=CLPg=CLP#{d7knmBqknmBQizR&Y>)H}Nn&%eazaf00^Z*LU z9xd(*BzyF`ACTIe8H`sl)!iYtqk6sI(Nq2)((13usUUh^-TuWvrJxwUzx zrlt`uOTERK35oe=UnQ|5x$KAN+S$h5yR` zSABWq4|($8r}o+F3xz(1p82g~TL-lcJ#f&71BVPAJcNhHZ}H^T%DRfjwlbjYz(Iot z@g!`XuGsCN>I}H9#{u0R4$6R2dLGd2DUb{p+{1t^AN5=H@TOO2-SnaJ8FZ?mVAFsvb$f*oqXzp7%C1lPu6lSUABP?f`)nGZ2cCO5c-W}H-5%+D z;5EPUfwkKnFsR!zSNRN`;<~>jo<7PmF}rP626T$sY(RDm9>vLL*zy%Rx6)Py4B}&S z{m=(q^TJmv)TSNJ#YWP>@FimwRU+x?9iGADmu6SA0FSzKHX)i z7<$mP*RV;7dHo(=e%K%$ygI1cGsRnn6%M*~E>DB*uJbqck#WOqnF4!U!?K`}dA*^M>4zH#4pdT+A z*{hwSmFam9PtoqOb29vAd-iTPJLfQtjV_08Yhh-E&#CV`w#NPV4j=B$E`Lm~)|y>@ z$f(vXdt7UAU~i8&EtBS5pTs6lar_AYOyuXE(^o(FV$>^Iy0+r8iZBf32jo1Nmn?boZ}txlM& z-41n!f4=v_2ag)uWrlY+=M24=?tFEhRo!K}c6guO4%z;2358aM}H4nsq5bY89>}`a{$@V z?U?2d;_W`m;2gN?pNhk`asB_MmOsw*|8-4&gzNte|FOf@|EJeatl#nL|JM|D^!ooR zwa?c6%?@7w-*o@K9l8F0O4Zk@CRH6&HE=tw|8GpYjRx66Yl`=7OuLQl-$Sc_wA<*G zJ#;6Kb{pNlhgJY-x6#Q9q}@idE0A^@J*`06ZFI{5X}8gzdgxYGkain=u!oiaX}8h5 zOC{|#x?QQH-A3>2A==Oz({7{77)ZN~24*1bHky$E+HJYQ6-d907TrViq&KGDMo0J| zF8pq!-)2|tq3bE6-A2pup?N^sZ8Rnyx)w;gjjmiE?KZk{4_!kg?KT>5fsRW(57Cm| zm`go$7$fn4gL&H2z}RC1|@R^mf6t2d7IR2U_wl>YR_k%F#f0&Rk>gb{*D zh2es-&jyAG?glidHx3mPCkzqvdm7Lx=vNpls8kpvsPrV@OM>F)JZ~H*s8l#mP_}S@ zKyx-@z9^{lL@e%Kwn!Ix;}`bh`qLYC6|^XPQqZrki=fi|fKLcoq(QxL zXF-efmp8TuiW8azl?qLQy8)f&jg5jz2LKI%u7r9)i+zEjpkJXNXkN&*9+mb*Dc5>( zVD3pFmwFVp8<0yqit7X9QjdOxTEuJ zpi(Or3o0!DKM=H73tS{9PWZl{(n{b$0rP7=1TGL%S^=Cdpmgo~!1n}{u6-MrBcOEc zyTEw@N&~Y6lxDH-3MdWC5>OgAS3qfCrhvt@Z?U#>1T3z74VWPyd+kQxI|3F{Ia@$n z;4A^zfindx26C+j*=skjf?VstRo0ekJy=X7*Lv_9$h98Kuia3%_jg?DQR&*38J|l% zC|&y^knBO}+82Oi4;BL_`Udd3_Bkra9xMiuJ@{SwG?ioz76Zv1{H}eHO0ox~fn*OB z*FH`q*@MNkPXNgtWCxNxC|&y)m1GYV*FFj)d-VGNknBpI!RY1Z=i&hdo?k#r#2_Idp01`g>y&XvSC{9TD=vPSiXwfkVAI04U zBz)W_ZUquPiW3q(DisnwTD%pDgikD5NcOl(EC!N2D!my<_NdfKvPY#tvPY%!fn<+L z3FhA=d$c$YNcQOW8X(!DMIqUv->ZORj~1;Yd-Q81*`rb+*`v}cfMkzKF9(u6D!l|q z_Neq?AlakR3xQ;h7S9KgJ?gPS_LPoAD+wQuMIqtiZZHQ(_~>^QknmBdknmBdknqu! zknqv(3?Sj7QX%1^Y$4&J(i!L>e4^(}3VZw3lz0Y^>`|hS?9sK5>~SwR1xWU2@iZXW zqeUyp9xV#V9?hQsBzv@YB9QFS@9{vgN2Sw&WRDh)0+Kz7I~qv#D0?!H?9rl->{0e4 zAlakRBY|X(O06V&R5}4j_GoboknGX#Xdv06I3d}i-%&uaN55?V*;7&~Bz#mVBz#ml z6iE0ePDuEu^Z+2?qeUwTAI%Rc-ur68M_0lnzK(te0tp}e3JD+ma^?6{!Y4{u^Q*}o z#q9?qd-N+Ld-N+Ld$cGdd$hPOknGW-knGWXKOotoMIqUv-#vh2k4pChl07Qz10;L2 zC?tFIy9_EZ?zk!4gejj|7F(*0(i&;U!2XUz+d=U5GTP&9F zL0ll=gSbG#2lEfU$zll~c8~|(Kq=v)(kzwi!PSFruvD@Kix0jIBzuq@NcLbcknF+y zgRikzvInK9Bzv&<;Kru9eifgsc(kH8uJA!&RpIPHzuMo{F0MVcc8{9h)Z9?>^_o4a z|EYRO_371nSG`hoYt`(kFIK)eSfFX75~BTP5(MB)c=3>|3^J? z9(|L;_Sx%GgbSQP-*bYk2831HrR+q&SCJu+1lezoqX2J?;JJz z^i$6~dG@zY|Juy6=4^FS4=!)586WFq%Y(o3aRv{{)*AoF*$h55?|It!r_VnB+!=FD z{`TpIUpVLV*)va`QT`a`o_E%qv(7*LsFP>U>AtUYtcL3cJG7c?{x3apCaXDcvn}|w znWvmQP25Iql=T zhau$y<0UNUGInW3>q|QNSCX3tmo+MUe8djh}mO04!c^(`0xW;+xVg#UoC4L>153chV^ppnY zBYrWWmlI`q@L;|fm|6CqN4y+;c;_x!4%i82%^+b9J9*a0r=B(E+}V>`yS(qt(W4&m z+Vpn5G~WO$Pw-x+-tNIe%hBRB>+K(0er2y;Z};GiQ1e>$_76@v9Q26SwYPV3^JSWH zws_fayI;CB6Y@cic)|M*zVzU(rukNGc{=y%_jbNC-#IJG@=Eyj4=&5{s`&N~F28NB zkZswmI)5;CwC~^2r={5Zf12NF{_oAtHUDk%13UEm zzx|u`YTCJ}s`0(X9ew`akqrko3~Jc%=l@+$Jo}IG{J&f4Zmj#y@%+C5)t|1eulhe# zzpr|=>L06~sCuyKuBxR~H&p$os`tdF06Q zdw?|Wc`8RB&3hgalEu=z=P@UNH1B!#M%I?*J&!3_zJ?W~dC!A5mahWRyyu}QfpYVH z#qv9;qsLtg-otz>kmkLz#{g;Gt8_Gw=Dp^HH19PpqNHmnJOrIUto%$UtzMKtA4_KTD*@Nt5uTe?%;CI=pK(YtF%QgVX9xMiuJ@{SrGL>Wx7E?*~up2CUiAu5u*@0va zewV#SCE0`0WzPf29%L_j3P|>#blEdNvIp7Ao&=IT_+7RRAbb4k$% z^eZHL^m_)7?9uOOK(a@_CjrSG{hk6Od-Q81*`r?}*`wd-K(a@RM+34ju zV%cOM;p1*_B#`j&_!Sa9$`%qnDs=@3A7zgN5|0C?tIJJ03{*XmKo%@NqX7 z10;NuP5zed1*=jk2_KaT2_MZ12_OABCgGz}o(cJT!Y4{CBzsgUBzsgk97y)KOSA&X z9{mc*9{mmil0Etrl08}+2qb&-djOE^QK^+=kGsKsK(a@_`vS=x{R+t*l@0)sJu2-7 zBzrV3BzyGhV#yx;_5qST`W48Yl2ZN#Kc!-D-e)|^Dm4CPC$KG9k;Xa(J4>bI{{`RczPzH4VO20P)S{cy!>+s$T7{Y+gAFOvDz*P)> z!O^ARpSRTcgZ17F@GW(IhD*BqCTs*h+UBRZU4P)*x65bP`hae~H)3ztKr<;nkle}- z96PR1`-?_?pgDvKyj^}nHH`5~c3}Ka#`_6B?&}X>d_TtL$4Q(0q(ASMD`Q;UI`G;T zKh?3smcN}Fy5*e?M*sQEUVzS9+NHEVe6nMFd6N#j?wL7- zipsppiuNudM^)Q0(7qoV{uI6j}nk&BB zd=2-oEk@iuZkr>xIK=MJ<(iwXaTk5%ZM;Tq$1$|qFRvJ}cTXd@uGei_VR(-o4D&O- zEq)F5;_f{U==Pp?h244>u;ra57~rp|BYf*SUANu%xN z=r*?QaDGv_mHq0ce5qyIBltDn76yO1&o)O4%P+~hObI%_;k+J3Ffn$$GV6#Rv3U@NaN@12Tmj_@My78kT2WZ-rG(A>iau2XlvgU7&mE4bUlR$rsdU8A+zEd=l| z?+z~PZgT|3cej*v1h)y;_K2;$tK0c5+crmdgPtv1|2Mu|vW*d37v_K6zQQnY-hV6f zG=d#ui`TfV$JgNZ>D}kTdCU2V+BV;n`%|}hYT&%(d-gPf3$|Ol#?t+I7{QUW#q2q6 zG5hQ`-&Jn)(rv$*x46Ei5nG;Q44n6qhMq<+hitKRuiw@@)#i6TTDQ1SLi3j^z5PV5 zZ&fmauUPP#`mWJ1oV7f@!)qDFS}yCD2YS9$$yVQm<4MgO{47J8zr53jJG_=5tmW<< zUP~)$@yo2em>GwAPY-s8E^)^e*=f-Bj~{s5i+r76tNZpyzRJWI&X8^)$q2qfu+0%3 z4c+(D>we1@9=0)p6C!V&((U-U?uDMt?S^q~x5c}9VPH?M!BO3P9=Pu3d}U@E?~3V< zJ8x|98h3oZhY@_ss{5@;241&(+uI6>Y~5~WMSM%Hr<9l{eNS8PSUpi$5J;94Cwp|aq9y%KNI3awx$OK?n+xoTiMdn2)|a- zedoKA?*eRl#~^;Y9C>|PxBC14Wi5Y<-~Yed^qZy~{r&&v8~12z+Tr{EpIrZ+<@f*p zS?>QotLkIi|Ns7t=`zxyTl94C{?hOA>2?LuWuz;&=t(N+GSd25^c0XTBb~fd(q*Le zl}fsdH18HY!D8t$(!5*rIFK$Q{l`U*0qHW*ybGkuNV{y&!&K5`q%Rmqmyx#KqDQHu z%Scl!m2??tiUrbTqT+zx4G>Kg`!6 z9sAM`^A$&vzVyR!Jp?VD0_-j* zPS{OQ>G8m)1;w2R^br(i;iC_6_pC73Rp-#x zi>V}ga1}`QU~%EgESBs+PaxTY#f2|XN%o*8knBNeAlZYSK(Ys=3!i69vIkcSUjULl zC=Dcg5SPW0J%|e=dl0wqS;i!L5V!CdAlZYsg--*?9)c*4?7?Cn*@MM}PqJ9D2XPCZ z0Fpf@UAPWN_8=~hOI#=oBz$!BD2pY0RQdpr@KLFd@X_L0AmO99`+$Ux;)H~ce(wen zJ{*_}*PwKGS?L-I$sR4<1tfd)dnb_W(V~#-(c*1DvPX-z1IZrE-wY&sw0J9!>`~kj zAlai*7fbdi&PuY!-C!}0?9s1~>`~kTAlakRML@Dg+4F&9k4jzabMA;L6_PzFy#Yw} zsPuZEpNlC@*hkRsJfN?jUm@9}(rbWZk4oDCvL{pW!YhD11(jY2Bz#nACE=q|A>pIA zOM!%sN-qQwK8m{pNcd>}A|Tuf7S9BdJz6{isCNa56OuhDJq1YixEq`ZBzsgUBzqJmBzyFG z5|HfC?+HM%M~gzTM~gzTN7=^!$sUy+SG>RUyL>GQ$sYZ(Sm}59DxD5o?7LQ}K=x#= zU3e6b@KNbh;QLl|btI7RQK^vdQRyTg;p4$P9!U78bR3ZI(V~#>QQR0H;iK%f!u|d* zKjKDHNcQNu4M_H=S4j3~QAqaaw-reCXmKcz?9uNaAlai*7fbeN@c zWRFUPWRFS*0LdQ3^#zhWy4n*+_ULzSAlak&J%D77ejStSQK^e1dsHeUdlcu|PH?-c z)D*{acd=zV~?9^ z+{#@!*5%mao*01~d))bADYxiYmt&6`ek}b6$g#)WG6FgFxJk%TZr-sj#~%0i$e0{^ z+>B)DdsK4laZ`*emSc|_aio%CkGp>?eVfH{;>XQ9mU1VLbvgF9t41n0_P8&|Qf}U{ zj$_Z0^b+LY;~pPbEC(MqJz2_aIo9Ri<4zt+UoYIdj)RZmwN%Kl$IUyIawCp)Irg|^ z$sY#h#d6-qO;eV>4CK6zyP+(70XWq6 z$&FT)J_n2yxEspSXMjTlZl@9$BXDz;K+gNHxb#UD8*K%@OCJXg5>UGI31F0f(o{wY zC|&v(l{Nv3OCJSB2>1;Q7qs{=m0^Mw*8)QY#aS65X#O6cRZ!dmKu-LWZDo)ZEec-} zl)VNRC}`2jfr8?!93bfGZs3c8ey!{;xEtIBd_mCfDqufBrFUYH6Tet=shsy|aRrd` zK3(4qA90xg0TF9DhbEnWyT3CcbnXcQE8G0-3=&c*5lWeY_?ix&X}LG!bLocO8K zwdKT5i*pdiiC@Icp^)=FUC#n?-ltw6=Y1*_c5=;HoC#D2S_FRiCxWui1TGO2cQ)`t zLBCcm7W8`x@B=}mrvVoUDm@YSzMxX!LP4d+02c@30_O=T zoeaztR5}6RysxBGm?h|H5^%1dQY$kBWeevB`W+9<5L7x2_>Q2`vB24au0{iA30kyr zrl6}aKu-KLKOD%3pGw<+ocOsL3K(a^K`vJ)wE$#~>d-U5ENcN~yNcO0- zACT-(>25%>N2Ps$WRDhi0g^rX-4#gosB~u_*`v~CV5%QZag9K-M^^tppN2Ds{1hk4mj1e6YCW16&b4x?1ufg=7yB zm%I-odk_~$_OKT$d6!DE2Un>id)Nz>yiFz9gSaK{0m&ZxW=ygNaj7JG*bSDv$zsVK z{05ReC|&Xvm1GY}m%ITadr-RMH6Yo8(m=8YaZ5H*N%r7($;&{p2fs@;0LdPdE+J)q zne0L7lIMYB4@#Fj3nY6`y5u<^*@Mz0&j86DlrDK1NcNyKknBO}k|(Gndr%r6dvg3P zd7MhZ2a8MA0SO;01`pICgDrIJ1B zeE>-IsPsM{*`qis$sYY$N%kmCNcQMTNcL#)ZXns?ZmhYPDu9XcQ%mh(bX&<*`w?kK(a@_Gl67}e$NJyJ&LoE>`|#>l0C{k6G--` z^b8=`qtX+BWRFUPWRFTu0Fpf_Jq}3rsPq^h*`q}(WKSYDm4uHoGvG zM~mZtWRJ4P0?8gNT1ock*D=W+m5%v;_3!^@cKG`LzW)9HN4WpLfB%oHKd`=U{U_^d zi~nAHgWonhQ~YJ|p5h(F#l=4_US90|@BhDDIKD8YFt#wHuy0}aLSx;3)V*EzySnG= zepR=&?l0?l`}_Y}YOk;Tv)YSlCB_N%oMYDd-{Q2W{1U21D;-mm$WnwM(+zUHx- zzpA;t<|j4R*8G>6^J~tkIiY4+%{YFcvFZN*|6Kjs>Zht7sa{jPym~?P-0DlK&#OM8 z`s>w`s}HGet^Qo~Zu}PGqh9>}|5H_k%Ku&YX5}lD&sP3T<$aYuue`bPy2>jmzh60{ z@>`WhR~}y3R{6!s;(ae>&ZDjOxmqA|9=)p1RRfvxXm)+B0?3?4Pi(-4K;}G}cY(}# zw9W>6KqYe?UAaK!JepMl-Y(wv+st`%83()tWX_|(HQ-Gka~?gh0dD}A^JupPnDcTm zaloroGU?G&3uMxxmpI@hDw*`?oeg*q$fQUAF_1}*UgCfk3ith%NsnWX|7NMod9=;~ zne%8e4tSPI<~+K31D*jg=h0M4C37Af)B#UW$(%>4c)(LY<~+Kgfy{X{GqYIcJUXbU zWX_}GIN(XfWX_{$no4=jTQT5qDw*?WB?dC*(X!0i%5z?+k~xpwY8K0!M{6{YIS-`+ z*0HwCc_0LnP zJe68u&hvD)1ex@-cpH^WdbBnNECDj)RC+CNq@Xw}M+mwSCJ9=+2AC))`zm09Ko>f2 zxS%*I;{|t}D}ciU#aS6AC{8$3P@FJUa5r$wAp$+^z!*WLS5i4xQ0e8sXhEfy0tX3N zybKs6==Ty}q@dD^fHpy;bASxNPR`wRODC{NZO4w6S>3HBX zf=VXp!H~@={WsCb#Xt1ET0YJUrUeFgP3i|B_6aSD~S|J0LdQp)C0*L#aT)AD7zXUdrGovfrO8;D}aQLN?k1BqtZ$s z;e)vT9|8#uoy`8;JW`tD#;!!_J0*f_Tabw%RsURi>V}g@Z0|-D#;!!29iDa?f)W` zWDgcoN%r73knBNe|L0jO*@M#l&jHCEl=goXNcNz#|I~z4@v{c9+dWfip7#W zC=DcgP#Q?~U@?&F!D9a>7?bQlcK>w%*^|RBknrL7?f)2+gb%X&KMEv#u$W512ig4} zpfbf3sB|rm@KNb~K*C3*_W%hWl?n+TEeZ)A{oV~Ed{lZD773qNypuw*M~gzTM~k-s z$sWbu3M6|JXC>LAUn|KT#VrAnJ?asXJ(^z(Bzu&7Gmz|2sf#6hl|99z=2j2XC>jI-^+o7kA5!!5 zvd;$+J}RAqQo<)nXH!V_s8mSysPt?g*`vi7K(a@_X8_3_l?urol?urol?uro#Rl0Etrl0CXQ21xek*GjTSzefYf z9{mbU>QU)Y0NIm}>^~Jq_-OG+AmO9MNkGEK<99re@KM|ZAmO9maX`XHzhi)ej~0c5 zkK)Dx2_I#*0SO=djs_AwDjfwRe6+}7>k~fu9bUL^J>e6j!zmP5f%&6O~`=-TnXS{|NX0`%2UJrV&j$a{s@dHOz0g zy5W+B?>3y)aBRcJzyIII{rmrn!q*Fv3x^b13!f|O_Obu|zq$6h+AC_mUpu4rTRZUg z{|nW>u70?Bb@j3x`ul&^s=CS#D*v_e<;ve|`|tmX;=QHaiw5W#+NmA8*BxsX1KGXk zqphL0TH3wn*R7ckvL*DlQ5N>+R!ZvvL*DQ!SO8+R*S@ zL!)(lPHkwa1#)Ubk8jPq!oBM`wc%*FW6iZJb&kh7oxnBpS=Z;xh6dXjdZz1hW zm7LkoI!lE!n_OaBL!WhhPHkwNrIJ${`h9EYv#!sn4L#2+mQx#AiK*n&hKAu9x~}VU zYC~sp4NcSaIklmCxaJ}tr#5r~139&!Ul+)!4GqvhPHpG}t~sAEIklmA7s#m%&AT-; zTG!{)hIZ;28m;SdYC~Ue4NcSaIkllRx`y8B`s4g?v|!iJL0z9y8+y2@xmqzRQoZ6^V$f=D=CjdFM(c)+zr#AW>1?1F5rB-rkqf#NK zHY%m-x<02iT5JPyYNKDF&3CQRp+HV;R5}pIsf|hx0CH-hI3cGt`rRMMsf~X31#)Vm z#r=Ss+UR!xkW(9#_5*Tiqs6{JPHptNH;_{sEn3N`jpD52)JEC60XenNqL5P?W%ofG zr#2C1A!jz~?E~b@M!mZLIkQpeu0YOgv}h$~Hu~Ke;LIkM;#0|~jR$ixm7LmWQOK!{ zej9Sx%QycsSa%zLp)$dWssSQe3zX{~j28)55+TeHf>r`@TgVNQn0Xen7;_5emoZ8@b z^#&lPHdtK!Dv(nfECzCFgX};~ZLk=~sSSQtzs#7N+MqO$QyVO|#u76Uo6!S(9rsN~EBi>c(y28*fW%m&%3pDo_|e9mk*7OgzbnN8;B)z1Jq zwL$6Xr-7W>pfr`7+MsmxQ&e(lgVNQH0y(uo>FOteWDiPLKLO;_28*lL0m&ZyJ`5y# zR4OEUR4OEUwD{0gJK(a@r_W;QrE#3u?J^41#>J>o3M{!mXKKi{KNciaY zHXz}nI3eMq(q%xxM{!mXKAOK7Ncbqu#S%Ws77{-CT~fIBdBP_a9g^%(?;;@CqbniV zqpJl#vPZu{vPbhb0LdQ3SxNS2-b%7Zze2J{aYC|(<9GG-K(a@_^MGWJO0NZyJzBg5 zNcL#49Z2?Q@hTwMqxs8$WRFTO1Cl)|6_PzF6_PzFy#z@1s8mSyXz?N-*`wb%K(a@1 z0@;(VfvuhmBz!!6&ju1cikkr>eDr%JknmBQm4uHXr71HK2P{WsfA>ZN>2omJt{p3NcO1IO0q|BLb6A{CjiMFT^$c3dsKQ1knB9+e8o9+e&qBzshP6p-vu=~N)uqf#N+qtXdLvPY%kfn<+Lg=CLP zg=CLP#{$V7l?urom5u_)9@{2&tZoAmKKgA15Ha{%NAvpv2_OCT!xiBZR}M+`Xw;>WJ-W7%>`~kRAlak1en7HEzkPvZj~1;Y zd)y`V1d=^k+#5*t=+{cJM{&CW$sU#V0g^q+-W5pps8mSys8mSys8mSysB{+~*`v~( zfn<+Ltt5L?S^$zgDy;>QJt`HFJt`HFJzA^;$ew(|ERgU)>8cN@Bz#aBNcbRb)q7MD zJ}3<&e5~9}CEFvIoC`WDiQSf@BXC1IZqCmQ^paf@BY}S8V{2Jtz$%dr-RS zB`V1t%&&S5NcP}&)eAtf2fwK#d$1Tt_FyrP?7{r1XBm_1!ThRcnks)*v0vra8w!6_ ze_-8Qt~MWC{XkW9)r&R1s~cDQzY6{8AF6x4ctgXI#!FkyZhp4;N0s+h-Cp&r>hD(X zTT@rNqW0v%6~)twLyMKg59+UJ7|=YX>7AC(w)~><>zn^;oLbqu(_dH2@BG)pef>I0 zmB&}`V3*1~zi6kY|L}8%1`j&0b(l8`8q)nvXhT@lE1j#lbURkX4UxLu++!%Kx}oF# z3OikT%(!z(kF@E0@vV;F*=MCYGW2SMZ?|>3MqqH$rh2${pRa8Y_t@bPb6syqG-UHt zRsOQ~s~R$Ni~FEVT>UuDv?vQat+%V#G$FZv1o}_ZZr0GW=o`>wX?`>nmgw;3u_`bZE!+Q7H z!?_U{4`v$L?PDFj`WM^`rq>U-D!r#xZb!*I=Qh7X$?(2ICa(U4_wy@lp|xgJ+N8TTJBv_epfH|Zd;AuE;Q~?-EJ8)arJy}idg!9 z2lj4N!%@yXcm{X-w#decvqdKSM~YMRbAG*kD;Vt+;6YTZrB&!w|FPDY^dIE5q9S-XD3$0-6OYmRov5W z3*Wq}>v(+8_U$^uyl)?C>$*b^Iehgk-`dV2cKBfC9d44^W%eD;R=>sDQ5? zAI?^HU+8vd6ko1jQ*E((o;T;f)em#uqVjE9CmlOs@}{Yc+sqDSZ|Hh!q#+Yl|Cm_a zuBmO95B+6Y?HYNlt-Q8Rfy=!5rEaf1)XA{xP2~CxIgk-P>uDP!oU6JW0}LPww?2T! zn{nUMu5XHuw`54i#~awoO^!Viz3YxXr2fJRZiZU6*X87ZH|2vJxA7_1s|I!15&8~k zZJfCJ$KEZpv@7)T0L*4LR5s6nzO4=Q6@5BB;ij32_rz@%xA~sf&AaUf?3~^=v-FNW z>g|@|-nY(G-QLmHde~Cj&U0Ju%DuDes)jVYQQ-xTK)9DH35<5sr$gw=QW zB-yO2*ZV^0NH67i{x8+R~*+si;cGlGS0XNy}d)~m+zwVEY(mBd6 zyTpTMoLfCjyyFL*0(-ej4fmkreRX|Ptz5}uPX8lpb?*fC(sr(C8|l~D%(~|NQP#!h ztC-ZWsVZLVoj>2!AZ|Ih`O!CV^&=N_tY@cQZt@XC3^!KomdFIwBi`(=boll5WR6w& zmb&ff6IZX|$>QZz{it`JZaA|PF*>x{?8&N*?O0Xs|1@A#+&8i7s`!A97CTqf+w*sV z#=H4-3xSENe?GEfRXfe=?FZyGi_FAb4`kleU+>?ss@{IU5v|Nq{IBb~D&POF*U$g^ zu=#&BZ)pC9=Es}wZ@#m6N%LPcU)lVF=9$eWH&1V#*gUHFz~;WqpKPve`uCZzS(qC(_u}+o4(MrXH!d4W#hj!zSj8L#=mQPwDA{> zw>2(oyr%I_8|O5ByYcwODUD+rhcxb6{{H{l4Zmx6zTsC5Ya9Nu;ns#58?I{jVZ*G3 zQyY$HIHF;6!PFXnsjgq$r|Jr||GW0h+E;3y<>?9c)&9J8^Xvad*B)NmR{O=;y=y;F zTV3Q`QFMq=~eTMl#zV#<(>4Z`KrlCzQpnlz3O~Fb>vVW&1$}@l1iG@e2r#gE0uDy zx&&!f^X;LLe5IxI071U1lEu=j=DR9^G^_dc&`7?;@=lu7e8ne_W;I_W8p)Sk-bu5X zZ#IqG7f7?3?+69T&FT`QSUh8??O&q*;y9K$_Jk4WwC(xQt1&8o#NeS&iSemsvrY)hG?5S&h=R7pbIK zjnY7x)hKOyfl8XyC~bQVNV6J?ZBGMfRwFKuW;L?go+#c|dVnB)+nxl{tj1#7zoN3F6j4cV7#DGD~Aax z6%sy*I}J$q==UTb;iF$G2_G$5N%&|{NcbpQNcgDqL?Gd#QY)i;QI+zY)Y1b4RmxXN zOAioK=}|z!N2Nz$k?_fZX(8F8xT!$0N7s{pWRHG@WRDhwWRHHw0m&XM3dtVD3CSMC z3CSMKj|GxF%I52#r3VPAlrVlf*`rb-xAXu(B?!qLl@0=uJt`HFJt`dtBzsgUBzsgU zBzxRJ4giupS`?B!THGH<_GnQcdrIa900|$J?h7P*v}h&aqu+i&!bgij!biVC!bfqA zN%-j3O2S9KeSw6JO7{d3J}TW6Ncd=RS1b}fvDk+~vPaju0LdPe3dtTV)&t2NEj9wl z9%a`8$sR2V$sWZC$sUyo$sWyD0LdPeRszW$EROg9NcP}&#Ct%p2c;w41(H1|O(ofb z(h+Y{N%o*LknBO}h_|RDdr%rk_MlWKJwOnPBi;m(Jy;y^20-@YSPUe5FhAmTDhVGf zj(817_+VtjMj+vXs}ZjP2_Gy55~z4;Du}O(ofb-w{s&$sR0@ zcmhcFATE&XLH3AsRFXaTO(ofb#SxEDIo-F0-w_W3$sUywxupjPDvn?+JwQ;uYk*{r ze(wg7JzBJq?9s1~?9t*XAlai|A=#r+A=#tSyMSbmO78^7o|4iPK*C3HLc&MCw*v_u z{R#;ml`aDkJ}MOwKI&NlBz#nQGm!AnqLqY?euadO7HobGUA2CNHbINCfn<*sX8~kS z$>K~P;iE+%;iI@2K*C3*X9EczEuPs_JGSCaYxk|FKdks#@u}i@#jh7WD!f`>S${{v zl@0%=@wmnpTGqF$YB{atVE*!dy!oQ$uQt~-z0`DV)A>!GDcn^!rEpN)2ZeKslZ(rX z|5pEn`m^i*z5bqtnGJm#RyKaQaZKZ~#+#bDj+%UbdzVY;?otjQ4>{F;K+)!*S?pD0Ce$V;~>Yr)&WW%V2A2htx z@Lc17#@UVk+%&G~Cry7UZ^INWNd8p-`x_Nc~weCB0C)SOx8&S7c-Ojb|)&7s#zpH(;_O{xEwSQVWr}p^T zDYZjt_pROi|NnoLU;5AcFW=0lJf~E%3E%?k5-*gky(&2!wSF@j~`$3Va6ofebKc*!rd2rfW`6- zY5@wF4t&#NfE@IUA2zz`sfwfmLxzo_l7pU=4I4!zvzwb>DwXoVc*U?jz(C&sA7@xS zi{%rrSUy{_-7U3%#WL3c!=_h%q4YYAIg(1|EkDi#DtR3?!LadElI?Ds_Ttso|4I3E zhF-;D9j`O&8Y;?dh;V(2;^P6r7mMkvfV9pDUfV;OI^%jIoWYb z)znlh@--cQH}GS@P4F~t?G(X}GY?3V`EjlSBHoX4Ib#BToXe{JzO?7K-7jIWWR%sObQn%E&nwv|zkst0+V0TyTW*Y;r*$6rQ zyLNPGOZllk0xokY-wpfz4cR691n&Vk-SZQ?3zSdy0LFCeZNqowQ%9AX+UP0D8dbOdro~#RaJCWQ6F&lSQo&*q zKdAdk=VBAt-b-^d@ZKgeRV+=Qy4VAC7j9bYZYq0rtc`tk>1PBNyQFT#ro}F#60fdp zED)70Hl}#>PjU)MW$X!sT}wL_N)COsFtBq4V|mv%|DgOjJ2V?H1nN?YAT))j$J+2>>4h!RUElk?<<=DwRolwW7m`Ncyz zE8}kF9c1p~?Tov=c=aurNqN`fnXZ1C8QV>DO7V=&F$c3BEXeo_vZo4(lbqQ@22 zbS^fEqwA*6cDyKC=chRbb#1)p;(f|v#=Z_@cX5Nfz^eJXCi~98j~0L1xwf$!CAaKS zUfcM`S@kE&i;dc?zNK@qQM*v7D=#*Zt+Obf$2Yo>N@fdS)SCL?onsFEkoT5Jmdd!N z8I!+Ad81=0>W}JNY}Av*tLNtcq%!h_`pY{ljC__cd-p}_Pb;tBP>!s{nM3?M$MK>$U3Vj1%nCYof7f=?8RfN&dbi|)ryBpHvvPPNZzq4#`gYz2zFA(um<_D@hh;cu zD63A2ve=;<7&njVcyG@)uI~J#hdl>$M2?Fs$_f~B2wAddPI+yI^lKW{Ip&~AOljGb z**b@?i`~+3Xdd2Nym~>$4tvniyl9%1e1!45>m>uq?_k0N-dpxw{XEACav}g6PG#Ze z$}c+lOx{mWRi9FR2jh92pX^$G*N4oZ(s8OeetOgUof~94pL9v4G&aZt zPR$lvTply}D&E1@%WFIQ^5$JOz33$@*0Fg<&uTuWb8UxT33Mnqg#G%K>@IGd$9SEQ z<+V-VeDIc>!ujENodu_NyeOaaC)w6+x5dqW*15LPkdcx(r==o(h{BhQnSyo}mSa0tFuIb(Iu7T9-f9`t zS((6Lwj`gF6-=lF5+A&4U-Tz=Q9r_qo2_laIM$YJ&6tCjHhz+Q2RP)dmhX11`XDyd zf{wZBpj9nTZhCL;@;W(wl*M7Tq~kPp!lS^^9h>)IAcwPW#~1CGxDL9O%6H0(O{{3y zxamc&V6jYTj5%lyf4g;PoXAnKG_y6nZ`hV~5|F`+?|JPOCTe+h0 zrTt{4PzW=!vG+5{G>_6^YR3*>x}Zs;_g ze=@hy3cb~7V}YFnx_^P>1HHFtJlUi@e+1M0n>Gr_>`aR;khGx{7|5(iD=?5#YZ`vj zcmPU!!h#mvwBbPhvZ8qx$R8f`>jD?}4(QiqOr|ONb<=oGO8fV$(3P9Uqfy#3?b3(~ zNFmW(w;LF+Nsm_12XN>SWG1+f^_nx^`nwg9h#=oc(O_ROjk{BG>~JQ2Ie## zbJ9M;imrsr81!SO@tBkLv#roIO(mzV`n8gPQR%LQ``gKHTd>o3%1L`pRMg9}OxiQm zD~_j}w3jEdQsq?Ftaukoj;T~Q*@{XFKu$VTDtya|N-Kdxib{oKg-UrcN_);7u{iZ3 z;2VxXTp(wNhzlg{@H>^~q_pSHAY4s-A2`-A>=RRYG)nt10!mZK6pY2dbSqe#%Hvep z^QRNLLB?cqMrk1VkJ71cvRE42C=KL15OIM76n>|^!D3TfHGZeQ222)EI&}l^WdWsA zUj&X65I6N@ASaUeo%#|m$qIg_z5q-Vu$VDPI4q`exD{jv#tSH&`aDVxD=D4&EaS&n zz~a=Wfy5XG=F}&Fu~v{h^$8$<-D5G8F;);4I9Nbw78@;Ke(K|lNp>PGkTXA&PJN6@ z&L5B+$O*hkAElC1RjH6OW|a!VT(wHq0z(Cr-Ukd36eqL_DisC`TD%7sBq;7~AhGOj zum%`tMZdyJxVkdtwh-VW^NVv1V=d|pu8&A`5bvW3qH zidzf}5Hvp@NaAa85zxse|qL09vDJq7(< z1AInMsj!Ej#dctKLGxDuy9rvfk`oL4UJ3NEqPQ!7PYL=Jb`|t{Iq*qAi&l0K^ecQq zQ0b+>&VouW23iCy3dtV*3dtUoUIZk2RC*zh>{01#Alak1^8vD_V%IM8Bz#ml07&>KPDuFZ zw=a{011K(a@r zR+2qh+!aXn=+{cJM~lrsvPX+TvPX+TvPbg;AlakRdLY@OMJvf3{R+t*l~w}D9+g%A z$sUyo$sUyo$sUwW`3Ok%pmfTI0NE3zsU&<*I^{ho2_Gy@c^63d;CISfK*9%$Q{Dy= zKKPyTCXn#KVirsI;5U_o4;H7q#$pK{{7%^jBz#ahWdjxoA1zLKl|r%yy;EKWl0AqE zBzy2X|r;U z@)VV14@y%>_MkM7>_KTD*@ML?PckOigT*ON0LdO?Pgw^fdr&&%aUj`)(kYJt$sUwW zc@#+Ypfr%|LFtr-sU&+;DkOWDUb7h4lVF|l0F{J~O78&@J}SK%Ncd=R4Uq6r+$td9 zqwG6@gpYn#00|$J-UTFlRB9#Rqte^3NchC!Z4{C{>b(_6_GnQ^_ULyBknB;MknGX# zVj$V0UlRA~WRDgX0m&ZyUJoRDRC)uD?9r8w?9s1_C3_TSCE24mA=#sO7fbeNz8y&R zsPq~j*`rb`$sR3U2_$>;OO{@p>`|$Z>{03E#rv;H_NY`y_Ner-&Hn!X=av^*e%4T1*KL77~jb}D~qj75Ep^ZZuKi{}VW7Bp%|L?i_ zzpa0uer5fV`oE~Zvi=A4GwV;TpI$$4JD>lzbFr%MUg3WfUM&1w;nBh`3bz#&7OpA$ zX<<&GxA*@)t?t;mBkK;X8&uc7u1{UD_QTr$S-YWj`=9^!=QWqtTu^g%%{Oa~syVD? zc+D3+#`FK4uliNh+N!^-y0z-Ys;jDgST(Ea)a`%%-~Agh9dcOTv}f`D4Vezv3vVL2 zHe@5vI5km->5XZ{CN zG98ju^FIVK9deA$e-FrX$bmGUOxlp?kO^!)nY1C(AqQ+KnGQMl=D$fL(;>6j{MUg@ zhfF~8-vBZlawMjb>5!v${%ce+9Wu|QlIf6XH%sGKfhfG@Y3AGKG4w-4^6KWgE z(_spk4w(Vx6KWeW9WrCge*wsJh|>9l+J=tlaQ=%xrb8^wC%QIdIz)CL(;>3wKT9Rk zA#-Eamgx{Zsbo4tX&}=fdgc>%8!{atZvN9irbGM&G96-m{*zQP9bz$KG99wFq>||n zrGZR`Se*YDV=^7$cRo3`A=9B2*8-Ui^-CtblIc*TLZ(A4-VOZF9MdnE^vcD8N`)T? zDkX+qxk%6=Y4ytY1ud=sE)#LXwvUO7k5B02WT3_({U+$-M^+zp7KSI!pnJ0Cbp z(4ugrpg0%%wxCks48h%C9&oy#D=Vi7`n7VZpxCMAs|d6jXXCaDt%H3xRJ4D!m9eUQnsFm zbV0wuR|PH30FD;4D11fG{F%T}f=bUu>9n#^mzrupaV|AQQ0W=KWI@?hzAR|b%8`QN zP63V(lzkE~Nzm^Jz(hfD!UREa#{-88`aK31FX+n3VS>BCbYPsI-{XKo1ua?`D`@d( z;1EIcQ-Lvp7LNiB7W8{0Fj`RQB;X)HrIUeCf=b5&BL$U?1KI?|jR8goDjf|Ze3U&D zNcgC9IFRsBsgUqdsf#6iRB9#RqtZb@!bhb-!bhb8aYgue8ks_}N4*1CD%qpa1At_Y z7KLPw7WV^^J?;hj0?8hgT1ob(R7m!y)WwoLD(wd(dsMnNknB-uUm)3|QY*|KClk4lAPj~0bwkFItGl0C|<2a-MdEda?L{Z<3X9+lPt zWKT({m4uH^A1&VaE=whQ(0k)sK(YsMfn*PU1IZrz-uNbqC3|pn;~PM-2fsJI4kUX} z8c6nFF_7%R{Ee@&Sh5Fkfn*QjZro73|K(&4es6pkNcLbcm1GYVZzO+TPWE8&#^-@# z4;F8H7D)EsDv<2KVj$Ur-y5H1v1AVxQ%Uw<@y5rgBzv$JNcJEuK=wr3jq6w};e)t9 z!Ux$mK1?OyqeUU%qqwy|!bhd|0SO;13JD)A-cz{$Wx^+V?xB$E(c2mz*`rY**`q5V z*`xTofMkzKR{_Z$EegpVExK5;M~haHJz87=BzqKhCy?w>sg-1p;%)qs2u)vPX*xfMkzG<^#zdE#3emd-QufknB;ZknB-uJCN*A+?7DG zM{y+P%gG*H3CSL2)GS8!WU{{TGAaol#R&-?m0kiQe6(mK;iJWifrO71FGd{U6LA)j zJsQ0TNcQOJLLk|r#q)t=kA8(@kK*P4$sWZC$sS#~Sh7cpvw>uf=4S!P9;V7vl08~< zv1E^aX9CF{EzSUvJ^B@rJz6{)NcLz^NcJfE6d>87($j!sk4jGjl07Ot0Z8_!R7m!y z^f(~dqs8e!vPZu{vPV}_fn<*sCj(?p!uZA`frO71g@ljhCjbc_T?q*vm5v7zJ|5;{ zfrO8K#~_aIi8u?%9`%lCs{B^Pqh0U+|Fe8^{*snsTaIiQ-16zpd;UMb_5Mx2_TT)s z{+oX3e_~U|{rz|5+J4t7`z2gacU*su!|7rhK6z~0c zVx4<@&gG_>KToW4OUk+2F7xM!b?)&QNUU?G*14}&-dmALhTCn)eQQE;rKr zd19UWb4vI_UkocmJY-k%fe?6~|lLr8Vw>5jQCb}YqBHB(8f zb0^Tb+!OQXiFNKC8c3{jPs~7KojZ;O66@UjbMA9hUn{*P_uib#?XG{GSm%bHbDsth z>)c^;?vp@bo%?kL66@SlbM6zxdsigZx#Q^EC#qg8t&Llw&gItCD-!G67t}E;66@Sp zbnZGJvCfS+=ROJ~*10d}+{b{#I`{ZYC9%#eN9R6FC9%$JJ?B0EB-Xh(>s;ndGQ{p*SZoJw6R zv98h;0I}}hHh0Xut@=+kDZQ03O;%LO4XRg=>ruL-qoBnlj8ClVcQKGy*Ww}|v94bs zv93}fv98iZ)$eYyXeF_(-}yjdU8VDCezHl=JSvHG{aynk*7YkS*7bWOkWa0}b|A5? zY%7U%m0k`c)>V2LkXYBEmBhM!tt8e}dI^wNSE-O#SLsDH|FTKk#Z(gO`n?E9tn2qe zAhE8}^MM?3DispzDxFnZQ(BwiW>HD3t8`}V0VP*jw31xc;tU|U?rv~q?RBM}fOwP& zol4I@DY+h{XLJ-)dIsYY>nc47NUUq|L?E%QUm>xs(i3a{rnF{{MaLx8_3L7Zb(J0u zB-T|ry{`Q81&_F6s3g|4codLW*RPOR*WzR#v98}qKw@2`6M)3J;)KMye#Zfcb^VS7 z66=Z+66^XE66^XMQ}>sfELu6xBSF8TfyBB>g~Yl_M*)d-m9_zib(OZ&JzsLA#i3M) zb(!3DfFXN1M8ExjJq7*t1wJFFRLBaHE$nVZrNVB4O1bGyY1LZXgGwJO`t1WG zdsNEJrdK3;RJt>e>``emknB-u0r-R~P-!iY>`|$eWRFTKfo2!eVrB92O|Gh`kUe&E z?wDHvBzzFp{t-}b1;6bd0tp{1rjqbsHwYwrP@2UOJ}7PffH4Ullmfpj{fq&nsU&<* z+WtO^C48{h{w|R4!EYepgVOf5>uWj>%=Wi{jsvs(&BDER5I$OLf3u^2#r8Lg_ui50 z!FBtq^(S>IZGVkQvInK@8-QdF;sVJY{05ReSPUe4kR3?&ptSv^`ujVTw!g&Ml07JG ze;!EoptSv2AlZY`_Gf@(4@%pg29iC9YbRyzILGad-}ZG4L6eYEYiWVtSs+K~e6j8v}T94wea{_ugyv&Z1p_0s_Qdv=adDk)(@u07eriDI+o;sz{LeP&gKo`B3bw z0GSU}+zycWP;5dDTcf1g)2=X3EN|5(34ORi2gqOplynxLD}lnz0l<60`ZCgmKouF0`B24K0sCbzPBKO`x|rFE zW(2MY_ki-S0o_wl-eU@*e8j z3?T2JiU|OD5A|&VkoQnhg1m>4HVW_m|H$wEJ@w!8{l9(w*Zo`k&-hpPAN~p7|MU9( z?K|cB#P@-3k8hjrIo~SZqrQ2U{QbYqRvRnPy4ng_b-ZW2$GwNVZ+mxoU-Yi=KJH!Q zec%Uv|8It8f@h@XZclg5t)5n%>pb;69``ryf4V<*zwdt2{R;ka!jtZ$?g#C^|9A24 z|2^wk>H39hj%$)@jO$)kAJ?6(RM(BJMy`M>#(Bnh%=u^MUgvAh&CUwva%Y)yCjKr% z?giifJ01JC*aNYDh}|Chd~A8_FJtG&-XB{On-iNA+buRNwq+W9RPg*TJqWh zdI7ZL;d!AzOCFvIR`ozcOCBCJUqUv zY7fwoho^M{EqQo+DG0GOJSMG5MKLXTc)}-W!bln*2@x%Mcp6)k0?_q#M?0b=4^LoK zOiNxn8?@x%$!Jw8)X|cMhpvJv*)*P}3bf?mQF9f=zJd`vsI6)N(2|G8v5M$=8&5{7 z5)sjwho`BEXwAbD%c?}=L|r>4SW1`MOqONFvxQyLlE-XeF)ew_mc{@rdCV4qmON%lBY=~wF((=VVhK#0`Tz%ksZ$rA z%WY;$J%BE^nJtL?{s9(ag7^V52}~Uy0GHd^1FrG{W)PSy4#52cW=jlUIsw^o{9C{@ z0aB$bMdBOpNpV+lwDK>-2Ta{MHk9z#I3 z96tdVO+bbnukvpHeSSDWR4R`FWR6PZ5|AK@j3OXG6d6fC9v!bjW4hc%wjBQykj)5k zLLJcMHge+l$B5{18+mm62tb$H$RmL+w~-(!b}t)1>L@aVfNT-mLqN71Ka2(j6Ob*( zKL89OAVCBJ2}qFR`w_XDfIK?B50FJbwg_~+jchqyiAaA&u(k;L5s)p%cO#NXK(-v; z1?Wp)PV5BqAuwBZ0D2RcAlm`G2u!MNfSv><2qQfR%!#dly9mq{LU#g_>SaJT0<(pX zL12Px26QDbCkW{TicRQ3V1f`j6PRHe0e2FZR0LgbGg~%6`P*&fHzAH(@*d^{>!h(5vxO0OPdGtXN9Mx>SqG5$Fx%DujQJd24UqXTLCOKfeAKke zhdIGwG9RV^i^+VLM=Jp`A7;xcfXs(U#fZ#@*}{m-huQKNz?jeRWdLJ70+|mJWHBN# zAEwSCfXs*4G7lj0VYbW%$b6VBjL3YLEpq`fA7%?d=EH261(5kLCkQehrp`=&%!dgw z10eHZ9!&?xe3&f+V?M{H0%Sf+ol=0zhdD7B(1?;Sbr_NPFm(trA7)D_(g5bes|E$+ zJ=B+_jQ1Qb2FQDuQ$+xI4_5<5k?N$b6VB1ep&rj3D!2wiE(n zKFpSp0GSWdU<^R!!!*bT$b7i!Z2=MQA;^1}AS@>DVd|v-dBkE7^QjAv`A}>>K<2|0#0!x5a0MaA ze3%9VnGZ9}0g(AHbqF#au18LQ%!dg=kohom2r?gL3+ov3Irbeu=7R(g81p&yEph_p z!<;zwElSCIpu9ldgQexz*NDh_kW&JA57rrhyazdP>>Cu5_h8Xc1m2^|mSbNbV$A2* zS%Az333BX9fXoLOcI-4j=7SYP5t$FN<=81iWIo82VqqX3x?Qs>ym0GSW6<=A0> z%m<6cu|oiv50(>w%m)c_?BIF7|38K={q4mU^ESux7XXXmABZoG&x;=%-!r}weg}{c ze`UNc@>_r({{H_ffenEt14{!B2Brqa1*(4^a800Y;8NcIKNk1rxV>?&#chtOh+7`V z-wfOrmm4?eBEKBC*!TZKzRP`X>tEJM>#x>+>ka*m;0fze-v9sMzyH7Z_y1pYZ*)K9 zUgmztJ>5Oto$Vgr&Tw~dw{TzUuIF~)HwXVX?^g%Eab4_p2j`qs&X1h?oUc2#IG=H@ za6asuiWPG;ugvO(3(u@*$AfV7eq9K{1&PmXBn7koAPj2HCEN z%m&j^5t$8=H5s33Jt4Eff|i|nGIImPLS_Ra6v%9-B0j--LS{qZ2r?T= zN|4!L4Hw94C>$d)8|sU%yPlBQP(^%$^@PlZD&p&`CuBBMei=Y!LlyCL))O)tsz{L8 zQ0%1unGIEB9hnXFWkhBJPfA_{kl9eug#eii#hwq4*-%A%s`Z4-hWgG0$ZRO-Tu2JD zk)#a3YjnGrJO?1Np}sQ!G8^iP54xU^*-%ABWHwY0-*7!4v!PZ5nGKc4ms(HAY$z!s zG8?K$kl9fAQh>~ck}@K*p``e_>j{|+B^?8h*-*uNfXs#}<^p6k)QTXpq4FaEG8^j4 zh%p;AAhV&^jL2*#DeK5=DCtmu%!ZN<0my8q;$VQxhAI+dHWa%*KxRV~8Ijpg-%LPr zjx{AE++^k=A(22ydjW1FP{rj+fw z4nT-NebWHf5-2GnO$bzxk!uLliqM!qvD*W#CQvIz8WE^(TfkKWN}392NMIVI0InoZ zQbGd)C2bD4f!+yv?y1h@#)m&Kd}O3Fwqfx`JA zoWmB*k3by;sI?CeL!fYg&mJI9Qa3=}!z>`kdnl;`An&1yPJp}z`X+q~koQ2+r0)Ro z9tbCp_ds8Pya)OweS>219!M&X_dwF5uMm;es0C^82P5Kfb?}4OACjs&vsF-vL zAn$>`NhbjE9!Q#01(5eZQh~e&k_zNKkW>Kgk%~#jP)FtieUm;0$b2BFK;{Fj1Tr7! zn{*h(WIoVWAoGE~0+|m~Oge~SG9T!h^cFzo14)zidbfQB^WjpNv>yR^4@69Q7a;F} z)&hACv=+#FAZgNG6qENrQh~e&k|tFmBJY8uNxK2^9;m2@ya)O!BJZJ!yHHHtL*WSW z9!g4(_fYw50C^83-42lVP*O(ZJ(ToifV_t)ZUM-9sP86#yoV}o2FQD;FI@IBc@HJs z0Fd`k#dQFA5A`L;d#EBo-a~x}@Sd=wYXLGJN(wLiOy)yL%KK8Ikue zS>^-eJ(QHi1Whbr~}$a|=KcYwTy!Z9N6q4Mbf zc@KqSMBYQ;2=X2(&j#c@6uUD(-a|?60LXi&VkdyShx)>0Ka=-RMS{GC`V! z@1cq*0C^8pOajPzD0T~gyoZvu0>FF1!VzRXl$0Rzq1b>bnGYpx4v_g!QnXej^P!~8 z05Ts++7ux3p`-+v4^ed_|`JrphokoQnuKS16?;ezMg|Nn1!|KI%mzn}L0KmY#UPkaBr z`u_i?z5j3S|9{H+|K|SxC%pgP*?P5H>pt>3XE#9WKC)0?*8Q9}5z)Gj#LK}8VdYx) zv0~)l9k6n(`$#-RwC-cY5NO>;eyW((eJlkzFQbmueXJNcc!#T8>pl`Z2XA+kYu(3E zkb`%)%FVi;vjL!W9}7#)I)K)FEFU>|Q>$F-J|=t)Ug#>=RAR8TK6&GbMW3*xz>HG7y_;PSQm2e5?Hy`eJme2 z%K%#Uv1a8g1!&#JB9XJy`)WDXeXa{Cg=JqC(m6{|O6xw>)||xvt@~JYa~1)#?qm5- zMC(45#vHsiR&Lh)oP_|b`&d{M(YjAb=OLnXpJEfV?o(2{9ae7EeSul`1zPv1B3=(G z*Sb&T@pf0a)_qD!(7I1a30n85BHrOD*Sb%A@v2w3)_s^j4qoUg*Sb$h@eWtHS@(0s z0JQE?(tLo{eX2;%x=-Z^TK6d_Ug#>_%T;f1iLwCrQ0&&dL4*{8gj04)2uSrnLc zKc_z;TK6d_UKM*v>pqrxf!2L0kN3u&(z;K5@v7KUTK6d_LF+yx?GDhoPe}>mc~DB4 z0VpJJViLv?I57!h36!)GpnyQ(+5*N9C}|2{G=X9#0rClyl*RH0RFRQf0#$4U7)7Ai zgpmZ!#pZw<0wqlZWD_VUVFZDa5{45fX*0ku0wpC3CBU#%>|O%(Wn>6}DmDe&L!j7A z0D}pXlrV@uNgG4Ofwqc`5xAQH%G(f-MWCdF0R&1~7to);>DK_zkHCrT2V@ecVm&}# z0`+B`J_M@BV!a7ekX~3NXNSgg6;0^*LRpfR8BvqYG1W1~F62)#KK+^0J zfQ|%6D!7#ZtpsTVNSa-RVjT#OR3P(#@&cI;Bo)YfAZhk7)RFl>((J2*#`jf9tfBHEuw|P7!$z#8yP!0~HmK_dxmVN*qVt14*-Y z0pvYYaR)%&Lw&aaBOa9wx{lfV_v2G9vF`wk)(>T_x|Kr1Jps9!feFAn&21@ZVMP9!fd`An&21 zlL7J`N(y6L1@8&Zt73r6hguZ@WIj}JB0%Ot<;MbKK2(v#WIj}cAoHP$g#eik^<_ln zLrEEt`Ebz~1CaSpUp6iCp`>HHudagmNK%%P_fR<4?<#o@^@ZcElJ`(wg1m<+4hP74 zsA4ui-a{1`k@ryf!2o#=RU8PA_fTK>?<#o@Rb)ioLwyPI9!lCDAn&211bGi7%>>AM zs3Jk$Lw$Py8-a|A$QOyI+gl?w;gM_cpSg3$(Om`2X$yga23l-u}k;?*50q zr{njiK(*xSsruYKX}E#85e@RcDJ8XKQiql)_?NV#)U>3e&N-!}dBxL0MH6!KLaEMJ$El0g zz-jhGw42&Hof4W*92!5NI4@LET3k>xI+TNd%`GU&8CjT@d)|TCq@|{&wMngUpw=0i zHeKV5siUTD`=KqRvZa*dnk}{5w8=tCI?3C5_0GKWyhEp^wQir5l2Wq*4( z>DM+5xsp;#zm}U`c;I5aih3Fuo1Pzk$pZrYlG0Mz*Vb=C{w24>Ge~PwGuvCo{ximj z;T?PN6G>{F)}~#}!@HKAHwm7-gh50mcBs)*N~=wqMnVszZk>M*>^z>+(#+2`X*hUt z+Zr`mqejjp)kwkl^}E>lVMN+tO4U3Brbp%_4{y|#aOkw}IdpPbYU>LQ-QmX^`ofkx zR?KLV=`kB?iqvh>7N?2TIaf1w@l~uHXF+n!R7}BynhDpYg`s^e_F_YulGeKQ1(uSr={d(G56DGYdLizTTWXV*-1-6= zNU^5GJw1MmO@P%eQqT#^r?(HN9A^HfbqIX{j|A-PWk!zj%cxBOiBb%o|3- zyME{yQoyv7TGoM_te1MO_XDdx}+Ky#TRgO8hr)Flx-I+ z*Ry{_E<|bR{25zk%_XcOZ7x_xFj51*@4PQqDqBbP|Ifz%@7n+Wso($q@7w?Xso(z( z@Bja_@BfGQ|9|55|6ln+&$rz9>nl%KuY95BTlo4%jzJ$eNAF134(B=w0zEQaq zpv@J0vqTYXuHb_ml{*m8<_bR8QMnzU%@us~L=kPS;Da4%K$|Q03U)JW+hVq;d<612HOt?*@`)7o62zViY0=F0lYg#c}? zP+x*JSE%A#fHqgCFF~6tRFR;~6{j(|)8g(LJOP`ETe z9|E(WEuc4n!ZFf|KuHYEkTh zCi9`B1ep&dbwWj$j}}oU0`eZp%lh&jsu%;1_dwr0-vQ)3kW?V=fraWIm8| z&sz`<=0o8WkoQ3NJ-bj!-UE5}ya|x^K+-+C0rDP5Dv4ZUD%8 zs5~R`9!k0zAn&21T}Id?@J>fXs(!uoxiop^B^{^PzBy05Ttnz0mv0=P)0s$bh_u!p#TBdnnvI zfV_uUFb5#-p^7Xf@1cq;Chwte1bGj0VirK&Lw(tRyoZt!Wi_fTI(5qS?)ECR@Ts4pY(9!g4(_fXP&fV_t)<^tqB)R!Rd zp`-+OPk8!e17tp&n8N`wABs(o`B25d0GSVkBglLxb{0V9LwyM{9||`RAoHQVnE;s& z_3Z=UU_KI#0eKJQ?E{eaP@Y}@c@MSj0g(4lD}ua-ViV*&6uUb>-a{1`k@rxm41m0c zDy9SEJs0j0siuG~-AJaQ#dkp^a--`Ir z@onNA!FPhc362YP2)gn2`&I?U2hsu_{|El3{6+p-{oc3(ajWs>eW$oM-$7r6uh@6H zFJK+Ap0P@;JFOu8THdqX$=)vBx}Lvy)_JCQ(mj{CkGR*nr@Fhk>$(2w+Tfbz%5Yuo z{KWaZ^JmVU&W5pnkKG*mKy2^Ws~uI2mmG5(eI1SKoT#(4&b&HVb*_u~99_HU|60vn z{$lmk%z~`GT?Xl?baG0|WSN7cM6FSCnTg9f-yq{=(dswCHZRn^v{f;s)|o`Bp>Ew}PCn-4T2-v6Nwua5j}qChiTOO*QKD7BZ!GLVej(~nqAV2cO_gX_j7R8E7QJ?n zDpAzu2Hu5(+}2cyHoZ_K%8YCisdDndbHT1yt(|XCjl-8zZim6{Ms;ksG%0;W(Y^ua;u2lt-_<~;wY92SQu2QRG z7p)T6-;CLOq2pb66b@LT8L(TT_N(SvseavP`c>!FX#J|SSZKhSRac32lxS6MFjZpa zN2^lXjF@2wkt$IZiwk~0s&lzMQsvPL&jp5Ga~kVh@DmPuNqY3cjzzD6O=NpTjMBu>5@nFDh*Wv}!YcS-L(S9IAlI+1a^dM; zScOS>xk<76qt>X^FV?6RsS&kXQEFUfYD8I&(5qTCIPL33PUK*;ZY4$W)p%1S+AT|R zTANx`cqT#9uM6)Y`J;y@wi+-8iFxV5exXW~Q}I_lY#2L3iw3ek-*%*l)%`)us~*@OQ3DwrapB8GIm3%Q0zEmy>pB^D zLuZbjoZ&T^jJg0lIm4Sk8F(pYj-H(1HK`1|hcib{&hYMzB6@O$cXu-I9?l#+Il~J! z8F)iyj-H(1-5r6RoZ$r<71NV5yi=2b*LCLT$r;|M>G~Z&PtNe_jUsq*rdLuG(Y6g< zfa>}!ifP*hZ`%m8ZG#tvy5g;#Ioh_t%RgQ5R?i%5+u&^|fwpb%o|Hh_Hh49v>sb`j zwhi8f>WY_t=4jgnuVZyR1<P@e!v6}g-MNxL3Fq#gm13N9l+(ykvPQkMWpyB-3> z6QH6XNPxbA00EMA{Q$-M1W4L-KOl|(6}#>Q_y|z3>stVe0I|Ei3GfmioFX0qB<)&> zh?@WvRm??z@?Cc!qHP;UD$uqKR1|32hWhSAF>Tx6ohgB~ZK&c7>($xXwxPb;0NS>p zq+0>nwxOhqXxoO8GGcGrghAUjl=Njprm=67bPHfAfm#u!5UB4)z+?jT-2|9KpuQUb zr36a4!Taj$5?fLRiW#7!YXSEWsNy=nL<03)1DHUdq^kf$1gf|iFrGktp8ymRC@Ena zfszu&5-2I5fIvwf1B@Y1(q(|r1WLLXkWZkbivW29s>q18ZK&cxfVOQY_FRCrZ7At{ zfVOR@A|u+ip^5};+fchB2Y!bKmyaC6mU0zl1>I>5hy8(4IogfiGcnD>RSlm`q{!UkjVhGE&}u=P&h&# z0);OG^d?Z>v4CC#N}3PoNuY{j06hrQcO>900#zh*Cs0K~Hv+}Z24oN@DI;A8lyopa z+cuPRAVAwT6s|u&+cwlU6QFGy>e~mPZ5vA33!rTqs@MadZ5yhX0noM$#ZCuk+lDF< zv~5FuSJ(RQoK;A=1 z>jC6Flr#vC_fS%TyoZwd0rDP7>IKMqC>%lFLrL8Lcu&|d2{Iq5$YL@drhx+>^P!|p zfXoMyro&ig%X}bd`gZ`C4^@l-$b6u$iphK+Y5F&a$b2BFK;{GC(!YjqFdqt+{xwR; zd!TjtmjHPWv=+#FAZhwnh{$^&Y5GZkya$q|p908xAgMs!0~OOxBO>pCis>f+@*apS zkoQ1EfxHJQ3gkUdkuXc%1Lf0?0pvZ9H2o+*-UCU~4+G>qkTm@eK;8pM1@az9n*ISI z@*YT<{w_e?14#w)9!Q$L4-t6}Bu#${An$=z>3ae49_XtGyhk7DNUuah=7WV-AoGEW z>2D$;^MStUI{`8u2$#MaAoHQ5jL3W__I7~Ghm!69$b2X%BQhVVNRatZ-|gO4XTf|V zDFgBz3bz#?@1dld0P-G+y%8Yqp;lV}@*b+lV)7n}&0_K%sz{LcPIRKdt z#hwX}`B24K0GSVkn+2_4KGKQ-c@O1f6?qS{U^+nFLwRQa#pFE{ZYn_DLwzR# zOQ?D{iartS`y>z?x?b@w9Ni z;Y#2?F&$%1I5yRp9R4S~B_9}8CoSfB%RRT-ouzsCp#eF?#W`cWhu00bqF=owcjn{W z{7`9LNh#m2pHLJUP@0!BZp?&9C3&HOqLR{_!or-=f(b<}LWA-`lP2col;(v>$K-{I z@}`8+M}>M76pafFoKRSrGdeFcrJyKx!W2{s-BnVUQ>vN<#R*oQV?)3-WT==Q|4vYn*XOt59HA?8cbu>$vB3J#XYZ9J+*V zGiLpNHFUMl`+wrd&1u)ibHT{DIC4#PwOjRnNABV|H>X|i3r8-NBiAS~H|hV5-1m%J zho0e)yX(B!>cGhLf8xwv{s)Yl?|<$>=L-yr$-B*Rx4f&UXu{;KMR~=er(snsp*P%_ zJHDWZqxjlq>odC+<&13C!xO`@)( zZ5b>VnwV3ZGagP;T!IDPhjqVT{G{<*`9lNKyKorA_z=vfF*(IBo>7yEi}Q*~L!p%9 zq|lvnZ@$tKb3+~X{F^iLcme|^7UY#qPw*aInfkXG^=Fk#!)c8V73byTP7CGZ12eYy zrG?;iq1?R51*7sxY|ENdoR`}Ij#*eR9ws$lkTD4U*OI*Aa8a0KaVb26j+ck=!MABb zi6wR&{>PEw58&L?B9xMf69`S5Fa_NznI!Ll2jz~Pgf5}U%z->^QQj!goxL-&LU}OT z;-b9L^8am6Wu=r*=w1B^V@lH#*b(&Ymqo6N@L5 zPAHu=5u;@e5h|U)SWC3k0^Y6@D4tYQ#47<9B2_3X%qv8{^NS~7c=K>B`ICx9@p>Sq zuvKV4cqD7qY!&KRfN?CDQcyZ-3{G+sMzbV;QeojV4Kz=)7zu$PW2@uM;6y7KN=%-L zgV!iNy0{?sqGel!e7D`!Db&BVw5@#lPtXh(H@VYVgho%eE|k_1ZBHy|-oVX^qg&3) zN$=suzZmz>pJrt-aWRx*I3T$bit>70fwFbn_nlW3R|6~VU-0Y9SzX5D6d@JOHPK}I znrKk?ng}DUOPo+kUexgaCnXK3AD#|z=QUT)d-zwAHmn`871zW`#S8uGjnNUV?UIDJ!LMiQACADqEAKCeuhwdsW$t&c1z`qYF$i)OKWdcv1(khhRB{?(+ z|DN8ZC35Na+w=2^LK8-YMo%hbuApeBXJOv>@p-8E`;{Y6b7D?W(WIi$B}mFirPIyK zDagZ2MVa&o<0g&AoXra%b90L)jT)DSYs|jIxmbHb<8wxh$t#+D=Vkx@KZncehDDxs zp2(K>@GsY0f7SHu_R2P3LYK5qN>YnZHzfCfywc1G1x2N4A^e9fSVcw_>jE74g{5vl zX-;Wg8ZvxhUTHyT!Q{NcXl!iu5DlMH*lw@gby0uo@z6Ecb-!UyycE@Hn z@xq+zxMxqhm^mZ)9=R>;&HMlQqlLb-pXp$7oAW!E zk~;fxhbQJHC^~I?4w3`*j8(X>pu~H4VZB>!?~?I%kw z-5>WK{yhJpKrpZ*cx~{Z`0L|m#-DNBP$$qP@Q=W5{OX`G_-%Ye>|bJ6#=aZ-``DLbpLIH8|DV_s&L++g z&i>A>&i2kno%5X2oO@heS4Y=C*Fx7p*MGY2aF2GcbuV`B^2Flpgbkj5dRuu%dKXx6 zR*H3x^^wovyU91j_b=c6xFY8^=LgPzyKZq!biLsEqr0{H*Y0;bbv^w&PkKJ~Ugy2r z`#b9f>tXAhZzPr`>%9;=^o-f?77A>+%whlisu{et=kfID>gU)Yl_Cc5O%O%ch@Cj(pR=RrybjToe0j zIMM*H+^TqW3On5xu*|C1uE)B7Q7Zs?a!D8h(8ds<0U&7V96$qln#~3>t%~1iBL$E< z9L2P8KxhoW6LcMC)M2aQrN%Z4UW+;!4;Fg@5s!)FBcja)MDkVv^6f|-n*N=hGBeTy zpr@*A;D}YR1f`^IH(?qqS)XnG;pt7Y|v4w;`in_ z6s4k0hN-g}t#z~EoQwdX?h*%=z%R; z!zpak?hEVevnpQpnqnu=fF5TfGNC<+8G-vOLPT2vj7&#snq_PaL-o9Apl@BPqEe6A z5h<-iG3_Y;#w6f4%5lJu7N}$Lpf7s;vUWlkIf>(px4Sc8I~pjoVGPdn<(@VS*?{91 zu_n2#ik)>#vDGN1=izLv5XaHP0Q5zY?=)jjfbP8EGROHA5i_D=j-mnWXQ9r$%@HwY zT7VwBagAMPVkh*V#D+=TaUAU<@Hm(lzcqP%??yDB9T!9j)}R4BxCcy}VO9J=n}UEz z^HHa+-P*lHXwB5g#GKnX(T)^Up#d`n6L+A2>r4+Y*1zp&8aR!JNtek;mlsOy$N)(H zTa(vAlhB$Gcp}E&b+=t?Y$6)a&JOxExd$51<`iJSNHj3oE;e)`8klOseI3z&8J)3X z(ZD!6GI=2y(3TAwKq~*%OpKwMt%^6}O#>K^*R^?pVq+ojTTau!UNm4d?f)t2nBl!| zJL;IG$DTwT(}O8~)VbDfp#KvnrY$uzJ+1|cX@v$%LGo=ib8aXm`U`QU&QKi3tReS( zi(+yQ)ES0Z|CX6^Qx;nlo6H#WZ;WDQ{tTOpVtICJQ}&?;X3mX+z?*XINWa54j+t4- z9j%I8CMm{kLIX4HVpD^tW0dQMC3=@RxpC_{P&!F@*U8R*U?({$!?6f>Dvh@|+VnM_mnqX)8m9CY|}OboLgWDdk}jM^m* z6l-N4XZSX>X3nP&qqEN_H)DlWvDpmo03^~MhuC$d)k6cFO#@JSpDY*$opA`qX=6u9 z(y^>3*f72r5t9ccbJ3bvZl`6Tn64Gj!1xp#)QFYU6vw&8ZeRq~kbQ$~_!)9%vq|!- zk%$zV$WW_duj%zPtYUle?MTU+h?pf{8rGfPn^`}8vsHobgokanXJ;I=$c7QKtcrI` zYd^!p*ke+x6zk{)BUVobnl`OX$0D@ZOtY+Vt74lGc*HKWcD?E7VXTQ}9WBj3YvvSs z&OvKtL75KaDvemBSoz*DCO(s6VCHGor>Ha5ZhAUSd)w7E;QQwl?_}CA6QlE-S;>2% zJ8#FDIv=1|jw!Yh#Twes%VAZ#ThE3Ea7pma{ifIv^uR3ZcQ-{bGZ!8hiKbKRV)qY0 z#K`!-QNW$1wQ>||WQt+jwwWajU*)fO?q)mEt22t35xpPj|E@XctY)aw!!DMM(RtCB z>)j&*lf&0<$f{ZEtcv$cip|1u`=asFyH^K(Q(f#7j$`uRex&kqx0@c!4ZIh=(nV{t zkuL8Umzj-a{k?&9vDvNA9b+Fk?x4$DH$OQCdA;A{_3STE%p4~hX7pmR-N4;PgDtA- zY(bsgc4ST|x?_@}*PFqNNU!I7g$B%J#K45$vKUPaT(%BOz*VR6pi%ylIn%9*_nX_T z{d_XuaszEq%#2P>cO1t|ncm*utKsfkjn>#voi>|Z12D5>;OgL?BG<|}FtArmlIJXp zw;~M)bR0I2iw4Ye9+;0h?dBO(LCHF?e|^liFbtatbLL6N2h`EZ@+ zW`s>w0nD5mcr1Q-SUEQEDO&4b7sGKjhkK2a%YkcdG|O%8`DnnT<)CJ!7@8hg7Y!Im zMh0;orc_1)0u4NRJ(4$QY5ppiJ?r|T({p!iM=W(a|I_~Tb_!r^6z94V}_nZ&8K5=bxJ&L>H z(YTvF>}ig>>7}@vUVyvlTXCOzJDv@E;eE@Rg}doY+*3PnZ@nJ(ylJ?TFZU*OXv>S^M2qx-2MIo_r24D z*}+fo4B&s!Kk>JP|8d;%Kk*-?SBzs+IK{5Wf3WE(fM(X!fD?{ih10Te{)5*yvldjQ zGvAsZ@)aVo_XdEY0Oe>S6mtU9z*UHR>iA=L4QYyq7oa*JL=K@fEkY=EeFz|9LFD>| zj=zUny9VF`s5L;-y|F1Vnlk9<^(_FpSU^XwPecQ{{6crGZwk;dh=Vq*L@`~+pl?lg z$F7L+^As#VY_ITPa5~qg0(2Oj+t%1w;ZF0c#{kr64$dY(#I@^Yi!(m&Ah!#tp z^%#JhfP=FLO{+T;VV1KXW(XVLDXc}YVgk>!7@(z>V>lMYLUO01j*7E^c&^S^>XzeoltefHt z{@@_+teousOHJQWqgsVm5piPGZRE%d`g<_UD>rJK@ zN2(82Mhy;6VK<;Ri(LmehB}ck+<}hjI2@erC>9x<3@oo^a5|$@9s4j%JGveX_l9Tv zrnO+Nv<4)i)9)H+`JHP|xEKbs<;T{750$Mb))sZ%?Z?&tEqA(3MKZKyIf}_|P^axd z6iYM3=D4q@ZY>uFeZY<+9z`8p?4Y%FPWK%#@(whRSm~Y}<3v=)!hdMj04Cz6+YKHsQ)pdrt*GB5x_%4d+VE~J5bAJ_<6|J>e z;b|8sc2hcv>6{qB34W;IV&Af?1#j!}77g5l$^Bk8`vhBkjkDD?H6k}|@LUsV?G~KR zhkDG0NV{2Rpru{srjh3z^wv_eHr$Tf($>>2(!h;N5i!&DmQv4yk(0Xx-T6>M#lE4~ z+gcRaw^i1HgK~Zzbcg53NNYFEu@>yt!h^^yTRg8sBDbJ{@cj!SHx_w5jvVKvov34` z-7OfzkCcokc5Aukn@9urGr$Y>>mrFwf9Y)%X`tP^0Ha*TeY(0>FBCI*iof5y z;B8%PqX*3!dyiH(-3wrvzUez_!9IBbirrk_TJZibyXj=4^Fdu7Bhr4V_q#})WDM2& z8K&48E2X;Wg#goZGE{h9H$Z408B5Q>@ut@=Th;4-GBWXflh?_KR!Mbhm4HZVm<#V~ z=A*Tw6P9fTNQ&ki5iz-wf`t9EZjIRMvsP7jg+j69?|hF$TDv(Fbxc;Jpn-i_|54}W z{s2840W=?CE%-n;XMom2e2pW0>)-{LzO`z|om* zE%=kp2he&mKnB2$E=SX5z3Q;h_peBu)}?Vpk>lK4j9Gu3-JKgxV04<=(0qAZ%Sf>f zyAYXaM{dS6`;%EVQZa-7Y*w)j*tCh%No|E>V8kO}FUfKNN|yXochGc_1QbRsOS)NSlw52WH$7n+FoB&-8168Mn4Wv0j@L zYug>I=|T~$-P$bBxw=>r^v%qywm#hQn{jJVhz68m7=yMe07m+@^U>>}_L;U=7_hH@ zQ0!LZ^`SyLa%*m2cVu{PZ5#MHa?lpg^rQAHhB_T_rXQJ^)v?KW#coBuePm|vtvKy> z^kjfTRf&k1G98BouZ{FN5o_;9T0_`0k7F{vv)NGlK8+%;?qB|{{1wRiD2rjJ> zi*V7^*B*m}vF83CmwgE%aU5eTw=G2-bDZ0dVuwxg-If&-Q|B_ffy9LX86_G>oP+y+ z)xmXR;v5`D_t+S>gmm2Y{DpPUgM`lU_l5g*J>U+U_9#YhL72ERerC7a3kwnOF*%f1YA2O z)I~(SZV2!pqGv7awHwD#9roG*P>!sNDs6NG!I-8s2hm&f93zof7t)dCA|N?Ij$mZd0biCOnikfH*Qc|kGR|7 zlH#t9Yk?MpFe}sQVqMDn|5thap8xcG z>G`|opy!XC9iA6Ft3AK+EcE>B65jvMb`Nl8xI4I8xUY5BbGuw$yZ+%i;(E`u+x0`= z|KH+##<{}zuydBP#F_8B$JxtyyEDakgR`MCF7~_FFJk}e_y4_)e>+Y&K5=~D*yGsd zc+RoP@u*{-W16GTF~ZT`(bdr&DPnC~-J6Mr&w8E<0eXc~a{al+fSv?=#qwN3Ko0`G z*Lki!Kx+;@s(G$1pgSY@MCZ96KrV~VV4m{>bWw)yTMD$keg~ z0bT0gd!OeVXiPKtmi+Z+zXQld@R`$d91l%veA!fyc03F|St@8tz{gAlZ3y@d=h<&i zN7EXg1r=z*;}f4}zeYqWdJ5nxKr-v#gP~{70(7B)kBpxE5^xJ6_(tg2(*PMJzUq1Q zBtYu|KGb^l1fT_r;RC2=PXTTw;Ip8LXpz7dRL>qk3a(%= zs<;c0`UHx-18_Nkk}^_{KuHO55vsTyP?r(vyA7agElNs|_fgWV0Ik%N^ksnV@hItL zfNYhL5`1ip!VxS2_1y^Y5~%MwfQLXyHvrrOs`v!JMWBiVIUL1a3DDgIC0zw@uoxv> z4yZ$*aLWKO1nRrg+V-?=H7Fb+PtRn8k}d)Kj6fAxYzBd8un2HJfs!utZhLyVtrY{) z7@(pH0aFRonxJa|syH8@%T20C(ESlrB$Toag(H*@m=bdU#RTd*4{#rWk`g8oC>&t| zfszu62o!q;U_616&IIU+jFK`kjuA>q7)zj}(*XqpN;(yw#}JgX6fl|*syG>tPoTbx zq1fF4@*bu^XMntiD&7H*_fWV_0C^9^ zP6Nn$sBcGryoZt!#pFFyks$A(ifsY%9*Ug`koQp1B!Ik!k`iv`DNxd80C^83 zO$5k$C}~pwyeB+=n*d}!RIxEY=0g<;G9Ri)koi#g1^}54Rcr{5`A}a*WImL%J|uj%htm>@oYyoX{lBJZKT1bGi7 zWdrgaN=lITP*OG^@1dk{*{9__l+*!`_fS$s$%xM6;M-%hRNr21;`kpxokoiDT zfy@WOo%t9MnGYmAa|9ss!TddQ7$Eb3q$(!!fr^UAe4y`{11Ki*fuv^+LPeMlRXlSL z0eKJPRVjH7R6O$mBJv&xcV<68-UG4EybF-`Km@zz6@*Zl1NV&X+ z`tAhCdnhT2mCJi5_BMdLhmvju$a^R$Bk&&mb(AwN17tpwbPGV{LrFISWImXfXEp(3 zK2&iHK;}bz%KBJZJ!vjFlQsz{LcQ2Chvc@Kq~ z0f6`DlIqMJPsP9Oq2=kGO*$BvcDDQB9yoZtw1;~3S96{bgeFp>NJydZBK;Ai+bKF^;!T3G?!@fs+bKSpm-|zl|=K=ge z{~2Fn{whE2m-xl}p|~{sdH}zQ$FB$0;Wq&V!3_K+VOj7`!B^vx;v3+}#b$RmcT4x> zu7BaL4!q%7?|Q^F#Wl>;#dVV_-dW|`=iGuj=2^H~?u9$$hPX>U8v9o4rr6)bei-|O zGYIA3>u17f|mI0e-_?!*pBxx@HRo*-{KCSSN~1_{Ip*c;29G3|Br@$M}I~Bye=WY zY);b#f}h36W3C1yS!GXZdAtVD7@*}bL_i(QrKI8PKtmM6^2o<*^SabUF}c1A zV3nYZFF@yy zuH?@LXk`P8?qQW}l^Tp>AR^;nWFaD2oEdRjW#JzUGO`a5txSNt-B#HyEi8c2d59$0 z2hE#{h}L69-a@sprs*8y1pAj7A_sR#rENIb(z7)VMI*R zxj4?=x^}UjcSl4E7>ea~Mnstc_&Lre{JU;OVi4(Q>g+|tG%#uhBC=H!o0|!caS+ha z@Gr{&qh?xV@9L5euz(R+BqN=yvbS{w!#c|lQAz_wev3M~;AWjHM0AnP$ad6`o~&~K zk*0RvM)EkY6lMN`<%lR%Sck`HYeyc$1bJz)4LRSTj_J;VLx{+vQ3t>F8=w*QB0bwdy)0I77;VP@_d2v;F^Ql#~ z-VASlXu8hiXuqYXV@~d#7HF-7eLnNXqK;e|4Gi!h($z#TN8dBOE-M7+3IxT<5>aQm zU2Fg*(>^mx=3y<^Z^obu4Xifdv2srnN}3>DB0gna5d(yl=F4csd%m#y)6|Bn+6*ynkIpt~O00 zX`VMQI1vr#4gpOs#`(Oj>t2EbV6yJvotRQCb3Xgf8irEy_%7th8eO(xsCqR;#AzSr zu2bl>$<*FQQOxMq3kQAPEI5Oa03VnHSd8=8WQO;i6IR)3v$Wo|1*dHWBx^S!0vz4#%T{}W|jTPM3!Lj_>;-U zUmQdoGortE4CiB@*BF2n0*=8*tL!)$^s}Q-{ZeR&uy;-sPFGjBm?8p!_aGNp$*1UBL%Z1BouQA0 zioHhD2Tb-pf`LC^I{L^OtL%k=cAb06QOB5XFGLQQDYFz=^;|2{^eohgv0(@jc5S8& zeLhB=2W(i1rRaq#Ofh6g_?KDe^`pq%4^vDrB+`cs3~WSec{cP7S!D;!{CV^n6q{j3 z9>om)&`g;}G1kwSRK9zszi0S*0~a4Xj#*`!)ltCEjySoH-9RryDzxNbbXe@UVRmF- zj6W}YjeYahONNbRo(|j*+!!e~e688BN3ni9g(0T3U0AQpxb>?atc;w(2sFLL zti2=d2!2`}!MMF>hH6BNc^QCXa4i0|NU==JpLM2z%meY)MF-$4Z=L#*wb!$PD8n7Ph2Pvig!^q* zU^ku)bPm*U{Soih-{snY?*j~RH* z-emt8zu^B<{2;wse-K{)813HWUW|7LUh!UscjobKJ?@oPSX=P!|4nfryn`?w@7BMF zw*dO$ivk;QfB$Fazn#zFs|0?$(O-%;`ai=P2>tK|!Z^G^&c@n9>doUj_RJi7oLLb!`B14=o<)Gdbd9rPb${n zz5U5}Cb9%?Ewl*Mb9KZU6Yt=w0abV_;t4!O$-z^T=kWw&5uRnV!Mhc|4UP{!6?`@L zDSmZvJ$`@jT6_iGyBO?0i!TJ=oqv3pVHuup%yd4AFB^=&R}T8)iwg6ctME3&=Xmn5 z9KYVcFFEk-gPZXkgv-KTM8G!^>@OtXTM55#B>%X7c>9n4IcA2l)Rq5a_G19$RV-j> z?2X}{&tJy~09OcjO!j2<68yVLH32MiEDzVmJ5Aa10g7A;*x=Y3z7@txD%mRly4=9K zEZK7bS_5tX;Qgd+T7~dtO!lnU(c$M2c>g7PD`0kb&ODht2gP*#bp;~Z&;vC#%Qy0Clt>U^nXA$~x@m5Y*A75XU2Sc6F!UL@9YA z`?(7d)#um@jD5*GXm~Qa5}*_1;8ez9fbV6~7@gPqSZii$3KN3Xn()_s0Xz2rM%u-8 zE&=o~kO|NQ0*loJ=(GW^y$h&g7kdrwhW_VR1N{NI&SSB9fHXU@V?RK*sfg@Y3Xo+G zvaE{lbZJMZZ&iHT%dYckBY{ocR?Begkh3^n^weR6QEcjyi)M^S7^Qyf&u16Y99sSlWepPzx_m_%AK z(yI70&hEjl@NU~dBjZA-eR8lJso02O38vV0Rz;OLpC?z~I7aOSNQyI8+Ql|jqE1H} zmfwMc7Td67HR@;rvTuv6iof_wZe|r?3KI zeWpiUh^#t{6U4r;RMkz+WHfild-f12sM z2BY(tsq<7eA_aD9&m>tDN6hN7bPS61GsjtFRU9>aThR;0F_U&_Gepc#tyqLQV@#co zt%_4IrfIyLdZdL7OEKpT&aj~j%LXnr!s}Z(&gYa#q-QWOj+zl&u@{kBOlz1wCv+=; z(=JCUpXz2u)?(5g>0-mu6IR8a>)BAY3=uQ8A8mm;BTSviIF6Cz*FiMh+K!Z$qXDDb zq6R3IZ%2NOG5Flfg|+C;sVSzlmr=*$XxRZ2OSB`;wnft>Dat=ZYY&*#FmB<$ZjJMK zb~1{Mwj)n7dv%wB$n!|CBa`jOqlGw*uEP;oG|;N}YtTeCpaIkL)A?xHvc1%inC_m zH(@&eqorx>7#c7u`Oneozne^432QrK4D8{-sMFQ1v$`32pr<1|1&rG?l!ECL2G6a+O!CLGt=zh z<%pP5*tFNG_}Fx387A#9lkva7bpF6=w>Ebw>Xg{<0oSJ-}S}+F`>> zSosbauYVXz&BqPx$S<)3oHM@g0%e?PN7m0mYeuY!R_IQ$9r+Dr@E4}e1_z4WZbvGL z&`~4f+-+9Hzs&0L@@lK%Bh#J5jnRN{nGKy0F=x7XIJ#pNyZ@KFw~vpiyz}>QCYj7k z9-xS*NO43&zz}&7At3T3q9Ub=l)4rPB!OT^(mVh{iqxgnT1s6BtOb_3Rwza4x)co{ zveb25pwtEgij+!fsZvX+B2Y^y{I2(V&Oy81?n8Bduh;kWZU6D&bDuM3&UN4S`<|0C zXa0F1FM3<}qMWMtZU|uQgS>@sa#&o=i-yz2{L@sz6TkRbwh8C>wJ)*jFsAL`u(vS4*5$E-aIx@JUZ;6tu!F_NSs#Sv zzCWC8rU#XEqdB&)?|h#Z-FJCV`6_Sjcz6=O|4?G(>2M{~xRqlIC*l=2Jr!2gajN!( zgZ8UKSviC!e#PDF;M2jbH_#K0_Y2_ruke1tQ?;-;v2t%!cm!$|&V0{|WC!7!+c1bq zIHf(qXl$MxY_p^fI|$G9LmcSa;q1R+DeJdzirze)qYjso>zX)%@Kk-XBRdG^-iJ8X zr$Z$hfKy=?`$21#Y~ea_NiCIdvikvZ;@)tb_z(yBv#=|Fa}v!ef&=}*5)LQKh0XM; zx5Hywf$hCve0=3BM-b-ehAoMezwZ$2U_H~*pK1fxypKv|xNBffm~&rYn}gxR_01<~ z7WUEgDEUR$`IbD->xApX4QJRvaj>_q%w>I@8^DXa=NK%9g>{t%;(GIvT$Q7@GxcSBvFBG^h$UAT*a0AnhC2Z3}+i+XX zj>qF0-zTDUlhBUGDHN!{y*F;<(a*g%22YgSqGPy5&A69n$75{c*^JwVb~FH9V{*rk zD_zu#n}iHbX>R!0v5;o|e8Rm%22T>)axb}4X?DpEQXaKuTeDvktMECxJ@OPt_S+D5J>0iKX${vM#EDv~YmYFd6LAdYF* z;#BabKN-Cn@Ull1#{)@iFN*@FuPh22`RWp5fh;wXMO9(~SsVvs3S?2>ESLE^fT$|6 zDDb*Te#Zb8s3MD_fffS!1&%);kkV1WT!F-m0GuyUDsVtaoWQFInI8%`%jH*azjh#t zg8(O~{1yT;Rgu!Zzzl(u_5r;7mC{~-BT`Cx0A8?4X+BV`ZKSj_;5CrMbpgBrky1gW znn||6@hzo->8ePnc2F*mxKw=O@%sXCDGFY=NpCx#OsyndFjXL>?E$B%l&a!Yk6fuz zqGs}|iep)R1(Q{gMZqM2EDDMQ64w@(C{Q={lnTBeki|UU9)bL}0{%uI zrK;R5ki|Igd4c>2#tWo02{`0sF#{NGltRI|L}* zehT=k0Hxbc0AmCwHF(W|((T8nc+G*u?MH#z)eKjLQ38~1e}{@!^N2ItstSG$w+QGH z+Ye)rRjG#G_QPy)vkK_l{w6R&fS&EmfU^gS+us13Js2@Kdr-RlAQfj1;tb9nT)COE z2fwa3d+06O53r51hu*S%Kj7>^sVmMN#BJY0#o2?>?YjYI53;v60nQ$j8k{{Sbu(uV zN?mdGAa47sY~$=f>GmCfvj^D*XAerZzf8s1gVOB;>v3m~lnR_ZQn~>kd(uib0S+H2 zeI9W5$fBA#eB@UZhmR~i3pjk_SK#oGQh~!q7S{p}ANdtHe57IfLzXE5Els*JF zdt~uJfb8**-98s^_-J6(0}daF6F7V%dlumEkzawsM@j__A1SQ`96nN74LE$HR27Gh zlvV)_A1N)zBH?3;Bf?`5gl|d*pXC;Ovo7fwMs;ef+OLv|qG@R7yAfWt?A2LTQr zSu6w`KC&oq_(*nNz~LjM{Q!rLED9Vx^4kY+_(-X?arj7SL44zTgpZZ>py2G0#eBfo zBa7VtXOCnHoIMgJaQ4V=7r@ygah(BYkCb)-oINt%5pecMsleGIiz&d_BfqLRdt|X4 z;Ovp#Hh{B7dQ@@t$nPb9vqu)&0?r=!6*zljz7^o?kt>0-M-~On9?8xF$R20*_9Wo& z(I_Ql-*fm#X$)}q$YKWI@R7w9fWrsb+s*(EA6yw6KKL~_eDG^<_+ZiC@Im&rQ|!Ru zgT-y90f!HMx1GWw;UkONPEc_6pm*E5fU^gs24@dSw;iM6?7^bJ*@MMx@BD?&|9|QG z|2_CybX)%Ne}<>|zsX(p+xQFhGyI*pfja^I=imRImivX=F}cHX`{s7dZJ*mRHp2%J2XGCh9}p#i2QsQNN;1Z0+?FvYqi05^zvBDcdpd^_@3 zNWuBWaBV&S zINunD2Im_C%;0=uAUE%$ne&Za+`J!fzR`KSo;Fv+1S5tAoF?$#saLl01tEf2O zm_ZE=I2qA44mf5|R~&H6t<8KtZGi)hiK&^dq%Cm3F;BYUfRjb-+5yM()BI$7(*gp{ z7Wqos0_U47E(e@%vM6xAN&Hg4`6i_T=bMy14mjVWRNFY;q*TqEZ&E67zDcRT`6i`& zr)`1rO%@vf=bQZUm9z!UH|FN%1pxWx&w9-d0}ePTeFSj8Nh#koTi}3`(%FCmP8Mqc z2b?Sl9B{HIaKOoYHQ<1gxN^V&C#4mD15V;palpwuUoTtWfRo>8fCEnA)XV`VrE2DY zlWc(lPD%w1IJpuy;AD~Sr!8>6Nw&ZNCyRVpZ2_+XCmClnR`0QaTQBzRBWf zfPC{O!sc562b?Ub;(*im9RWDtq;xRgfRoaJfCEnA`T^HzZ}Qt0=p&F{L2rSS_5gYb zBu>y%Aio7b4}n~%a;-qJ1qA{r%?G**q(|H23uLhyaE(BI1>FQvD(EUu2k8WK5y)Z} z;A(;VcEMujz@iFQsUUIMq?15;Is#V;Bt8Xn6i9Xl;0l3UsaZ-O*=lyVK(YlL1hS}R zpB6~AcFHd=O`F_#pexyHp%L_%%3u5O?S} z6^9Q>4;=#>KFD@6hYuDH9i`&%!LPyLgVIAsaYguO#JS+?!RVoP*u>d`QG>Gwi-(R- zarV#)4!sFDdr*4lt;D9UJ9`jkaQ2|b;OxPow)wiV2a5)059SZOLB-jFID@kXrH7iS zID6_Mr) z*(0S}sW^M2RN(B9#Z3U&<56mG_%JXJZJ^@tky3%fN8+9b96nOI4siHL_OpP)M@j__ zA6a|`aQMitwsH7K=`-<7UnhKQQJXk>q*t3bd!%$N;Ovo7fwMTmv|JBu?P$ zky3%PN8+9WoIO%1aP~;t6M(Zv;snkf^_Jy;vq!Q8&K_A5ID6!GDd6mpQh~Ea76r~8 z`E3B4JyI%g_DJb`z}X{<4*|{|`JD?mdt_0~oIUdUAVBt{$6`I;@R47E!$;#+;P8=B zfx|~iX9Er&DJ6fu?(mVtYV;63)}w;6N8YLcXOHv>oITQ84LEz$B~)?tNU6ZtBc&C9 zvqu(HarVfsD$X7$6*zljQQ+*6UxBkn7E1wVkNgUpJyJReaP~;4z}X{l698wATnU^# z@_RSn?2&navqu)y%-JK^;{j)nERF-5J@R`8;Ovpbk$|&D;snkf$sP01{B{7GJ@R`A;OvoKfwM;z1 ziAelp{7C#~@mJ$NjIWP>H@-CfjrhEHO}sSz`S_^#jqzUbtK$FX=l}0yEy?;?R()1w z)}*YvvTn&5n00Md$E=I8;;}!*j>Ucv+Y|fu*rwR`V^72u#U6^?A1jajrO*FA&uq&4 z*UaZLzn8f@^U=(|&76^0mU&O+XEKLoUYFS=^Rmpm%nLG3WW1emAmhgwTQmN%&;J)^ zB%^X;20X7Yjtrhx=y!WxrQ&&o;b!o>!i2GR2NlmN3{ivU6()?m zEFb21USTfUyA|-f!i2H+CBX9v?A<~$<`pj~_ihF}u`rjo;)#W+ zz!gs{OdoqU(99DHqkk`JiS%vrjPbqe0Z%N9{=Mq}Pb>`hz0U%kSQwRiiSl`#SQvSEN)G&nr?Y@Vp|6 zj{)JlviDKI^NN%%06ecqso(-hkkW^N76MtEpV)Zr0f8(&1k4r4;)B4K1TxPbK+e?* zq;wuIM<9y=FKT5`&F)u);MqGHm?e->!Ayaa&H`o#q;v*QCy>%wpjIHI{AuJ|jX)Nw zfNFs(@)wYEUld3-fAlz4C6H1jdK$OQaTFwfv(%c$ngjF`NVed5ft1F9z5*$Y0oMtnGy~`(kkSayTOf;qUIP5?IScd@NNEe8 zhX9Lv_&dqDYX$h-^8rvGK&hd-0Hu3QQ*rp9bk8Zk;e%2)bNHZi4}SqU=kP(P!Qq2a zgTn_`d-!w6IfoB^_Z$HnJ}5Ofe2~3|yAjS2KAJ>baP}Z>&tW!k_8@N0n}D+i*?XD+ zXAc%#arWS9&l^;nJ#>RT2LNXeO7|QDoIO}{#fw_Z@7YJi*@H!cvj@L>_E2&5pmfh} zz}bURgR=*vdtRmD?7`xm9e}e3zk7B9&K{KRc?EFxpw!^(LFt~CsW^L3YH;>oanDvN z&K_CZ0yujldlNwRq{VFp96nO2io-|ZRB`yo{PTdrM}9W|4j)-u4>)|}cOBsHky2G0 zK2oZR!$(TjAdc{{xV03VJ<_`-vGJ_4M;2ED&K_A@1vq;o{t3X@Ba5mydt~uRz}X|& zYUb>b#T9_FM}8j%oIO&y9B}r?qAJcF`E3B4JyI%g_Q>KAz}X|esyKV3^ijasBc%%f zXOEN$oIO(dFyQQwQh~EaN*@B8JyI%g_DJc20NIlsnDYRKk6Z~HJ{pU20f)&mY7 ziJJ{LeAEqQ0S+Ho6gYe&n_xZb@R3DT96s_}3pjkFv^Ku+Ea78|+Qiu-i{*f`N3I3V z9w`+#d!%$4;Ovn_fwM;zO95w(WKRT~JyI%g_DHF~*&~Y+0B4UZ-VHc=Bzqj-?2$NC zoIUb87I5~+qMA8-B%72y>+F$IfwMh2LcWsSrj;YBu?P)k*h+$;Un{X0Eds1 z_QfLMV~Z*j>NwR4dH~KIDJ=k;J+i2ZvqygO0cVets+qG#N(IgyDeVS0dnB$S;Ovp# z_JFfT7CQjW9?2Fsd!$s&oISFrinB-JE&-f9lHCSy_Q-E*z}X|EtpI0_l&a$Fky2Hh zJyMzjID4ct4{-KKsVdGMDNO=oPg<$K;UlFnz~LjMalqjtr5S+3M@l1r!$;y;01hAd z6*zqG``X$6-M|Np{E9+t7vwO^W=cp?4c!dC*N zfQMyf03MdTfMO~hmeHW%VR*ad6%WfUz^#CXWoKX%;9=Q4sCZaj7Hs2T*&zTA%WDGguuK3W*nx-T z6~J)7!}6*CJS;B`z{4^Q45gWeWj-(n@UTn)1LH5e#IR(dOc%T)yc+07D=!JN0`QWs zH_(TQmxLDqeSwQLV{{6@OTyMbFDe(QQUK%wZ3MC?xKMB%&<$uUkVV0#1QI7`C6Ln2 zKudwl3-Sa~+5yNF$YOgSM`eQ()0E>nS0eD;sptSxaV5~q&w*q$xq*QQ+KuR|QpA|^yCSZ&}O1A)?5y+w{ zqXn|K9=Kf~*=vDO0$E%K+$NAX!L0(xeipbzAivK5BLz~r2Dn)uaZdpw1oA7mNg%(= zf#CuveH<7jkkX~VP=PE8h6v=h0T?WhQo)S^DSZqWB#=eH4FdUn6c{Lw(uDv^!n8Pn z*M#yb@S0E-1zr=%;v;~=N9Gp*UK7fqDh?m{eFSlYkHx9r?2+Dw0cVf&&I6o15;q@k z_Q7g2*(0T@ID4dY7U1lW#TkIJM-~On9$BmgoISEw z1vq~VmzN3O;LWKUY@ zSis>U*<%2QkNm3Q@R8Cx0EdrU2^>E1t8E-UQYvuxXq1jd58-1yqbWFhq<0kH?2%D{ zvqwe+&K`*uIC~^+B;f3k-w}YbM-~On9$6d?ID2GK6=#pS!63ldBXL6kXOH|22Anp=XOH}L0-QZk+7WQ} z$YOiI*&~Y`0B4V6w*$zY^oUb4hmZWW1spyar2>bKED9Vx5+`u@NNF3u;UkN!0f&z) z3LHMN*ed?QR>H>?RdDvGv*ZBI9x2TOoIO%1aP~;4z}X{<+Q!)6~`~XAepZ&K{J`d6SB>2XS+n0cQ_>=ez+pd+=*;_AnORjO_9JJm&z- z96nf_L$Gdj_#n;|hYzyn?4#oF!LOS+d{F9&!w02v_8^Y%kvJEeJ?NdYhwYs`=$*40 zaQ0wvP7~nlL7c(agHnUD2a5)058YtS4z_XjpmffwfU^gSb9MsG9{jqQvj?Sfwo!5R zV9^z44}RyoOvTxQ(m5{y&K{H+oIO}{GiQ%1s+qG#76r~8ncoCBd!%#&;Ovpo=K*Jr zEUpKfJ@UH_aP~;)6M(ZvN}mLrJrXA%dmNv0Rsaqk$<{UwABj`N;lucy^Elw}k>90& z!$%gE;)?LGtK}4&Ju<3IoIMi11aS69ufW+Or2=PIgqFSeTgUXP0rY)=K=B*z;T(k#HPe@lJm2>Xa6$i2RxrHk0;b^Yq^sr{_W>U zb_-)a@ssmj92hrEeA)9-zrJ-8)yH&5hyEbBF%9;hb(9^nauf6&wa zazB&1i>LdyZFxiHk9cz5mt)I#T41ZJ2|RuOEo*c+&pn%)ie(&eI2LV+VPD;H<2TJlC%c&-6RX z^Z!or`vbdq_Mx8rw<`7$&osPG&;H{{{@>x5hNb)-L0A8N!D60`Sj}%9T$j6sCkR%? zckn#G&nJGy(*QT{^uU|5_wjVUp8PJtWx0Qw*E;tNo=EsKPx&v(N%BO(K{*Fa12JnDy2drirXGNEw;&GrCeT0f9y^8@h@od_G|K1HSO=?ZM=6gG$ z1JduHyMW4-s^~c9vAy5h6~O-JlJvXQdpiJl(WG}Un{6)FHhKrMv+j%jPN36vkcx9d zCsYvR20NhHHZ{{5osrWi`hq}jw7Nx$9M9(kKo#3~38wc}4tNQsQ!o{1t8H`&N`Z?6 zG9q9Jrq3yBzE{lNyiDm7R9dT|!dudn3`f#}g^QADtVwJ3fG& zov6gqhqH!1S2iAS-=uP2exmW;uMH|YCIDVPQrXcV(YPbrX6GvQ7QW8TVve9ou+5J; z0$%=Un`U<4MS$RmMB|UWRseoN7ygZNA2{+>qVcU%u!Ff!SJP^LQ1Fs|+ zoBc6@%Aqmr?SWvMpS;5kD#IP{wtq7_fM0i}GBT{J;4OqN`eQ214u0+JF5~^=e*+#iV;G_YpU~ z8lLN>ibUft+-+&r+=kZ){rrk^u=lcHn|&=3jp=Uz((JeIvV(AMP0#Q;Q^UhK!VXFT z_!Z~+XI_-B&Cf=%H?JvxeS>*XuNn2COA?Jovcqkf6OF&k3*enDyy&a|j`d)h0Riw; zhQ__&>+GACXnZpnR`w+t(_da@*T<^an->efJ5#B6y`#!Hj;%b{=4X#28q+`IO{M7= z&BDsD6YRjNN$p@Y2kMy>cq^4?Jou?_2h3PM@hnMY7qZe1>C-kx5{>)9ZGIX_H2yyH zb9^(+!jAMC-f8-g8f^2sKD>?>s(PJCyt!}(zi7+ea)KA##|-{v*sp&vp2Klcu+70F zuj6?ZIDUq`%?-AB>&ZmpFT;WH3r_s6!y|a>O^%>n(Cl}$99uZ*e>06Y7Yg1*clmwT zuiqcYi+VQIi;m*h!o&ILP+ljPP}clnKYObScKw?*yv~I1b=D^uo5J_A>sfXX4yKJRpYP2QSx?2wh5i?q9=Y3b}@ditnoxN+%@KY8NP)#FG)21F5KI1j)5g!k6LN3?I|%2Hcd_u(a0mM%iN^HP5qYO?Kb2_w!-c`?oEXFrOb_7wv+OM# zv_rp1YaNc=$25%ue&^Pbq2*SDd?ZfOK zoW*wcV%OpHw0|f&2#3tO#QM*}f&TLxCWkKtuk+(ljx9Xuqd47lWl-6Tl0W&=Ht+QJ z^LeL*LFEL)?49sHk90~jzS}ye9DRmn6T@a(6OD(%x$4cO96>lI{(MxT@#Lq2X78R( zH0}?QY0drzc~LK;^`fsN8h;d?#2>HXb;53W^jM&vl))8Kw&{l*_2*!2+|&KH6g z{cQn<0`3%&31O+`-Rx(kyg(l9QNzvY8Ha1oK;FxHl}EZ5O}?53x;s z04F(u^k0Xy%_|&rSx|XzHg9fH0KaU{QBMxw^^8R0sc;^BZ&RXi_a#B)HG0(_I|gtn zl4$%@coKhk4~G+4_${OHM`0Mf%Jj55d_S*kNHnJJW8rZAFp^^nXUjjt6OFHj6Y=ZA zX?A_^I)8YC!wCoNd#K+Tp7>W+b2wo(o*K&G6a?G+ayi?C{q1;RV#9;IgUXpaPHz|= zZvg2V=5#na*me7$*{f4I>hM&(_5rUG_V`l|vbS*JIy0K14p$qm&u4y%2Rk@k&)%km zdwVCbA$?0GuX8$?Xgm~V)*I~Lj6c&-`F%!W!{3H|^vpuG346%tTd9O_ripFBIpow! zRKgzer&eqecIDHYw_lA7j^LLE6OFHZDgf>U*f1~jbDA#pdbp-|{bibkLCKvX8@@a^ z*yfL;c%5)^_|q6F;i>v#PGZCSaA^MNF<$ikV4K4oc&DMcHx{zqX&F?0(v5BI3*c;P zAe`*}w3}T|314(UV#8Oi3!6O#ggZDpmR*Ol*c(k$LO9C~9?T7Qz?*9hr|3hRov-?G z28+`cV-p)5@+Ch`{5g)`tHI$s-GXR)eNM201B`{&eCdg1+(fnEp>Vc5wHA6V|DVVw*Abui{{N*p-^iJlQ zygyl@h=(cGFE0hp7HgJxfx%~D9-p?#;qAQWc0|mGNWxqB6=qJ zyXc$Iz0qya&C!2~J{esceKVF0ql5g}{}P*5dv@nC+^+qAJ24mN3=Ukbh#5Rj_67FQY=XKS zSL+P!kX-xQwTFs72Xh&2*KWWQAeZ4>@zCRn*sdljUh#5CZP%;7c8w`((Srf2S}3g52vfQReApmLikT)W$~j*9c23#i`a7FD>Cxa%1z z4jV4y?OF@mtP0mMcdY@ukmRb~uGN4iGp-lzS{>iKni)rz2wiY;ahcWN&l6n!+_j2L zhG=Kk15W{-bh);>>q+27Rk#pnaFBA9bk`G9ZcwFP00RYFv~@F2;apa9vqDwW4VJQv zvxY0$1}~1(4VF{!jHM3pIM7$y6b8*aW2sMQ2cFNlu(_)NaH^_mPY_bpL)wYpqnb{Aaen)Il`{v^|!h~ zJ(a7~Ox<7>;2BuGWd`5{qB@nJlbWeh)dE)v)Iqe37dq-Xs(3n92N9&yOkJlMxLly# zBIqDcZ>a)2xvRHS0FF!bmJ0gBWkH`Pr_fHDsOL-rE)}SQsN!Xpx{)dutD@c_Xe&?$ zDF!YQ$h@G9K)praMS?n&z$FI&`R5=Qwf}~>Jt+IuL5OW6^E+&(LF$p zwoyO28^{)@>j=DvQ`ZqBR8gPMHeMU4w~Pn8a#TMW3wY6^4l)k#s#aY`kf9x@x7-0l z1?nJUfQUd{XB2ROK)vNwz=5ycGB~mMyAP-mbdc}P6{zc|@+EJ!?gS`~F2 z!50PUIz8f>zgrdbmL3!;RZs^JR0z~{@`33Bb&vv}T%fL_idQ!3Eu8_cN!39FUg4_i z2&QTqb&yVgmtg8Tf>Kq~Cj=z|^@)x^u|WN(129>je$);)A3mx$eAEq6fWt?#~TyXZ#+nU~GduI=Q!WCx^J*Vk76|%>D!r<_s zw{Vqe^LHISbP$8XhYr$ogo?w5K4A#M$KddxgEYNGGlvg-!WD-PeZm!o4_&9}FwGo3 zm^bv-;V^?VHB)i;&<&d2031H_qoxCZ!-qc6bP#a((5YN;_%MUG;_#uj7#u##AZ`|h zPt!hj;P9bO7#u$ImZsfQ96n4ZO?v=`4;`dwClH2@!Qn#(X=2^--7tKbUIrXK^a+E* zN8Mm66^9S~sA)6c@KJBs0yummdlTUBQEw4AeAHVu01hAZ7J3RB55I)}C;iG=^44YgkJ?bFO0%72XOFs3 z6+rf+`$RS1@X@3paQLX}lmiYQ^$Bg`@R9inAPgTj3&Y0{hL0f(pQdSSL8_n!$%#Y7;yNggRr7m4I96^D=d#2CQgquw$KaQKinZszb&2T{f0qdqYbaQLXVi~t-y z>L5dNqd#x)^GI_|>}y_>H_0 z{$_t0e+%!)U&JrYNoM~k+rNCDy*+y~zm4}~_G142KZpAYiujBD&HP2aJAXgFFgup~ zL-J_yP;xiF@3(

RZ9z>*sT~z%+ihZw!Cm@5|rk+jB=kBylovM1PM@{4lYe-y&Sf z-~Z?FYkj5sm3|a=1N2H<#oY_p@w4&w;)mlujql*M2cM09hu`-58utrSav#E7{MO$9 z?jE>;djqnvPG|i#tC?Q_e1*FO)^hj5W84)mi+ckm@cV#TRa6I!@nfpKb3w_ZCqjk}#(Z7j~ zjt+_TiC!IT7tM{fh`b+pEAo0|XXIZZ>mn;7k4L^9nH%|Hr1<~m|M!Rl|4&~4h&+=1 zqd7lozor0ipkE4fp%Zx?Z3pn{lSiDb9e_@Wm1`Zr{A|vx{5r^5r<7nG;E7l;II%MQ zo7;jGfCnmY3)?*H9xGs*r@e3x3<4adz{s|MYyC3v>w z;}`r<&8{q6(WM-J4rD<-U|GP``HAnG@d6a+-h;|J!8ZBt0zVJo8K5bI3gBNuC;*-h z;F_br_d-|;EDu3P@XZi(1P=z#P1}$qKG1I3#uGM&(@ooWQWR*L(LuAW+Ga=yYXC3b zXx3HRc!?y?Hs{~Awh7;MmuC{+Ug^~ARJ!Dwc`YALzd2yxZoqF2_{JH)Z%(ik@S79N z2mIy)BLTlTK@Q+I2P|j;{N@A=fZv>8Jm5DcXb1Ss0bg$h{N@Bt0)BIXses>{ARq9X z10FdB_{|B{C03?C8mb>u0S+wz-6j2L0T_A=DAY+5JOg;wf(oEbSjh*x^q?~2XkukL zkp*i3zXd@#Ff!O?2-~dkx|zygevoRF7m$KgKs;zRxHPeHWo-zZfpBQvco+zW=8aDQ z{exyVP6Wa^1t7Z~)SOuPl$S+zlw(sBws~q;P`N?dTpPj)Ae=*P zxCihmjcsmdmst57FHwMj2LK1RU@34*u!Dhj1K}Jp@Dkw4pfX@T&?z31KYY zg$R2a&>9FQyTaW-IN23G2844+;T=HRUI%mgns&u2EqgFp9gq~ z=0*Fx3S1HFpx*)@oR$0W187go4l79@Jkaa60sg4U4z7O~7!)+So?nf6qH75JP*nQv zBbxQqHsOKxWt(qT1kL)g&9}n??aMab4m;9yuK?kJUiT0X9_V!=fbc-CizQaB2oJOm z+pGxVqtAR`Z16gLh6CY&_K5)Df%e`Cggw6ZJm7+0o8E&HEB_(vNWDmzfB1Y*>9q+M z9>Q$E9}an^y$XS_$M-x9gtKx_wps2aHO+dG7|V--9rR@OU+yV@N)HladD!E7tOGg) z&3aS=VMprGE3tA}eNegfI8YYCv%p;;Fa<0d8UjNpZsY+*yHoN0AY{6 z<_M4<9L_bXfN*GDQw)Uheod#u%E$d7gJbJ<7zk6d8$Z4Ec-WD;O$7P`d+U}0E)SsV z8$jr%>+;0PzYqO%WeWIve-dEVUE2X+kMD8-2;;rWQXm|fUB&@nymx5}gdOSXJ&Bb| zrUx&2bpsI2NLSwh3=1o*fzVIqCZJtV>HHWFzU|Iq5-S&nQ)lN^K-iJ4+6mkqY;)Bk zz<>}KW{bOokOac1vlBz6A?!$<<^!RhPD6pvPbY>mey$t@WCpL( zkww-bf9~TXcBK0+nh;j#{)>EpN|k;<=;w+LfGdJ#S8M=sLYR?Q`B>=ZioU?)pprTT zd?tkTz`zh{fpDOwdI90odHHc55;VK~*~H4f3#ZP@tAMa0UETu-J5q;tf$%^(Xq)gr zJ7}BmKsyv9Rz4aY=%*QGkA@xT(+smm!vp;^!|c)UKtHW*LO<<~0&Rk0YrhrrNS89qzVSd<=>U`maLGa7b0IKfz7ftym)s2$gq3!{ zWdU4#00=wM#cZ=6>_``n2SPs=Ujp0`Y}0lh5GF=jhFSVixOB0$cK|KJW~~w{)6Y$% za?z_m*yAr+2!uWUqR~J&&@ajX!j9BtClGd|HjeI4jku0@kqC>W{D90Z?!Xa7YNA2ZjXA3TgrGO_g52)j_4Z*72T0 zsC0i8@H$aYb^iPRCtAMU@<7WUx7^zDf0Hvh zXGqQ``~Lrv$;HWslXH@v?EC)*MLxXdX zi@1g{s&KJt08g$w>4}c3T?2S>ZBrXXL;L(>SZ&ov|-VNZqJy{+&l;8}u8poQ-M zp3=F3S@;$(Ku5p@J42y>%W{Q>sdz%=s%PQh_@>T@POyaWZ?n8b3NzXm0sEb*9BeaDd2)^;eML+5OCesaIFBP2G7A*G;~)5 zzlMAPSF8C*vgzbC0+bf+1HA6RqQP?`;tXBX45bE7Mwl;bVjCw1N)7%fhf;%AxhO5< z*^%jA14e1#PQY^`N(*^H(N(l+BanE( zg#sz%F_0&nmr}~}9Z!Br6^Rpg$t=Gs0H>Aw@_fgWd1@w$O99W}5-0GYLrMkNY9{jn zr@Sl*5~|3RATE$>L6$(S1YTmwqQL1Z**rV)WQLll8}R7IlTm@hJqAPsQmTrBP_h>S zzH%U?R8DwhAf;4J%+)p$_XzMMf&9(~>IL#U511p6(g%Ur0x6vf+%J&DdSI477H0uo zcuDpQV1_DES_}9ijg(dZwW`Qsd3=+8S=$!NDO9T<*HZznIiyrjrHU+0103@5TMAUD zB8$bqbb2Qo((yNa+M%nm|SbWdixV2XOq$uV9KQ(xYaj0x4CcL?H75uP`M} z&Acv_UsWclnfipFNFb$m1HRxQi(`R%RguLzfC&PL6L_g5abtjcR8cn=1$b#9*`tBG zRgqG`=LJ$a6!2#qSsV^{87RMlfpKakrGmQzQYsiLkkUfH;UkOv0EdtK_5mC|ve*M~ z_{eV$loCExs)Dme;_?A!kNkE9oIUc}1#tGrqQKcBznuVQkCb)cw-QdOKiQmTrxM@j|G9w}`LID4eD z4dCpN($;{pM@j``Pgs z48Y-o(*9=vhYv~(4j+{EKS9OegVO#dut@mGq6^L*^!7haD`yW%4bC1c_9uSR-J^?s;q;v(~?2%G|vqwrv+4spF4?ly$M}C)3ariJ~4GtgqRmI^Wr3(OukHkF! zIDF*yA;94yzp6NVq*N7$kHpOf96s_}4>){eaUS6Ck!*tXeTR>f*2g!!Pxx4=HgWby z+-$(vBc(F{XOCo81I`{Ptp%JtQc4!T@9dFMfwM;z1MEBp2Ao!S4Ay)OIl?5}6f&HiF`arWo3Z^-VEedYOI@e7~fug~r` zCsWA_ld;4f5=Rre6aSXjka#+=A~8QPGchgk1%9!wZ=&n@=k@Dp{d!K{l=$uO!SUYl z&hebAb6Ll;ewDR9>qlAt>|f{mQdU*g1lq{@1^=|G)VR0G=E9oCg)p&Rje$a&P(~5)a>8Jf4aN6%W!}%tKF~^Pu9{nTy9n z_N1HfRL#Yssd!NFP|U?601v7T01qR5&V!0)XD;Spq|bR!@ledgJZ1Db4=NstY4D)p z*_n%Zx~xwsz{4=Nsgxwsb)463IW^Zd}~Jg9gu z=whBZ`kV(9&nz`~Q1M*P#oeL<(|hAVnu~cF>2n@bJi(O8xO9alpn7i%Dy@p2Ufd=6 zRJsxmw(*LNXQM9e%npJT9nAo*=y*=);!c29bUftK;1wOu^<3OB`qT8)J06a@xKs3O zde=M;bukY*eaRJXcbhsJY37pK^yuYd=oE^eREE4?#W zQYz>rkkZx}^U~W$DbG25u7@g8%EL&XyH+5jJb(1L0)dnYx(iU+ za28-erw=Va#*y^iaMf^zN;g&TYv?M#Z^H*vx(M*wa2mK;fYOE&KxYBs8jb^32~cYA zijL>DHXO?wlfE2^#fEnQue1=?a2&|hHn?hdmmPRThxvwg0I%qfZSaZ?zYRyIctyt( zYF+V)4!;eDGpD8ZhATJo>!7sZt;|Q$6~r~Xg)3HcOu_s&JG)p1fNQpYIo%3zu6RL* z-i9}6)<(_fEDg=Tg#wf|yqWnydK)ad;sqUk8{VKcJn!+xNp0KX0UVt1yu!D7Qc zDn14HZP){NL5I?Y9e@{fC~bHdNNNWtH6#R5x|K>?Af;Pl4e4D=sVXs5WN{OaDUij@ zfLC;qEr_ZjrO(G+Nbf+d)>H9{PJRVm(aG=n*qIM4J`bF?NVD}`(aHQ;z$-er5_m-? zzpJyZOm8Dss(3{w*{cDs=p=hp)*~(4!z7MJi?3%zXK`yO_%-Ef4V%>J9mut|uMtS; zD!>am^^d0jFX*IHP^D(F_*B-G^xkAq6))&y@d;qMn#sJt3py!X8oxBXjVvyuGEL3o zw*e>)_| zcP!uqos<%+>zzGPIuaNfDjk{Zp5B`*s^aXC-{F9>M@j|G9w{9JID4d2Fi?Aw(m~0w zABr1D#o42IQ$Y5l$8TYBPWnYDQ4sRh&Ii+5xyyuOr!ljshud2V5bL(l&szM@o5S z_`4j;y^D;KI6N*58v>st#@y6A(Ph3AzTLZyrN(em|#kCZMt zMJpFjy66_O?Gqkyvqaf{vooISWQWa((=6N}!W z5)&YM(P6;ZgI|NQ2c-sQ4;B}_l{?|QMeo4bgT+P7?7-QBxJ3sO8-MVCc8yZQTmcpr z?V;lA!Q!Ibx!*o7Zc!5zXAepj?F43P8!Rr`0XTcGxM&;T?7`xqZMm~@!$(S0arnsM=DdRR4j7BT*z}7s z78jA(KbWq)$?pa#^dno`6tPWN{wg@R7xNEf1u(kvLTxK2kcDKl6KXlEu04 zjXxlKEKY^r;y#MY0zWtdA@fKHI5Zm&__?VK~lIql*Rb?f$vpdBP zKHa;#xOv_!Lq}gbtaAGFvYMK*%8IgzDXF5`)J+vrrj*sxmXuZGrzY3c)K*Ss!?9B< zrx(?v#@0-pT2@_MQc;-n4)ar^%O+Rmr-sy)l%~2=mrSp$E$Nz{8d+3Ple)dKh7G$E zv#;v1Nd>8@qUzd;lIpI>WY7LR?)zM7%(zrpMNMr{d3i~3eyV4`)R5c9jIGH}1sl}W zmK3KdXRwRjshfw~R#T7~Q(jb2!9Px}te9L^0W)&pIRF~A0RMeK=pX#LpE}2zTSzVi=SXP@Vt}D?tGfRr@OHHXR^HFJ6oX3LH z(Az$js;aK!yt3!A>HOym{=>~mE3v@QmrS2jQk|cws;sH4;`oYF6_qo!!`q9hCr{<| zdRj={qN+WW6_?&*uFsgjDKN&d&+eQ_|U%F-04 zI5>$PeVgpAuBIeaT1OQZnD?8(No9Fa`h5(kO-(K11b+B$sp&;!6})uCpPvn0M5m}A zIFeM&)XKW@;uL$D!D*WMX9uh^@Zk~ZELTn{FPUDLx|1_iUJ~x2V|5Adc1m>--Lqm! z$5dGjr>IsZtfq|i1*zl>Hw>baRkQO-HY}T5B#*pgoeo~@t4qFES5{q8T#y>UYw847 zRv@z|HL053mEu4qm!xJ^R^OK@qNC7@Ci|%AKt7V`xYx$R%SubjCfAkM=BF3}>ZPg4 zQ;VvL=r`4L?y||!!TaPD>8|&u7&|3ZVF%HhFPT-#&?w=heKtASRh2X8*yp={LGqT0 zbZ;(2Nev=+S00rWQwmZ&uN#v7m!cUs$1rbx$mGeD)y49U#`Gc8XDgyUL28_iadJ7MliieRR$#<2&@}~|-#{ZcJ-EGLdiE$TnM~*N zSW(Z>TjSXBQ!}TQ(Pw?o=MT}F-KP^#L|?hTgj25#rqioSQw)@nnwp~O`}1*BRbGS! z)l!o*(uNe+?Bw#I>ax=NQ!~qIr}`c0b?BtLKiZa6vnAefRGjXt$t1Ix1l80{o?4jf z*)=t6YRTmLI9zqM;8eS5S~*=f80g^}m|9fK`{!&GYr^1IbP_m6Z2sYRs^Pym(UWTn zlD)d7CpyhP;rv*@0P*;&?Os_|Tazj;DXmS_XvkI-Rg{!#G!Cn*sI9JKpGA|(DoWT- z@2>O*z1!ORRi}GUN)O}oJ19K=n%X#+urw#0pZtpH=94v1(Hnwktl-bvG686&pjg8h zMc0S#Kh>qCgzi>ZTt+ufpP@-53=T#}Sw&HKsKN^RRwzi_p?8$(-J?e#GwMwr*+xCd z`d(ab<@dp;xjc1?{MGWsKjg@K@$yuNGdmNCQ5zleKs zO$j;3OchK4HFZ^0oDT2v{2Q979$QsjHzn02*cEe18UI#UTG}cvWC(1B~2ewns!npJZ@<00*PCPO1Vfoh;Kt$81HRSX|aKuu+7?aU&St23w1CH9$V zlKr{{d!QAsuXm(TOPddqGdxP7A+01mzop+?L9+ixcTw?ShsgiPo-3I5?^QzPr|K%o zD?M=U(|ZmMU&qCy!;#jqjz~?atF5K)=v;&^?t^Svd{O*bnh>k zL_~Kzzpt5^N$I0iCDqvBZB?ezyS9uYV5F3!x&%WcSO)}?wN9NoJ;xTjDg(KM^QGKm zTSi@34eOZnUh-47^-A#~6s6atKOo6w7tRL>}*7i#vIQi7bK$@isCTJT=dGdiZP>dJ~KoXrp4{~f^sjm}iddMemuI8KA!#A3UeMQA#Lv|6KCL2`0e zR<6}PSmje8>#b^SAC4Z4Do)-3lvRKyaPW$Z28N8Op~+2gtqeNvOkD`)a{>S{@~+wbB< z_)w(HS#6yUE_L0KB9wnL6@s-V;g{|rTKTh`_Cf?R<AkN?v zW-{LV9VJCIkXG{^P{l>lix{hQ6_d+LimI8j!bmAh4gC+x?O?U7O+WgXDm?`hRaLRQ z=Mu?ge503F_KW!Q9Pf$&nm#0-MP*0#^2#Fm9z8N_)9=2|d1c2(is^i~rGKh1y`Ze3 z3M-l!(yz|WeNKW%B=cET5;P^Xo`=~b(N1)YTxJzJR&X;p)bEf3n{XcmAU;4g*TmQqI z18*k7dk6k8*^vBda&~fha$@q%BJ^zeY7$Y`6|E{p1F#(oXdJ!eBqf(fv#MnW?a%*{uC8oc;+hB@+adPw{YQESFx6JA#aPX zJ9GKb@F{J=Wx?f7P-!LLiska90N0&$@9fjdxx}|6Pr#KxS8@ehBV5j3$hPDNxO!;F z7I2Nw;0w=Oeq8<-&3xgRD~`*#-nYdUp1DS7$kH}k&t1;Nzb(G-%yq@(T)W%i3(s6I zT>cP{p=Mkobj25*xkkABK`IedxZbzC9`J={E(;o3sKVt(!Hd4|%$309{JHE!UwGy^ z>GE2@7oNHJx17J7y;!epxE||@FFZ?J6%}82<_{RlD*#`3mN->>;h77QhMC%d{HmER zJWFXgP^XHNP6PZ`Pl=lf_`jR81e6P8aUyV^Ko;)-eBoKL?*__Lk;0|iYoFu7Vw2$yUV| zo~5)9@P%htIU6_&#IY}<^y8{awYhTKz`LMyzp$eT@_jEhD9zsdtj>7Z7N87XMpR@X{D;% zB9PKfz(|3V3T_riX$N40KuX&KHwk319WY!VziohF0$EgLs6c*O149H-+6ovfki|UU zMuGe$fk6T(72F_@(l{_sAd4|zfIxmDK%qbuGl2dAS!@CH6G*n;dI3t8odNm^P`d0i zaGd~g%RT`52=Hs@Ex@9i^%7vwm7W63FMF45dI(Uu>^N|(0Hv-J2(Y;97?thVM;6y%k?_%o^Cr$7 ziPQGZ9`%A}0cVf=YI|poEUpEdJrXBy_DJa}z}X{izh--iKbkCZL|oISEAaQ4XW zBY?9<7Uu)b9$6GPdn9`K{`9XOH|= z0L~s+oCY|1IDFJ61_2HqDIEwne56$1@R7wrED}DpSV+OyBXI&}kHnMTo1H!K z+ZS;5NNFFy*(0UB0B4Vss^aXC#R9jpS`_?2%G6 zBYV=W;()_PN(BxdDHS+;WKrPoQ8&l{96qwBio-{KRdM)8X#{Zipmgb3z~Li{EdYlP zeqC|+pmgb3loCEt>VmTer3PmYN|&ByduIWZ@mi%XlSID7EB^dR8uLFv*1 zfU^gsOZNlL9+WQK|5ttf=NIVmey87}3%(EVaXEU4l>g`TxDF!~TB3$N&6)Q>2L6Usd=9lyuA(Gkmcs|=1FG8y&GS|198$mBr@)M=ale zs^ceIH#%ZvQQ(M`-?e}vRu%=0SovK8IAUc{;E0ttfg@J3R|Ae%`CSD#Vx?5zh?P=) z!*!!0R!RkqSSeiyIAW#rF~AWkrK&h$rE~${h?PZwBUTn427-u9gCkZJAEM%jl|_Lg zRu%=0ScwxjVx{y!z!9siGZ%40ti`F|gq7aefD=}F1x{Fv*m}STD^~(1to#Z{SbcO& zgCka>R6B6QN}RwEE59=UN36sNf{0yPR|_~|WxfJ%#L8k7;E0ttRUEMrCve2d?=-*> zt8O50#7e2a5i6xr0Y|KqmI97gDV+c~Vx@E<;E0vQv4A61en$g2dfT!n$QH<=ASsaS zQ9wcH>;*V`B)b4`_DHEJ&K@c41~_|UF&}XD$f7FF9?2Fsd!)1r;Ovpb zPJpvVep3M1qw5)K>)HYiABk%XIDDkE72xoZ>>R-1BRzS5!$(S0arj87z~LkFYUc2f z-z4Dhkwt;SM}Cv>7d8++9*ZhCd!#f5ID4ct190}p6^XmS*@MN}vw*Wlu2gaMAlnsZ z58a^lG!o_(7=Ge`sCg^P%Ugb2e$oQMbsk&wuYj6+7IgoMatL_~xE zk#Hmg<8a91LBnD4AQ2Fl4rXLXNC*=G0)irPlL(Q}h=||s{rSvZ8-p3mBA?^%n*oIO}9J_0y<@au}R2c-sQ4@!#ZU8PS z-os)JACwkv0~|gmE#3+^d{A1v32^ve(cthwT=51f4j+^n96p#YUPr~@gT>h9|s&hQYvux z$l@Hp;UmAZ(L?xH&tnvvJu*5IaQ4Wxz}X|CGXQ6gEDD@GvM6x&$klYf*&~akfU`$_ zRdM!cuuKD-JyNR0oIP?i6>#>*?-an4SJ z!$)W7P{83Mi-Qv@f8p?vUxC9%7HEy8+G~DJ61$;p~ypPJpvVN(t6q zID4eDZEo~~tU=K^S<$DXzl`pUzTs#1^VEJnr=KVD`&s;Y`o5mGuP5yDOnp5?Kb8|) z6&n@1h3Dvh!%xoFv+{X5zMjUy(C}vBDUnM&HHiQ?7X}32L1o?FLd?))_?xvkkEIk{*tBP;D>g; z40xuApAF3o4^&kyGW@RU8I|>cHHp&K-KHr}5&B)#U!pYto(DX^UJUGEG0(%70Gq=( zSpzhmTne0~;yJYuunzE?+6-93Voo`AFrSKNCv`9Klh!#s{DZ1C?9Q$T;5OQTX)NZ+Njo}?ig%O^*i|q5 z>#ApV(%Y_XbbXa}hu(I@0p}+j?258jux&dh)0<}}ZQD31?oHb^E^4s>0l3LWg~#9~fX4$iKofa6O?>h|m=nS(Ph(mk^~yLtc?qCx>)tibpT6-`)@>bPg z(MA^ozKCJ3cZ~wP9__(EIvAAR>zzG-Z>4v1XP3x{s>O70N`T;a>@3RuV%3q-=DZAa zQycBi40g^J(Au9VzyMWbWHO6oj#P{24Vfd=IQyqnk7U($E(3h^s!e+$`<<$F>aaDW zGf(~6w~FlFX0~S65;ocw#yV1U>A>5mW7vfbe2J+ISVaep812qWRD29|*iv-RC%v6J zlV`1T*M{uBRviNE&dWe>bazIhU8=ffJ#U2oA6<6g&C`Ip=1{+RDp9)GCy%!J1eM?z z?m8NMxM~<_w*|q$*_9~W;%hqEzdfIVJ7Xz>y=iwidpG++L%VY-c12asz}t(-A+Lru zdmc-aZttmmV-NN*Shif1-qE+0QSm1LdfV5ZN}KdzZ!b@j?r{E6IZ&6%7lX<%z?b$^ z-aZ;@m>C}j3TfjD1y*{XO``M-FUCsuJQ4d+W=G%N9or%Co`80<)G+-wP2OcSI|GUD z4UPRMvj_XevzP}c>)gX^wmleM`=(MEnBKHKJLtd_7JHA8x80uufqipguT^cQj>je{ zzMKH|RU}H^^wh+59_UPOz0{l5Qx^MUmM<_V?ymaN=K|oM>w|^o%|FdoHZ38@Nf&HC; z;JCfpm)`v0L%nrNl$;q&ixVGa_H=&{Vtl2koomLn1q1cKb5wjisXc9&NKfn>o%eRK zSf@bA2G-*+LUc8(t30ZnDgJfF}-aEQ_1x6 zPv~t=9*ccGUD-c7IVE!t57OH%e-NO9_x2~#k33)(4z^-F9^I_;o&AZ@t^OduV()Mk zz3I@PaIPX`0#XcPfF*ZewAGr%wr9#(ErETIn;u zchfufPFYU+kq6qgA*}Q+RcLeYb~*^wv;Rf*$1?;S917(O&+O?tkFnU-gJZBMC;gYv zI@Uc|k2}yx>3VCwV5NguPjJ#69Fg;Crnf^4sQ7^B7?iT7-fE7{-hMgnW)^#g;j+ye z%3^y5rjnV;!TGGm=Co3d^;X|l(BW;FnwS|#hb~U7%8cuS<+*QFb-*#$&!E`hPY*h7 zM^it~oF(tDZQI7BkIr7^vYo-1b#O83@wv@PcQZz}`Xf3k-F=7-tVBn2H*I{PYv_=kQf+}h?P{fqSWht39AtC0 z`;#k+?PX5f>GKqLFUm@Nq63Gz=cX@t*wEdN=ccb%I3VwFZtwK{6e{mA__hQS*Y4p! zaH8)Xp8H^CPY>Z|XK?|KABl0#gZZ3#kT zcUvHcm)&ji##OzChz;G{D!+FfpWCGR?v^a(W5AWb+iUZBRvl5UU*4Whkd+iw>G1zL=*-yXr=kXH!k`t4z?)Jk+Iz*+KEa612?3rF-GErx|ZT$;By zGsON-KxMcp9D_gP0nQQ~_|w3x={ASn%G;A^b7(7-{^>S{DuJ5>YV#5hTs|CnD!;** zHgl;26XYRI&0W6zrZ(*9uB(If+?GF~>grB{2cg85z7jl;iZ9Nn?CXva&u>)rb*17N zmfhaRo^JP<#o^s|GZh~Y4(~pO%XWWCVWs;T2Cr=5SnuQf*&b}czGVKNs?J7^=srf` z_RnbBw9*LRT+m9hSS(oS-cwYZfLdt*m0+cNbz=DA6f51kgAa19u+qKTa`O{e?}eYs z3jZc@K_n9XbNEnrSLCMHHN3m-KchEhm+?t_c+THaKjIC3|Ha=2Jd*!8egUwUPuuk( zKaG4VJDz=Y_II-P@ou}9c?aGiKHoph=lh1dZ|`yL6gT)%aADqT z-Y&R5(l|0T@=kXB><6-!X8)h)GqEu5&^sA>fp_hFz&(IBd4u0yc-P;Hyccj4ZxH-L z-nD$vKb5~M{9NQSk*6ZRjU36oA-j}!=%u17c-LN!*z3Hb@8Lua@A3Ny_Ya=uErDCP zcd#ROOkQ^0_wyU%FNl0Ga$n?!k-$P<4e$2* z8gKkN&AS1YCoc_GMmk4^MgE#SB6}Ne>f6ct{BGq*&XO2@mtu!YJ=Ee3iEx zPLDmr-IDR~y}W~PbTY(Ul_|W%@NMq0%+Gn3cOg#X{z)G9K05La#Rs`3b0Y7n+=Kb| zRFbzOmZuJIZ{-r+tT@x}TYSrJVeFYVj{6{M^Y-xW#tGaNS(%^6zdZd$$GQHyjz5L} zJN!iW(dus(47K@q|MdAkoPH8UXz-Ks$^)n;2&FIiuK?x)ow5>W#pPV<3 zipSpNROW@&Rh>(h0LuYituzLf(WbT9@MeyAy!7LMNB_mZ9H5md4S>1fhE;7Y1l9mP z6)pmJ8OH&GD$}TVrA>jI;fYz3)PZ{2#$wk6>)}l!2f7K=!Fm=OAkelIhbMBDJepqc z^oxn|C3gof0k|cAu7JB>yZ?3?Xpye`Z57~cP^BbM{xi>mf^LAd~Gl2o+zJrMS8K#rHS$qA8jhXs!WtW?nxeaXL+K0lILjP*Lf`FyQRRY4Zv;b z4pz+sdI!)CaGYtex{2~qU&I2h&0(dU?SRc|S&ye>;GN@%@_+Y7FW^nKdQ#x-*L@S^ z4|%?&vgRq;1ikGkOq9>@CqXJZ+3iR2(_8S`W-94udU9tsR{HgHWlNmif+M-?Eauy?^tPoJ9TcV8>@1;cj|3_k3KHeBd`+OmrX|Y%Gg#@KQFQGvp|WN-ZGt`B za5KF*S*UO)sQe-46!6=oY=NT|;M%Z!mai6oEo*2qEZ73Z!PICPetRn`4K`=bGS(A} zoei_;pi6qOt;!GoO*2NE{5{-U_Bdkbb_tkIyF)LR9KBeT#t<440QvY-q3x z8&UFD(81OuG3XrpJYRWVfikCCw(iuo?owLbAn;{-e9^;XZ4dCA4`-! z5e&H14)c)N(+g468RGg!G66H?^r{*7bvN`?Im5rO|AUGg<+a}7tpB=P8(Ct)$X>eZ~+624(>aDD&XS&UiC)k2ueyglx zJ%fVvJjWI^OvAPwbPybnS2@-{Y#UUju%2Ll_8nmhKA)}}nolJ-Pxmcmr9sz6cCgYu z>BW9um&({Qynitr1cTzx9yTYa?EWZGJ}uavb?o*JZwR)4gZOy8G`!P^4o0Nm56u$g z^MZr8zcnijM&j@L(OW3J*sE``Sg@!2hb77v)J<33mxUk~wue|xkU#Gfv)GlvVsjJa z^W(uvZ=>tr#8}7So!>O5JjHr~Dt%SsDFPOy#;6Rx`A{M zjD!7$m|cPc|C^Rj?(=raX2b zIB9<~BvJlMus_E+0iV1ey&i65l|K_KcARs&JebyxZe>F+3^oUiGlFrwsV|k_SpSjX zGCNr5_Lu1(h{F#WB+4HSw(WP=elQpZzhOqoyp;Gjr{Y@TM%s9ju0CfTr6ywK?i};-|e7H5IG-kte^gNy6ZnOkRA-W z{ta{0e+O+oW71Iu%02dFgRsCVnZLTn_leo z6m5nFZOHA}W74o=GPa{>_!AktFbI~9*w6=qp}cx9*J7VaFSdRziv_#=5u!<`%&58AN5Dd## zNQ_5=INY4fzr5;00$rbsvpK=ez1c1Q>t`yx=!Z0IY^+3KL{*BS(GX{NWo zMib?WgW2We8n$|Hx`UHb>Fv&-x8C#?%t)*E=Km_Q(!cg(bAtVOvxH0CAZa)E=2LzU z5`QHZ76)VWuTvO1!F0R2oNfD7dOff84?h31ZKp#2^ZWm*Hw4^z z);j{u_wWCMw+1XY=e+^v|NH-{HwnCb*1H5g+3)}Lc7cn|dB4CX`~Cl*=vSj>zjNS| z{r+F?Aoy4O{eSiM5}f_}|20loeuXlrMPlU|4@rK;GN~!>bqz0mcrxi?pud1$@)*7* z;P)w$8dC9R1%4!C@EppIgeKLa;?G$8uxL^q;8Tnr7EMY4{nP=!s+kl4zAWH(L6f3@ zrx|_eY0YnmyqIU_tAWE*dT23zVN-Gh@TXCJi&SzH@T|$Nf854bH~jv{ zi*-{Qet+Z+Jj?LwA46AF_*swPa{_*URC0*k{K1f4CK*1f3cn>P*-gdC&X0s#ajNk{ ztCGD`Jn7-em21?7A25|1q~eL6Um2C`2Rf?4513r>r8P?3b$eA%TC$VHe9eqFLpxPa zTC#(RQySSN{GM`+FAY#yvI+3qh|-cu;3~C2X~}w^wE&AH>i`EP7E9IutyDpF$tskR zHdgvF1xJ^Zz6AKHUrPA_#_u=Kx<(N$GOnGA*WI zuncgD$fBT$D)PG+aI8wt5}=VPQY!GhRVmeC&Lk-ncyiWgSp;09Hgcs(LxKFNa-l$e z1r7m;(_+3@lemR|Kb1)wzkpohivfuf_(DbIp8_sWZ?ZTa@D+$giy&VWDV+!838YkQ z9QjiE1mJv;(z!s67L(G)fTTc5X95X{6;qOcg0D#bPvVaVmvu6{L4O;A=Hm zECIr*$gjYOFL4uqI;zO8+Bit%cU)rSD-%_bQo#g)l#T%$eX>{#j8{eC1in_2>=D2? zRb+7#aGyYW1Y-qKs>OV%C8dHfsz{F(^R_TUu#v3cjwE#U8*QHIYSrnfQt?Ib^XL zaH}dZUj%$pAf;V_fdVP*0{ojmN>v#kkkZb8vqu&M&K~*g1UP#nPT=g39)Yt*emelp z9w{vZoIO(77I5}RoWR+m0n!F=_Q;|t&K}8b4LEybQHzm1RTfoo_(*nhz~Li{EdYm) z{I&udKC;*n=%o(iSBp7(q_i2}@R7x)fWt?A8v+g=xe_>hq_hBV_(-7bhM8$R1Dq6Au9`1-Nn>hYw089;D*%L7c(igI~9C_%IA6?qxBD z4@wOVACykqL&f2P#fdurhYx-yZU!7aD4n4!vq$1oarS5!JP$Z~h=fqd8CVcE_4h3hABt8Z>do(0w0?r<}R>j#PrK&i4 zq;v-0?2*z^z}X{LQvhd=lnR_Zk}Yud$nRvp*(0R_XOAojoIUb80dV%nBFVhk*&~Z% z0cVda3Y_63|hQrZh}_Q+LFz}X|eJpgBq zlnR_ZvZ%$JJu=^;#^?W4>GuFm&!3n-D*ukm+W^n+^Z&`*Kj!YveLZ(guHFy$WabTl z=lA))L+aD1i&MF&teiic_13`i|NQ^$~GMViYGlzYcJ+Wj|r^7rBpoWarQT8 z3V70E&T4Qm;7N~@&)`XqGrmE?c*Qy_&g1NFP?w75JZ9YnDZq0cXL5ri;5m<}z~DKLNy6YckF($4IgeSlL6kP0^Q1Hc zc+Nvy{nLQwJd_$d=V8&{Igi=B{wWsooQF~abDlqD)IUkZlO9Uzp8!1RVbK*&dRVN_ ztDe^dlV1I!fG0gH);|Pz(!-*`lO7i9AEx3-5A*f+1D^D-SpOj4Ne_#zc+$gS{k>E? z>0!S9ZlISo6pOB0FTij8om6@XP-^(10E>nm0{qtBiPGz;l-A!tlkO^@wEi~W3j&nZ z=Y7oUx(N_x_`Cq6^((1#6(GC*df;;cl-Az>bP-_D@L2&C4MhSh8m<*!-W_xnptSy4 zI=DuF()z1`P68=i1#}chsi1>EN(Jo&viK5ED3D)4JAuRr+6tt!0=Qbh1W^BZpp8IE zp98KEkYn|EZ}Ym=0x4Ytd`2LPi-A@G`CSNHDUd}$OM(2(2R<#3t7m`~0x2yAt`JCe z8PHrHzfS>|3nWg^OdzH6fXf7u{RGfdAf@wA+9a)1OEp$ON(GGsQaT5?R3N2uflCBZ z`WSGrK;i@!2_#O?P#|%F3k8xr6KEjNFenA;3#4>9P#};}RX!z<(y2f_fh57AaSFBxIlh~12KX83Zeoj z9R_3zq*M?Q$f6)Dki{WDNFZ0Y19b#adK-`>&@dR3sCd=kBfo><6|WLLno+gXtIi(j zy%liwNSvBDd!$$3?2-6^fU`#y1k5 zdt|W>;Ovp#UVyVlN>y?8NU18$9$D-GID6z*;OvpBo`ADQ7P|w^9{CkGdt_eV?2*#0 z0NGPzu?TSZ$ZsdW;UlF2hmS0_1sp!|+Zu5ANNF3u;UkM$%;6)yTFl`irL6#mkCe8= z72#u7Ehsp9q^CLH?2)*pfU`%g8w1WBxfVEkG$gc`vqwss0nQ#-RK?jNzZV0}9w`+# zd!$t0?2$!*vqu&M&K}8b062T3v;c7SNNFD6?2$!*vqyg8fU`$RlYp~F;snkfDUAZo z9?2Fsd!#f1ID4d2;Ovo7fwMDPwBQ)v@Ijm_ z4j+^j9Hrv$!D7J?z~O`Wfp zNa+&5;UlF2hmR}@96qwR2#bV|EiR_u?2-6|fU`$R7Xi*5iF*cc_Q-D;;Ovp#a=_Um zSMvd9kNnO9oITQ`inB)+1f$#8=48O(Bc&4nhmVww2OK_9ItFm~$W<}m@R8C{fWt>h1r8sX9~G}yOZeEL3eFyh z6F7V1dN|A09vqwsY=7vhMnueNZMVf>UhhGR!4ShY-JpZ-)$3riMFUud2-zh(m z_xrqgdEd+H%%}Kax!2}KQ?I9f%&*k%&gqhqNN!C&og9%&Cf@ja|FT~Gr~m1P=l|e; z;mfj46~wbb^)G95Wjt%e7lwT6>%8r*!&U7HuWHw}ZO5W^or~ID+uiTJxsP|5+t$Np{N?Mat)pg(t0v8zazW6dsMd9KI%lg2 z*{b$+gB_`}w$>)?&uxOd!TFgc>#J>7r=qricpet1u@xVB>4HxTdJXxd*Jh4sr9KMf;j9 zt}W`&_T0@1e>JOpBG{}tQ)@P1C57iSDbz}?IG>diMsCV#-}oP`?YYkldO+wYtpvb5!PBFL6bVuYItm4Sbf9Vt4a7wlNxKO*`zS}x$K8R z=heg_>jcNRU5%Br>r~XC+OA|}<=l`JtR(Ajtxe8#Ul^NMXU@b-lONUAq}l;%ADfu< zw+TU$+Rn(1MICEudGLXtN!CL(*V3`5edlvW7{~a*@tG#uYG`RklWHe1gYv=qg9CPX zZ7mAVU5R$3a9pNEZJSlSg*NNH%w`>_btUJXD_TkWv1gjpx|V89w3d4_O=_9FnJcOt zV%9Qv%$X*&ZCEW$+TU}gNo^Zet%*kdgT+CUI+e9GsTM0bB_AAprb%rZR=r79R(#T^ zKuax2)S;+jwUICNBZC%2*In1W=ecRup{T>T+0{P&)2!P^WLnhRks2)uF*J=3J--k;S3A5*>^ zEL&$nI<)k?%!$hjZBl8sa;4soI4GBEnf|qWIb1N z_nGUfO?TS;n=(z_sI|$tlWJk^rmXc}$uz0OOUI(ZYWBIn{!yPyllir+rERr~7MisG z(wQbTk66c|>P@sSy)#W}*)V37Y6C{sU)KevR?TaJLI!=c7Fx*{GAsFE&FyMm{c^(N zrQ4Y%HTS;uCZ7$O)ag;PNnug@n&t%c8l=?SLh%twUOI$6xh#O8h#pJo<2SeDrV8qx{u#McE=uy zjpeWKLpiVV7yRWsIpEIR-$y?iZ4-SumgMj33-~Mhz5Mn35BQ7tp*$#9;S(S741j*gzxeOrr|}%XcKpTss_0h!0zdtX0R9U80M7*+n7fd_fgh9q zr~jw_*7Mi({QKYf+`nMIm?W~Yc;uh&i1GxF5sQO|0rHHB5u1aD0rHTG5t~A9Wcd~q zPofxc4EV0@nDM-c5j@{yvhOGID2ov!A^)q0?2HruN$a-w@RXECYPkkw+7bIL1@{e3M*za5#AW zpEhlBqI8mP*=f^CsJH{xIkFz$4p`^Ny5Z4P4;`TEk%fSd2OW&eVh?X8Hnj0wb`~4S^LQrvmN~mHvLTBN&|(~dkqys!{@)0m1T$&4 zD%#UqSjzdc5#1xd$nxz-ZS)XeNU%FYS&xls4{o8-H`s&zk(pJ;LkE<{jaB_Iwhm4qi}@I8 zM`r_GsWy~H(M4SCBm63a?c;B?4iP9;pRp3C4UKssll>?fLW)G(LaM0Oko{KZZUtzF2qh};aANF^C zRK^{Qrl0agoBN6qrPI98RPN)cThn}`X>%Ws9h%~CtPVCr@6N1e++lhPj?}nA(K8Q& z8^e00`s*fo8#4tc(uUH(7>rKww^G_Rp7S%!61CD%(RZsPa&YeN73-RLF5i8L(no?L z{Qyrydc@zw(d2>tEafwiJs88moqBWnK#gHCs(N&Q*2%%0=24{G8Nmhwixu;5qKC(& z+uYxRioY~uvEpRxds$7He@dqfP+f;;EdQ6+#s)r6N=ttwz{2;pj6IgwjMwJs+<$xUWI*i#qkfvdEnqQvJM;WMt*7d5P^sKMB!1hO z^{_eL_c+yhCIA;|+q9lB@$s3(?jOQd4^CGecq0CE)!3HHwNyNf=(w%pxcSQ*?az_; z8<`I7?M2uAGDqv_hChEXqxE!R+x#`2_NOeKp7OOnoE#6w(ks312zYVE|CKEmhmz9Zycyp#dFh#L>rKVq8f)9=?fc(O_cpdOFerVf#&$@4^UN01 zqm93ZXA8zRW2Je)7Q_K&PusrdG>Zji(fH=c^dtXhGmca0;g0FW#tj3UIy#6$lbfoh zPZk^79q>Q`?%7Olcd3nzXlbJKA%7!A8(wfz`cQGO(pB^poJ`{uCJ$%!bR46q)Zc=! zr{izSiDr)V_(4>Ls{?u)e{0V5naVv3@<)OpHvS3L^R4t^_h<_S1}o)q;o&}M7`G^A zYbH`Br0BroO^0e8l^`3&v(*pxRT~|U#Z-cM=^o8k{+3f4`V{N&e4st;1AH-9DYhTE zRG_V9AbmfWm&T3(93gZtwwOo$1uMNDKaY4+>C8%|(ob;G;k}ry+ogNEColD-%;t>W zNu^D&(kLA`X;|q44FRS++aA9=Q93=CLnhSY0fJsBT|aO!5NI4*0t9#DwA)!}C@#&tB-3UBr`hyi4w=x8C-wygaRL^m)mIyKZtP3Jv;2T!2GW%8 zr8ku4%a=~^1p}K?%>GOd4&np^PjlDWg=18FGO=wF)(6l3;}}d>Po-zDp>u=h|FND4 zq~-J=dne4``F}pVYBQa#o$=bXQ-FWkK-XiB=cb>3tPbdUiVq@{(F1s5-(S<~8O?4_ zi3{j$^f)R<1YA9gW*4Sp3%HsZ-7D|=RhNofrHt+l_~>x`GP)b!&Ec7JquX*V;xEN@ z$Nuu+kJ2=Z`k0GZmkJ+JYpH;qtVhEeHXbEf54- zFp9(bpf6V0f>B2SUw^O#qYeX}-`IjtZvp?Nm7-+SCO+K!IlTp=Hc|O{dbdY$+#c*N zU~@*DV6jR8yFF?(m74@?&ZyP-kDS>8!u3I)=-Ps1z>Qi=Td)|oL7*+*M1Qb{KwB`I zu6^Cdfgi;r^x)@JVYf$32f7Nh1<$dVyVe#=rSe%-v<1MlA^{!T*8;dE-NAiL0iVHi za9Y_4v#$^X%qW$ERsB&{Bg2>{)%(| zWf!Oa(JJyv*3Qg7cBRJuLhprgxrK4PzRj=mRAJM*M>W0c?ooF%9bG)?&f(u}`fdL6 z_B%&^`?g_s++Ov?N4u*EJGN_A)Q07Gv->Mp2 zb*8J<|C+9@i9DP2&cCLsPINWrU(;1by3%dof5EZpaDB!5*9KjMzIGmipx^KtjDko)S@ zzb0s3*rwuW-alA*A>a6%dw#IFM|GUT4j+|c93vyWjRzt5;~ zYqjut_KvR+84Dw_r8An>nlFc_ftMr=Q9}CtmR96orb3QYCUVZFtM;6Q)xHzqSn+Me z`HyyfJy&?{S4El>`5NQz&Kb40;P+GK(L&QGKkGV=7CH?wUzOA;sy3+GF_Z91xO2bl zPJO3N=4Pc{q{~%MwiS%to-?zpJ*y+PRZr zA^VXTC3QabR<-393`OnF{eDh|y>aHSSDzW&qVU|&&JcZHzYDCIMISnAKR6983kn~9 z?6zmL)%XgKuIgvHdi<<){KM9y+8;A77W`r^FCPfhsX{ASSA`OFOJ>fFPw`6~07EVSq28|=`z#?Lv}sxM{^ zN%eVG=UMgNjPQE~&(u|u%=PE7@>;vf44+|8Jjak-8|A%K1Mz$8z@NY|B}n^Q)X?Ip_cP|AUfWP4-M)n{1tIlB}1^PW&Zt zIB|Y||Gzx`llbHDAH+-IqvM0)--!2#e?DIL|IzdReiHdtJpb>V&_De9|CJy3HY0y~ zQ=Uq!{J>vt@b@|f-*e;oheTOEp@MnKXx(rh8=&&Qy!t>uOIn4sq!e` zZ#4Kz9z%1r;m>W#Lsb0r27i@fXr>B(uT#!rhCaAVz#se=d{>%3Ia+XvN)uK1>z@Uu z<10Vl?zjFxX2EF+{_2LmD_U>@@U3+ID924MQ4{`j#^8I2{85e<^X+Q>T4upX+BDQ+ z{E5$kMbD z4RusOslj*LF~8vD#LA-+RYB>3)xZP+vKR1_prgKXj8ZS=?@p1u;N|$rqufTeMYSKN zCUPb4jbpjyVMIsAsv@Q8>|TL}L99~dmqXc72!x0KEUe7jq+9|!y;vHZ>jZc`ii<&i;0{jHyrJ_h)%xMZv1 z8}9PU!-S6Bsy0$u3i!sclnVS^n9NTFd?#H>1q0MZvL_?%8)H{WG`0`L`8q*RrD0+}BNd|4o+s`%cyl&a#} z@-ol!hmQ8qVzQ{pmjseM7U(UIY%S)y_fk3v=%tEej{vS0$fCgC;z;%|;ESqAw!nA% z<#z~hohtGx=q`}o+W>#rBfqx--BgiZRs6+({0;>C#en<@KBvW`v_H^AAlW=W=%~LX zkY9nnC6M2Kz_nUTe)|BO1@bHK_Xkqi3yYo77JF0ZsHG&n2jDMcB(4|WZyDsbCs3%x zve*^4N+5CF0B4V63!FW&sKuN;8WTl;vqu(HarS5! zbOM|`QmVzAJyO~kaQ0{zbO4+^@+)xmNU6ZtBiU^MXOH~00h~SZD{%J6Z)cH6}ivnkl%xf`c53)zh#y2mG2WiQd+i& zg0lzLWtD)l2fwa3d+=Mfo{F;vzhxVMJGGj zgR_TWP_~MSvj>Z=ID3#?_A(V`4+Es^CBWH(U$=4gNU18$9w~hhaQ4WRz}cf=upDsq zNa^!{vq$DtA$$A)k+Nlg!$*Dv4j)cggTqI%7gKTg$gjZRBfkQNkNgT8KJxnv;P8>( zGQi;@zw-fykCX}=K9W5baQMitz~Ljma{z~r{PJYL_X!^>RpAEhjw}kCJre&I;OvoX zfwMj_B6oRBc)RSXOGO60L~uy zod7s{@#el;{en$WfA1PJE;UlF2hmX$r z;ef+O;zj`uA1PG_4j;)DID9k=)W+c>rMCkPA6Xm>IDF(+6^D;34gjvyhRW|PfWt>h zc^KgPgpVz1DQA!L_6M9jQmQ7-9x1&UaQ4We7IXHfU`$_ z14Q z91m@QMS$a>39vZ+!W+Z`XXUfYmQZjy)JrerbZ7`Hq~dhQPJ`1SoCc>u3*Z?Rb2_vK z$^fUsMQLz4M1gWDPKVE=D^7AaQErc#t?%91jhE#{kEJEKUa;53*PaI38qC;CPV5 zX@KKF;-&(Q2PqXe9wcrG;CPVI62S2wi{k*tgDj2*91pTM4p+p3T@_PsI!NLO!08~p z!vLp)EUMykkhtN1(?Q|{P6zo_8>fTx3oVI!Mng0O_EQ{Ld~M05~3`R29dAT=fSW4;ltH1C9rYQ^oNhzc&Gn z2U+X~I38rNFW`8P#Xf-JK^6s$2U+Y5I36Uf7jTKTO-cn93uIAnkw6x^0}TZd*A2K( z5CggZ4FvKls4tMxt|%=?EA33-Qz}SY2cVunehYyM1hOcoE09G&zCae+0C@rpgH}MU zKuT3f38Yk&9D$U!1d;-YYYrp?^4k=M3*=W26Ud?#t0-^aF0MrBS5i0N(G|@Qkn&f63Ai*7%9N-($n!5wvMP$y7Ux^dr-P`2a7p- zuxN1h;CJa}D$X91F0BNdJt#GhJ+`=X6BUOK7F}`pVA0_4!Ti$oEavdRqALy`{4U)< z#o>ceFXr$;slnlc(xq!y%;AI5rE39)4@#G=1{^*p^;Ovn_fwM>A1kN7Gegbgz$nWETvqwr*arQ{5fb8)pyL1lV@Zt1ZIva5K zNZez9!$*2larj8KDh?kh6*zn}CZ+=pA6c9MID8~q6^DZFaP~-P3E=FJ(g}dGM@j|G9$6d*ID6!GEa2>s(qh2b zBa6cUXOCP7oIO%H3~=^H=}^GgqhUbGZguuZsleGIi-Q1Xk1PtDJ(7JZ;Ovn&fwM>A z1kN7G9soFdBwIlCR4MHbID91T7Qo>nzp6NVkNoxl96quraQMh?Z9x3esID4d2;Ovpo z?trsLN(IgyDeangVT-dzN{awzkCb)-oISEw2snG>w=Ll8k;T@4vqydf&K@ak4mf+H zv?bu|kvqwq=&K_B83OIXYQQ+*6>`MV>k6a0yJyJ@1ZXtV|*#?J?EUM!0(UjZ( zaQH~6z~LjM0*8+*)&m?q@>>^h_()s<;P8=BRUAH&EpYfqoWS8Daq7+CBXOzt3tI>u zi%U^(_GlDD0cVd!fxy`#i*dl&BfqLRd!$t0?2%G|vqwrpfU^gsOHKjK9+WOQ0XTb5 zy5ysO`1yZi{_Xi+&+nc8Io>IMd47ZZMBd->j^@3aw>9t8ychF+mUlky|C^F~Z|+e3 z%Aj9vkKAi=Tje&&J>U2LZOi#x&PzE7C;V`D zeE9D0ZQ-wldxbw6ZWF#NTo8_hPKN#%+WkL#|G(Ym9yhyYElI50?sJcuYO@vtKKHo$ zXYjel4X#-WsrcOE&XvLE9yhpVanp3W&pmEq%_;|c?s2-T zUAOzXk2|QY+@zi3M(Zr@pl<()fZM5tegbZD&f?bS_Ad*#e`)9|kWy}qZog3=rGh>J zDIE@cNg$=efZhTr72F_@(xE^vfy4=}7s&4rpr=57Z%5A;(|Wj@y1j=A(kr-5AidmL z-QHcm{anKr1k!sOm2LuVtc#X?Y{1lY*l>Sr!mnJC{)+- zt4ce8#0lC8tKpTN9_5iLD$ge7`1yb4x_>4eG1+4_KD7aD}za4;<0*Pw_ zd|Du-f))aa6I>yX($+w8frf$La)Fe#!eXpm%M4EVZFN*e;c?vql1uluC50pROCDHZs- zPfF_o_0+X2<^dN7DtQ9QjsUp=SrnuM5~sy-1R4e*ASsaFEFd9} zQdQyt#LYYj#02=Ac>;(E@N38xpmgR(R3ZYz%{&H#1t^_)6bK2BZKxwa>C7XD%c>GL z^GIUlwuvfWbmn1Tf&kZs2Ly)_!V{rDMbmm$r&K}IqTmv|J@H_Kmz}bUegR=*524@d`XTHQ@WRLwC z96nO2io-`rD*%U&lnNX^Qu;jL@R8Ez0Eds1E(07sQYvuxNa>RJ%58*?0?!3!kCZNA zDQAzw37kC=w-9jlNSwggBl7}hkIW04J+k-=;OvoKfwM;zwV1O4hEb(QYvuvNa^i>vqwsA1DrjwC~)@3@2!Bd zM@stx&K@bf8F2PUsleGIrTqYBkCgTT$R5wnGkX9IAGzuYIDB-Lb^{zf^4k?~_{gu? zID8~d6^D<+2^>E1TLd_KBu*8FkCb)+96lNool#2oSgD#gd!)1z;Ovo7fwMXOEN$oIO(77;yGTX#>F7Ba7tkHfN9gszUZSOJ~+gtbD`aBc*Y` z;UkMlz~Q4)HUv0)BrXa#d}KrwhYzwJJq0*?q?BNN!{H;P0*4Rc9z6{>d>9jto{X=2 zgYc0!7o0tafAl0vIeXCi=tqFF2Um}h#cw!!@N01P;Md^n!LQpmd$4G5_Tcx?V|3u` zLFuDM0cQ`cTygf`*A-_EehtnZ{62bwHqIXOJbD;#_Tcx?Lx8gfr3PmYvJK82EE=3W zSbX$Q)#v|KSv)~+fBtr!V|VWF|EqugKb7}>-k!WId291le&Wyn*X4G~y)yUG-2B{7 z>ciB*)SIadsb8m7q@GFrXKF@jQmQ!h-PC~8jj3*_v%mk>@Bh#J{68Y+J30MxZs0ux zSLZa#sh<;1{xx|d`A%|k^0&!~Nc8oe(%EL!#X zzjO36(Z_@XFXWx@OB>Ug8`(}S3yF>P;voFrh z&CZJaDY8GZJ+eOXtH`p*g2>#+BYgfJ6}cmFOXN$Du90?;=8+2{$?)I8N5k)iw}xL0 zzZm{mcz*cb!_&g|hlhv19lkkyeYhxmRk&&RQ{ianFQLPsw?mskuY{ftJsX-AniZN7 zx;Hd5bZh7Uo0o%b%IrP zrQnEX*clx0U4SAgj(AS@%Fcizp0m{zM?B}0D~@<3smcy4=7{H`lmOl*~xQgOyJn^s;7 zIO9734FP976I*2g;EeB_24_5zj4RG~=FG}G7IVfkn^x8ZobgO^l_|g(&)jTq#xny~ zCaE~%ndvLzfHPiWA__R;uLUB2GhPEk;Eb305a5hwv}`=h03qW&KvZzVGjcYb0vz!S z5Q8J00kZKUDvo#th%1hG2FS*fR2=b`-*^IW#4|wL#u3i|F*xEG69z{-gKFb3+Bo9z zyYV>Sh-XY}JPHu;{tUPA2;huofVkp}XMh--@r(&C=8R{AZ9GI9XFO@S@gU%gXH0C| z4>;o)ItFJv17zb~D$aPu#Kt{LUIXMMz!9$j zA_yYh;E30lc##Sb?@!eRXS~c;P;tgnY z14Q7A*Dw$`<2678&UlT9C4e)YDQM$jz!|Rr@(kdN*8o`vIO8=yRB^^@fRqEycnuJN zGhPFv3~c10o)?cn3xWHU7(>;3iKCf=m@?h&@j+qHw!dc1YZ?sOlUEO zkA}`P1_+89;iCZ}aQJ9|3VsQ8{KsJ2DVh$e$$c7_;!-oN4aQHAL3=SVg%Z7t2=I~)m zY&Z-!d>Abo4gn4y28hAo!!U50Abd9LWif{jV`9U8z~RF%aK+)nINGqAio=H_a>e1p z0NJpIio=Hi;)=tE0pd16_-xq0Vh$e$h{55*nAor_{$d&7Bl8=!vXrxjAz}E2^e~Jz zR8k4DXTv7I*~2i{umN!PFhC5>9>&CmwN#uvObr{>1I``>)rK{Ivxi}@VI4sB_$IsC zID8mK8&*?s_+Z`@hYw@Il^}c!4j*F4;P7F97#uztAgk!j;iCca65#OB0I2{RJ{l7O zhmS^!z~Q3-@;u=1(J)v7ID9lf76T3+4V}g3`Tc*@=l_51`~Nea|HG+|Qtzd9rZ%Qt z{--|wx6QdcrvYyxJe7PuxhJ_Lxi+~nx%j+4{|`-kGtn<`U7}Os%EYCK{6r}JVfC8oDnuEcC6=O`$J_ zI)^^Pi)UB(bYU(D^J>%;K3y2BVcwv+!lw&UsKKWTlZ3&i3j^E`oG$Lbrwfyj!KVx7 zxWT6j13bKru6?>Nv4q#gD^_s2=d`!XA7sb!DkEeSD1IRuJGBy3F3;+ z781qavxP|}{4$IAY~dU?_-tWfG5BoZJPN76n%e zWKqyYAd7;l1ac*4Ezp>l4tz!+r898VD(y;3U8w@|WSCd0u4pNcUN!l&KzezB>WUTu ziBshYf&B6|)fLSJ^2-}oS6nWTQb99;lnQ*QCZz&js!6H9mugZf@THoRmH@s~lTu#C zy26)gvMBJSn*5Fhe5od-yr^}BFV&<};7c_r9Rm1LjT8yr4){_{es2TnYeVH%P#}=f zLBOX3vN#Z^Cy?J;fC~f?C#Wls-vL0rKz{oJc>*cD8ORk#k18pFl->m72qasO6iBHc zA&~5w5EoC2Q)e+1WV9a;6-ZoPAX^~ueSnBS;X?XAgcut7zlwL22k^z}X{<0%wo>z6dybq*UPSk<#TrYZ;N!#elO%N|yj+kI&N3 zGl0WKe#-%ekCX}=KAe~ahmVw&QE~W4>3qQ9Bc)Gak?^s_rzkjkq?h2XOXCoWR*5zXE5E{LTiPJ+i2Zvqydf&K@b9 z0XTc4RN(B9xKhB`BXLs!XOCo00h~RuI1O<2$oyo$*&}gk)_IbQD1Lc&-f<0}dbg9RWCebYcz#96k~!aQMjY5WwLhivov_WD6WVvUoe- z@R8r!;}t(Ae5{nh&z(IIHwbX{Na;Yp*(2EkXOEN)0GvHiDsc8lsleGIr2=P)@?CW!2xJA0&*$o;vqM@j|G9x3e&IC~^c;Ovp#p1?32 zYKc?D*(2FK0B4W<3Yi(mVm=YN?QRAA1PJE;UlFjP)hh%sS3^>DQylod!&>s{<*V9 zN(Igy=@B@4hNdN8<7TXOH}<;_Q*DDB$do#Rx$5_?j#f0vtXX29bZ_`~Ssx zKhB$-_x-$adBgL*op*EI^?5~kSLHR$`&3>u_srk_>-m54a%bh9`ThTy&;MtC|Gzx- zlYhzg|DXKx|JmRFf0EDtHNXGwAG;yeC3bbJS*(669{p?dNc5fP=IC#u715tYpZeI} z|If^RFndh)o!JAkzntAYyJL3C>`Suqvg<^SM-D`GL|%)miu^oM9;y2M|KI=q|Kt7s zzv}b#|k#wJ~;__B*>&fv=~CYC0h;}u&vRLyx!idd?>&Ua?UCd|NF3I)u0 zO*#SX1hUuxXe*FK!PNq}60{M>mEbCYlrn2?X)PcF44)CmycTOEkSoEJ0x4CSmIBFU zrr+{ufh-DI2qaE$g+S(++_(6uOBPk(s>|O68hqI$rCQ9FU9#8|@MRaXVUuQnFT13a zDR_%7yW~pX%P#q4KHlQXF8LMsvP*uMb+`DkOG=rKxA?M47L$N4yJS(|%Pz@gqTS-l zE?JBNzU-1kRSL8VlAQ&7N+6|zdIFR-K8?i-sw_4>O`)y|STy7daNYPMl{^7T8=nAj z1t@L&5s(s~)Q}^yjERa&c9Rev8_^L}vp96f=C07Dpb;;s#z*k+;ql&M( zWKrO&E)9cafUmkV43+@C>XKhoeAOkTs&Lg+rF1di%PuJ`2YlHjr2=1e$)doQU9vbI z@MV`Q&I5eeC5r-wkA}hHfWt=?=Ku~LS)2hld?dRRaQMjLOu*qIzgo=UBXQFJhmVvB z96pjg8H3%3vqwq= z&K~AkgR@8ChEj3%Na+xO?D5Rq_;$eIBc%d|kCYAq96nMiaQH~+Er7#EN(TTAABnpe zaQMh?KfvK5ivov_WcLCbK2q8TaQH}RZ!8i%w%D73vqu&M&K_Cp4mf)xz8m1|k+>d! zvqyeaarVe!SHRgLi(LR`kMyYG?2#UUvqws`n6pQ&RB`smyeiHf4V}(_vq$DtarQ{5 zD$X7$6*zmOv=iX$kNU4DA@$VKJw*(wMve*J}_~>MA z4mfD*=ky3%fM;4m`4j=h#2snJCRN(ND(t3cyM@j__A6cx6IKs!`@+dfaBrXLw zd!#oBID0e-B7n0;;^Kg_M}Adt_Q+x=QSrL7N3yd3XOG0G;_Q()fwM=h1kN60H#!YC zdo&ExfwKp{t~h%TXK?o5*Wm2IVxyC^arR)*;OxO-qZ3q|Jq&|J#{p*#N)65)EE=3W z_-%BI#hg7@G>|>c>_!CZ>kc2z(nf~>hYv~{9RwUcSZuTxaQI-+;P63qqdim{J}5Of ze6ZMPCl!Yeej9BA96l&*v>9;tVA0_4!Ed9@@ru_8A1Q6LiKU!9C~Z^;ID1gqh%A2H z*@H!cvj>Zf)=+Ww;L70aL20AaRGd8wgGQ?WXAc&=n6n3q24@fE8@E(gdS z-=1;B;UkNSs5pE$e;X|X96nO|4B+sQ(lWr|Bcn#Nb3>>_@RX;vdA<#mC3L7LUbtCzdC_nKLctZ>b-p zR^`sjy_3Hfn9DN)F6XZT7UvC$-4c5tb~1i z=6*S^bzYO))p=j#sRAQo6Jw)z$Kb<>lEmob(B!i@*XPVneJSL{6el zvQzTjoTfQ9r@E$YN$p6zmU~HV_uT)={YCCuxxbHJ7Vnk#b@IxbpQT3Sw#*%qcNcdg zR`Q&JJ^ye1@mCa?f1xh^cXjB0$-lPOT-CNP^dD7kON|YldP%=f|0-w*^bL)uf=di9 zRlP*L5pa9rk;$I!>jV8mF9okXpL$6*DxR({qS6)cblnUnVln66rN9%3M<%7G>#3J? z3Vl%Z+ViGVh69dpL0iBvsWt<{g;lQxj{@NVHuCZP10st^!i=O7&`J>+v7lwdb}LNDz2#57t+I|JmczvFohX9;XKf zt#(cek6lM4t2I05_cl97>%|WG9jSlg=!vdpSXOJURKM34mYn9|^lO+@`AJnz`WYbo zk*D@#!)K4ag8pp(RnLE5P)FQ9g!{Ywo;Dp!{s^m~F6&1%gK z`fX_JT^Ytf`ws+S-YfMOkX?JF)-`^+NAiLb?LQQl;kkLGRs%U}uN0@2ykV36BN}HP zeW4d|%q-Skocq`$dq#Y}7aE`Ko>To9c0;Zdue$$CDz!P)e+rOocm@5(F)Z=NE9gH4 zNaAtQ{YTY?dD&JJN|haWI#)6*?SQXf4wc%)>32Jo^b?#;|2wJFj?-^p;hf42-1S@_ zM!akbcs+Ti;FX$BrFO&gV~XF98^#lzS6E!RIG*U$K&GCT?HYjllAPy%vq@Si=2U<8 zoWppft|&ZE*|XQ5qz4RsHV<(jw}5 z1;cV2UiE-W3e_Kj_Y9aH3(~;@1I95d2lW*^SiGw83OJns6M?KOo?H2*g?Zb;sN;K6 z$R?b?@lAwhfERsy-LJq2ua$3FRGaQ6>|h6R&8ZzfzI;>Vhtz=~TY+>CytW}5$~WB< z@xV}qEzBzbj_+68*rUMpyy>R&RctwQDhEi1L49yrabM+1avnp^2f9y+`|10&t8)CI z(unTL5Kd}QS|Ro}co0WR59`sM=QuSOILaABXkj2We~A z+pve(TUt=y__e&mEM4s2B-XJ-HJ5|i8AdmlT_1l3!_vdD%}H$xtHI!lIh{-(Dnl2R ze%k#?k7xB=lrGxS;TBk!Zq9?wEBEalb`me{=DbDl>MUhg?p0su`Q@7yCxC##H#016 ze}JJ6m%r4#gJDkq-LI6;T9|j59B1I$>;N%Y76*5*gS_YRM4u>ES9vDTuou|oqt#bB z@I_uv@{nOC%>-&^aMGFO>XPs4S=-dJ`=A4vwF`S!k28>K{rvzZI_MZKd?p1j?6q=N z_clYHWt*HEm4PdMWp5{OMHlCEID^5Q&f-KE!v;Uu^qKA*3|vsY>Bh_hUn$r62kG#E zVTXC8L#wZ6=#i!c-P;U4#5PgyL0Ry=pLf1&GiW5Qw04}6u4f0stFPzex~7iq9Soep z4l*e`=$TCqcUK0DV+RAP+njWB(=*+blY6sG)O*kYO~34}oWgutTw8BW><=V28Fpe* z^9Q?!4J@&P+5$eXuK8o#l@mGZo6o4e(v!zDf3>@E61H#59nRj4dx>)!SsixLV{G%8 z+KW50`A;eniFt5JU$z--1;NKX31r3Ol^(Z&OO;v0-Ugl5{EP16oIHzNkFDgImDJ$e zPMpg@KUF=^lU{5&y2=f@hF#YdsS_9RN^2MXWSXg)rn(IWJ?U*KiBxud^7Sp>>pp{1 zxPN|-chyu*8TBi>KKT}QU0dHyT+X>=&GdrY-mJ!BZ$OmJ^j7P9Nwx-*2OW=V#zw;_eLYrE(5uob+X!EWOuznx(x3tWRC z=dwhPtDf5lTNsuKJ2-`ZJ?_5nLoTE8@#;ZOSr432-N7jjv~BJ_w-ZpZsJ819?qS%Z z>aI`O+jgKb%roG+Ejqq-P-fLFwJSP&c+X?H&w6+-DpP6)B`9yH-L$9d?|JIcgI>wr zYS-X|%X)sX`#2{sk(Si@q#@i)i?Xcq;!c>=bN`~JVm-~Ydt@BjPP{{H{n zJ^%l|{`>#0{{8>E|M&lY?eG78vw#2pxBUJ8wz^;U@BiyJB%%1+sgpmd*^nENkLWu2 zbDIsxAwIYYWMScxz)t>JX2THgFg`Hs8cVzrERz1&mMSI{7=A z4TBuUCv2Vk?ahYV$>V?xKo&hdO3bk19L5KJo&15!hAfnPE|_8IZunTQ^YPO94dk7l zICks$?_#pI*JKrgr9L%BdtflpIA`3s#5Z33TPc0LH? ze&-K{Qpr1aK4k3VuX;8#JB&ZAN~KBQGvHLR7V)uQ=Y0%IK#i?JLXD3FJMW>A4)Jur zbIUu0G1W?gd*f5e&JHT|0-q~(t^m@oo>qkqSmC3@&gE2k2z(mac}IEuPrfHOTW$m9 z3(l6?f$s{=7AslvoFKOXS@WDAHv`u?%y}eyTX41rc@OFYSplAw1r)Bb;AC-B`UfY7l`O5!2`hO+;%vDdNRR8(yAJqC&*>Mg@RM(a^TB?v&CIsAUIp* z0Et*9$VEWjS2}er1kxZnTdbVtHcpTWfG-G6o%4Zn1t*B`dBLeO6PPVHLCys}CpZme z0kZ_>k?>i;spB>?1*eWMLvT(^0}_2sovA=NW~a_n=ESt>oUm|?n>Y=Gse;pJ5^%QQ zoR|WneQ-{l37locc{CZAEI3=-CXIy?WFnBB#R(#$6>x$GXS$7(YCLd;-~{PMzUE8Ve_g zl}|d%sbgiN;A|NNd_r)x2&W3pmN7uuJ7>!fV1yNC%Rt~`f)hj-E;x1i1E&bimVQ9O z#|dI3;p5cl3nYA;AVR{&3DO5h_&AT+fbQ_=1tff&AVR{&dDI(7_&8hKCgJ03X<~v9 zJ_(W*3dtTPh>+}Y8Z`mQ9w&%E_EhFX0Z8~bCmMi+kCUngknmw1?R*F54j(Js;Ujd1 zkC5gwhuIRSg-@UsJ~>XphpDr358EVsm@PXy zfrJkeWal;@;ltDkBz%|?frJlJXXlIM^^Yffm^wRO01`e-kW>;rOpu+=Q%U$Rk9Ix> z)WT=yGe9kT0tp}HL?GeAYzZWMm|;7gDy@H<@Nt6d+{*UJ9wta2*~2v2`4knhCwUb} z_%K^`ZlRL!VFlT_8A$jrTXt>)5-xPyd`)9o=J;ln}`NccDn+*`uO+2XK-kF#YxknnL*tpyT3PLPLzgb&L}AmQUY za#+I0+43Ne@Nu@R0unx~AUp2|5r;d>DaZcO`Bz&AYD}aQL6GTY(IFFVC2_I+6QXt{uoDdQ|EGIi}2NFI* z1?B|dlR04_+2foLrmIKuw*h2Nk}Qz$akkt-CE>%`5=i(s+m=vC_&8gHgpadj5s>h4 z8VCs=%`XHJKF*^BK*Gm)BqV&CEkeS_X&@wgoMH2Ugpaf3dLZHB1Q8NGPAZ2be4H&p z!p8}6Es*eWf(Qv8=h0O_!pGTi4Uq70wplv5LvbTd6MTWE2^N=j@HD`ecqU;> zxvS~qrv5ymz!L*a&-@18TzG(QFZ_4#A5S}6|Np(G0{9H6M~}L%RX#R6Va|capZ0=6)_GHd|wJdk1i=iGSOcK($=Flf$=6K*XpekqO1N9Wvl#>Tn_ zD*r+~7$`5^k+qh>)M@-9e|AP;>Ub(yso3+>!9Z3jb~be&khR5aTG(^$Y~aj7{hXsa zxQ1bg3wLk{kc4mt7qd+kPPds%C7Elb14v}L>qQK^z&q1nH!{7r$Jp?ckmIpH!}{m6w3pWjpgNAXmyA?B}4_fd_rOepls6vCRaI znRS8_IHy0*x4P$Z8u%Cg+Ri@BtKONlg-smxa)6zEdIJCCpCydLoHL9{77d1ddK}wi z8F!ltfGp!4N61>s4$hg>aLv)}b`2hHY&?28ca;}!tLd3E zrg1>`Y@5U;->z-)PVHa$y&f-7NlWE1pJ)3ISBFiyy1clvcNL~hXuP8PFw^=`skg#5 z(~fCe*!`-f^t4zi}ZgL4~yestI8v4e!ZJ2=R& zL=-UXS}JLrfX|F5oL>2dY~WLjN_w*AX}40S*_n1*dGXJaJ#MmxVd)dx*~37x*b}&& zVa?SS`k7UQOOEbf3&%{8>kh79o0+v&{cPbcx+nFtt%d6C%Ncy?E}(V>)0^1l%e8BG znB&wY%jBVj9hG5hGrf&U?e3d=H`{!(y3O=aKpIv~bb4=wrCH;2CeJC3?7q6w+lyx$ zJ?ND3;uq5gGVD{&lo#)6sqIar^Q$jm`Yh&Qt{cN9K3S|TAfC<=p!+2-cemH()a32# zEw`Vib8GR>dL*-b+1rY%dNejLHa#Q%pR>5eyXX(HicEiyO4>XQcGikg@#v{eBFA;WSUhPAhpPVYWWd!aP- z=yBd+2en)1EEctY`dV!VQ%jc|-DWaSyAbVT*mdo)wvQk1=T*;b3isVVdrbeXF*&B|I6BZP-CO#(vSOw$1tF#a)FewBJ`gqx-Cz0Je{Y?C#TT~AqB zuKH(hQ#gYcuc+=|VlVdARy*kCU)e$XKtSD*i4*Jq=?E4MK_m@%~WFo2Z{*<0RS zQaO88)0pnPojsgwYJO(0es^Vxx$7xS3%ak)*_YS;`JT$zmon`0)t5bE0ZCV^o#-u8 zzFLJD+_^gj)+$?SJK&X`eJ_>Vh3@U{+Q0vMqIa-^ym9pmo@jdc=!tf+O`2`D;l}HV zZC~k*9z7Z&*d4qB)E48@pKBgp`^T~yPv2Tz{Id)@X3mYLF z_vz1?JZnz$^at77Mu8sZ^m}Vh27E+dSZ(s1eiy_3%wYqmtSB#j;d=rndiovB>yMtn zZB#OQJ%byXpF4Wcc~r8pdOBRU7pfl;+<5xc>^krCJcG;2iz~mx!^=MHekzHB;{+;G zs%LQ8eZXg`XK)&i+E$(b>&Gx5DcTp{L@U3fb3DMyuKaio=XTny49oq)1v!m1r1Evq~Dtsgjg)#$HucJ1uMT}<5|yUSoc{^rIN7otf$b^ z{&VfDCs8?0@T@1aPC9zlv1eKm0y10tjFzW z`$lELa@OOvQ^|zotjDoDJ)e7yvmW;x!)j+e?kOsXXwG`v<{mvh@W<|&vmUpR%3Q&- zew>E^vW;i`7?p2W@kH0M&2I~y=xQoy!FWC6wzX}q`0=bCq%y~0TfV}-@o6kN6WL0LH z&vKXSiC`;t09pC0FynXUidwk<$ji3EtlFJ8w9+5Apn9B{nA=@zU}nAqi#$X{{QQ~|NrRU|9|6s`TPI( z=llQPkH7zazyAIIz5o6HeT^#{-}~SH|J#56@7MkN|GJK>wEW)ZfsXRJj*mEp_!Z0p z%YiI<{8r_G6~KqB@bi?ZWD@d=lz|Uf;kPOSSsVFD%LBKwO>P~2sPzDUoY|2#Q~dPi zfm?y!avOfT^T5qOQktK%Jg^ApX@y_0Jg@}Fs>#of9=HL>Waq~&4_pr<%=yXE1J?n0 z`@#>C9=IAvnDbMj2j&4~_r@=D9^elpJF+(NyP^lK0&*ww^P_=+!}u}N?4VKL$4pbn zO3P1{2C~xfW2Oh@vV%H@@w=jdthD^*>47V$UCFP19=IIHyAOU!^uQHB zmJfb@G;p1J<99_fEd4ycUwU8;!>+Z$Z;=M_E|wn_J#a~B-Aa~fK7Rc1flC>cm73o_ zJ#Yzdjhm?SV&D%2EeeTZEnWm<4OjMsz*P=Ysg<-NDiyM_sq{P`U8PFffh*lcr89x7 z?kcr%g%vGY$?C4(X~5-HR5}Sr>!(s7Zvj<05y%Rv#R)({K#Svmue$?XjR7tdG(QUX znxN8=z$Jnftt1{aZzb=1RB9zLq*5yvxs6JNuLxQ^706p}#R*@wqHH0nyB38nSyA>- z;Cw-)!+|dfDz%b;Qt41EexYj7!nuyp;vnGjg02Swvjr^<1`;Crb=WK`DiuB}Xi=Cc zXi=CUD0=|VE~vCGkhcT6>J20=RoVii8&S3})ot|K2AnOZ)JhsrEj9pWS<$bMfKzD? zAT6p&g?tu)(*69^VtkiCBg@G${bsU-ce7&yfWvNLR$z?|6s65FI_ zLFxW&z)&kF-Twk`l7Q0v&jCXO#O>b#HdvWj<w%97D&-F)SEk8U&%?m6R`e?*eDo_MeDu2(Ncd>P zO2S8_RuVp%UkxODR4OEVR4OEV6z4VxAE&_sK*C4A_oI~XiBb#69+j>Fl08}!l08}! zl090y4@mZCo3ksBqs8k0vZvx# zNcgDqS|H)0(s@9_M~e{01VAlakRsX($vi|s(NN59j6WRDgn z1IZr!P6CoWT09dVdn&iAknr)Aod_g+6lW#jqu&WY!bevQOZX^zJdp6wuaNN3uaNLj z=@=m4qf)-zXa(UDi{mIHd(=z(u1NMMZWNI0QIC~mk9ve;kFrk%l0CYzlI+p1m1K|R zhXctTXN!>RQRy%s*`rb+*`viFK(a@_gMeg@N(TbT9xYl)_UN}CknB-uZy?#DQX$!+ zxL!cAM{zAcvPaoMvPankfb6NPwL-#2r42yBN2Nl-$6K}zNcd>cO2S8RJ%EIdvW0{X ze)qitBz&;A?`hp8lc zuoy`8ATE&XVH)f^$gpG&e)qiwBzsUANcJFZ-(D)o9+U=>J;>hIMJ3sT(o~W?C`~2V zgSdU23`_Q)bl-L$*@NtT+kj*bO8310Bzv&9?-?N3gWrA60?8hf29iA}-M58GvInL6 zo&u6R+?e||17uIymO#P>+50w7N%-J*-xEN>2a6e&@WF2?2_KXO5|CHbK z_y7K`ZT)-x{l8wV@6Y%Df2#Ste*gb}EH5a3tNdQS|NqJ2W5xemyt}xpxTN^q;@slb zitpzAe`Dj3##b6&YW#1FPc%N%_-^0-pV2U~;lzf%4bAoM)W2H)?%x0ZuiyXwYE}%M z1N+l}>kE8^$V(?hc*h{En#o*DIu@?hbF?e)l?1iOuud-sW zNK^_e7q!ios(rV~M_3vtsaA(AW!rtQb5Nlwnyhc#tQM6@y1_#?EF~Rt%oa z8aoTfiow%Rsbt0A5v)K~3?7gfJDFiwF?dR8EZO;LRtz4h89N2Yiot_cW6uP#V(^^Q z*hxTE44#u3OZ2^(6@%xb#*PQFV(^^QSfcCItQb7DHI{&TH7f>B@&vMC@F-9qD+Ui| zjV07x&5FUpOk+m^SuuFFDv%X}CwT%{F?eKYEIIaSRtz5K8ao2WilI2t>eZ|mJOmb~ zt{AJv4yTe8gXfRN4h6DesB{RB6+@+ifpTRr0uWcKinCC(pzA?EK~S8~DCoLB&>(10 zs28-@52zEgXypR}Plt`|1N0D7dQ5rU!S4xL6y^(B6uv7cyEky1ptut79YLi{z_o(1 z>ws?yS|lzH&J*-&6pX7Hw7$a*i{041Aic( zG{fc!h)d=71(c3C#15_$kUfS_JNOL&rDI+Lt`Ja~%I^t0k`}mJ!0#9m?%?kV_zhep zpmavjoKnpA|H}7MLk0 z+sX_<*+RRZ--m(ef=b{03UK(a@rLb6AT z^MPcKeuZR@;;sdfJ&L;yAbTpZg@lh59hUIX{53$rN2T+CgpW$CBz&}JCE=srtAT`% zO0NJCJ}R9HBz#mVBz#ml7o~)cQJ6xqM{!p&D%qpo%YkH%7B2&mJ<6T~Bzsh9CE26J zOMqmL;)G<6u7qTd7KLPwvM&abJbRa$p|@QJHY6p}p}9SJ0RbS)%%v?wHdoD#!< zWRFUR0m&Z4SxNTjcPNnT(Jv``AlakEAwaT6zgChxDz%dAQK^vZQRyHc*`v|{K(a@r z{eWbTN_zvz9+e&gBzsia3rO~;)M3dUEj9tk9{m=8WRK!XK(a@r4M4I-**yTVr?Lvy z0SO<(jeZA6__zu?Ea8LSR1!WY4J3TD=&*zjen-CzBz#ah`Yj;ggSgR0fP@czM;`_f zKKLDd1f_(JN;4|igT>K@7?te7Zy?!&(rlmXLEPwr3`_Q)bo5>z*@NuSdw^sQN(0Fr zEC!N2hzlfp5En@H;CFNqhE(5d{p`vknqvsdLZGW-*t#1d?L<5vPYxqfMk!Z z9tM&NcJdONcO1IVaXnq-VY>u6elEm6elEm6elEmG=C3}?9u#vK(a@r z_X5ctEjldOqu)D$WRFTafMkyrg=CL@mjlTjmEH~{dsMm5^yZEfdm{&!HmgN2)Mk12_)fIOEN48r&5O{;Z%Aikc3m| z1Rx2g((ynNPK!bkPQT-TB%De|0!cV6jzSy>7jdUjNWf`y7?6Nd+;AWP=Pa<2fYYy) z1e{8T0tq;k4gnHyDz%b;)8b$t0jJ-AKmtys1Aqjau7m`f7KH?ye)|ClIK}k^5^zp~ zV}JyleuV^_N_ztdIF$+sI4$-95^#!Z0}^m5Z2}T-nlAwfIF$+nT;6R4l5nKzi~^M; zoZ^HeoU$8$B%FSQB%Dg?fFvABdAj(~B}q6f_5hM__-%h1NW!7C{VgB~hsE|IKoSnW z?T1iG!l|_V5QPLB7TXU32{^>H?*|fa$Zqcf5^%UmB>{)h_B~V*aG1}q1RQ6{W;)R0j2F* zfqnu?+n)tKBA~SW8KAF#(!hrWl(s)bI7=0rTxo0KEm2 zrt(_?N>k}2U@_2BKwO|rKz92EcF-#5_i>;_Q0Zepv!K%TK$D`|PM>{03MK(a^kw*bi=l?r4} zMd{5z!bhb-!bhb`fP{}0g@ljd76J($#VrC7KAI;>7bkp_y#Pq~Xwgc-M~l}32_Iz( z2_Kct2NFIiy}tD5V!|gk=5-X3JzAUxBztr%Bzv@Y4Up{7?^QsuN2ON+$sS$J1(H1~ zy#h$~D0>c&?9t-oK(a@RLb6Bm4omi^)Jn2PrI!N99+h4UBzshP5s>Ur>4iYDM{ySb z$sU!S2PAv6C?tC{e=b1wRBp^!K*C4AGl7JUcd3x@QK^vdQE5An@KLFd@X_KlAmO9m zsX)Ri@bO4a-QK^vZQE6Ww*`rb++2g%Pur4NhDvPy{@X=x~AmO7$A>pIN zHXz}n`4%AIqf#pgAC(FTAC)!%2_G#MfP{~(NBz$7gLb6A3 zJ%D5nQ)2qtK(YsMfn*P|1IZrzPJfGG$sUwWKMW*$P&)kxknBO}^w)r74;BN-9{f%} zNF~{W(o~W?C=Dcg5I4P(VaXo+PTvkBd+GT(XWDiOM$sUwWf0hc_ljU{#GeE)zi-Cj>7N>8elJLP*DhVHM^HdT(C=DchkUjlL zwn_M)box_3!Uv1OqJ$5Ar*8%lK3JT-vGnL7!bfo_BzrJA{Ru`Td$1Tt_Am>kZ=jOw z(ciOQk|L>93Rjq&4dRyy_t@B#n{rmsdn>(BTd-GGxf7AS6 z^Sgil|FNclO&@G3lz&;?TYmTN|9_`+L1{+m%+e=ILrU-V{r~-iKQG)~_waGM zY~7~1fBpS`F_Ndv-c@8|&1fUsh8+ySHk;oj-E9Y_PhV$`t|NCU$C)^Qt<285*`l{6sC_COjC zZupK{8CGjRI&KEifUstD(1UfQ0bwcVSOTO0;oj+32&4gF{pnaxdbEoM#HFBP0fqD* zEM^@y0O>ynok(tjxK zG9dkjO6LIdABotGOMx^XS`^ZNuowl>fT+|;8W5FU45R^3=>CUww*RsPCVi&oNr=+{ab5S2~^(txOR3QB1}qSQkA z4=qjxYW+tb{fA1er2o+3nLzpv#R=&@R5}qz|DnYRK>81-!8joOhZY@{{zJdxf%G3L zby)fjl?v%UR4SzZQ0W*T{fA10^dBl638eo}=`eu)BkvD8h5%_mbTt%61ENJMX+ZQV zqyh0Z9|WWUQK^syM2iD}G$8uz52OK6X&)dBh!&3l(tv2uN*WMl_X5&@D6Th<21LJ2 zKpGG&w&02eB(7-Ny3&6rz67NIP_K~wL%l-!55)=TKlEDw(tmjW3h6(zD5U?;Zyk{S zLsvrj5B>H4(tqH0H8%Y0wt3dh>l&*Y>O8O6!t~>&y|G=V^UFkoVAS(|8 z=|51K3jIgk%db2{B@GBlSMCMUfM79@1_W^{yQriAL1`cj2siV}PAX|YP`YwEkOl;$ zD|Y~CKv0@W8W5DOe2GdL5X7x~4oCxn(v{BxX+V&@@);lv2o^Ie4G4Z$K2>_uzwTGu zO4_zv=|3>Katm;UuMIsbX~A~=o`Cq3n}N#(l&*Xd_+0^|fn*QnS8k+|?7?ETN%r73 zknBNewn_G&bmbFllk7ohc985r>B z*8#~MEm}$T==VV&*~4ABaxIYT(c%L@vPZw9?5<>wO78>6o@8kt;iJ-fs3d%}C?tHe zC?tH8eJ7CcQK^vdQRy8(!bfq-frO8Ktt5Q(dn*o)-yOKRx6p}rPb6B!RrB;$Xx@rfKJ-V`z>`|$eWRJ3^0LdQ3 zO$GXUJ)Am|fn<;3tR#DsZ6(>GICqfjQMQom(XYdjJu0=5>{02NK(a@R6Mre~DpI!0YJh>rTwu;_{3s=3dtVz_63qXD(wd(dsIr|?n?G3PDu8sv{(7j&Sa0W+kj+` zO06V&wAdTC&P$+0hb4QIEhKw%)dD1YRN4e2dvqlvdvsL-l0E9NlI&4j0Z8^ZK^lN$ zk8?su_BajdfMkzKg=CLPdjQEEl?r4};&a8@K*9&5frJk?=88j95`?Q{rx$=w)g$EYx&i^i`&j^JG*Us+sE1lwtcXz(E7{Py{#{|KGXWQtq-^U zxb^7w|9_=*R_kY4$F!c@+P}4DYhBA5EnO`?YuVEBla|#jf7PE}()Hf?TtwCVn)KX1Cd>HAIBHhrV%;-=3xO=&uKST3!09((=*|O4paZS(;P&QmMUkMrmZ} z#8Tf zpy4VLoflKL;yPpv<_enkE8^?mA#b#K+}tNZoe|G(~$+`HV! z#T&}&9?8AS>?&RlS)9){xp!F!iq`_UcbVUT+`Fs< z#jC00-eoB%UIpadWfli=?{c>Ua_=&wi#$&GNbX&3@l_7=#XXRFm;11I z8I|0-tOSAFyR0jL+`FtR#fur1dza;>cp<>On}2*uB{wfCK`OarQ?C=f=b5#(*%`{0?rXsDohm==diN{m5v0a2+DTYS%OMW1ttqB6+RvGX<3n0?rUv+>3*OiGmgf0G|?+-5;1BC{8$C&~IO0yrAEHz-fXO zt)y|(Zy#W+6)pC`;+U#M3!^RQx(yg5Xt5XYNkP9Yz(_%*O~5Avl?tZ{S`yVzJAi%yN(QKxtt! z!^#2{3mbuwfZsq-KxyF#Dg^I20^9kfqFrUj{$Xpe%ApX5LEgw&_hru z@bLEpEei7m{jLSRE2wleaGju1;X8s#?+30GRJscIwxC5JjiVOt0TMpSz8gsRXi-S` z==Uxl;iJVnfrO71R{#kgW#0iLe6-k6TK6#FpIaxj@24rB?z8 zAC+23_^9+UAmO7$A>pInOM!%s7KMb5euadO;w}afKKi`~i-b=sT1fWj`g|bSqs0q> zWRHH&1(H2lJP%0r=yx`d>`|$eWRFUPWRFT`0m&XMP6LuXT5JcBJ<6U6Bzsiquw;)) zg=CLPrvS+wElviKJzBJq>{0e4AlakEi9oVPzY~CDk4lAPk4lAPk4nb_WKZQT6%sz) zrQ?8vk4lAvkK#rF2_OBA1QI^_Jrzj!XmJFP@X_xuAmO9Mp+Le%i$j2fkFo~?2_KaX z!6M-kix!eS>KzCqd$cGddlc6XNcJeZ50LCpoRwsc;)G<6=8plAJzDGyBzrX93rO~8 zu?63?zGy9UyzM@HW29u!IkHX&~W)(#E%_Bz#aBNcf<%@d%ZK4@w&k0SOo-v~e$x@Ih%H;e*n~E-DEhEH>`JBH^RO6p}r-ZrskOWDiOM$sUw8?x2$F zL22VlK(Ysmfn*OB1IZpNHa=Tk_fWD2^MPa!N(0Frls0Z*Sh5GDjaz|a4;E8N_F%E` zDJsbxWH&wuBzq8-VaXnpHg2Yp?7?Cn*@OAUjZ~67C~e#TBzsUANcO1oaVp6kl?r4} z?!`tT_o0LjcWEHuqiib)AC;~L5<_%;9j zKfmW6^sIgV-zR#$AJ6|^{=Pi_fA_zm=l}b@56}OnA9P%cZ;!WT~j(zNh>8-X+}d@05r7QJO@TKI~MK$;f5AtR8cg|FqYL~O$%RekxH5tzSAO=G%b8B$DX>uYA zJqzF0v3oy|o`r7=NhLiCU-+?`)o@vQ7QUHecPEgZg>UjmB|Qt@C9-=D6?ztX>>uym z2Bc}>`#N^B0xnC_!WXRs(zNj1DuFaDeCtXeO$%SNvin80IorMQh0MfMZJtw=L z2hz0gl_P;PEqv|D?&qkaX+i03*3)HaTClkL86Zsyes{BKE=$vbtKF=p%hI&qYB#Iq zvNSCy-Obv#EKLjM18G_?A4t=JxNMWA1;4vlX_uvG!D5D`X+idG*3)HaT2Q+C36#>b zsC4%e6wq-oLb9YD2d`SI?hK$;en-VUT`QK^uoMT@rrXRkw=XHlt@^eig90Z7lH zQXxHyN`>?+D!m3s&!W<+fb=XXoeQLA(V~^~EQ-4VNYA3|%YmYL^ed!kQRy5YO^Zq| z1=6&r^b#OVi%NwwEh-h#w5U`_)1uOg%j=e=X;JA#K$;enT1nHQ(({38(^7#nEh;^a zN}3jx3TavtcP@~oMZdFwG%fm_1*BEV>rbvuIIB&!WYtKzbG}T1n5MdH0r{MWt5Kv#3-^&!W`|$e zWRDiDkUf=Ecp#AQajoqKBz&~k7fARhPDuD@{um(PqhBitAH@j?AN}?L5>T0G-4&$qbniVkyFaL21`PAlZY`uKhr=2c=zIK(Ys=fn*Qj zx;m*Odr%rk_Mj)jl08^VCE3F?=-R6V6p2twn_M4F~br*OoOgx5l8qauIpJwC411@^$d{gL2n@0 zgVL_8RFXX??b-q)d$1Tt_FyrP>_K+dlMGAtV6kfhknF*4*W*C42aBmBd+^&umM%^9 zsB}G$>`|$eWRFT829iB0T@56ARQe#0>{03cK(a@R_W{WsU9AF=JzBgMNcQMgNcK1l z?go-Qin|9$_UKn2dwh>vfrO8;-6r9~DjZ1osPs-M2_Ibv2_O9uxl0p1`V|sB`V|sB zS|qcVCVcdJ2NnsRSiFNmvPZqQ1IZpO3dtV*-UcLlRB9#Jqf#r$9+e8o9+e8o9+ln< zBzshP1CZ>|BJd~49{tV-l0AyElI+p%bwIL5zYa_GsB|8X>{018K(a@rR|Cl&mCgl{ zJz5l!J^H-@NcL#)av<5GUxDoLQ{^9bT?Qn4R4OEVv?wHe6gLM*_&5zN0TMp?6%sxw zy%b3Js8mS!=;~r1;iJ-vfP{~-g@liOg@lhvFDR}16T&A-FQky{(bf4tvPW0v0m&Zy z3dtVD3CSMC3CSMK&jyk`PLNqZvPY#efn<-arU1zv{hkRVd-OXANcJesO0q}U6M$ro zeuZR@O2_;DzgOLuck}Q6f8BOh+n=;8YWq&xmG8s%|F3Czf4=|UfB)a~zWn?D2TF%Z zyGk#V{=W2h>A#fjDg9~b=F;~{SCzhAI=?i%G_mxF(%{mEOHIZ9Sv*+$Me(`f-xb#v z|GM}W#ihl?#p{Z{U%aIFh2qrW>BSMne<*A$JW^Oy__M-og&Pa= z3cpvlsPMVMhZ}b{zS#J5IG*r#76> za7;tF{_Xk$_1o+JvHtJs*Vq4b{ay8cQopGFJM~xAf3^PH`m^iD*MF>jVEqT{3w6J& z+gtZ?-7|H6Tla9?kLx<>{$t&Ox^LB8UiX!{S#_Ubg8YmBE3aReCWQ}|9vTItN#Qf7 zheiU`CS}z_BY-q1d~){Ca3Df3rLs3hnazN zDPyX`(xvdpW-94Y_`ENWE`?7+v$u39d`cM@S6L=kJ=DOi)1~m4=R*yp^$Y1zSeGh= zG%0+1nNev{_;C249&C~(h0j0Nz5}F5;d9BgZv$yk_{4JU5g<(ppD_l~r0|hvAWaJ9 z*B)jVO-lZ~E|4yTPm0$bq>?TLzkzfqm=B~&VNR^w&#-hUd^WpwFOV(;^K172=~9p# zNSA`rwL7S!OF`+{?LfK|%&&b3NSDHF38YJ5f~TG3X^K>Qw&R&!so_o`94x~$Q8dyn};xu>|NSC7Q)j+xwr@@0j zx)jX|=~6U*Kaeg(^Fq25Wdk>+OK}>k0@9^u{vIG*istVI(xqsgA8NiaU5ZNY1k$BA z4XmU~(R>Fm&sVBnAzg|S^=~A2%R??;DS4fwlc_Cej6XbRvU5b8}0_jqm z2Dbv~QuHgNOL0!z0;EfE8dyn}qIn@*isqM;*562%62CW7NRy&pAx(-?ViAxg#VH}s zq~zZf)-C|jrD*;JAYF>)uLshl=yyJlF2x1lIv`z&(?CdrdRI2TCx zC|gMQ=yx`d@X`ECAmQT#5fVO{cUZzl!LxvbkJDf(knqv=G$7%lZ6V>~eLe+9_-K1F zknqv=Bp~6VZ6V>K?TJ9bN83WeN81yCgpY!SgpcZlgpanz0EAB-=?El!v~4BnqwQ0H zq>r{o07)NhTS@w8n-<{4q>r|T0!bfj3rQbs58=KbeR5w6qLA=WoRIL*??52o+JJ<5xQOoKIhfus-9U=97ijY%KOui1ln(ns@aIw>T4kiBLHknmv|1QI?d zU9+7^!Ux%FwgCwrrooz*fP@bdWX<#C^$QX{$X@dtknq88AmM}GHP2E>_%K1%Yy}cN z_{|OyKA2A>;e+gKGtVo<)LFBIZ4y41U-J}@@IiJe2_L3GDhVIVr;_kN_L?WzCgFq9 zK*9&}Yc^9!_+Wm`Mj+wCY+17bNcdoW%@aVv2lJ^Ud@vtK_-Oudh7mq_K5NZmK+;F^ zLehr?V9h!p>7#ie>7)78K+;F^LefX`4**FY%|8eveKdbRkn~Zuko0jHtSYTvK>Eb| zeH0Qtn!guF_-I~8_-OtfAmO9=yMTm`<~x9dkK$GU=lepHeFu>6aZW4+5rdR zxE)CNDEl@b;iGIT2_I$O0wjF&dn=IeQK^vdaUR_aBz&9`OMrxre%(RB$2nmo;o~%L zn}m<%tt5Q(y9h}5I1Pk^kFpm42_NUg4Xwr7di-wj#vZNrwO-RYy7dDskGI_1GQDMR z^K;FA-Tc+&@lAW1{Gw;2Q65=7vAnwcS55t!KGXEe<_|Vs*}SOb6D=>aPHKIn^`+K_ z+CE?0S1Oi&(p+fS)q14uH2&Uzzdz_%ZhO1u2|d5q^TE>T<@Rz{^T(S1uI0b9wzW;^ z`IkLk@7Y;A|Nrg(>OTJer~mQ+K;1c&-{~yRxv^_#-6cJeKKuY@*AO5pd?Qfz(;ivF z__@ihkwDf7e%iC^)bf&_<^JObJi9Iga{uuQpk2clmX3y>5M|E~R1U+hd3LohEVlx` ze%aN+u*4rfKif5_uKEMwLPPzRdfZS+q8qy|19ArLZ4NugQs;SIN+rvIyPifRi<7&a zMkQy!S?@Xoq;KJ@cfH22^kJTLe_&GeIJ@>TtX1GRyY|%oX^*rw4qE}Fhwx=z$u{Z3 zID=hXRBBghSHrQDllIi^VpQ_RvspqVm(BBBL?x->3%wplD0p?}GAt*}uw7fIqzz*S zyS7kCN8=^9yP^79w(MZn#`2OEljiR2v4&eKXW-uMr;;%C6}(8LTihxt$zNUFLnSMf zS86SgGw@11$QcZ;U7Y)=TaV_JDXj%ayHq3liE|8#Gdo6fmgkIJdn2ozUqq@mh0i1nqBxp0Ubb04 zhIwjp3X3bld~Fv48OGEDmUds=T~iBBcE5t%9YBWp3NEiz*yfc!h5y;(g6j2nrB8Xu zKc#Kq3|?si(t>aXd){GKZa81u0w6b>FOE@Z)_6IuTuPy)_m$zriIwZYF<ts<}09bWCW0R z0PNt%i1Lz`(y;n++DlLNDA3O=+1}=04t?;!;#-y7P=BKY|^}uVlGwk&0-uBP6UFY0_{$HuMgO}5jvx9w`IfHc3412vdkbcycu&rEO|9J_o z&f$V&!DQIscgo*9dYpCaEiJXjxxc)nyYhNpPPBFrU*%?hIUTJBT|(unDq)*fmzS69 zC{^M0*_=V%JTUBa)}EbbRV!~yE5Fgb>wVX;x9r-3&gI5Nn>ww% zQhoz+$;)|*?<;L<>ge8^!?u6B_OhREdZzpSdi{2wHeL34%Ooqk@Y~s2COHS)`&#qB z?!E12#&3%(D*HPbmN&>8bnjNqx^`o{&gI=%y9RG?4R&P7_4RCRKD&Ewdzs{wKcJ@a zCNKNtTmuify7^DKhrRv`em+pWqOWpiy;3OgnOS|=huWHd z(Y?353)oxUZgZU1m@Y4+ukoPXnwbZ{fgzk*-ry>jb9%FsEs!N`?*+7PU(BlAa zUQH#-mwwpWOVxK^H}0Ln>EvAs!w&VLlJ`~~6hAx8t-gdq$FyA4eWC|k*lL3J_Tj7} zi_>|HbNhLZ>NW=^w%pUL@r?yQZ6fV0v4gxZ;W)2w1O8%I^@6;1Udy5GVTWe&5^xV^Qm|-FtiGNp|q@YUP!O*>(Raym?*g zh21B5fUEP1G&Wwui`b?%cV4-J0f$LgVR(9a!W$}LLqwbm=ymB*; zndmFMmTeMTYUFPGMOIj^+oi2fbf4%Ux2fHYuUx?E`B3#l4?We^*nOghcs-Rbflx39 z-I?{xbGwZb&1V}N$Gz>WEj4c}X}h-jHao~&zcU{uu!A=?P>CO2!W&Hg?X}hN;GGQn zX7vo-V1cZBTLs5?a~+kM`a|4iKd-H$2f2tlYw*VAw)>AB^a_@ztZy9ja1ScAgC6Ea z|M?Zw;~c!WZTry*le{y-IOt*KPG@s<*x>@(@F_thPe=7UwfpKEp4jtK-Bf)&GqacwqlGPkKg}$ z_uv0t`}_a*_Wl30zyE))-~WGBVO-&q_u>2huWI=Ed;b3aN9tD9-C6g?b^pun|2^`{ zBr}ioY@J$uPoZp` z09<8-r*gJV1hN3}VA0kwrAK}_Hy`*_Hc1=CQ!HCYGU`e<;n|z5qkwM+JbRN$Rt%o7 z31oHV@uRJ$GAyykgE(790O|L67HR8nAgvou9Bmy2BsqAPDKN)f^I%fo>jIA-Z5_(6 zye;6tq^*O2uUX+?rmcg3YLxzX>p&oV91j@<(vR>YPljcg;<=)&0~nSCnJ0O+_63r- zJU$dicJYwV);?6e>~VOkXKNd9fxtsTTYCXt64cWIq-W+~rmaoD7p?HvR^U8=r;N6i zsAQevp{cD6K$2aHLc(0Xb---5QK^;B3A*Y5WHG|x)9(PEwSw%Yk06e9j!$ZT{Pf!t zW>`S{(?@`I0lk6g0u}?)1S~#%m|^Mdu^5U^yyA2X9&0oWO2st(>ti7jpOOCr?&&?K=2#L zx{uPQw^14I4zT$23qVo?zfV68jI)B$r=J7H3Rrx4D=S`|79XdO zj!akUfs-Aj(uaYef=br`X)2usR)$znsg<-%DispGidzeu;4uBJ29m^Dd;mD!in3P$ z0|k}d4;&|`)XD%si$Yp0{R(O6RC+Iv_mwKW4@g|9^lsoI?m(qN+B203Y3WpYCvc3z zRJsEAkf72#fIfmsmjWLYRC*iGTTtokz;6j!yanhb=yws&Q&8#6K%1aNAyKYHp~Z@_ z7Xs;e6z2|_tfhiFK-zrG14q8+FqI1P1(jX}d{@xoT;MuEi&p~Q5ws{=D`-(j_Bai$0Fpgg zw36)6@8v+UN2POsWRFUPWRFUPWRFTO0g^o`y$DG5sPue*?5T(o5;o}6ETzcdP;S-CFO7^IC5|Hds z>0}_;qf#N+qf&<@d$cGdd-OXINcN~yNcJdh9FXkM?VbRdxM z@%HNvBz*MS7fAT1^cW!Fqf#pgA1(F)5|q*gc?U@LXwhNG9{u(Jl07Kh zas){BAa2WHAlZY`Er)<)4;BN-9?WlfjY_fyaoHx>gWpt=J@^eIdr-RNAloE+u()ME zknF+lmM$RKgVHT~fMgF!1IZqgW*FJyhvGlp(#f!d4|nO7?Lfi@rCYWE2_KYhc^*jk zpfr&1!D1lcgWo{H2aAD(4}P~i%MKDgSlsd)knq9pmS<2(_^5QtRtm`;lx}$nNcNyK zknF+YmM5tsdvFy<_MmjjW-7@Z%x`%DNcJFZ%SIsCgX}FEfMgFA1IZp`KSm|lqf)Z; zNU}$z4+F^_U0F%?sB|rm>`~lmAlake2Z3ad7OfC=L5+em0C&mXwgctN59ts$sU!?1Cl)|y#`43Xi-S^ z=yxuV>`|$Z>{02Jzw-WnSI-xE{(aBKd;XW6_w@YJo;UY=Z{PpFuXS7NKeTRa{rB|! z|9=19d;k9bU;X~Scl-VS|EX|i;g1Uo3*RnWQTXk`?1JzA-;dw_^Zoz%4bvMYHjHdI zv7v86bNxH@uh#FV|7rb`_5Zd0-G2YyS#{&;PT`5LALTyc@siC`f!s$tA+vc(Y5k8X z_Ywb_Lhhr}C`JR`Ju9FY5n zhg~+00dgPlyiO{)k9fXi^C&90k9guJko$<|in2}aBOXjjCHE0e%LH;C@sQExk?bJ% z5f8|0J{8D)#DhhF+($ebwRr@U+($h9vw0Yh`-tbHHV+5V!|{Y%AUzyU@?=1AJsLg|bG;utp6i5@t6I7cAQb`lXQ$~R_aXcEexgV8_ z+%*qpZSD(vMc|>Q&Bp*23OqivxexGVfd{1m7YID`w7D0RF9|#~wYd#AU*O54%`Lze z1wwP-P6I2m1!X&pJ|{2@HoXJP5||*Hc(CwC zpB0z}ftdob12Y7s!KNb&YZsUxf$0LW1JeYi!KT9uJ4axG1k%GX4Fc)mmZj>;qqMkrh`D5IHo}$O&sPo?Wd9^4)cLDame1(MI}ufvn4Rmy)h>OpAvX> zE-*o08f@CZHm3_rgTQ!!X%IL~U>a=N&aiO;(;zTbU>aX%HAKFby_6Pi2(A zG}!bk@JRvlo1Oti3YZUkLO}MWtyE4GmzkB-pa{>vU!&9N9o~|Z6!UNb7DP^9!|ePdN`*6PZ|CwJ)G0v zVIV!67OkX*Q?`}#aL$Rf06kn~PFP73=QI!oSkb)jQGwN96Hg}osK20j;aEZ04*>lH zr-AShL8bQreFdk%y}*YBrvXnR{^%INX<+3;g0ijj5u66X2L)x{4fGbA26q9!C1_sg zB`Et&pr_z8;Mv9>wF#PE4zvpTT?(`an!g=r7Mv5e0ZoGDZ%1~yD%(POIA_5kAU&M2 zg=!C1f%I_Bi5sY-hf}tY9!|dtfb?)qkoiD*IH$q&K(&X}Dj?yb zc_HDW`73~gkA5!$5h!qxs1|vd8;(3Xtq^f}9B?do(`@NcN~yNcK2ECIHDEr@=&k?5W(P z?jYf#QimmcTn)wp2_MZ{N%%N*tR#FiFC=_4KMqLvXnqWk@X@@G@KN?CAmQUQ5E4F` zr#DzW&2!T)y}|N?kJDfXknqv(P$1!>Um@Y+1Q`q@eDrH2;o}4u2qb)z?XZN8b7ByX z@X@@G@X`DLAmO8VA>pI>{`e();IfHvWE$>@f{%9qxl{H*^{;_|K57QvqBz%|#frJm!VB=wSknmv| z1QI?>gN+BNBz%|#8}|YUACv|XKA7LQhf2bSIkB+|Ncb>YHtqltKFo%I*tiYzgpcMozCYFX#Qa!;iGvW;iLHnfrO9d?*|e-ntuRD_-K9=knqv`eL%uT*>?j8 zA1&SkBz!b4Bz&A8cL50>{kl!U$2sA!gpYH=O2S9;cb3-wDd7|IZlCPY{2i6||L@`Z z|NlMx{r}rd2b#7w{o{N5{{J!Mlgs_fJ>TQ^|IaOct$1GXoZ@@^{{NMYw>JJ!<2CR3 z`~Tm|`~S&xW9x>M*ZnZ793LocUkzlH<1?}CYk{nCeDW2@D#r(8fvj?T47Qzbdih~i zIX+a|&X>FVFsmG&1a9a1Tz;5Uj*q9d^Q|pE%qqu+YN=$EiWL(#bF-KJYoz1O07MhG1lM&kq{(m@FBz)9|#fx6paH60>TU# zh6k;&YODpSM8OrXuC=LEFa`|};{fZruC=bAW}w#K3@ano^}5z;t+CdXhrRFjXJ!aC zZEmaHdwchFU%T)8{%08G{XM_;kK;N2$u`Gpp7{dV=6KCBE7|6Fxh;@wju$ic-Ns|G z&G8D`zLh|>IbIFj$IV&3mu-&MNdwvDc!7K03Rbes@hauMWk9w$UH}bbo8vXlK(;wv zC*5}wmt~vdHP3zAY3+M#b3Da=unvdi(B={|1Z^1bYGyt28Eo4b53yBx2X?&E$g zE3?aK@fskzoEC-ba#|F!%W1v^$S$YFCLp_-Ds^SHpi*wmvhqqnr56LU1eFSnf=Vw0 zW(ryqW(fMd0GKYQ)RhK7i>_QD=yzOU>&kESC_Rsb%Uw|ES-@q2O1aa^%4vcYUHM%> zal%wVrNR_J^P_>uf=WjK-xO3j9GE1ibQtgrL2>oKL_xo2bhCf=Z7CE)-NMd`<9)IT*M=P^s`$L8XI$^97X(Ul9~1j1%*a(p;AKVDaT$T$cFY>gDHw#0RB; z#0RChEb(CsUT){I#0RBWNqn%F$0R=Zefc>qOMI}H$0R=ZeR&5KiI02j%R9I#?LqI$ z&jM)=N?(2kNPAHF^3y=tgT+AFgT+AFgY1`|j~2H8X^$3NNqdz22$1%u zR7iWY_z;lxDDFWZ?NRpqK-!~4SJED3yOQ>3@%up9qs4oHv`5+Z0BMgF1=`c?*UJ(g zT?vVge!VR5QR&^4TW?K#lr1DaT3ibxK8m{oNPN`eO5&qmR}vpB3W<-dgv7@IxeZ8s zR4ODsj={>p)?0~BEV_{PsCOlh_Neq0Anj49koKr_1(5crR7iVNDx^Isy$MKr6n70U z&!3b^7XxXJvW2uqrAdfkoc%{ z5|H?4UPyfODp0I z-;`HSNJ-*Q-F~mJ4PU92{wsG z=W?MJmC3xy^x2d+yoF#ZB=L>L_ z$Wfe|MYVP2Fu}$W$YFwwC6L1eyCJuCYU|8lf?b9iKect{Fu`6D$YFvVklQ=8b>=X^ zmha6BOam(LfFpx;g{M zVM3*@-S?`% zNFav^#(=vswRPq&fjDmB)Yh591WE%rOfVBaewURTCa{>t=LAIPUw@)|s;ee!1^cTW8J^h|5aO63EVDa+bhvF3VX0rCG^Y zf+r?-glg-|SpvU-oF#Z-a!aVTPRqvYQ$4W=y zqu-l=#7DnE;-k`=fy76p*B9D4h)-Ny&qCUx-s^z0N4-MYquy(Qv`2A5+M~E@fV4;1 zi-EL9ajv92nr{Wt9$k4^+N10iAnnnwm!&=WbtUalsgU-lbRLlQXt4=Md-N-$Ju00G zq&+GX(jLW42htw>UJj%^`gJAkQR!qL?NO6=qf#O5(V~#{ z==Urj?NOvfV4-YUY7QtG?%44Slsd+D`^knw!90ZJ%|gW zJ^0=7HY;flW3c5-AnifvmbZYk2c@|z?LlcE?ZILo?ZINcK-z=sEpPAz(jJsG<88)mbT*6_Bz4buTyllKpAmHoO-pD~Szn7z!jdylE#CLaV9PX5*z&riH!r|V-g!>3yF;baz2pQX#N7s6PuVH$3j}8`SXCZ zM!)9(X^rN`0zIvHXu}ymTBB?st#J&5v_|t|fV4*0qky!=F&GV`HJTp@q&1o!4x}}j z7if(yq(8Kw9!PAI?MhY{Q8_Vxw#!vC;2PAhB^kia=tcUsny4ypY&969a(6M)N{qqj@2*Q8w^SVx!-qfyBm{ zr~?uk{R)YVGf@R3HjaUCjXyVK*8o=wjzM{0+dE5p%zM=m7c?&{7BpWDED|(d0<;Rs z?gK0olr6Lf>=Ww`0N)lczy1)gK*0R^cY$UB^XuOOngq;eWxjy<^>4E>Pr!WODgoK+ z-(h90z!9^{=opQ$Y6mSAiJ%1d>-Vv8g@Ek!dw_2V_zhexU_Nk}z_hG?fy<@|C|%zH{H}oc^}B(o0_Fo# z1O_CJnJi#_{Vp#1rhxhN?Z6}f^MP*&_+9@TN+)(JUH=?cUFrf#*Y5x(2+YU&XMwK^ z%*Xm?fbjydvvP^Re5`+pm9z)HfwTwnfwYI2SpOuKr9H|P(jLcPJCOEh{xKl!(Y%oM zXkMT_-F}6{$1&IfBtDLTkoahR6Oj05{t+PY(fmdr@zMN)K;ol$A@NbRkoY(T_XCNK z=I;X%A7u-Pk7IB*koai+9w712yeo;1eqBj?90MWo(eGVA;-mSsK;q+o+yNv$nimou z%?pW-=2roUkLFh)oA|hMXCduz3U1@7v`6zkB<<1fN+9iV43+_Dk7IB%koM@;m9$6m zLfWHWFH3tge-n`QI4#!$X^-Zw1=1ePUjw8)K7US#_-K9skof4g2}pc2KMzQJoCzWE(fn*6@zK1H_-K9>koc%{I*|Bi{t6)R z(XWvBI0lykiI3AV6-azEKMhEHH1A5{qwI-5;-lAneKC$RkX^$3#v`6tiB<)eWkoGt^{eiSczpkV`ns?=JdyWRu z9?c7BkLHE6N7;2i+T$3M18I-43qacA7?c8OkFtfd2iXrC0%%X#@xc2);)Co54giS{ z&+M!uKFq`e@3E5jAUlxwFb26S@xgpn5+BSz@Gg%@e2^VTd>DfV-eD#2!S4fa0f`S| z5J-F&gFxbg`3K(Mvcw1T54;8>KA3;tbs+J<`~$B5i4W!<*asv&m=7dAn17&)mBa`0 z5A4A&@zL)CFR_sJ;P-)-{!Q=yulm^T|Mxq!$JX|%Evb38=6}}gsrgyWlQkdL@BjPg z@BjaNH|Id~mSN@6e(z1Und%f(xm$iS0-~adfrN8|A|EZ-XlnyMd>U*&7TYdkJzAt>J z-~YF?;$n{$+4?Dp_+tj#$}5Qk1aTD3Vx33ifBK6JG?M+u(DoqWz} zbB+?sU@ps1g6D4MyM^tWIZ8N?S;$F(fedhx$VtAFk6CTbQGz|DlMhpE&QXHt?tBx- zQQ~xf4^wTEr`gn{$+4Ckf;z!4}cU=chLJ z9wh=fN_>$OznvT<#sD2ajuPxXfgB~+FFNPasE$Gl1Q!Mv`#*OwK+!#_KVJ4K#mgZ7l9ll*cEbFjuLENoqRTHbB+>hpq+d+Yjchg>^@n^ zQGx_?@^P%qIZCi==dv6n*nP5+qXfH8AV&#y;7&f=wK+!#HnvVasI@sq3F;8YQGx;K zY(0>p zgrmbpvo`e}C30Dg5{{0K$x*`5@i93{I4yj%YEzC94v2qFjuOHzX;};8DB-jSIZ6nOS8|kaCYAvlCGwB-K+Y15+s&-> zo+Sb~OE@hzv68cd({eqKvxEb3BapL%qjP;>`zFp3nHI0gQNm3_$WelGMdx)ujuMW} zQXoeOr==ChQNlTD0dkaZKwQaD!U1t5M+xU>0g$7F)6xXwDB(WgN{$jv%RC@Q3Fl}w zkfVgt;!2JZPKzr!N;oYufgB~A7Qb4K5>Cq%K#mg5#N|Ma5{`~5IZ8M>LXHy7#8eWr>f|QV%3P4v3KWI65Z*iI3AFBtA~diNN9b_~#@(j=@kM z@o_+e#K+Mo0*Q}9bsUiRI4#EliI3AV7&sgsR}vpbX8@4+I1@tRk7IB&kodR-)c}X%QwJnI&QSqKd>n%+An|cpgv7@&5E37UsvJms z+*=9^2=U2)_{Gv52SlJfnYNBYK;q*L;^Pw^r=Ufov#D~2le@<_FI$mL=H$H*h_;l=JCGlZEI$i=2A4VsT_^^Wn5+6pV zV>g#2K8!)f9w6~yKsq{r-uUFQ#D_TwBtA@7#|vDR_%I+@NqiWctRy~6OULtE)*GLW zb|CS=e8+P@;=>$uJPY*3r(*|@_%J$w#D}5kc&4!ZN5sdO$U@q~Oa#&%CMRDk?O`SY zv?se($J2b}#D@XtcnU~-7?6%9fy9R`tYbTn_&6X>0Ev$S@;H$AI7eH7#K&pzF}?BW zcogW3Psb)8@o|nG0ea&TNPL{5hgj*2Psc_e@o`!n1QH*oMd*!B{+z_e(fK|ri4S{A z$NfNWd^+v}5+C-KKyQ3H?qwzMaX^H`$C(fkALr;Epf^4pcLRx!GjSJ?_^^Wn5+7&6 z%Mu^QU@egNID2;jiI3CbO5)>CxzZb-j#WV7aa+ybOM&V-MrJxO85G9dABz-|T-9|uH8eAt^hZUPb?r{zW<@o_+0Nqig-R}vrR z=vpB0aX_vI5+6s$mEQPtECmuDcaT;f@o@)f0TLfarwK@WoR)b<{P+J~|Nj3I`VH*& z(f|E_dF|J0&#V1H?MJ!)|A+hU|KqAouk!wX$5fS7zE}CTm3u39RsKcgW0fE6{{J8C zzyII-vHkb|2TJey82}OHI-MPyKh3lb8jjyJa^xO zf?Z}RFFbeOgo4vZAgy3y38WSDWh$>ici)AARs_-tMsn(8R?-Td6j@0tDE`!`tfUoe z5>qDvX$9NIR9;eEmsYT2WTm$iQ^yy!t)mq_t*4IXs-%LgWGb&UuS+U;j!)&a=5%wQC^o+u+2?94C_vgJf~V+IUTa>LR-D)aX$AZ7R9-h;msYTsOy#BGb!i3rLRQiW zw&1C}ZoDq7V3U~2>&ENS3dNlOq!r|H>Ty6?!R9=b*NxYu6)F|d3YGHm^18G_r9xVv zMZZ8=p+zCBP@IrfX#Q9rtKG@Vc}DS5x)@X$3|CX$49HX$9s3X$4BBbn%$90;Pepf@ztu zhm}wJ*T&+Mmw*!l#AW4p0ohYJSQ#o{amsFBh=A-V&jUpPrBhx&>2G%{%~i*_fW=(( zTLOLq#|kK&($3?5Q$XpI=YYWiN~b&x{Dy$iz#xI=Vqlwzjkr9!2kIH4fu*T+-{TD%V^7nCiO30nLqy9{U*bmhuILD{af2r6~u+k&!h2GSlaUJs-_`n?8d@-i(7X^-NBv`3|j zfwV{Stw7qNQX%b8X%mq4=xQ#I_NY{#J>5!$#7B#>fyBo#m0lu3QJj$W=yw2+_BaOpfwV`ZRCaCJqtau5v`3{v+M`k-?NKQ) zUYqu)R7iVNS_Py%DlGxh9xV!K4;CjM0MZ^TPJSOqdoVxwJs|BtX&~)E>14vXHtj*_ zAarLLqsiu*p0_NdgAv`35g0BMirg|tVdcL8aS7KOA&i$dC? z>{US8qs5g#+M~GJe&yf)|9egTj|=Mye_U8u zxS`NmxU%qJ-v3`&exUsC%J-H3P5CqB+sZeV|7rOh<^Q(#|6f)%zU|}md%xq9ObfXu6&f|&}de&x$=>tL)?(%;cTva^6bzEAe$>6U^>J-SRU@#Tz_zg zyR$r;&6Up|<+5z9d`u}T*E|Hdj8g6v*bv z2ZIisT-f?Bn=8A_4-Rp6mxp`y)*l?=zAq1FZ{;&fhq$}T!`WN;n9?C`+wySsRzAsd zh+D8coV}Hg9AzbYE1y{kWN+m|LWj6*%f{@je1_}L03ds-O1V+W#_X*s6|%RglpCdN z%-*U}Zj`byd#g%??5%uK>rgq6y;Y@sfb6X*6|%RgRLI_{9)Z0zw+TCV2*~D&--8E$ zY_9mtN;X&gW+j^|N)K{(mW|n5QF@RYvTV%eimO02S6m(BzAYQGxgz`E+dwu~K7$p= z=8DBYHdn^rAop$An9UV&2f3rm#%!*L%VpVIk)6x3xgz`E>s*%26{QE?C~Vz0qg!dN zn(kke4|E-TjjI|2lm@O4P)u0p!DDiz+?fX2cHAJDWLS=v%n+)r3aq@z9FDAFj2tO!KYZcRKViFCxHn9 zvJY+tzAhm9;N!q}fsfT4d;+*c(4ug$pkFV$NKmP8p`cQ~+SdfdJqBDLsB|mvRYBRV zoG)l`3-A>|J;FFa*_(hb3;Gq#6I3dkD=7ORT%FV7>Jb*sc0q|7fw6+F9|XQ6=z2YH zmY~IlfHMXCdf6F*N`)^9Diy{EDiux_RC*sUT2Sd-z!wCSt_4O3T6E>}f`0D=MhYsu z4LD6u=`FwrL8U8zQw5a@!v&Qt13o9H^d_KQP~45cDT3mJVS?hW2RZ6{I$UE z2+o9XlAzM-fX@h86iyWM>t&x7RJs&6LC~UbyrAF3K;omtRv_`wZwrw4sI(P}#K%oE zSEW5#T)K-#11xj@>ZI9Jjh#R+MTvi$;Sk25g~NPAQ&q&jRg`Pl?sWEvd;h#AID$}koaivEFkgGFDpMxd{jCbNPJW} zs<8Ek#3$lhNP9Fo3P^htHxfvDR5}7kdlV<6J&we1Anj3{D`}77gtSL-^+4L=7@Q2G zJ(@oWNPARz0+9Bo)RnYHr9*+VN2P;+v`34BfwV`zuB1IG?GL0qDm@xVdsJEnq&+GX z(jJw1S=yu00+9Bov>Zr#R4SxBDlG+QPq$Jb@lmOlB|a*3CGk;d36S_GPDp(4d*FQ_ z@xgB(@j>Z<1BfF&iaT(CtI{6y=Bl&@y$9Z7CGA0JAnieEAnn28fp@tq?Lk~1?Lqc| zcUVb#u$Yy!2iXVSVkPZCX&~)E>4Dc+NqZ1?;B_GF!S8`rfwTv|2lfGJ4@$F=_F(bA z9#+yGEFS0p(jH_V*bSsTC_V53koKVTz%C%|LEM4ofwTvu2ik$O2ibwN2c-v|Wrg-+ zcMK#x=sEBVD~S)X4?GPdKFH2W;)Cq0BtC4(fy4)kfy4*D2cE(e@rkP^_+n{~61M|s zkK%;1NAX*Mv`33V+T#>F2BbY&^f76V7QHO(QMQows8mRMv?!!K`h65gd$hO-NPG1A z2$1$@@gX4X(eHX7?NQu=K-#0<`+&4ZzxM)Zk4o~4d$j0E z+M{1r(jJwr0@5Cp3bd!&;z}U#(c&#Y;-l;pK;om)WkBMiQdbfmmAaDns8mRNR4ODs zD&?-0|i)e>az0T{5raTO|`pdVc?3+ku=VnBrZ<%C-YJOHh^i2hZGVmu%(pB1bCh7Dv%*m#2mW2$_GN$05 zC%1appR)uO1362u7wz0rXxqcylY7AI&shR-ft)26gPq(1W`E8S_{|r{SpspnEN2On=CYh6$jeUd2(v$D z36$>SzAyW8mO$xFZuPQ1X9-+oC1(jN?&KaW`*W7S?@sRSvOi}DEj|I{ETKhi&ayve z2`zHhmHjzOXi>;nLW>UqIZNnjJ&?167ViggmQb84IZG(+J|Jfa^$0mjXz?B(X9->1 z3*;=pGcGGROX&9=^l+Al9;M+qegIZEj2ZXibqE#3v>D4{rkqeT9(x${mS zX9=E4S;<*K39jTUp~X9ZoF%j<RAEgETP4l zfSe_?cq5RrgyLMuSwdH?-;#z^6B~;o1OBESdsI3UNPBeUO4_4eSJEC`32BeAi$L0=I9Jjh{T>UXJz6{tNP83~ zq&*JE03hvguN@4eJt`dpq&+?{g|tVdJ|^u^sc^VGbwJvq#iN0=M~jsC{j^8fRY2OK z(gKk7Xt5MXd+^(S2uORhSOTOy_{~b%gShqstfW0CZGRs~dyw7!Eeh>zmh-(Vr_L2vu3K-z=e_Sb>52XXDM0cj6@b6MJh z-}YBnNqexEm9z)HSxI}an3c2#zwP^YOxlCEK-z=S_Lo>mdyw6}2S|Ic7)X1t*xtcP z+JnVF+JnXR-K?ZNj6pjseLw9%Y5NO6+Jm@2+Jn+umiF-cZGV=_(jJrs(jJrs(jJty zKh0%n4;I^>0@5D+J`T{Hyy)2e1d#aXcRP^ys8mRNRJsL7e0Y|&KL#W|DisnRl?sWE z7JW?Oqu)&^B|cI52n%VC79RrA9xV!KkFFjB(jJwr2htwLKuCKO=VfV+vhN4d9>oc1 zkFtfdN5A(0X^%?p1=1cZ-UFmPTD%)bdz3AtJt`H_9+ln&q&TDqRMoJzBg4pgq~2vy%9z)XNedmEH^_K0X(30ump^T?ZsS%DxszeDo_MK3WtK zA1z)3BtBYnCGpYXQXuhh3`p+#iH}NKQA&KGw3UUlM~e%9v`33gK-!~hA?;C|koM?z zE|B)jIBAX=ER!csHv&`-_>td|Bve3)jzF%y!uDg_f@Z{UQzv>>IKy^swY){wfcu9{c%t*QxC|MdO;FIDcWe5&#% zl@C__$I9C(d;k4^N#!|}zxw(ACkmSj_ZQX`ZYlhJp{3ARm|XZ;;jF@`g-;hg?C1X< zD*u!6RpozBzO?+R^2^J=UVdKr7s^lm$e;heuJqfbGfTf&dO_)#r60%V|Cf}^ExD{@ ze95`_{eRorQgYtA({+DgdmAO^dH7J*`pWHX2{~_X2_)pa)1-^f{qJDv*#n2CgLJ4#;$XkRMg*=v)D$GE zfRx+`8wsT3PK%I|J1rxCl-vOkQgR2R9!SX@ka}cO^2i>}LPGAacvV8~w4Dqj9gq`%l-vP15lG1$5LZ%ihiWL0 zk~kY+?fzka>iiq0U#x3jsjQv6J=WVzR${1 zfdL6D5ty*O@3FF2U|ROR3oH^CkU*=zOavAROv~PP3fmuR=^lf<@9>asyTE|$eFIn^ zU_L9&0+X}%EmoQYW-2gWU~~fW1ZHCI+gx^)z^1YHO<=CT=;TY!5g3C&+QW7fpgkUQ z9@_gFk4bzOoxQIEi4QZe_f;VAVOnxo;=>pO5+BUxvc!jJ2_!y@+unVAfy9TQ3M4+r z-untGz46IP;=||!5+5dP?@L^k_%J$qJAlN80ol6;NPL*1tn|ib?{lp5#wU>YFh_fz zWhL=pTK2vGBtA^b-e-WshiTdSB#`(pEqk8=5+A4K2_W%tS{?@yAE#wI&>NpX;^P=> zWhL=(bRGkG;}b}HoTEn>5aQ!Lk%hF!$$6BAq&*IZk579v?@HR^fNTQN9!Ez=dz=;_ z?QuXJ0ccP6Ol$-aAE!k~e4NS$fyBpYc?d{+oQd^7;^P>&lK40}KBhN5fyBoFaV7C_ z-0lMsAE$*A&0~p=GvSv`e4Li=1BnkiNFI~;I8^ttlK40+eznBMnYaf?d>kDi@o_-z z0umqRXf4nipS`yMz3~YoK2FODRuUfvPmZ?DE-SJr85B9)18a6 zfW*gX83QCf&e13!@o_sE4IGY-D~XTOA|yUei*PtTBZ0)nX&C_|J`RX0iH`%~O5)=j z4F?h*%?pR)GYmK!pL!tiagJO`e4L4sfyBo-8VV#nj?PIy;^Tmv2qZp^j+Z4qj)8DE zJ|_T)kE3%ekoY)M#{r3t)8fkE_zeEF|NXzEUt_|=l?(I{r|iF{r_>?|Nq0i|G!Yazx>Vem&>0o|I6~NdKBPeW&#QEbaIZ@Bd%k_u9VAeW&;RM&I-Mez9+T-ywbb|101B|5w=# z*;ob*sNDKj*$&w#2Mq?Y9Wtz0>D>+k*$x@jLC0`ew!=>YH9)pQo(F+!hwO8M3an&1 z)$h**X zWH)5b%1U-aj-G++hHSLCEW06_W>&HrvNZ zMp?;rNG}7~4%t3(S++xVjDfttZAZ34cEEwJ0ND=Nzy`hqWIM#-z&${=Lw2))9YD52 zWDn$RY&)_Y;&?f9k=RLZ;1c1#i!w*~lyp!to!L_v!_=2Ah~!URF3!q){Y`k3*8u7pbj zEeaP4`sHnGJ1!E~wg;{UE)-NMd`-~e{lEo+etCo2j;{(T70wq_dJpgwL8ZbtL5sZg zZO4}d{qml+9p?!uy%RWBQ0Z;JIf6=80%r><6~+oGy&3qDpi<#1L2=7~GX?$f2DKe$ z2>KPiC@79MsO=ads8l#zQ1-Pb9o?h!Iu^d*f)<5Qf_|?7J};DMR5}|tNl>Zq89}AO ziGmiV1D_W3dj)WUphZ`X7xe4OP(h{BfFXhwCj&)6zY~Gq78ExDI8M;7@LPg@#{w$ z>w&aKzr%pEM{y?uX^(zS0@5D+o(QBpDm?*6d$j0E+M~sxm0N#Gd%9&G2P8f!6%rqn z4h9k*Ee-$@AN?K!Bt9zb4Cr&qqtYrM@ljj>NPJW(BtFV6FKqoO@yU)_ z&O+Lw(NZAoQJgDjkK#*!v|92B^2E$a;=}WIz)M_~_@Hz^7m)a%bif`U@j+=I@xkJN z7g$Mr@H=1^kocf5+5xNc$TZu9`p`)21t9b z7)X2YJK$+n(jJr!cmha!usGl;AnnnwD`}779tYAMl?rK(7KOA&i$dDt7(51~Jt`H_ z9+e7dk4lBKM~jaFX^(z|v`3|zfV4-8g!QLskA5En(jG0klJ@BLJ|OK;>HR?3qf&wP zbSo7SA1!_#NPP5r50Ln%R7iYOdM}XpsPs-C@lo7bAn{SDD~XS?N$yV*A1w-rkA7ET zk@&k#K0yo^i3cq2A=(aoEUia2XbQI*&paVF${g3$K=F-#i6eNIWgdO zXcxeVAt(N!`+yu7*jtCb1mwto#Xyb>hzsP%fb5~WxhzKp{0`-u^J0z+Sj0*(Bk7jjtrXLibakLvFJih3|ia{ zf(aUmTP@IqxgR&n1a$?Z0D>*Sxk)aO(IWeg8e&Cc| zi}wLJGAQm|AV&t3-UH;wpvCV4IWjl~cLO;xXwl1ZWYFSWK#mN`UJK;Npi)U^iCj029@3c0((DhOvCkDk`3*^M0xWzzD z4Ek*aa$?Z@0w5;_m3mpNdbB9y#Gv06ASVWuHUXR%@-OM3oO52xk>NyEW&$}fC~g*z zBZGdY135D2_X;3K1}zFXGU#_2kRyXig&Y~QDCEeX#i>A!42lDG|GwXjN`>nL$6ylh z9YLj&folaVy7GI1ekTIg2r8WbTrH?{Jg`(ysjx&)>G_4NyNOR+ae&#K_9*c@Annn$ zkoM?GNP8527LfL+bS#keDBG2^M~kkcJz5+C%=a76m5}ymeiV@QD9)9%N7*BRv`33V z+N1g5K-!~HA?@*5dNPpqXi-Re^m`(Z_Nep(Anj4UrQK^vjD0?uF z_Neq&AnnnjKzs61SRnDyqK`>@v?wG#${qkDJ}MOwAC>k85+9Ww10+5wbtUmpX$?w= zPn441-D!{FgtSM$9l9TuFP7J>-2L?ZNMm13=n?(jkX{v!Z&nf?{0@1Z%Mu@y4rxaz@lojzTD&{$LFo|k zyF2Yc=@9a}JMBT~kf(vP2a8!rd+oc1kFvJ{X^&$dq&-@E z3`l$Qy9r2pRJsL7dsHf*)Y*!K=mEHp+K3cpBNPHA`H<0)!`%WP7(c)U5 z*6%>scL0fxO1&)cQRy8hB|cHQiiNaCr9#@H(iK43qeWW0JMGc$G9c|y>CHgeqf#O5 z(V~#{=vPR4w73*Vd$b7rJnd1okoIVCF_8A?w*^RhwCGCOqu*8_?a|@_AnnobEFkSs z>0BV~Q7Os&Iqk`RTnHpSx^gA)(XU@1@$p$Y6G(iNEhIiFoem^EDisnRl?sWEO0NLs z`-f^#NPP4=4M=>nI2A~I6gL@2d=w`nKKh*qBtDM8gu>RJ6Q3xZR9pC7pMe$6^y#;y zUrXIxb(hthT>Fo;&)5E_=3vc`>eM<8 z>+I%5SI#arH_f}cIO;SmZD?uq3pF*)XlS880kz;9*VocVKF z>x<{kZpUvvDi3k77wq#vGRtx?!R2)KmE&X`{B-S4s4$|yLo=Y z!s5h*GiJ|eY2mw>IcMSFKfCyqv%j{mIHK6lG_!bGeR1OKISY#|jWZX`Xk2*2-(~!y z;;feD`TRXk=ey%CoWI1GXP#C3>fxVDzNMztmaBPOzQ67tRQ=qA{2Y58J-qv|#gm$v zTN}p|8*}**zPaunpx*>5-G9umBLDlGR;?_WH?ugs@ptO^&iLuJ@FOcOY~Y8(&pU$Z zKi9KR{|6N})aHk=yx~`V80&BR^q2M3h@se2$lFpu@ck*AL?E@)_KoEKfK z&HPcnyrRDN<)sbCxVm`i=S~||oKxReJayEl-s>0eWap3W{tNt*XKZo)qJ^z~6WxC( zhMPX{lxHXxHe-zc`&YjEh5QI+%;rbYJZo0{jYr*3)BU{s#;=Ux1K)mW`n{JRqh)b^ zuw#l0%c&!dn9Ea#k2&o${^0rZ7d6e9apY!n(fEnQbH7oX*SwIiTR5j_20!K5OlMQ` zuerRwc&VEkKaYlNb@}P@XU=Hgj~(;*(|TPq4vzK*x2HWexs!PE0t5`G+jNXsn1=7J&(=5zx3AOBZe2} z&uLoJ%0NwT;HTETp@OZ9W$y%wskcxrKea}z?)KWV~6LvJY0 z!;bI$(tpguE;?qwxT7zgGo$%4j5y!;4d>rbR_Js5QRO!_7HmfG(uS6nhPhPcCpQiH z)@`?SSLW0aMRv57g?{}xt^Bx}t{hYRW@B-715a~)z6~=Q7PMwVSlHUQ0K?bhe|CGF zIfpHu9USGods24YBWjW7x&I^6|I2-&-Y?8d7rxi$WPYrt_Wb1s7WVw;oELZBe=mQ- z?hWGb&#C!_()?9!IPJ*4$_4yYzWc4e+xXVRCC!Jwn^x4d%wJ;C*whx1&0%C=!J_WJ zL{sz3#^Px@&QF(T&e`LJpH14X%G@%xtdFQK7AM@$x1!IPN0m2JezmEodGVK<8e6Ws znlkcJXepjOlVKT9*z@SXlYVjNtuHU_jWK=5wsUS{%k<`9#U)g=fxtD+qw>U~zG`2e z;~k{lk(kbxC?8cd?k)euJ*ICsDznym$xJUfZpdZrzr5tQ8~Wsu-|Dg7P}uY1|6Ta` zmR#Z!@q*vyTQ4cUr0_3&>wW%+hrIK{CvIqOZt~dhYesGAbp^lU8$Q`1iNE!a|Ms}y zzg=XAhZS2Eers_f|5xLD3hKtRu$gm6&$Er6*40?fBsCNlv@}oWsoDJln$*~|XkqLqj_MyXrQ}0I9 z(wOrLL&p#C+~3RNuk3mJP#?eMvZ=*OczjD^1IL3gM?C&t_`8k1CST<1JzwOv{35sf z%^h$3OJ9Ue!=D~pSj}5FW4=_XWgtheBJJEWlqji#p%s#D~lFRAD*Wi|Bq8oU6OC{+@7!4 z->>+sKY4cikzetvt?V)xbAG@}>Tejei05Zz`Hklu`TXR8gZ}#B<&S)|*f2j^l8J99 zp0jAqyqTYy*|=a{^VP-qjhsf=t8>kCSGcHW(aZCEYV{mQE?XM7oF{cvvHSl!Wx<&7 zi>A+;vvBsrmO1n1H_kkBR>Qo7jm2q)FPKrBz_YL61OHnKPxq!pOHWxkYGm<-DXrO9 zzFTqRH_jfp>8-!~g9C3(WFIXyH7+U6Sk%Ian8)!KI9!!{Zwnh{HMU;ebM9pJzRW4I z!98(7GpA@zG{1bnFFVDy&~u)dKIh6S*-}X0;s2@UpnVA&XUmc~eDB#okN9Kf&Eu!u zTD)ow2l3`vvxXJV?)lR&+`OQbb2<;IzoD+Bd(-^(k$<iBbq@y`i%#)ZxE`HOWwlRcjMzw|uDb2Hyd_rC|&k9%@jUmQ1Q zDQ6I;gnv98&#d-V>jV2eg5A1?G-vjDFFC~|w7=QWr)T%eCG)#4=^4)bwt3Fqb^?dykC%(r~kwziGpjSGF`>*+B1#o_glYXgu|*4?JX;5BU!h z<~;Fh9`ePxdB`_=zLC%Hkfy;C?i!nawRAr>dQNlQrxpH+6zS^XLXOP!H+-Wp&zSEX zb)=lao`?VXC#S8w_XE!u_55@5SARtFGBOTZ_f*wajmtlfMvXb`^F8(Z{MVNFPr^C# z7tQY-z0B{-#)g^G-EDaAh~iaC(2Bh7!vK>phmpSYH1^fj1|EL3*>?0A7V~UqU_y2=VtWY4!>4@Vo1bXUPnNHbg#07Te?!e|p5J`Iw<JR_-|6lZbwO>cSzv}nV z@BjbN|NH;!n%}MY=>Pry`&Iv;>fg)#{|8k3d%6Grn!X?U{{P!{^5Sm(d&~-c{m;%* z1YRIpF%`(GySxasViNFKS9rZ{#Y7;l?(&LZAg}K7BH@Y&tmM^QUd38*G4L55!>fNQ zE(G%GF0b*exB$qjyS!o;$g8`&Vi?G)yS#X};yfgO4CK{aURYc)jFr5)%S&{Dyt>P)e}TNZ%j=vg zPUf<_y36a2EBGZnJM-!;uQIOSSNZJBtGm4V7x&Kn7r)C70eN*7rOOWhd39HDJ|?g3 zqBJXcb(fb@m-Fj?+VkozN|(P01cTpPnwvXWj-Q};cvOr)AmhUTUYj5thn1#H!i{9n0aMgUTLfmqG$xnM;+(q2- zF5oIx5EsacySNJE#a%2ee~HU_U)){32e{J5Fd)l!1H8DKH&o}cMuBH(E}JRfcXDZ3HS~Cu7JhmPqQ*r zz}51nfGGm9mv09q3;GqlDd<<2B&hUp;2VNU`Sm~T69vU>0xlKw%P;w9pCIU0_`0Cd zjlg(8rNSkGO8H$r?H3Cw3bzf)?)v#tQm%>4oxqubO8shQ2wHUIi-Lad0LBO^b>(zHr7M8Zf);NEz949E88Avvw(xmDSJwd} z1(jY4oF=GL7$Io>8sJnxi%Wswf_@hRpA)p$0wg~A6%rpU3W<+?7a)%KxNk0RVj=BO z?>r#wQSV$J?NO{_+9osD~S(&m%R%l zK8VXo;)Bva;)CpEZ*y7VgT*{1@xkx1cMIEoMtroGg|r8~c}UuWxMgqg__PPVfwTv| z%id%q?LlcE?LpkKH&{t~@Eb^b@Vo4FR?;3^1=1e;E_;oYv?I)WLFuv%Anifvvgd)c2c^r} z0os%8H7kh^O0$yq@GM=ngUb>h#XSimKKKnJKKgx}mBdGJLgJ&}tw7?V#qB`iqwGg< zMSSAQtI{5gJ_e*c8WqwWEp7qQ9xV!Kk0Y@WNPASe2}pZXN|=9^_NY`ydsOOWX^%=D z0@5BW`qk1N{koF&sPsV~?NO6wk4nD}q&-@^ z2S|JLdpD5ws8pamY4)-^fW(I<=CZXw;-lXcK;om)RY2mS(v?8sqtcs!#7A*A0*Q}) zuLlwz{R)YX7Ow*mAN^j7MdA~SE~GtLyaq^nw0KSTzyD9})6akZzu0d_zkmJx|9kKM zcTL^=x-04~ts7T&dfl+P->y5RuB`UG+P|%Rsdi`WQ?);-eX#aF*4|e8-P*;qb84s6 zUQ&Bb?dSg$_y4=F=1VmrYCc^vsHVF5Q1#zezf%44>SwF}Q}rX&e^z~G_44X#tDFB# z_y7BH)#$3vRvlOMiK^1df2@4H^1oNMSN_+^M?cd2|4t|jEL2wiz$Yy#N2}W&gdbz3ji1 zJzBP*?C!GfmEBmjsBCuG@0ML$c6Qmwvd@$aE~_o;Q~Hb2S4&?k-BJ3VOE;DNdFk5H zKPvV9e~qP+OTSin)yD$lk+ zqRR6ykf`$1TYX#Qw$4PAC)jGnyE9Q`yaS0Uqq>@>L}#MPtgmM9I}=r&Q>$+(Z0jVd z4)JP6y)#W^)K^~%q^WE;fi#t;)N01NGfm~$8c0)leyv{0N}9?Zla(};r_}0JR?<}V znAMAcG?o2g^#UMGWxrV61f;2K5rH(7{crVbR?<|SQ>$kIX)4dQ)zg7Am1pbfD}XeW zT_KRBvKg+P#!8yXp1FE5kfyRTW+hE!0}Z69?9;0!aT!g`zcN-&1QJ#D%zS}FRXwgG zs_dD0OrokqR}xjl35lxWCIE>ld0KrjkfAyL($kf>_0Kai->s(k50l?bgqnw3OVi~gaBsCm0i{GWN((HcsVXf6(o~i90n${It~vyysVa3PO+{Q*(o~eLI>1Vr zitJVI18FK2SG@qD((p3De zdKKtx>Z*M}nu^j@T|k@FL(th1avry*(N>@F@Luv)Yt$GTm5%9a}NuXNL?-M|kpi);V z1(iMy6a+192Py>p3gv=Iw*qB?N`+EErH=q2@U~K3cpBNPLuiH<0)!+m*yer9$GP(zQV1 zqqsYO#79?m0*Q~ZR{@ESvTp+tAN}4|*w#UOe8y!V?a}BhT$T1HQAm3fzXC{mwCGCO zqj*=+9+e7dkK)L0N7|#`n}D=Ozc&JDj~1^7(jNU@2c$h(6w)3o3TcnBuLaT`EiM4k z9>oc1kFtfdN5Aucv`3|LfwV`9Gl8^6zte%VN2RW$Jt`GwPq#%cOMLWu1(5h?@p2&X z(eE@M@lmOe_^4D!d{jCWNPM&?BtH6`1SCEx9gjHT6LAw+NPE;f9!PuCdohsq=*pF} zN2RW$J<7fSNPF~qK9Kfk(aX{v{koF&sMN=#Jt`dsq&+G<4@i4dDx^JHJO@a7^g9+v zdsOO5+N095fV4-8BZ0I>zr%sFM~n49+M{1r(jJu#1JWLqo(QBpiaP;FdsOO5+T*?{ z(4M@^xN0bn_^4D!d{kNl5+9Ww2P8f!Jr+oORO(9NqeUN+_~_Tm5+9Wg!XojBMZ(;X z_UNiVkoM@h4oG|SE2KSIJQ_%QbS0!cny&)V9$opEv`32tAnnn-koIW497uaq>Pp(9 zMIr6cua~7gDizWmEedImeoKI~2c@?k0@5Co-cE8m(jJuF{x*>Ip!D{)fV2mTx4#Lb zJ^0N^+JmdxUuPxl!SC&_0cj6P18EPkZ-12)+7qR>?*kGal-~Xdkocf9D~S)T0*McP zZ|~x=#0RB;#0QJFzr;%7gZV(>gVNhOSV?@)csrTyNPO^fJN@lQd@y%A$?Zsd@DoUU z5PbU%RuUi72NEBg-u`Umwigp0l(_O@;)BN9p8*md1P2lyH0Cjh53&M@53&M@4^H!# z#D_V!{b{~h;)BN9p8^seH9i3(K5Eya-G8gw{(;~4H<7#jd$0eB+OFEau6??;?VsG^@8sIwsy({4Z_T?k z|MLUC;qQi;EBSBxBWniN)YkN={zdhx)&IGAQ}v%$|55dI)!(k3S^drG3#!ko9$tNX z^?>SM{zkuTRexG_2cPAiSoM{vF;%Bjl~?|+$~P+aR{llhW0gOsyr=T^%9|>eRL-ru z?8x8XSNMm*YlY|X+5H;|t%ZvUV+*GhPAvRJp{C;PivLluyW*!6k5~Mt;=YPC6(9VK zeM2j{@7DJ><=e_Pmj7Y-HRbcmuPDEi&pDi4{@dlpl$VvgS9av@=)0}#yJd^Z=9GDd zzV7?;^(%d?w6kw&AmEKyquyj`Gl+q9WR=!vI{=DzAeg9M6NBaI*-#hy*&mH+D z^*y8S(7vDg*W8V-7 z%}GEG5d6A~Kn@W69*i~o2BYpfWbz9x))avpAox8PYmNnSfZ&%^tQidC0KqTPSThL7 z0fOH@63799U%s)1Urp3~hfIF?#+v>>4iNlOj5Yi=qV79n@@q=g)Brg^@XJU7IY96$ zM*=xO@XJU7IY97hO4gL~m>eMZWh84#`hK-fb|Zf0$eL1CdJYh-T-&|EFCbY{QfT`L z2MA)p|C_6Fe&F|y1af}hSFqgqUf;j(en>fRfXi}z;CGhX`96^I1HVD#&UXOL4<49* za3{a#=qEWq@T)-Xd>hCCg5PG6%W{C=*Lq|n2MB&2%bjm=Sq>2VYLh$PD!sn@4@KPn z&EES!TUpn6+jRc!z0V&E(TL1Y5fKp)4v0iRNQ$OLNJM0Wh(tz2h-5~_cT=I6jUsiax%M%TdDjx;}evbV}2*^{!dZ+tXUl zboIUO`)v00y?>wY-sisWlg%9PUkq9L43Gf=rAzk#86Z#^$N+)TKn4hu zE`5^CGC-hoDSyuB#~C0{x^yp)0Rp8<9|bZ%pmb?R-A~Fd2c@ZGfI#We-E5Wt0;Nm& zJ4HXv0D;n_`~{;QXMn)s(ueB)qf>$mi-G9D;?jrMECU4Qm+k~IK%jK#_WDufeXtnF zK8Rbo4RH(*id(vkT{1uLhi8`F4`hD8Vk(&*Xo;ow*8lnI7Vl-V%nw@J1Y~|t_T2#U zL)qd6AOnQrgbWbMUJqn|(Bj<*JYmEHwp zfY73l0Yblb02v@uY9#}NN^b))K&bTAhMQh@wVF!aca^RLGC(MM8IS=&iz|Q(5L&d7 z0YZyQfea8@ya~tvVNcxDu>EzV!Xc$@mH|SgHvkzRRJyR?U&@=QbTJkgAYyTG;}PY8 zdKa=w<_9ebnIH6fEs*&^rB^kcQr^cClfQHH%>pt% zDEm_2%JM)}hRhEt4izQ*YXlI&6Gm|{(Ne=YJyk2WNGv^X4?=Fe32&|*hbszl-2_OA-FJ1JyxTAnW;@m9Z zqxo(?!bjOc!bhb-!bhcDOMm>j(ypa7<)f*z3rY!}oTXi=1ub@A|74GTTY+ScN=v26 zVxZDyD#;#|c4}Jox_Oa;=YiAQ4B1Qe1A_%*2a-L=Uh)i;WDgbt1KkY2OZHJ2AYd^SvL}9* zJl*u*A&aRbeDIrn5TTVMPUa<~?1qGoN`;~aQ0c8L&%UlyIHdGeHcR-ZlrY|q@KNbX zAmO9Zn}LLnN^fpG`OvutoK-%W;#MGz@QJt;#f?8o_9%WSknGX*vg$4>b+crTN^fkf zEE6gvrGJ#{QR(%q|N6Spg;bI~DkWHd^fmvXDqR31dsKQAknGXol|ZsbaYC|3r9!et z^Caevl07OVWq&l=L#uRN=a0Yc%1W|Fi?e|*yP1Ax0W$^7&jh|C=*kM&(Xk4mR16IJN#`hTGP@*uR62>@|92|B z=a-#Ig~HCpn;IsyZfn`lJilqwdwyB}ETupEzyFipf$Jt+m^+@o-T13_JpaYt*WNI1 z!C3AKW#I*|TSQi@Enq zjXvYtFV6Z>kLu0ymD^G-yJW664qui-e(|!I-e1EpFX_=cx7E*e@5^UZZW}#uXz8P8 z4D3H((9j+|2A|%)$0wLf=X_c)E)TB?Q9PN#6*MOTdC#?3Qk zHMxs9)*g6LbIEW!#$RUHDT^?Av21 zHyh{Ps<9JZ|AEs^^gh&?7hTMoUw)}PRbliQC(r!KMcjMEeaO|fvo8|(ANp2a^6T&3 zp*M$)EVtCK>TBlS`RbcIlQ)}(5O6nFj?B|F=Fa&duZSP(Qy%hS2lkjfgL@(`>)Ye< z*{W=7>w8+Bq`^}QUVp`xAhq(ZnpXK&`O2pA^buY!H?g^^T|MWbxtH|#uRr(DQFvTQ zkAZ_YcwUY2Dz81KL-n-rf3H0I;$ogP@rHMU`^&z-P4E1qX>-0ZyGQTxnd1HAm-%+j z`{JCrm(yC8eVwyu&R1sH(qF!aM~lq5tq z8FOX7(pi^qn>R<}`5ioSWoQgsR%y^4mtB6bkH46H`OKML?^n9|v`^$VwQD~1hI{K9 z3y@1FDTzzZ_jx`@b9@`?j;v}i5u-N<38~6Gg)#^U|(;wzkD`#*HvymcSX6l zN0yZ8i?1vxya{KQt)J&Y!ZFKhQl4nS3Ucx2i-%Tkd*$v}mWLigT|(aQzm4M|0IVc~ z-uSf0SEQ-}n#aZo;ciJO9_; zxq9EZqwhOy^&j3jv*E4Yx$}Pgo#TGqJ1*$nds_cLymPJGG{&zlGFZlJI>*8DYkqf&{`9shBrk)%3>+f8_cdl*spg$x;Cg`_V z=UP6QckYkA`i8T$!FTTDm4EX1{~r@`?5}rH(f8xT58wLyAI`zIJ_q0S`u}(T_y6u} zS@|p12AtONR#yjH-~2zC=W>O>q~`OQM>Y>^?$!MM=H{l?nqFx7UroE4{=Vs+rgcrX zHhs5gVbeF8W;b2jG@u&e#8sC=4hZU+DI(uK&Nb;p+`E8$RDKuHj=1 zzw7n?JL>MO`(fQ}b<67(*L|yQ&hK>nf7jZ^npbL`t$Dm=SIxGXjWu`Gyy^A-`|_ zQpvY^Tndy*zSZMeqSdq6EZ^#J#ZW5wR*&m~Qu#{xOS!vNU&?0rR*#E>R&&YVzI?04 zbwPoAtHjOd{%Rn;J(V2dgaaX8zn9!N`)`=a=q;8acq{~C~@)6>ajq+)#HMpRPq}o zu0>jXE|rPy!(~C)?9&2Q0;MuR(Bc?2`;?&H(ZF~?rNe*=1YHdU#tHfz0(?@?uaMs; zX_0FI_kF^O;syif3z{DQoF`~e$ZwRC-5loMJxG@lCG=_x1#Ls zK;<_|cdh1%!F|K5==Vq*V=sWC#Z^zRS$?C0 z>{X8f-K}tzuHuTpeff>$FCLg7%wgb&pw0IxTBu7qTd7Tqk_V;d|3l0C|{lI&6GO+d0orAvWikK(K(dsKQO zknB;mknGXoLLk|rU$XQUWKUV?wLrp0rB?$9AC+DOBz#mlA4vFU@k$`!qhBH6qc|bq zqtbam!bjQj3Y&jH_!xMruAq?YQSV$J*`rb+*`v7GK(a@rLb6ATvw&oe<_YFsBzv@I zCE26J89=f}*+Q~Mi|&)`(c&~9*`w^qK(a@1Q-NfUeuZR@7KLPwt}X9!Q#peAnAkORFXa@ zUAdh~(g#;7w*g5Xl&-uVNcy03<$XZXM{)N8Ngvu^sN5A(LHa|`J#G+dzeAK%I zNcd<`NciY?6OiyxX*-bcQK^vd(V~#>(eDNz;iJ;KfrO7rtt5Q3xE4tG=ywf}@X_L$ zxA^?;T>#(WK7dQO6X4^&axcKYwm$M}cLQA1I==NR?g%(J_XISw{AbHEE&tro(XzFr zy~WS}-)_04f$(GSAzn{2l24q~J8x&RZFo<8d`zm6U)NR)$EgeqQ7^p1d>mjIy-L$l23zyWkB+YC2Qx3!j@af zCr{U%D<~wMSiW}N1SFn@0M`SFr_+HOfW#BaN+9vX*_O=`Pb@`o6h&V}rgcw))h zxfn=1v4HNp4oEz)lI*-1sK(RIYkRAo0YC6-Yb{t3cw3bt#p^6Dv-RmUv=a z+PQ!OB%WATcFqS9Pb?*Y#1m^oAo0Y)wDU?fOFXg2?3@D-Px+v;b2gBCvL|K%$tTTQ zNj{MqJ7)sPCzkL)^2u&-pX8Hm;AY7uyJb3%e6m|+0LdrK3&|(DMMyr`E$)+ivL}S( zldU5ppX`aLK=R3MnG7VKY>+9m0r`|Ru#kANKZL}SoihnYJbifjUAsMU;>m8A03@F5 ziSa<<$!-}3B%W*#A@O8Wom<@Uy~LB=q&UWVZ|hl23L^ z8<2dmCxqmai^c#T`DE+#2a-?rgpho)CxkEhLN(tPm?79y!WRUast+(-uv>&n1RF${ zCfFdofr|wjM3^erZasmE1iPgdFh#IigwG2$h?`9oY>HzGTfX00|#@B9QQ*TXsCcJ_#RsV#h;3!iR3z(E%iU=!qQ<0tp|wWyb?R!iNS) zCE-I)1QI@UOCaGxgY4MOJ_#QhB#`i-Cw6S3lJKEhcH9RfeCUZl!pAnamrBBi21zC1 z!$}rM_}EmN*eu~=x46&ys|~URNch+~?LflEo)8i~w$271;bVi`4J3S6bpi<=yTwYv z$8K2zBz$ZTA>m_B2niqi=yo9CV^7=xBz)`^D+wQ)>NX(ZV^7>cPY^!o33o~M*g3ZV zWKUM09jk$a4@*NJ;bR-Dq*4u^pWg*k!)M0|AmL+EEd>%jHptCD!iV)}$1)({W48de zBz)|a8-aw6-6AA>?3U|+gpUm(RKq8b@UdI0Bz$bDg+Ri`1`!fIHpq2A!pA-m5$q9M$8NEb@UdHjgpWNj2dIY6j@dvpd;$p{&Ce=qxrOkF`B`k0?6GrZ0?8gb zX9ke$vB897k8Ly!NcPw*QvtH4yl7ZS_}Cy;5m`U z44_*GpLC0bL)p_8NcPw*y@6zp-6AA=Tr>o-C*#qMo?1@OCl{{NpXSNvW+|NE?fWpDGefVcnr@3R9se)H1<-ofYp^0Ne9dz+^Tyxr&j z>XQZfzUi|C{=EK;PZtwOk^C*vSCc|4 zKO^~zqpv1~SQ-OKAy&hYGpQtnSeQog=SN>n3b8b%k`!Xq4J3tF^8!gBmXeYDEz(z$ zLafvy`CFu~CWTlhQ%MTx$_gozxqKvlnDo`e5KGob{`}~xi6JfW7e`-B43Rt|Cj*Hg zm0C#*X>kIO7}Bqh7*gptATgxUu|Q%-r9xszrRM;NAuWyp5<^<#FMhvD48@{_q>$oA z14$v33P~ZA4hND#Djf+Vg>*F(NDAq92#^%guaFc{oSP+ulx-y`q+csZA;k>2PB0~u0T>qi&m0CTI>rXg*4v>ND8UcN>WI1R+2(0?F}S_l-(0Z3VCAo z0;(xAvIme9Qt7ckQb>zJQb@l?0ZAd1b_bF|D(wo8Liv4lATgvxD~Tcfb^#JYDs2W5 zLt5mIe7{Nz#iE6zkgiKWQb>zJe}9aAYk*S(E!F}31pRgbP8Lu);vmphKwRJ?0at-O z0)9ulz-A{3C>`+%&|9Dl0w)Mq9PuKRUIKmt#|tP8^c1i-;(0bZPQY*ASOKMhV+53r z*w1D?1T2nt2KbPG#Z-4?3+kpfCbJO&&gaAJ;l1n4SYal~%mZ~==W9tOGym=C;Hz~Tu0uJ@~ll`W2V zh^;zX!1aioK&yboK#PFi5f4yl7O*&CJJ2NHcf`FwNkHj{`+%aLQlTKIRA>}bDkOWf zxCKb|Xt5ng_9$)xknB;ZknGW-knFK1?go-QDqUaP^h&Zvr9!etr9!etrE7s?j~1;Y zd-S^oNcL#)4uI?_`@IcF_$W?D_~`d`AmO7$D+wQE-vT6jRJs~S_-OG~AmO9m6+psA zi#G!aAN?)^5`}Im?9t*_AlakebAe=!O3wk3Jz5l!Jz5l!J<2{4NcL!PB#`XU?=T?Qqs5^> zvPZu{vPY#tvPY#tvPV5avPZu|fMkz;2Ls6-m9_!N9%Wle_Ndef*;8JH2LK5l&r zQFb?!5_N})gFvzezrzmz$sUwuvt$pl1IZrzX0v1uN>fSppmg}l z93a_)(%~-w$sUxZLiQwBQ%U%6mJWZB%@RH+9sWF!@Il=0{XoJ8zr&va5~#0`I(O2P-f!yiK&;iI?|l0CQ{{uo;&d$2hCQ6Sla z#XzzL@xvc3Zu-w;4@!qW0wjA-I(#>f?7`yj4j|csxInT8rGaD*=7;ZOvt$oShd&4; zdr&(30U+6f(&6_5$sR4<_l`dQf24E&&c}5=vU9QZKEq@ST4C zuU`NE>rWc|Z9e~d{r_8k{(mkD3n%=b>x!G6%fiB`6Uf5CX+4OLe=Z9PE5@J&Ko%Cx z@j(m*&t+lZ93ONwkcEYFJdlNjWjm0Cg)?jrgTZrISUBNxv@9%~h=UdsHa*9};<=YX z))khYLG#%q>k7+4AnOX}UJjOZg_U5?6>OGug*76Ob%m3E&>SjRS2z(<$-2Ucm`c_a zPQ*ag6;8xJ))m&gL5vU2WnJM!95fTiy283J=u#l-3TOWy=7Q(4uCPc9ngL{8;Y=Ph z8DL$>j6I0C;JGX;oUenX0$EsCzXnYLvaoQD51IgEVPT;iG_km8e-;*2!$Bne{wyq< z{ewvS{aIL8*#?~pWMR>wkcCCR=Kxt)R5}L8!lJm*Ko%Co30YY5%Pg=z3yT)5T<$+X zSECD?_Rp=jvT#`?l?ROi<_NkT4t!P6m6h3oZ8QYe=_9XCO0i|t^0Ye3p zw(SK@7qHmIEUnor%m6HT4rqV~iZ`(EwaH4>?w)=qI z0)7K02v}^ppGq%5*;|0)1(n_d^b}Mo94BZ|I9AZ2aEzcuA=#t(yMbhnN`+*PO4k6% z9+j>Il07Q5lI&5bknGW-knGX#tw6Fzr9!etr8fh~9>uK&$eyxaD+wR{t^^W3DqRXB ze6+X>Ncia2O2S8RHvkDA{oa5$!pB%kA=#tR#cY-A(TI@jQRzY;*`rb+*`rc7OZM0- z*8#~M{kmDQN2OMhJ&F^OJu1BhNcJdONcQOJY9QI8Db$sWxM$sT)R zK9KCu;yfVPqu*ITvPX-A@w3SuEzSm#J&LoE>`|%vBztUwnLx5fi_-zJr+ofS0}?)3 zoC+j-JWD472_G#^0TMo%p9Ca)w0I$q@X_K#AmO9M@j${y^WzJfo+W%@(L%CEz2ksn zj~2%Q$sYZl4W#>Bz#ob14#I&R7m(}QAqgcmn?lY;iFPg_SuAw zO8H#=Ea4N2Zk6oOVpky9qs1eEWRDgP1Cl*_F!?~3jo=Zm>#$vNcf<1;4?tNhqH9xJ|N+P(m=uorGbPG zN(Vm9W(gmZ4txSg_+WA1lR&};zo{gAusHBhDhVGf4tx}ggpU?eNcJFZ;BK}`_Rs|b z9|4j*_zfg`P&%-KO0ox~fn*PQ20lzB*@M!74*|&@WCxNx_zfg`@Eb_>pmg9)_DS|& zF_7#*Tp-zl(m=8Y^8>fDPqGK4fn*O#1IZqg4&26O$sUvjl0AweOP@{l=(qh>KL79F zZvgzT@>c+Ux9k6pY3<721bC(8*+YL9;I5WczxDn9pXF}^e6+c(`Ghz8oq#<}4_5wG zz&rc>|1G5@rR(^c0kcXM9s0WgJxYg{s((A+?SKFOQsEbcM+^T@xUcY|!tI4WD_mdj z?+ARMFzLViErGZH{r_=|M>ZB44m3R1@I=EuHf+yd75IyWn||dl3%vdB|Hsy!Q9ro; z#QLM^JJ;9L{YU=Bz|Oj#9Qr#0@8tLY->qF(`_0j z6KCaOZUWntm5G*I%&lI#vNF-Ei~9munK;K6b9>mXtV}d`Hmj~ofvilN2aCC(Ygbk# z&hf=Z0a=-7@IY23IyaD&iF17Mk!+Tgi8fx$ZCkstG7%|(tW2DI*(@s)=V&TfnOKYh zS(!Lt7kA+RS(#W10$G_@3l?*G*siQhoV|;=32awZCKiT3RwhoqKvpKsx5WiE%gV%R zwzvdjWn!I6B`XsP*kbM?+r`S1`G2u*Z2?n|HA^xn?cqzOh|dnOMvg9RRX2 zu^uma8OX}SYPRSVAS)9~@S>N1tV}G8fvildS%IufEZd8?J#1H2CX_DXzOP+bnXtI% zd7!#7E!q!MSEfK#Cd@D5Ca_&unUKBcX&@^TN*6s2WMx9>qQ`)&Ojt}MD-(WG$;yP% zMZ4K7D-+@Zoqclot!O#*(iPf5UH_9+VZ4HN{F zF5>pEU5x@t0}TR71N8zH19bux7d^l}wF0sOH3CW(@ki8ly{9a05jTSO_f=apXtK(~e z7P%v=W1hh2w`e_Zxj?=I<_em>gUV%sN`*OsN^b+cDk$z&V78#&TY#?!`dtmo5>&bp z__CnV6~IhErNWm4l`aD=6%@A=_@baVVTQoTyy!;Y3xXDJ0;UVPvT})_MPZs?gIo_> zEGW)>rV1)`vx@}V;09odpg8yWyr9y>z+^$$3k#b&K37q?kivx)RC*2YSwV}!BtgFm zfX@gj6($Oby9)TUpx-Nj34(rwPYEg&#tSOF0=Pg>sW47Z={(?*f=Y$4f=Vw1J|U=d z25`Qh(&@l?f=aEND`;^l@Nq%E(|~gXl}-W97F2p6Fh)?RaF(FbNx+$cN+$vz6O=Fk z7%gZ~I73jjFiKGAc;KUgN`;YvZ7>!{_-N5e!bfrAfP|0c&jk`bT09>}_$XUQ_^9+; zloCEJuPG#Zv^a*Xl0Eu86G--GaWs(Z(eFqg*`v}?K(a@R!+>Ou7KLPwvWEi69xYl) z_Gr;cvPaoMvPY#tvPY%8fMk#2NZF2LkAAHrd-U5ANcLz^NcQMgNcO1oSRmP>(xZW7 zk4goyr>yiSAmO9Z?m)svrB)I?D(wa&d{lZQknmBdknmBdknmBQ`y_l+Y9-;L>}DY0 zqs7B;Mfk*37YfN9CAI>|9>te{WRI?`Bzsiq!IC{HEda?LmAX%|M~e+WvPZw2fMk!Z zgk%qX7ajzXJ@^eId$1Tt_8=~h?7{rPSJ)@ngWrV*fMgFA7m~6a$sYVJdw3 zr3?202_IYq5?78gE9CD}tuEZhzxdl0v9Cy?wx>B0wqWDjkya2t^9L1`+<9xN`rpGvYv zSN8$Q9%L`P7fAN#S4j3~(an-Q%C?g1(c(QovPZw0fMkzK?*@`Ry1E@m_NY`y_9**S zAlak1+kj+`vR4Di9{mbrPg&_LK*C3*Lc&L-Lc&L-?vwCQ=}I8sqeUU%qu-l>gpW#B z00|$J3JD*TF2f?>6N?s-J?dQsBzshP6OioDqLA#-FNyoJWRK#6WRKz&1IZp;T@NIC zG;bx@qxoxrWRHG@WRFU(1Cl)|wUX>noRI8M>D558N7)O2WRFU%Bzsh9CE26W`9QKq zrB?vS9xW2AKTG!LS4j3~aR!j=(eE@M*`ppS$sX3)RLGvhXCUFDxT$QG@X`DfAmO7p zD+wPP#7e?Pze2)CrIT?*_{5ckWRH3;1d=`K6_P#b_4)trd2dZ0|Nh^vUjP5Qeg5}v z0{;5_|2MY$zOMiG`G4>1^S^&F@SWcO|0aJu@VET^|IZsAX#DHOwT<6vT-x|2jq@94 zH(uO0q4Dg--_QO3^D2K`@U5@^um1l3lDdg?AFmr;cWPbFy7$$UYJXY#eC@y1K2rO4 zwOeX`PuS$-ibga2JY0_%MDQLGBL2?1TrzOnC%^3*s_j^!BcN9cSfztz`&9h$iTpPxR?8% z)@5K|@d#80hP~WCwJrk#OVM8Lj9Qn0f%R`MH#V)yz`$CzcMOn$VMwKtfq^w9l?)85 zjM*mx11rg1?s8g}fnhMfT~6yVFtD%%GBB{@?d8U%br~2~WA<`m)7lISER%r@45tI! zzO*(2154gs?s8h2fq^A&FE=Kw&A>oB?d=C-V6a=be`#$72A1%>+alsZI=mObqsfl}rqF3%5C~&BS1X2$>jcsvbZl2D`;dCI-!0 z$;80Y7|6t6gB(pI6N9ZIR40bLM**1_>=q#tgFVq5$i!gl90_D%uyuq?40g+rg)M8D z7}71>C}d!;TZ9Y@q*!*zz+kr=MkND-ebfcWz+ksn$-rQPlz`G69bFWo<}jy#Gv^-kFtLT2FwRCFwi-Bc2mi~K(hog zFwhfw_EO2fKu_&?1jxWZPwaUZ$iP5P?CAh9Fwi=I3=H(do`<0^lLUK0=p)!I?ZAlw z%gLTiKySeYv2uc7gRBR72{wq3@X_yDAmL+!YylEJw$5EZ!pCk|10;Ox7ApxK%?k-1 zTjvfS;iLK6fok{!5T75pIKV^7Qi z5Ob;S)&s*i_@GBz$ZTH%s`~6IK#Ft}SDMgpUn!CXn#4K}G=y zAKPFgknpiVh64#7d&12UKK9WtAmL+!xLLx-p0JYev0K`JgpWNj1W5SUErWrCkFwn? z;bVjN3KBlHj+KOu4bmSt6h1=2$DR-pKK4XkAmL-{^ac_>_Cy~b;bTt-2_IWWNcgyd z^a2t-Hb^hb6FxET!IC{Ti(4goYy&IF9^1gmq3r1iBztVVqk&|PJt2@i`SN>DcOcIknnK@=>{AMA0gpmPY4MgTc-|qi9o`K*4h0sm4pvHkxIgco=7F(Lr(+}KJ?M< z7uYA^gY4Ze0tp|x#UGmRp<7Z(_^`HQpM(#s6G-^bAiMXoPr`>b2qb)HkloK9oA6Qg z?q}F4*+YNq-UlRm=&9XL1IZrDXR~Vdq*BeEKs9>;$sQUcN2_Mf?x#3fvgZUUPyWj9 z{~vtUzyGg({(pDB|1UrP|K0umzxw(AcmMtWe-xfBl%N0i?tcGYe*WLP|NZ|b>izux z?tcHjwDwPGz5oAr`2GK;Etv&4`-@YHo3>;YpuGZ_1z04CTu8SivjA&WAhQ5%T%1TH zvjFFKk*n&qWENn}OC_@a=U(xADwzdXvx;Mjn>J?_U@a+*12PM+W)-=pZF6P;(khTy zfaEETp^{mE1*|v{$SlAqS{w>w7T|<04goR?uwoRsCT(+O0alqnW&zIrBA2dh&Md&` z638sT*SwL}IBDXoSfJ(an znFW;1#s97N9{2TnD!~vj9p{ z$t-}yKxP5NWwXozG)RF9={9E;z+x(y1(03fa=Fc!1yEXe49F~i#Z)p2;J3gfa+@;? zptP_T$Si=;0vEz<&Mbh%0vEz<&Mbi6!cHKw07?rF0+|I+8ptew(!zEsnFX|XFOXS4 zzg(@hIkSKkw*Z+1^t%bjETGbMAhUo`rQCz7U2BlnXa2QGYdqiyJQql z+}%J%0hO)=G72br4Ukblr9wsll?oXJv?yd0(C-~UbrdMv4rCPIEDdB7P@EM;f&AJv zkXb;Bw^GS0p!r*X%mP}pl375%D}l@cT3iie7SQj_KxP4zx>;rcEee?h^m`M~)mNa> zrNH5WN^b?U#JCN|v;*mhY$Md%g$sWX|lI%fgAlZZL#+TSE*@M!?=YeDoN*nhB z$sUvjl08^#e1=N02aBmBdyw6@k4mx!rGaD*N(0Frlm?PLC~bU-eUd#`Y_KVceL%7Yi>V}g^m`AL zWRDhwWRHG@WRFUPWRDhwWRDhwWRJ4jfn<+Lg=CLP*8|BOm97PnJt`HFJz5l!J^Eb( zBzv@Y7m(~xoRwscO06V&G=B$>>{01$K(a@rLb6AtD*>`6=VBn?qu&)&5+4_*CO7jjI|*7n_QIRr*@f_~!RDFK^z_^5?B*w*E!yKX!hq{)oDV>%UvSyWxK{ z^lH4ZaaW;h;mP8NQcda7(w$8wH*IO|+5BS57hA9783O-L-ORf0)L&e`u>OUHxs9ha zezGuzU^~9JqI5>-nWi5!4{!drmK$0gYyIQSAL+cOenS1R_4hQqzhPvC z!dLi|@gJqZrS_(?n*O!`ou$sDYnmFG zu4{Uv`PBMb8zwc}-uS`B|Jg`J6y_HmC{8c_r1ZH`N7K-zCCw9?=QQuFKc)V)hL;*Q z7LFIvL%b=EdE%z7iE`7V{@TPAxJ>Ohv{#Nt7E$?ahqn4kwp5EG}wZ7%w zTQ6uC)pAG6%dLG|Kh!#<^`_SCt(#ld9C{AJ6P^FE^Rmv1I$zcKtDUEH{&eRD`On|f zeZFp7-4OnBblrRF-dl6h@9#gIYChj7=TYPIJN~tT{go(4UD8ep^VKB4&ICzFFG zS2p_#D_w+|Ys&|yuWXhaYy&!RfHZ4urIH*xp;AfW7X%KS94t=11dtp&6?hy-4xR!$1|$c&1CIj9!Q%uDok8muU@w*A z;PJpiR5CI26sRNzKL9*Hr4oGrmB9O{YzLBqM+$6~b#jpV)O9bnz!8TP+kc#(1$r;w z(3z@$?z4*Rd^1u0_k5_i*uH9Z1-d@OzvoL8=zLGHeQ~0med;E2fG<}n-Pab|S0wbP zbUs*Y|4#K)m--gl*UhMGcHBM=Ft-AAkMr6xFR{-NV~g#7l?e6ayubl6*8wG8Tjm(x zL+A5zDqVNyVZ-_NRR0OR@8!_de|Ft!4n3{%bB?&N*nU%D*P}hp(I!+XAG)E~{ufD2 zDo1osNdWnC9xAr4PdWoV`6v8U^@V<50I%TU$^j1JP5jQx3Y69s+qYDI=*dTM=<2IJ zvMWbBy|P(P{ypD6rUE^>aOkNO_`tkk`=5TG0`)!Etok1G7+-9^z4}5wuz`Q}tjcC5 zcH-w;Sb-xauvsQUUiAlF=7&zMRC@B-zWS6x;vr>MJ;EezAQ? z6`I!bbE@V}yoOhhMcY>}mw!SQHsF|U{Ifq*{b%!X{iN^_3SL3A502%vZLD^0pBwn0)%Wd# z_ZHi~m!aN&9DT4P;~>yHuh?Gxr95yfui&2QtM11eaz}OTJ-UVijH79vKU%|D!g6i7aGL)ZFU8_zQR%|c-wHh|-HkE%|wL==G z72E%&`W~Fpiyu0#`a^Fjw*PIlLk3{3e1#haIId^0eM3`avlFi30M$3-lo|XJhF26Lv>A?NWO|hr`dNeu2fq1m)>9P18$9OzxOkhN`F%3FAEiTKS$eAeGmHXEw=xp zXLYmv#rB^zR$$OJ4p9A}{nxNhRej%O#r9>@qqWj5KRKte&#A2O_g7EAwobgz>KbzR z;$r)^tFM|b6Wf2hJ0ghc6XkKV_JU;y~pgJC(zJe*OrgG@Iqxj_1U0}ZcLiggvYx5oeGY9k9 zs{3?h^}n%tmJ~1L-}Cj#0a_3IhU@>UpDWMdv-lgI|Mx`eKbAj<^6CGk*6Uio(K@U3 zo&Ej4H$MOGsFuzxHO>Fg{B-l9&HvDRU-OTeZ*Tsy=HK@De-oO{ZW`8fO4G4TM>Z8p z2TISCo+$le>9>9U-wnk-D$Xl@v3Oze6U8(5_3w%NVzcvqlk5L~+voqi`St%luYI8Q zuWQ%Vey_Ir`~Ru6Z}$BE-*o-|#^J>_{ue054NHLO2?D5y;u{KHvo)AHGhmKo>XbU4g8@9{`?bvn-US0Q-UD zcdtq%+0_Q@qmr?uFYq+b?9q+@o&u8WCsZJ-OtG?A(am}QPq0~5j6oGhz%&AnQ)zIs zLIvuDp1`A25~cls-Gz-lGmx)9`0o_5V4Mm(47|r(SR=M|09g$YXQlkeK*U)oKQa*6 zfp5AG76bDIEN**{&AuVvYTHgAOCw5C$s$98YXj1U$LTJA(5g|Aw!``*8rKHReBeY z>{ID_;8G8uQY#rcbS2ENqTf4!F9`a*9mqtbUm+h)6n85y&COIQBm|T#Otqp?Aql6_ zTM8R}W?(GdOd&a_-W9-PcTwCjAfNXXw-iX?EBhuO9|sg?Ws>`7{zl+4f_~jBIjBV| z8PD{4Jutz|R4OFBReBweP}Jf=Ak(~luLZ`rk4morJ}GF?%2+|aR{@_8v^XC)U(oM7 z;53sdOfA zhM-a_qXd--9~D$O0~jf&bUH9X(4v*(x_+&E#EMF%p>$Y9=@bedwxH4rfuVv*h0_I< zP6CDqS`#hnB6 zv!dTKfs+OO3Vj7F4hK#W^g9gbBWQ6bkoiN4LxA2^v?yeR(xTAIifzya953ifNciY? z0FdxeX@4N$qpQ9^!bgk!fP{~2&<9BPD9+6iJ}MOwKDL3IC497KCE=sR-ax`f*+Rlc zrF~FJ_~b0@Ng>&z#U4PiM~g=T$sT13$sUyo$sR3s2a-MdJrYRvsI(i9>{01qK(a@r zU4UedO06V&RN4w8d$cGdd-PiXl08}!l0EvZ1Cl)|C0NVP48-Er13ONqhzpK3L2?2_O7!eV%<1K3LrPLUCjHnSuD-`XX?Z2f(76m7f`ixIn@O z*<1HhN%&wfknllVHcR+me(OFqOZeb->(fBO2XR}U0TMna&1MN7WN+P9*yu9@RhnIr zJt*D!B)cSgP`Z_rEDK#!WDiQWlBMNm2CDQP zAlakEEkLqIivrnGwkRZgv?wHeY=aFz!bd%K0|_6M3JD)At_Ko6`n8hq(c)Sl;iEV! z2_KbON%+_;Yk-80;yhZyN56Lf2_MDX1tfe_dKVT6pIEez?6C`O1Cl)|y&XvQsMJcb zN2NltN2Rv_$sUyo$sU!i0Fpf_T?Qn3RJs&M_NeqGAlaiuE6E=H-T)+fRC*(j>{01r zAlakRYk_2s7Ow%4J^B@rJt|!QBzshP6_D&vsX+E*Ma^aj9~RzJ5XRC*zh>{01NAlai*A=#tF zNkFnkzY~CDj~2%R$sYZV1(H1~Js(K+sB|=t>{02NK(a@rR+2p`9R(zNJpHUBd-OXJ zAbXOffrO7rtt5Q3I1EVmC{9TDsC3A0_4&Wl`peeme=pDf@AKd4`Tyn5|Cbg&$Mxp_ zXMXkB|Sp9^eKN#}F1 z%zEw~T9D4?nws_8uCpMW&m}(VxJPI~I-d({)*S>gc5(GkDjB=D#Ah8h3@ymm#l=j4 zj9pywwC*J;8N0aNXB~I-EXdf!RXu@>U0js2?s+O1ySNZ%9k=x?$k@dtOM#4CT$Pi3 zGInvv(mL+(S&*@dOQQmfp4MD670B3i8o?b)zv!wzVrgdE*8!5R++lE=qg*) zxIfoSt$UJP-Xn1F(7MNfP6F3It$Vz<`L%BeTxS)yO5h5tz&8bCv(M(&<_m*?M}cn$ zC=FaGV16Bs1$yo40zHw+6#{Lrj>iJM_B8?X>mCN?3CLc@qkvw!T%ZjCa|O(=mP}u}i;efQ((57czF)Eq4GH`>O4h z+kvTqe(wS<5;QMN5$uUO3Y%a1e8sPY$rkkM!9FM01s?1|!Tz`n_^hCLVUnQiTY%39 z$`&RH$`(E?D0?L^L9kndPYKFi4U89TgPVa&U7F{)K(A%$(!3R>uCn>1K*lc33mLmK z&qIP<%h;uCo(uF^#xC371|VaXvaMw7vJH4h&}$jHG`|?g*rj z7SU^&x->6j>e9Tx)K&H?WbCpHczn=n8M|zQNkGOf%})k0c4_`XAY+&2g^XRE^AmxL zU78m%c4>YBkg-d@LdGuJU_6kq%QhGbWbD$sknmBqknph$&Ib}cnm-3f_-K9Um@Y6c_HDW-{C;Q#|9Y!Bz%KeC!D-2NOP; zKN3jz=(j77@X>r1AmL+A90nwOG%qB4G~Ws&d^BGNBz#m_10;MfzxDu-@ImR?gFwQE zHdy-#kno{f0tp}5VC~CP5#M<3d5{0dx zAlajAA=zWItOt@knirBinqLbfdo;fWNcL#nO0q}uOaKRyJ(?GiJ(?GiJ(_1WIGF5F z_H6*!lWA@3EkMG@o>&Pad^pWhN%-j3%@RH~$jv~)$2MRbIGFHJwv~jBN`-`v=7ofh z4YCYK_}B(Q!bkH$!bkHpIn1^6X=;@3j5N55AA$sU_!K9KCOS*`$*J(`~fBzrV(CE25SA=#tsxj?eV zHkbn>d-Q81*<%}6N%q(Vvw>ufewhspCVMn5Bzx=$A=#ts89=hfHW0|3vUzg;V8Tbg z(|_&$|G(+H{#ULmKd1BX&Zl;A27 zZ{3dH^7;R7{rms@HUCocaLrHO>hJ&YE!37w7JMbO;$a|@1z#+#=m0WV@SWC*2Z2l$ zd<(VWAs~|l-$JF5$$~HZR&1w|$$~ElSL_5bS@8AY3cknQlF5QExB{6h_~t4H$YjCS zlq>FMvrHCz|F~iskja9t46T%(8Ne5VflL;BF}UKs!bYDNz&Xx;XR8brd`TF{V8J(e zEBI2p{Kx>lWn8fd$Y8GToJMHo#15`Q($Y7yTzOD9=0lCs)1z%8a&S0U%=|BbxzUo~u z6=1L^%bpBmvQX(1Ad`jSgiIFtb+b$s`sJJF&6zAz%6HP`t1wkM5y)hrQa8(Fp+&x+ z-kixozd|MpmAY9b3zb^QWT8dAy55}0LW@Es3uTW1GFfQx93Yd07S9DTS?J12CJW7v zK^&7s#97E-p*W#3Sd@>P!NM*WNhO1YXDQ23`H=xC=DP*wFbu*B`LUC3ySlAK;po{-%SL71#UP18< zz+r;o+^n;p(mJ43POfn*O# zm%j)kd$73tc_7(?-$1elrOWqGN%o+0`O`qMhZA%86F{;Dzsny3l07K3QhsIt7Oj+@ z8GyLuj{;;*E{F&ud@#R!HHUA~viuCRi|<&OXfAKGAf2axbV z-13Kkgb#jGN%-J5knln2@{YnrpBbRi6p}qy3?zH-yL=}HOZH%K`GY{R2XTR953-kU zqmt~wVj$Ur?B(}UN%mkdknF+Y^82VHdyu{SULe_{I4jfrhwAqpAlai|A=#tS4M4I- zr9!etrR#xYk4l9p9!;fp0m&Yf3dtVD-3lao^m_}C>`~lmAlakrl|ZsbS8hi30BV$qte+xvPY$}fMkzKtt5L? zIvq&%sB{{T>`|#e_T-YRK*C2?RuVp*zf*yPk4mQi2_M^FGBBX3R5(@8;v^v9qs0q> zgpU>{VUh5OMYl@!*ahQ(WRI?_Bzsgk0Z8^JTS)dO&V7 zQi8So$N=>S$sU!C0g^phJQGOvXnqus>`|PM?9u#4AlaiuA=#tsVL-A+i$j5AkAB;L zWRFS*1IZr6SxNS&v_FvSQFcFo?8zl}%XjmAH@j?A5Y9aK*C4!J%NOeN`-`v zN{;@!zv?wHdG~WeC z_NdfKvPY#|fn<*s-7MLoUm~~s$N-fJ$sU!q7B`k38KBY z@96XYTV4NuOY4$%ef|G0-sScG=QMq!sejXP@9O&hZx??*&;P%tab4rBjo)ot*!azN z_5A;TuYaumXZ82j|G55+`ge2vf491(+Jm+KyY|W2cXR#!xSEgE45>M(Q*mSY`zcPh zhlQNUoNl`g0y&du)?F_bHv0XP=ftj;Dda?^ad$lr#R+7JWGUJ8AeEfSta(;``7K`#D~6R{=1gXt4CGAawBEIyO3q|X z>s{M`OpyfKuKR&2JpfBV;Ohbl%dY#VTp?gFm9GgbQ@ie^GEY$Hy@idxyu4y@3x&BB z)Vm3|OweLGFh|hh2H>lLu7ufw7S{t`5p07sz$`&=R=zB#bS*Gbunq14z9gvhHsDf0 zi^3NL{jLUP2r3o6AgENx6sgh`z$I2x$_Vz$Op#h#3S4YOS2qDu1!dm=WQtU&FvW@% zg-nr}zaE%uMWt3gC#clQg@WR&WQx?UFv*I3-Rv`hN*4kX1(jY0d|FVcFhNl1wZNwY zEm|2b==U1n0zr$yI6=Qxqx6#%r3)yGwV=}Zz$XNi3g-(dy%IQ2P^oaPptvi5j|=*p z3!EcpaSm{{pzK+|7(t~ofwKfHUJ9Hk=ywM2F+p)tflQJ5odTR;MZdx*L5mjxnIiQ& z5g2Jjr9!4il}-SLTT$FN;3I-Y#sk9y{hkkGiqxW;4Yi`hvB2qqvfXTmV1t|soF-_| z%?1nl^#FqemAYA*phaPzpx<+V0fH8-oGK{JN`FDwV}Mfx{hkT*6I41Hr6*UEj;7Gp zf)+;tCkgr;4)hUJDx4^&ROl_JbSQ9wpwhuWFF~bk!101g`vN@$E%pPB6ZG2~I95<; zA0ShtN_zr5tZ1gv#4}LrL0%T84*^WnmgbycXAmM}3j)$ovd~g*=_~18? z@WDtR;e*AF4)#g-V6o#NAmM|aR1!Y4LC1qs5B>`|$Z>{00^AlakR zb|BfK(hWeeM~iEKWRHGt2a-Kn6p}sqy%k9IsPq;f*`q}v*`wdpK(a@RLb6A{D}iK> z7Hw%K)+`YhWPZqf#pgAKTz2AmO9mr9i?*i*A{02ZK(a@rQ-NfU z7N-Hp9{mc*9xV#V9{o-Ml07OFl07P&3?zFz zQSpX|!*CHN#uzm?7-Nhv#ux=uKqQC+i5Eh^8bXalkM($jSPR5@rXE8r5hE~AYYjEV z7;DuC7(pP`V?7=#Xsxx@{GR7Cvr!mK1^wgvPX6h0-nG`gJn#B`-dWqV=sZi$2NFKI zvXb!8ua$(4O3wolK8mxF@KLFigpX}-4v_Fs={blad?L<5vPYw51IZp;3&|eEoe3m+ zG;$V@?9rl?WRH4;WRDil0FpiS#OXk?M{#bJ?6E=GfMkyr-7MK-PY}%SC3{pVBzshP zB9QFSqLA#-?+HM%N2M)5vPX;kfn<+<4+oMxS`?B!iaQcW_9*)hAlakezCf}^i&m07 z`t1WGd$ic6vFfkO`d3Y_Y$(=!zW74%e-*ASoLar1_9r#NYj>+%&jX;Zs;{e`+~e0h z?r0j)cv<7nhNr4etKPF}Q`PjsZgovHi|X#K{;QfjYS!0YQ~QNt&$`w8HU3=vUli_b zn9x|+RN3@r+yAd>dguR|?(~0UuYCA_@sl7N4-Yp9)q{pqvGE3qsM*l8lN9O>c4!A zihIl6xw!Nit*4xF^6+l&YT!1nF^D}Ly=dzmJA938_h?~{+eUBQV~3x-`yLm!mOe=N zW81w5U+;0PE!%xryvVV~mtJHCLfB)_hdxN<-DU4yR(gf9x4XZ>u-3uby(xD2#rQw) z3hdGRp;s8&hu(Q)-_j1>-R^VqA&zeyvaP=s_t>Yj$Mo)RiakF3A;$I@RJppWW$&$f zZ0E1@HMZTOrKW$y4LwSqynNPU;a18Zr$Za-M``ETAR21^n-kr0i|7lCypvX zx6d`Cbx=!dbIUeLTdJp(4dT4-dY3=l?p?CWu-1Xyr9RQS^i>?!eGg9jJRKPkk7K+8)KJ$_-bjF9ekF-Ev+rvc0vog{9;mRmmQcKcwFm{ zVcUNE;wfc=j@i0P_mAIvd^azgo=;Z%0h6pT+r5Y%<%3m!2VYoA>yYiv96!pHrT0~S zMK}2ahmjTAe3U_c{C_;Pw9gJc{$RSYdyhSJ;UC%so7=vOufp>KO1r+ZE zQg&PS#nLrqo92(nt$DVCe&JQNU-=qNC~N-g)>qj+H-_-hS;s&0Dtuc{669Tre)n%{ z5UWe~FZdZ2{mxx>@NF?5?qJ#bB~kv7uY!|7-M_A9j^4UU_pfWn;MV5uZ|s)`ZQW&Q zx8;Rb*};nRELr}MZ*0iWZlf#T*fY(4Xcv}>?&tl_KUk2ue-@_dZ6>&}eOem+yllXw zrT!Y)tyx_3Kh!L|r{6Fke#FPf3B3I$Z@jZ?(D1Fhbk7Lp&>`Ec61>W<&MWP*1Mvj$ zcFVUN{F~2zE#0&GSLLN$cJRhpw*9vFlcl9;eA&2b zO1tb}VPTg++kJd?8MM`6`Lo+O$!8g~-F(#K!g@|g88ayu{V z@*|qKYo*x!8{>@)>UP?*%ebvmMfnrkox`ldgSO9zLF_VUYu=SV(e1PBU>Dl*m)|J8 zv9hJx?UFav(mn2f`N2Tm{Tyy-X&t!TdbCsb{}-FyYx7!r460`{@%Uh&x&D&+51#+G zSAC)GKk8nu+gSH(-7o4^)ZJHC`uG1XuNz(W)wOxk;VP_$H*!Q|J8s0e^_DPLVfM~wVP{Ss$E_Cc#Cos{(1F-)&Hyd&g%bG{r&2zsxPa)pnAvu{r|&NORCzdepEH5YG&1xsvST7@3~Lm z`F|@G<_aCR-i+dww1v4s$6Y<6xQT2bSLpoZYSE}yfn1{Fj+9X^16`Ns7L9rZ$R#>% zPe~=0=(zo86t|=;%q2Q**GVOp=(r0lm0Y6ZMx0UHc(yQ?=(t@c&~=Hf6LN`;yK+W7 z$7Z=i$NfH|)&RLg$9+YqbX}tBgsw|;i$-y;S?5FExfdyrOLW|oGm6{G7UmKi_v?&$ z49F!qZUqYD5*@cjjao$|m*}_^XcYIFEzBi4ZUqYD5*@eOjN-<#g}Fq>JwBsW0$rEr z7LDRAvW2-s$30JhT%zNKpHUA`$OMN4^Sp34p=Z#&=vQZEtnx3 z-c|XYU{BmlWxAk6;k$wsxua~sG(q#+c(&kLL8Vr%5x6%iaJ8VtJE-L6A^mbg*n;m^ zQRzHjs=!@nfhz@W70YH*1eLnaw*{5n3QQKXcq4FypkHnkTQEsb>Giwz@>n6?ca%xLDA&aFL*2VYHxM?i*V$N>HgVQqa{T;6g#a+$y%<0ztnMfNu)= z70wq_Iv)6jpv7^(d4d*&uM5h)7|72vMzAR||Y~V~mrRM@)5>zUjA*l3p;ERGvPX+SxkmA~a{5+)6;Xr;KQufKfY3`#% zVYr~*6M-)XDiux@RC*%fPU#YN0)>+;sCO9fc|pCxNrD!I&k6b!P83u+6!@&5QsD$a zrGtUb2r9MGDyXytI9||Ve_)uPMd3I>*+PCEQd~b^h!vF{2@Do=Wo3|{MWIEo4cu&? zpzK3{W=tk>E(XW+ckAB@J*`v}9Alai*E6E;}T1oaO?tUQIqc|biqim9SezHf|Lb6At zZkFs(=^`N6qs4oHWRHG@WRDi_0+K!Yoev~?RJssI_NY`Kd$NdTpM;No-6!G0SvvAg zAmO9ZTY-d+;)H~ces2a6KKh*lBz#nACE=seIfx^CBJKtX$sY9*vh$NYx)PE-TD%@e z_9%WjknB;9m1K|Rtt5N&I|E4es8mSyXi-S^s7FZlsB{{T>`|$Z>`|$Z?6F&}0g^o` zy$VS7s8mSyC{9TB=ywW`?9s1~>{00?AlakRi9oVPr9!etrDK3(k7pdgI-l&x!aMR} zAmO7@A>pIN(Lln-Hn;#t_^5Owknqvsc|gKPzh?mnAH|&wBz*LHCXn#auaNLj>6s`c ze4_LW3dtTVwgJf={gSxzlRYXu6-f4I(MqyMaVG)E9`&3IBzv@ICE24zA=#t(6M$ro z7KLPw-O>sqdsJ#A*`rb+*`q}_OZI3{NcLz^NcL!cD3I(?DakxP*`rb+*`v~CAlakR z{y?%vr9!eti~RtyCs{i3a3JC1S=tv!_^4D!_^9*{AmO9MK0v}pzrBEjk4lAvj~4d^ z5cQ1VRQIZGtS+m1v+MrgZ@vVxH z6Y z;F*C-v+A-)yx0I_)n$=+kq7%N&8o`@AIPf9Df(g!m8`m~hA;Azzol7qSqfgPD6Cw{ zs_XKTLKa=tl|U9<7O592*d>cDXLTTpE(^wbo&~rxi!Q6wdY%%vG>h&~fM)?N&7#Zd z5y+y;`5wrk%SsT)qRSewo~HyZ&7#YBm`WC1R<=~K=(5NJvgmTYuYZeuvgoob1hVLI zhOXyff=jdLvaYP>nS)ES=(2tVSakEmuRvB^*4Fhrb8u-^T~?3vJXvsQR$Z2#^*ldt zX;xj9lJz_paA{UuR*&_YfULT#5$iVqS#?>zvRPJL7TWbMP|2#>+67s4hXK!1$*Oxo z7i86?4c4!rl2w;(S^q4MRhK?m{}hl_m)1!ot1jIV$f`?&WV5Wgv`*eZR$aPf{bL*; zt1jKL{&66yF5MEys!O-5f0PDc)wMygOBP)kB#=dyHd?=m{j=!OErBe$bj$ijsbtZ$ zTOJ0o=-Mq00aN|xz!<^SnG9Sa*ezBr7VH))7YTOD zBw(~)w@d^^2{y=hV5DH{i~}wd>=xky!EQMp_@m`UoDL*>Y>+k};bT(`2NFJZi?3NROgpb`KBz)`^A>m_#oCG9%Y>*RxgpYkBBz)|aRv_VHgA4`|KK6u=@Uf3t zfP{|?A|!n5qh?@h_zVCNKDLgqHGKL32_L(qFOcxjRc~Nx_#6%-eC!rCOZX_e50LP& zb=)W6W9#$+5 z=$3UGfP@cywC*J!;lrx4?qwk1L${=o@S$7Qy+9@5LmLDVK9~meCUZl!iS~`Bz$O)?33`Jsn$JLSot%;$8O11$sQUcK=!03);-6O6F&5jALnNY z9~xxc(?G(9K3ew#kno{f0;TW?l)@*F@S#Bh2_Jf5-Qye};X}8qdlX3c&{XRl0TMoR zODYK;x@FyCR1!WkNH$CO&>(??4}BCUh0nT&*{2jf>mC9UK6cAWpcFpqmH`PLyG2O& z*c0~y2_GURknpi}7E?+1kT>h@0}?)V%OW7*V}l3@AI;wbBz)|Nb|B$n>)Z__d~6*d z;bTwC2NFJZ%bh^N#|9A+KFXetU&1GTEhKyFk9k0{$2MY8`B}0@^KO>xv8UWD*<%~I zS+b`RxC0=2GApH$@UcPeqEZT_h{qt#zl<_8gFgtC*4TmMA;-`3w> zziZF`JFTv@?wGnhb$is+6nFjke}7b%TDY`ue&I`nlL~`&@%ev`)vTzwuja=!x7Gad zE5m13lO01_hy~1XhlsFG=dJV{= zL|UbiNr_eFrkAN?QsPv;=_MeO5(`TznUq+jZhEP(;x|l6E(JGjVyg^FEHXE}0Ax^N z{krLSAcGQ1K_G(?OV&-#QOTghYIxIAKn5kw*FXj(PU}DhCDx*wo@BGqpcH6!#b99y z9NU#IfdK-Ma?@k%bBw@JALuWjG;p+l#hX^KSw8{4H$4IzC7?8Lq@cxzsT?8TH;_R| zrB)b}^0!GKladx!Qpu#GUm=r{N*@F=DXH{+Ad`~fgiJ~*T?}MWQucj7CM7KjnUu81 z?;*d*q@?V2Ad`|x?*TF?Y0=FxDe3nvAd`|x+fmA-6s7K;K}n?xfecDooDXDB((fHW z1|^jW8I%-v8_?75L%+8IJp^3|O@gw8Mu89rGziMRg-X3Zj0NfhE#63_DCk!x2r3n7 z1(nVQGAL30f{K}n?ogHrx3&SsgE^gD@4CM8`7nUwT95y+&Z(g}qX&oU{+)dUI| zl$1Cg$e?5wTnuDT(&88(gOcJ$1CxCNDs{6f1TFGI$+MFL{qjS}vzH4h6($N=JQw(u zpx<+V34#`_Tqfw(%6LJgX9JfCDm@Fxprq0>fDB416*4HPRLG#D(l#K2lH!C6O8OlR zWKdGvsXzuLl?oY@G=DOXK}n@nGAOC^L?DBbN`(wcS{w>wQ1XluGAJp#1<0VJQXzwq zvIhVRO1X@aN+u=!4nQ1}QpCAc1|^O52Qnz>+DfuVrTu_pj~0&vl0Ay+3nY7#eIStR z(XWu~QRyK-vPX-(fn<*sdjZKF#R8)d-N+LdsHeUdsMn7knBlqhEpS$rYkN!biUqR1!WaEdvrhDisnw zSe)}7knq9poOghP4`j$wlI%fgAlZY(IZshZ_FyrP>_PUNr>P`+P?}1z z2c>~z4@&1e!Dh)Gl+Jk^NcNy~&SOBb2c-eBCrSeeAH>ahgv}B@_zfg{@Eb_@sPthr zOZcd?14#I&R7m)!^Z~>XJ`wjIg=CL<7X!&2#R^_^6b~eJ0_f(iw#n&k#PbIE_NGN4-}8$sYAg1(H1~ zodP6#R4OEUG(QPQ_9$*LknB;Mn8_^4D!_^4D!_-JuBknmBQknmBqknqv(NkGC!izfpKAN}$l z7d}JyL@Dw6OtMFd!+>Oueuo0d9+eITl07OFl0AxZvt*A-TYzMbu3A3g@Bew9!r%WJ z8lP$WD(!c-PDnGL`fB$#fmHC55 zbi6sd*l}0p51y*=W*d=8fAENnH-`e5KX~FtAoB;0*vMwgA9=7>AOi@`!N_JAKzQ24 zoBcUJ1`wXN@n%0D0|?J7NhJdaPbPWuNGcgXcoxW;hX5Hscr3@8eG46TF@SJZ@_$pv z{J~R3-s}Tp{@@WEZypGA%^#hR`GaR~yxE&d<_{h$lFc%I@GOx)<_{ii@@6kK%lyGp zSKizk$o#<*L*CpI$o#=mbpn|`c(zI)^9K)231t4@5iEhsA3P-F&7K?}^9N5|31t3I zToaYdA1bW_GJj~X0A&8qd=-%SL#0CI50wg;KeSi|Wd6YKmUn>6A3U>U%X>iP5B#RW z{NWFXKiTpwl?)*GO(g>e7Pq`jB?Aa;u;ncv0|-jDya8kY!D1i-2!6M`MkNCXO1Hd@ zI0g{KZFz-4<`0Z+c^Sz3f$J@sfXp8#-SQHU`GaT0q>}jqSAonQSQLJo`2+J?HUODF zu(;&~AoB<2w>%GI{y^!LH9+PMEN*!Y$ozrdK;{oD1~Px(H<0-QrGd;JSlse72gv+^ z-z`r9nLkjPO6CugZh3-A<`0x^c^t_6fyFJ40hvFrxaCnG^9QoGJOX6?KxrWJhZY~E zlKDe%D*@&YuU7wL%Q7GXh<-bO3?M4Ck^w}eLIx0(-VbB|QRxFf1`w4BT?0txW*I>A zdtagB#|$7*x`?eZf2i~xAoGV7g|7MICtKQq%pY15GJj}M$oyd&ECe!tsPrx%^M^|3 z1DQXxcn6UAL%;KY%pWQhGJhye$o!#SA@hfRh0Gr+6*7OQ^fn;#hZb)KGJk0CW+3y2 zvgZJqKU6AY{!r-+K;{pX3YkB&I19-9q2KF(%pWSXlKDfWGXUm~PNmlX89-DjbPXUs z*)k2t0HR+j89=lsWB}2kkO4&5lYtB%o|snwpYwH8IvJ%Wb}4nM&sxypL?GFt-w8mn z#}iXX_NY`y_NY`y_GoboknGX#Xdv06QX$!+(hGoOj~34dl08}!l0AwOl0AwOl0Eu8 z4@mad6GE~_i*AGC z01`eb6%syL6cRp~uK^N1DlGsBA1zh@2_OBI6+0Ftd{inVeAFW(eDJ&ZJs{zO-_7p= z2_M95ejiBqAUl_Ob-O+c~-zu7F= zgWo{12c>~z4@v{c9+Yl=fdeFau(4J3T97)baad-FqVmhe&B!$87E zzg7}H`dtYmd{nv&i-b=sT1fV&_W>Z;qs3)FvPZuU0?8gN3dtVD3CSLn3dtVLF9wo5 zDixAFD!ms-_Ner3Alak1b|BfKQc`wdvPX*xfn<*sg=CN7gk+COg=CKw=L5+eyX8(G z*`rb+*`w0ifn<+Lg=CLPZv)7lPNhP^M~k-r2_O9m2_Kct0TMncoed;>RC)uD@X?}> z@X@cEC496v3rP5A@j6@)K5=y&g=CLLrvu3zyFf_xsCOEW?9rl?WRK#kBztrvBzyFG z4Up_n>9mjh`~OdR%;@p$9%DY?@Bf|m|9`^Y|8xKUC;k0@_^0ywzyJQ&HSaYb!NIAMN`iwkER_TYYstJ<*(|}q zNj2{!Ai=@O8%S`l$^;S|oI8O82j|YbP3)84V9A-cp|E^8!Qok%LUMysCy?A=Et&NN|uM^OgY#4wZHQ2@YjH03>MEBgY3C)v01_gSAm2Ne&@bHCED<@YCE0`0K(YsMfn*O#=f1*b$sR1ueHlphU_OxSLFwF0RFXYd3?zH-J9j;m zWDiPHN%o*Lm1GY}=f1#Z$sUx>eHKXepmgrjK(YsmbDsi|J@}pb1d!}O>D(uQWDiPH zN%o*LknBO}+(+3g*`uq60kS9OVj$sz?70t7N%&~d%@RI}6B0g(TL~n5IJ4(20}?*U zeh^6bXwgc-N52mM2_MBhh%3S;uG}TrqbniVqfvKB_9$LR_Sh2l0m&XM3dtV*3dtUo zE(Vf4D!ms-_Neq8Alai*A=#tSyMbhn;@W{^kAAHrd$hO^NcJduK9KBDsgUeZ>Fq$W zN2Rv`$sU#73M6~9cngs1QJj$MQR&S9*^`xf?hQb~N2Nl-N2RlXgpcB80|_5b+3SIX zj~3l5;iJVFK*C4!(}9GKO0NMDK3cSr@KM|}#1TFbH;qEFM{z>3$1a!(BzqJ;1xWU& z^eQ0Pqf$3Z_UKAT_Goc3knBn>3Kl1N2TWi$sU!S10;L2C?tFIdp3~lQR!I#*^~I3 zdwOyC(u9v^_HZEKqtZ4Y;iFO^;iE+%;iKPEfrO7rPXZD?iW3q(iaW8ed@11*aVJtp z_9(s;NcL#aO0vf;7z!kN6gLb=_UKAT_9(jrNcO1IeUd$zZw8V*igUAMkA8(@kAC|D z$sUys_yd3c|G)Cz|Np=7`~N+KKP!Cl-~Tt&{HEsrjsO1tlFD-{ck;jg@0gYB|{Az%dbeYlASD#Ylj2LPL&GDPL-YnBs*1lGLY{Q&5K(bS%Lb6lYhXct@U0F$X>bEaI zc6N$$vxKLztt32^eF%{7RB0a|;i=LC5l47NoP}hkMh^s%om%V-Bs&$qFOcliRWBgf zsU9KOsb4osc4}Tob}G)zlAW606G(Ovq-*yElAS8;2_!pJ$`41glAS6o0Lf03)&a>* zm6id?PL);w$xg(rc^61_qIAvMK(Z6rfn+BZh3_Xj@w_llQ$xf86d5uc46Qyfj1(KauOoi->xHYd(Nq8cA&C5W-6Tg9kCra16 zL?z*g(m=u!rE4}7I=)YMYB7amCwkXxV3%YkO4qChlAS0`CE1C^RFa+O2_!qQxaN8G znc(}xV&F0X*@5u_;?}HTvr7dUWX*HHI03(Fo(0AVC|$!(O5YzNpmYttB7Of70gHi) z1^ljgoXSN4O4mFBj22M3W)(0>Q0Yowq@dCVfeQtdJ^)-GsB{_dO+kyo`GVr^2fiUF zdoggHpx^s|uM1kVa;~6X;cJ2xg>wYvsWpp$uL{b(7dTtc;yu7u1TD4$X9>y{zAUJ; z9gBodEV@gwN4<9g$sU#71tfd4XeHUBMJvf3WiJGhJu0=5>`~l&AlakeJAq`6euZR@ zO6LK|9+ln(BzsgUBzsgUBzv@YE0FBb@6AB6N2POsWRFT`0m&YfUJoRDR5}Al_ULLl zknGXoG$7fd?5luekFuu%WKX9nA>pH6A>pGdA>pI!NkGC!rBi@}j}|8b2_M^F0+8@g z=|mvmqtXeuB7EY?Lb6A_>=q#5V;c+x5bw424qu%~NvPY#>l07OFl0AxZvt*CrtR#E% zdnAzT(Y%oC(W09rd-QuaknB-u-(tu0$sUzbxjxyW#Xdl?N54X{N2R@iWRI?T0m&XM z?h7P)^xG3i_Goc;AlYLZSV{J%R7m!yv;ZV~6juc#dsJEhBzu%?h3v^%yZU_~;lsMQ z`aK}wgVI342c@gup_1@H-0F9MgbzwrzXc?Gu(X)e`d$72A6Oin|Zy?!&($(v!BzsUANcNy~_48DcJy=}* zERgKM@9L+3WDgcsKMf>%@Voj+AlZY`)sF$m9+U=>Jt$qhiVE42lno?&wD>TUgb$}| zAmO7@D+wPhJ_ICu^xFX>e6;u=;s~FJTSg(-qw5ENWRH3m1IZqh-VY>uwCHBZ9xYl) z_9)wZl0E9NlI+pqeL%8Di}!W@{ok*w$D2J~?yyJR&1zv<_|sp@5U^K z+(6aAQ!H-GV#tjz9XzYz#w>>1YLZG8L++1BC5s`q(FC#>a(_$*PrkS@iy=3mq>{yu z8&^7bq{WR{47m%Y<5nPxAvX-AlEskwiUL^-xko6QWijL?qX3Ix9#GXWhXZ6a}eqLS5+n`*LIRzq$W3S>3pUZjp0Y?jrK`!>7DMit>KG4XG34H?j*EdThTQ*@&9WGB!%)W1$Jki}5h7XVod?Fk`^p?*gKSqyChD_IO}0}qhJ zP`~E^EQYzcI*`@SHaLe$Rzn-)Tp+8VvW2XMwt<^vHRLv@jx&L*hWb4N$ZBXC3g9OdHON*fS{=h&%+5LcK!8SM?I95>hk-z{!*;bAbl-(ETFW4Z5 z07nZdb+dkg=H2Wl!Jg;?94Xia!V!W>J;33D<_`o86ErXM6_hO;Dk!@*aEM^*^a2hR zJejTZ5o`nDAVI%wcA#Jz>u%*PWG{ais1;DU{1u=^ph1?u z1XK&OK{l%rkey1UfYMYd1R7-ddiE(7XoKY&fHDEu!VhN($PUa9uo(EBK(}~+A5Ir& zgH*mN;5RT$peM4~wF0sO*9bJo^5;3g)dJ?1uK^N1m`^3)gZWevKA2zrG@B)SFu(j+ zAmM}gyGLY<1sg-1p4Kfi(_Go?*knGW~knFKR#skS7WlsQ-J<7I{ z?6E-vvZqtFknqv3knqvsI3VF;8;k)GKAIOw;j{c=AmL*hSV{Qk*Gj_2HW&?*!e{vf zK*C4!BY}jE=B*@rG;by0qiib)AKTzOAmO8VD+wRXp9>^>G=CP5@X`F4K*C4aLc+&3 zXaf>H`V|sBwtbJoA8P3;S`cR%03xL_Sh1wK(a^kCjiMF%?}2WJ(?%lf0*o1 zwv}X$ZD1wYqhBG}qxk_qvd5n24M0m&ZB2a-LQ zU&f$tL$U|+%iaKzJy;ARduqBM*+UyFd!5b5o@8kt;X_X>dyPuMht^s4Dvk-canG$HpR5B&dtbt4koT4KhWwT5PoVri1W&t}ohgBnH;^fT^*E3zfyHRV zd^XFJz=|1-fVg64U^&FoAGS`;!R=$EJ6%+8dc z(iuRe1eHz$G9{?=8X!}GN~Z#u5)>z7N>C|}u9=-FL5n<-W_G3o%}+ucQ$obKRfYtX z{Sgy^3<-)8G9;)}$dF(ci~}+xkb@(}0~r#uC@>`C&$DcnDM6)UsANh|sgNl_r9!3z zEee?u^g9~Jl%TkgK&Ax637Hb~%j0rpXG+kbl}rg*JRiuEpvCimObIr~xj?1_mGXp~ z*_jfw$kT3SXG+lT=|H9gm9_zy5>zT=O3>nPAX9>VPX#h1sFVlX%+8dc(i4D82`W7i z$dsVcRv=S?N{0fO5>z@2$dsVc7Q`_nL>v#enVlg)SIt0%1YH9^$dI7x0YHWX{R$Zp zR4QahP@Iq)CwnG#fb2#_g3 zr9!3zl?s^>v?yds(C>jjrUaGt1~Mh6v=@*mL8W^FnG#gGJCG?sr9!3zl{NsG5>#3T zWJ*w}kSRf>1t3#`N-Kb|eo~c|0b>L$TDe5PZ`*so#R5tL7YSGlj27_Q_D*5N4@Pxb zYPVQAze- zvF%kL*@K=`l0BT5ZLd&C_TV>=>_KTD*@L*Ym)R`YLxZ$!0+KygOeNWa#XzzL^KCD& zS+WPEZ5x1O4@%qC1IZqgw!Hu(dr;c;ERgI$Y1`94vInJY&jDmlE_k&)2_$?_+V%vH z@Ih%H;e*n)$EhTI5ZCq?knq88+rvP@2fu9(0SO{01mK(a@rR+2p`oev~? z6n6(e_T-{p+pR#tN7*+62_MeVwp)ONk4mj1d{inNBJNgK8iaFNcgDqOd#Q- z`7?lok4mj1d{inVd{o*7BzzQiGLZ05&q+YSN7+0%ZWiGaR~C{z8a)w6_Sgj{0LdQ3 z6Th>PJz8|LWRHHWBzsgk3`q89QAqaam&l%#>``e8knB;MknB;9knGWjknB-*Gmz}D z4TNNmeg^=_9+e8o9@{`j_NY`y_NcTUknB+@VLU6@qeaqu)~J%jLx6;j7KMb5<_XqW z2_MhJJ%NOeetQB5AC>M7Bz$xwBz*MiW(gma3JD)&*8vG1l{NqgA1zh^2_OAdVUh5O zMGMIuEtUbv9$cUH9+2!&oRwq`;!b-PNcQ0Ow0D4H59U)z_Mr5%cm4anXT{Ku^ZWna zJ&H~5HT_G|rl#LCJ=V0M>At2PH{I6s$4%3kE^iv$^wp-}O~*I&Z#t-H_onK`e{X!P z@x{ic8$0j+pWpbWjk6lBZk*6~VdGhir!)?2JgTvGV~@s)hJS5%rQx>?Pd5Br!vhU} z*>Fe0O%2yIT-h+L;TsKSG<>e1rQxuKeH-fQ->=_X|5E*$`d`&QRR7cZ?*IPZvGs@4 z?^R!@`;WTU>o(RsTlb5)j=I09TUhts>t@$oTQ{+8RNdKiU#J^acXZu>b-UG775}aH zYH?lhAB(GsON;jw|Ge1!-~Zdc*iCl&K6{u3aIH@;P0Hu{^Qx%Yvh&4BrtVEybIzUz;R=gY_E79@e z7H#D6<%+CCEFK%*1F{ma#%$#3;|f-y{7$-&%a<#%6tOg?lBI}sZ6nthS7a#~)&*IL zXpoIumt2vhh($Y)rHF3HK3R(BmcZ#<-LjF3lq*IEbj!wt&t{(!=!sNL6zHSCX9Zek z;|pwdff6!R&L8U>|va0|gu89^e4M)@cWN3pR+bzhF4FE?_Ugc3TMSDcA@L_X^MTz2`^ZX9!3N>i%oRNZ z8)P2PB-j&H8U?$>N`qjB-A1?6S7ilBq0WNc;#Nh$2Du$52)52`K&@bd+yc}Hw$5yz zTCiK@09AtBawAYF*b_GZ6@oo+Gf*zr6W0S}f=zW@ab?F$!3Gg#2zJ;s;Cq4%G8LFE z*gC>@1sh}vFip_>WZ+ss^OJytk4-fJNch+-RuVoo)kGlSV^g_V!pCm0lJKz&gi`oq zvxJYWGoDH*d;$p{+rUb~#|9Y(Bz$b0F+jq{1`)pHySBrGgpUm(Bz$a;i-ClXeKZ3>s$aNd~BWb3oAPaA5$fTWRE@JR>>aQ=zM_e>1+@o;bTvo z4J3T*mUDqp_@t8Xu|dwFlJK!X&IA%ZHpm%3!pEjM8A$lpAg2NeA6v%*Bz$ZTH%s`~ zIwt}NAG>8JknpivgoKX`G8jns*g8VO$8Ko>5<9H!pA-m5=yS)_}E8Q5|v0M5ATf@gn!pGL>10;NGkV9w#!Y6HDA=zUaxl6Lg&N&cB_SiYS0kWra z1#zE*k1L3qC46ihH%s`~Ao~IdA6sX4U~Bm732Y4?VQcufS;EI|=?Nr!Y>*lt;bVii z+0nio8>9+I_}ElsK*EP^+3+5a@S#CAyaObBXq^pj0SOR2yDl zvxE=rmP*2h4%_fDl~VYmlJKEhvQH^|0tp{_FZ(2XXplg{hc*b5!e_%v96I4cQ*GEp zgAhJ8ND9dw)`>u}ho0K7o?VhXbjyYfK(dFP*suv8dy-e#Ea5|krIPTWTT&^7&xYsO zC*i{ivSAI7@L>hn@EnlvA(l2g3nYAKstr#8rSM55;X}7b=+rp z!iR3zunb7}*exAEDSQG69~;EY5Fy^OfJJ9AEj(%KujRROQbrAFTXeRR>n>R#jE`Z&kyp zMpd0%^;cC3tNwe{>|%Z4Zwglw_N;xh_L|y$H80fMTys+KmEs-6GwSBoomF2`e_H+j zsDGp3#Ks|w|JZbSkF`}3tB$UEz50aebE|(^(@->XH`WqSsHncZ3HGY|^2g93g*sa#k2YSkC2I;yU%E>z!G{rj3hHGfolK<#n0 zKPY^ru()_w@h|I6sr%FVW9rXo=-cq4hUXhkZd}jRhZRll_4wP$>njIWJzMo3)rVA% zsGeLsw|Y(WLp7Jy{6oz>wUxD})-I@hrf_@V{o-}S2kIu&y;eV|{;wNmHay(8f8+NX z|4-$am3LPCqH1IHvDM$J{#Erq)$CXErJ6@--md*h?X9)%76ugB3eyXli&qwJs_RjA zb=|+$f46$C>PxEcuHI5}c+L4We^&Fe+Mcz`YyWTI;KC0Jj~82tt3vH zt^Zy9%KHDT{Z{Rw+6{$^3#*HtD}JN+WL-t^U+ad}EvxTSe^LE&4f`}qX*jQ8PQ$Mo z-fFz6aaH4=H@?#}y6(cdpVaSBe^>o48|oUq*f6$XNyGncEN?ur@q)%%8t>)G%U8J$ z^W&yXjh8hpZK~!v%pY@o#_Kfy(slO+S8uwW==k*>_g4-s{jXxc$Ne9F|Cd#)F3WPz zXWW7p&ZyX2mc_PL7i2*@6gacketRl=18o&Q?A&KRU{b~6vLwm=;}*PlVzGT*0=PHO zN+k#2XfO8U09l5qyl_(GkIMepm4?d3vw#-_E7w)L)VU8wdto|nC+|%-fkS6F;6-0N zx$?ZSOWntJ&>uKoI1FH`3?#nhSrih+yy+KD2l77oIDxGn^kyo>_P@)x(|g>)J^K~g z|0;3F8+x};Z2v`)iOT+?i|zMiNwV@Nn`M*}W&;^Rgf@no^)39zDj=ha`^*B8!NTxjyH^1+rKP_ZQp$I^P1D{U@L2 zuQQW)=!b#Cu5dk&ED=sFws-z>$sC}129+#u9^j;6`%1E;^L4fq+ZQKxt#Gu(ks@5j z0TMGF0QoCRAG>i%vHhos3^sdzCHrKx6L_7)nI;AHS)38cqrJ}oO5b&33t!bYyWYY6 z>-k2rkn%cvj;E6K7U>kC-z}|;*w9-51{Q{NB(%bP} zf3*t^=*`i--UWx8Q*8g6(s$6*%%RigyiUzZ_DOyK2aIH&E+q>Oxs`oN@49Jnv3*H- z*U`#bi|xNmaJ$d^V*9T%6Zo#5=IwNyB@6c+$Ln-yTv+oSN6QGyW=)HW?e|~Sb+oc~ zIY8-k4&9vtkyX2j0n{OW)f*cNg3Lu_Wt=cX^|w zqaFGbN9(FA_&t?XUCZjieO_Xp%)PvWBYB-CORv+nXR-b9uH|XrfiD!>JD=a=8|~n1 z>^k&<-vdu}EyWA_vamm%;grn|>czV*`RQ>Vm4RI!`=IkVTIOqy_Ac)rf3Wxtrg7-6 zb#Auc_tV*@^hOW5gV*^?*8%$8%tyGS3-;~H(MlasXyrvqoAr2|qjgml{Qd+EP-^nN zPx7KAb4PY?fOEQzR=9>2EgkxxHN4JuORqDAqji0r1@FJdKAEL>*9Cg#q0*sy4&Zf4 zC&pn-yiV!FIPx9Nh10u^Rt`L!!IuLZHLTeF52Y46>$Aj@D8-8Xw`I(u?+-#6HKA_SwXt2Xw(4KxKDYh>!os9+F&XQiGqfvSK z%cafU28NYj8SkKU=sve|=;2+J!`|m;rPHi9jD1RHW51!r_P?#{+N|e&yiNveK6b@b z#rEHndUOD1$={cbw%;MV&KJ7&>GK?iE}e}<_W9e=8}0czM;qIjI#XZG%@^m~B!RyrGZ>(A-jqx7OHIl!@{1H8>H+UGJyu ztGf0%_*~v~>8vkufCol&RVs(_c1p|o0KSk%ck8O`hx(_wa(m$swEuHo>8cz%fEPWj z3yvPlX88-57d@Q5e&FKLq50mPDuvz=(>cI|(g7xMfYMiW^i_PGl7-zC@kUEud>!xY zfl@11^6jiH^}(@h*7+|E@}fucu~(OR=h)Xcbm==dntdMa*Y%>kXo}8%-I0Cz59UQn zjkFv4baahH3+twGw4q)5H23EKr<4wW)6Rd1(*v;C!zFXOv)SrWE;LVMvkSWR>3=_! z(#LMTm)9wsb9KJAQit?fSZrTY`f$xmX+JBSr$I$U>N+<0=MuN4aeFhOZo&U5j zM?0p4_tw8_pQ^#Uw^ASMzKBVvG^Op|hkZU@I`raV`}3vBpu719rB1B(03*9L+x;~* zE4`gTFY|UvOTa(|jLxgQyo36wR7xGvawM-)YO!P9;Juw%dT(sDcAqY2;Uhf%^)48E z9+PUxT>S%VR{DBd+S%-i(q{8`Z>2`sqkpmex22VD$lgF{?H&9a2Pl09ExhaBmKM7q z=Q1ajPNqHhu3tE=>(E1Q14`zGo&%KB58aaklosM4&jO`$ZV3By{=njQfYWuQk8s>A z93WR9s2q0|Q2Kh0+Z`x59r`o}D812!!9AYn{L^MX{wkPPg8doY`K0SgOZ0J1@exW& z_E^;8<<7r=4rL!Y%-k;L_|ED${ z*Z9fq|DRX?C-pPxzg<73{_FLp*YE26|4$eHzPPOTlj8j1pB85ouP#m~URd1u`~Mqi ze_y+$_Md9k)c&gWq1vC;-d#Jl_Qu-p)lROxq;_ZS|3AK_f6YNPyVq1#zf=8xs@GTl zWA&=)rPcRV|9SN-)!+Y^_y1p4b!FAKs&7=CQT4g1ma4<5_N}U~e7|yYTD<7}? zo65zNe^GgR_mGfkhC5b|=QG_5fV3E9a3VOA>xu)+^_cB};N9 zbJaAE$mW`5InOUya)kSEy}bNs;BbK}t>sSu8Sc4!AIQ+nb@_50X0qf^H{%LuInOUy zk`bQElz~h)To){Vgi2OTl%{f!`>2#hmMl3?&>{~rS(4>YzdWX7NpCAEeGu4RP@Ire zMx{KNWJw}h*^7XE-AtuCnPf>8el0FW91CT{S;!QoYj;V;s#n;<{k16UF6j4OAZxfv z+kxbm7KI*erbVGiQ1)FwqoC4-K!c!Cp7780pwioc zYC)w!rg1F_i4^_b0#vw}7HrrVEO* zlKD*8Gk|GU^ebE|C~g{%Bvt7(z|~f?C?rKRe--c@D~g+1=(vAsRj0VA6t1+O-YLKo zL5q`sZwq$8L}0R@#mT@Gf_~j>lAuyIyIfG|1Yn||QX%21QXzwzO2+_~xtSI(2F45e z6)qJNCnS9JD`c$IuQ0~VR5}v4L{O=aiCLxR0T)@(;`zX6LBCc;30gc07%AxYOyEL6 zrDp({Jyj}v(~9ESfb#{Fo(g1a(xR2~tZ4ou;Ol})PXNvpR4RN;Q0a-lIf53gd{xkI zD{!`;MIjT6eutv;tS+U)D16ziR5}>Q^sG4HOIGyT44ffoQTU>u?Eb*%f))n=BLw{l zZGsks3_bc4hFekT;lLLJmG%XaJ&F^OJ&F^OJ<2`=NcJe(O0q|#eSl<-N`+*P77qlH zJ^JkhBzsi4FOcj}>Fz+XM{!L+vPY!?+0!Yz0Z8~LPDuFZw+=}7=(h?;_@K1xeIVhZ zxC$WQqqs64;e+h5_ke^CvI7Yplm-$$C@p&*i-eCWY6|^*Yv?U|oBfkLC=DcguvkXo z-kizHsPt|i*`rb+*`rc7OZKRAK0x+l;VrupNcgDqb|B%SxZ8k)52tL|tw6#@zc&L3 zA1w+AAN}44BzzQi1Ca31ua$(4ey;}-K3bez==dq&6IZh+Bzu&29gyr%{B$7Mqw8rv zvPY%Y0LdQ3xmmJDac-9EQMQ{UdlY9S*`q5V*`wd9fMkzKg=CKnA|!iMN=*MW*`vjY zK(a@R6M$ro7KLPw=Enoc9+g^2_NY`y_Ndg&l0AyElI+p%I3U@hUm@9}($N6f)2VbM zknmCIc|gKPr9#3-rRM-=xQ|ND1QI?f6%syLJOfDhXwgc-N7<(X2_G%CVUh5O#Wo7b z9$lXdBzsgUBztsq5|HfC)rml|N7=1FvPV}|l0CW-l07PQvt*AwF$_rd*b_s6WRFU% zBzsgUBzsiqX2~9v4hE7vDjfhMdsNyVNcJdBNcN~_Kx6r`vV+PemsK86KDo!z9+UXh zcx+Se#%CIDZ2Ww~I}O9?|E0dY{=)h_>wZ;teckcJH;R8*99i6}@I>MJh1S~5wfEGH zs@=Qh*E{-O`Q+~Z*7cI8DEPaHd@rMYGBG0n#vGjLc-OY4x9)Ps}!7ZP^$})yUtYVR z^dY|RPcsVnzmF(Xe9RBT+we0T_u&sTv~q0u*s}7^`hIFpz2uC`CVlJF%dWg+{6$kP z9s9LOmrdRF-3;Rp%|lw72m5x}^XRhje3IG^-u_2_lSddUZvC`npWWG)-MaG^{^{bKmNlex;Goul+sbPAqss9+E1lyEY#lOi z8|h_b4PV{aT{`xRfoETS<%fFM zmT7GnXqTM$yQ}#sa{lz~?6-3}_c`Z^E6%v$>fu*R`SRqkQ!bi%*%gy^e1Ji}yNUx0 z$!mHB4xcji+us>G>5^+XK-*=Pj^FWKt-t#Yd!$NXTgn&0m9$NbRF^LO|$Teh`1m^Gwz;4r_&hIKXH`k3!> z+r5VD+`HUn=jwM#J9jqF*<&YObnPiud}rdAGq0F>^4L=*UUB6%t1mkbV&&_6ztt;B zJO6<;82-P@5WX{MaXcs4pyOHQKYV`lX&L_V%w0JUVKHR;19dI;A3MMDj#$06SwVb9 z-`j5c8b>}z-7K+Vmp zwA&x(nw>sSv)#Jwy6;DG)!ey;7`+JUzJXifiC_VGu%^%JC3A^zAnGA*@$J$ zTX>D#g#)!5-#WP4cQj^K4#an~UBL6V=FW6o=U-rh>^k<`$*%j*&ck26Xcyi;3&P-T z2{n4x4m5DP^Y|lv|NnHJ|Mzs`qm9cO7d0+uytVNMjn_1Ot8rxGR~mQr_y14h-~an+ z-SE2Bx?}44)a_AMQ~dYhYsD9fyY~D4)WW5O^9x@poKzT8IJ~f5VOM_tU-AFb=l`wB zr86!f&Ez2=t8(d#%UA&}o#kiKnLIIMRj!?JT`-VqXIzDv$rD3X<=Pn+s{*-p#wE6y zJPKr0uAOm7DwSM2<7(GT9xSpd*Uq@6HFGeKYiC?O4CLAwmk($1^p91!cE(l4K(3u} z&2r|ERC4W%3u%E|JLAG)AlJ^g-Zqoxf~?B5Gp?$ol51yNat!3!8J7=d@{o{Kxpu|{ zyP3TTEBudhy<#}?KnnTUhRcsLdjkXgKDbIblShfH%Fi}ji=4SHke_Y1PCAq4imWRA zY%_CjfS+yhE7D9JC9 z5dzmNXV$RU;R4r51BVG(r1@;#(KVu7(UIG?pyaDVdU@@?-fVdg2QrSm9=?tE} zwQ6qxJ*n&^pfs?jfW;ZFuvvb$!S9R>Kz_Hu;*6IOw_B&U8Jj5NXB))LSP$f98^q0c z0m#obhzsOr8^q68L#4r&X#t)G^0N&WkyGJkoBZ@V<5?>C-3E&@o&yS2xbQsVX`oiX z;*6(&8Uc$lo&>4|EC#9s%+Gj?N~M6(K!t$P8IMva7f?Fm5ui*!sqpief=V9(W(Zn* z82Fx`Un|oEm97N7E2vbMCaAOnxK>c1T#zU^kZx);drHkxk-^1F?G?=7tOIltR@`lXPcZFIemttPs^;)MKcqhBFE z+vs;bz|S_F7ViYc3tAK|6_kA&Fiz0o9l%(D^EZ_-f)?HE59tk9SR5}_+_GnQ^_IQ@MS+YlqLb6A3 z=K;wcWuFBkd$f2iknBUrB*)cSD?}}fMkzKg=CLP+kj+`u7qTdN{0izVAKB{Nl_{%rFv!fe>PdA%qZO4Kb7uLI@#*z%Wb*83-{1W+r5q5JCt6Vqn&? zK3oDbU|mbN*6XE&SgYV#1FqMwEJf;7Lt&uSb*-hA^;+vvuh+F+yU*wAK#Vnyrizb! z+7KOCO=fq?n?NO;fdx}bh#7Cu*fW$|o z6M@7>r9$GP(yM^PM~f4H#7DnQ5+7ZS2NECsjsp@OPw6-;5}#Nc%OLI1^(Y|iQQQ?k z+N0mgfwV`zPSPHgI!SvJC!{?p9SNj8${r4+Jz8{<_ULy6koKsw5g6uw94!t3(jLVL zX^%<=0cnrsYk;&zi*-QSqhBX!j~0crN554-+N06}koKrlNPART2BbYI6=+ZKV3q)h zj|Wpoe6-jPNPMuk{#79H;c2k`6(I3JX(ove7BfkF@VovcE=zn+y8cBV@j+=I@j>bO zb4(H+l&*gsrNl?28KgZ}T>mUrr9J3be-=o45V!tmAnieECTS0{*Pp38cqr|`m6sh# zdw7DZe-cQ0@SDrh9xSeZib>jo?DbCoX%9;Cn6w9_nWQ}^4WvCNUEjxJ(jF|XC#;9k z9{jF<2uORdm`U1$-%QdTEUrJsWoZw718EOR18EOR*B{|B+LK)yNPIY$>kl(Yd{7!l zd{Dan5R=45r4Im!j~0c*N52Pv#7Cv~1Bs7Hog_Y56cQi(-di|$i1N59ttX^$3f0MZ`C32BeAy^QuG zxq-w-rJI=~KAh4(;-k{*m?S!u7B;zwSUh$ z1#bTh-`)GS{rt;*{$0Nx*KDk5tNBXJteQ{NTK z-VQF~7G>~(^-`?z9!X)Q_zge0|&H;bpGmvw@p8^f!9Po!Y133r$ zz0KYQe1Y79@s~+^n@d}Y|2q6B(BAn>au3EI-|TGx&fkOmtamn$docczXYVW^_h9^q z&EA=%>x;i{!(adGoyjEkVEkRsK<>f#0gGL=r`3ygH4(yM^ngQ;{pFv5vSg?9@o9ar{n@e63t z$uKAS9S1ZDDjfq16%;oL7$T^21d#tZiW?3LcA~41K<>fx>m>JJDiv}M<`bl`ys`Li zptwdRxd+qlU?BHkS`=~*rtAhF_h9_h)ZTg^_h2f$r2NybS#*+nFfCpJ-hH z{zJ7`!zA}$`W12yrqTjX@PCg=3+2D;m#2bw zi|Mxn$UPW;a=5poqQ3aWw8)Vy{>}h?dtL!@4~Ej77lHMD0hIQ<0IU;G+Veui_Tm@7 zVlG?j1iwA!xa|7^N&{;Il=eKwB==w_?KunN9t?3kXMo&;p|s}-AopO%4t&QifW<)W z!SLJjc*Rr2e*-M`Jjr8n4~E~K$AH{}VKI<f=`2{fFbDS@bdocX=JPPC<45d8}1K;p6l=d70mIx^AIoAL8 zf2FkNA>e}2o@0fd`%43)ym(axD9z(@4~Ej7BYd&kgQ2wNaQ{F5mBpUJOj`ZN;J4=x zkb5wd-UlpjqSAW{AAL>S0VeaE==UBV_h9-Jau24`yMf$;sZ_{4m`d*i=K2Lxx);bj zm`ZmSw!Eh2HYT|T)8Z~5_h8E23FID3**61U@T=+9N$$Z^dJ~X)FqQ5s>?wX}^*G5r zn0{|6JW`zK%1Q3Q^m`+a_-KB6Wohv;Wp8Ja_^4D!d{o*4Bt9zLS~g{8mZEWR3SMsQSTchs?`HIZ>QnAo0MS<#__RmYvw*Zmzq6{pRJ=@!Gnu44`keu!Ju00JH25!|(y7%C6(6HTVqE;4 z0sT$_(jJvg1kxUrUJax@DxCn-`PEb^!R{=Z^i;MS4pjuGr*y?{Q{zJ7mhDq9^ z-_bzYqqq?@?=R}n$cUQn79Zn@qq4i;#X+Vo!_5;6wvKwk1`PJP`&!EE3{iT73^QyGR z=SKsO_9(ug=EdSy_AGi?+M`mEUHqK^m0nUitazD9ouoY~CD|8#XW(Z&Rki=Fc$pUI zZ}E2q^jij`Jt*DwD)24;rBNDKE}(SVD@?vApmf{IK!kJ4>ay7)T- zDBX6v?)l=EMrkffdr-RVVJ`cE|8qE{+a4P5jpAh}-A2EQzcYZ+ZHIvwUZ%wdfV4-y z_XE?Ns8mRMRC*tf_NY|&jF+kO0Fd^m^xgqC6#t=Gyqihdqu+hNr+kb`?-=kv@lJ)a zxQ*l%e`!Fadw@w^rp4QU#7Dok4fwm_msZa$OcEc(?ET~8=l`#&Syr>4<_k5GYd%^ts^+qqn(BY9K3Dy> zZ~F89|FCL%)$diUt@>8g;wpds|M99ZRqw8Y_@lzj z1^@ovcM3}jUoOlne6ldU@V>&}LUsRF`8|j;{ZI8j_OE>Y|E2v475`N6T*Y5koT%{c z|NU{rEfu{L*HwJKVtK_^E1D`kQ!%09gB8Oo-dRyr{$I3=JIzVvTO`$``yy|467N^dRQ@mqfX|47NtOKvaucO^X~|3k@|l5dtQDw$I< zwd7+Zqbm>g=Bdi-ea)wV^WUT2-uxJl+azAq3*@QFD}jMLRe6aoknhoX^{|;2YJ2lk zzyaL;s+azA^3*9YU@y}mug&(pOVBT`+V4fsg&1dd#n8CsPtMO_eomZ0OUSN zaZdVsnX=aa6@q?+azUkQ5XXH|#PJGjZ>a6h1Ldw%F+ zw74ADASkW_ST87hDUk2cwYUWMffHpf0@eyzyaxEbpx?#78bPH_a-XD9VYL&L`UP^I zq|z2(l@pZ;-w{+QpM+$ZT* z$bFK28-ST!rr&zt^MXn*0dk+DQX%(ADy;)@pQKVD_eol;0dk+DMIrY|%B})(pQKVJ zpZ1@lxC$WmN%|EMAN`gAiH}N4fW$|O{SZfdJd1N*VUYIVdhSa=+JnVF+Jo!4FEUAc zP#Q>k5I6S)CTS0T=bi)79{dK<9+U>s9>mRkhRf0(Tm{k|EC$jZWY0azWoZu<=bi!5 z9-b3(p9In#EC$jZ{LVeiB<;cCT$0<9_FyrP_8@!i2_|U|7U%W>X%BugNqbNlNPDn2 z_c)i)p7;$UJ}900D3inorGdl;rE?!?n6N0gT+ANgWtJFnIt|a%_Q+bX(ove zO6MNovcw0aa}NWF4@&1AMk(=$(gzr%JzAu=J!y}A?*`Hy#oY^}Jt`H_9%bJHq&+J2 zF=>xVg|tVdUY7Q#^bR2HQK^vjs8mRMRJs>PdsMm`NPDz+E0Ff+mzMUVJzAutJ!y{? zouoa=-VUTaTD%EJd-Urh?a|_m0PQJ?bCUR|R7iX@FC;!H?Ew-Wl>*xmAC+ze5+9Xr z0TLg@IZ1r<>m>2f;`Kn{qwMQ|#7CthcU$74QYVRzN;ek{ZX-TX+RY&CQR%fn+M~sF zK-#0lwLsdV9wF_~;%Xr6(V~#{C|gK-e1fb5(jJuxX^%>Uv`3{v+N07AAnj3U8<6&> zbP165DDD~{?a^;5koM@8ux?9xw739BdlWYxNPBeE0;D~x*8uHF+UL$@lK5!88AyDz zC?q~w6cQh03yF_Pn}Ebei$da~U%zzXqtaPG;-k`;K;omt89?HrI46mZN~Z&fkLIVL zl=wucgS1DbQ-QQcrBi^kM~jnyv`4>J18I*+Cje=WN`ni=d8-vN6wTUc3wBIn4`xr*2`A=QJ4q z2+YRZQ1LS7sVzWmsCZ56)D1vxsCZQ_kQ*vq@H=%qliX18;@zq1fZR~=+S@5U-eqHM zsCdONkQ*vqq6_4PikJ0H@$oPlb3?@|d8hakn2oui;x)cg>k0=pazn+U%d7Pw@(BCb^&DrO{J-pv%T#?jK(K3p5J6 zf_kcx$xuOYUN%JF_1IHgz-0n2!3G8kD)lk%5)`)_7$m5432>>PY(B$fV}qblKI&!T zK!MkAGpQF;>SgZ~R4U|#N{d2nsPuackQ*wM@*yxAb3>)l`9N-{RN4aMhDvd>f!t83 zbS97+DrNKOE*o=0rBWxkp;9Ry@3JvBR4Ns6L#0I_H&lw72IPiH*+Oop^g9)c+)%|L z9|E&6_fzWS(_Ma)`zb9>1ad#6Uq0&PN9+Ahpi*I-phe*af`0ixmmjSabR~RWP${48 z@}o6^;>H8t6Er^#SS@JL$#(@UI$0(7G#CSXM^NclV5OiqC*Kxybp?w z_fTm+;46Ykg#`i@`(6dUEMPG(UqE)>D@?v5V6pFIphduM-%G$e0i}H}0?h(S`(6O% z3Rny@30Ukq$7GIx?7ruL+)!aLkQ*v2_C3cWH&n>(dj`l272-0<4HbSf$qg0a0=c0= zT;J0?CO1@=59Edl*@4_pp|tNwF3SxSO8cGyazlmEzQ=*wP@%N%F(5ZoDD689kV7~7tlf(z}eTRX>2c>;Su}FM8n7JzL zL2us?u1b5bn1`f2`0YEyB<)eDkoKrlNPARzKalpQR7iVNdH_g!RC+Iv_Neq8Anj49 zkoKtbZXoT^;yxhl(eE8V+N07tfwV`9UY7P~@pd5XQT84n?NRAoAnj49le9;Ry8+sh z&E0n!koag(NPP6W3rKuax)VrzR4ODsDisnRm2L+TA1w-rkAAlTiH{b0fW$|?TX02u z;_3zlX^#>&18I-0yMeSv*FxH(MK4Qx^ed!2TD%TOd$cH|J<9eAq&-^P2&6swy%tD& zRJsmGdsMm>NPASe21t8UDx^IsT@9o?x)RbJ{jLJi9+j>H(jH|m2htvub^>XS7M-L$ zTI>MQ9%U~DXiq8|NPM)or1HSEiI3-ZF_8GEv=vBvRJsUAe6;9giI0ArBt9yg4<6Sh$UgZhkoKT7koKVTs9xUdvv%Pt3n* zhq|ZuyK)b{?l%HD>-?R7H~;hh(wZ0ZTLO>d_XPIT{6Wo@njh7?*`NQv)zAO`W#!?@ zKdszb`IE}67xDT3zy9<8;_nx{wa@>5?dSh*{qz4{|MUO1_WA$+^5_4*_WAz@|2R?P zWx0-5Di8i~qR6XvfkctlnmS%)k|^>TUB`=sgMUmEc@o~<@dAT1k=F$~o(IxIUKi|m z4oDMuU9jUBAWh`OyN;)UG?CZ0I?e!TBCpqVoCVTEUWm&iP2@$wj;ENUiM)6x+@2=# zB4Hp+-Udiit7@&#y(PYP?K%&U2jJYgPk4Y4H)isbP@@i(s z5hjTuFTr*k1`N9`D5~`S!ok~# zVl3XvAWc;7JwTeM(z}5)QKkEUG*P8@0BNG)_5x|5es2TPL@n+H(nKu^X`<$D0n$V* zI!P0?D5QzX_N%3dD%}O7i7FM+M3o9@qDpTD(nOW+1kyy6I-!aANomK8K%%JM?LeZ) zE2tekK%%HcAyL%gRv=OIX|M%I6jdrDiYgTnMU`#_5=AXu2PBGG6cR;c^OKU>6GioG z1QJCpI!P4uDWQKdqfsM3`{nyAv{K$@ty z4j@fbkB}xRPDm4#-3FwIidzbtZ{qD8*8pjv<`)5JqDmJ7X`)JnG*P8OnyAuNAWc-M zUm#6XsS}!5RJs626jj;+B#J6+2F7@qN`(&!ikk(D78Exd_<*2n;R-?7GlBODDxCq0 z613>#eS&_c1D6Y0oCdsC(C=hmq@dC%z=vTN@Q0Zu(K~U)xz(B!cJ{+hQv^WxY zr=U3D5<#USfB}LQeN3I;(_jdY_NdfJ+M`k-?Qx?DX^%<=1GJ~Ocn1NAk4lBaM~n49 z;-f_&@lkdikoc&y21tCg=p^ycZxxXEs8mRNR0{ko@zG)#koag(NPLvdyB2;%d~y~Y zq&-^f2c$i^7SbLpw!Z?TJy>ji8AyAO-Toqw_Mo)=9FX>4F_89PF_88kyZw1COM6h7 zN!o+b_Gg)-Jt%E|21t9b*nS2`dl1+D6p;3yG?TOki|tP`NqZ0%NP7?$NP7^MFOc@| zY-xX-$D}=&Z$Aytp1h%{{V^c%;gn{Q_@K1Ck4fT#()JTT;)AR9<3Qqr-$3Gn-}XnD zBtBSde+Wo?kllU^NPMu^{xFdE;5U~gK3Hr&f;i%%xb~x5mG?ZI#R13=oNQZGw;RC+g%_Gs}QAnnnjkoG7}NPASe4@i4_8r%t_Ju1Be zNPARzJCOFMbT^RpsPr}I$9{oB=d$hO~NPDy>q&->`(jLvP z0@5Cp3TclPyMVMuznwtZqf#O5QE3~H_9(6cNPG0V6i9pY>t$(=N|yj>k4lBKN2NmA zqs3N$_7p7&iH{Z+0Ev&Tgv7_EK?{)hs8mRNbR{G{nx73MKKgA25+D6G0f~=Fy)5xj z>1-?#pICH|_Gob?koM?$8j$vAaR!j~=vPR4R5~32;sra{=D-t4{`a^FROJna>LN?yr4X zz?=X1|KC*gz3vkP-s;c)FR3g&|EU6xT*S}+XZ+eH4ZQWA|96*vue|u_1E1#e2j1Mz z|Npu4TBk+&wyZNw@7yZh@xwavyycB2 z*=C%#xdpDuHsesttpKvkI8}4YfNV2P)!Y&w+l<54^a_w|#z}5^8OS!{j0UpJIB$V$ zGmcmw+l(U?$Ts7+G@auMWSg;anw|r)&Da=$Y%>;E)3Z#n%{Z1#XMt=pj#$$(K(-kt zvFRxw+l({X^aPM?#(8Uc9LP4~C^tO@WSem;1KDPr#6Y$g>oAYWHse?}ac{FN+l-SK z$Ts7QHuW)Ko8_C1rsF`?84IZC1aM)UH9ZPsov}hQ$vR_eW|DQrLJnk|v0R&u@tCYL z?xC6<#v482VcaaFb%N(0$uSj^+I&G6fFn9H)wP}+0^$Tm~y{Xn*v;)HB7 zmEH$rn<-n!Hq)Y)Wt-_&$Tm~yzRH7Jv(2=4Cy;HX-@QP#nM&^f*7=`Ji^2~C{d(D2 zL8Z3=-xpMR3$R8|&o1D5f_{b7f);lI-xc&LtP(WO-N@GO2r9i9SShGf__m-@FY6L? zC9DvLTGRHz!L6O=C2VK#EeCq*0hSAj7rrUzZ7a|r=vrtObS1P2A-7>w&Ke`t1g;5wyr1%+{|7`n?udEGW*&R|Ulhiv;~{02T_G7g`0C zt^~d!s8m=WC{FmYpwcd2zM#eBz?THgcK|JdN|yrj1T8KBng#t{1I!gvx)^8@w73YE zBj{I{EoiY7_@baiVV0o91;7^sEjpPg_%vw2;^)s>oX=o}1NCxiv-NX=dbpd}I$hAO z@L55nO~5okrNU{ zxoO!tUQns<5kaLw+N08u0PQI%6%rpUjsOxL{R)YXN{0i9kK&vpKKgZ%_~^G0i^L}j zv5`UAqqxC9+N0|RAnnobARz5gsgU-l)XUNyT?uKAO6!5NN7+K!qc|b$QT8Q3+N0kp zAnj3{koG7}NP83~q&=E10n#2VmH}yxPXi}uk4lBKN2NmAgVH%K18EOR=e!7{Jt&>? z0+9A#anAEV+JoOY&jD!Pgv3X2Z9w9q>?J_rqwF?Z z5udp7s^|Nj4}s*_bms}5G(QFY<>|1b9a z{}+D$|Ki^NU-;-bHd9HS`i}vSOb0z{g)~t`NE+#qFtdBsBHG83pm9;;|n#B~zv1YLZa;(`UUF@&@ zIo2G+F80s<9BU3$7h7h3jx|dnkYmm1?_%Zb&#`8g1aho7VSyZL&TALTXn&41Ar0hM zvt_#2O#5@JIeUQ|YxY9dg2KW59BU6^7mI2Cg;U+d#@U}!&1&spuk6pMW;JG#Q_c41 zYGRU8&Bh6Es&iMJ$K+VECj;+x!k+A!#bbsGEb1;c&i-M77KKJZi^5Pri^33rHP^-d z+JBj#Qnu9o!GcOzO#9y@s8kpvXmJ8?si0pL)BXlQrQ?Btf=Y#YL8Yv${qGc1DqJF{ zR2U$rbSzLOsPuB6R#53EphnQu6+pG1Unf<9N_|YFpzPs5LD1p|pueC+p+eB2k0}>4 zKOBo?=Pmm9QU~g71WE+O4F=vJu(i7yfPR7&f#T=#=}Oq(M5V%dL2>oKI>F~e4e$ej zwcT|IuvX9_cl^cA<;b1(n_n%n(#6d`?iQFkMio@L55n`+#YJO78$ZBdByQFjY{g@M%GD z!W2Qjd(iW#^LlnONPCoc8<6&>S4ew&7TgM?J-WIDNPBd>3rKrZ>Ll$^_RT=rqf#$R zdlcs+?a}W|K-!~UA?;D=79j1>Vh@n^C{9Rw6epxTn!f=^d$cH|J(|A`NPAS;4WvCP zCAs_39+f&tdsMm(NPAQ&q&+GX(jJwr0ccNA>1rVHQK^vls8mRNR4ODsDqRI6J}O-a zBtDAk1QH+pE(a1H{dNF}k4igGN_?ze25FB3 zC{9Rwl-&xXJz87@q&>=B0Hi%C71AD+3TclPTY$7ji$dC?MIr6c{A?iY(c&y1?a}W{ zAnj4)fV4-YRQ9g4M{zYk+M{1DOMA3f0i-?3E&Ns4@xshd$8DfoJrb) z#ZLNrSK5Q@&Z9uugVN4pK-z=SOlVJH+JKymA|NnRI|MzbMT;hE3jd{W zw(wVl3*Z0$TR#8quKu_6zu5Qx|JU;WT>eD)FUyO6b>JuETgx|7y@EB#+f?=1cIr8mB*&;MIq@~ij%^XpW9k<-HSZrCkAP75b_*o{C= z3s0|MHvu^I5S~yh0ZY&)53r>sA)eLf2SQvpE7S7bLEj&Jlg@rL}E0Dv&ju>`5 zaN)2F;}`z^B8P=dkVy^;hd+?R!Z8?j9hc>>aB_xi1UM|YSqlqrTmiM@gEAx9t~^|R4S|&RC)!lPEe`v13`-;fVF~t zhZhbU|NeQU!x^k`pg4XL@c8!xl@0+`3(6M0E2y*qSS6@*Fz_8grTkvt@s)x~g>MU5 z6uJcc3b|8LDZeCmJa=j;tpakVro{>%cWU|-a;K(6A$Mx}6>_Jh(lQ`-YAP)Oa;K)n zen9Tj6z3#&YASV-J2lKV@*9K4zwW;%76aD^_-%ZN$=3udHogcf7VsPRs({kQb4(Tq zSPU!_@Z0ztlU4zxfv*TyYI6878{@9A@dwy zvGGZuS-^GUd#5MNunB1u$yYV=XJ2m_^o&a*EhSFS?J2jLB za;JvU#)r8qcWNkYdOL9An{S@JwW24I3e*-sh1@_$`%qIE#3(v zKDrVTAC=w#BtDwo3nV^T6cQh0?*S4YmF__)@v)1IyBVZCD!mOzd$hOq&>>s z38XzLy#+{nRC+Uz_9#wBdlV<6J^H;7NP9HD6-awjDx^Is-2$XNTD%@ed-N-$Ju2M{ zq&-@6lJ@A=N!p`QCuxsLuLIH^Ep`L6CofkuZUhn^m0k-ZJ}O-cBtD805+9YW0TLfA zt_Bhx4|5lg_^5Oxkoc%nNPJYf3P^lZ>SGcgm39D$k4l#ViH{bA#7DnvC?!5o>O;~V zl?rK(u9g64k4hH1-hF(V~;IN58-?(;i*T0@5D+&H&OL{d!s2qhBX!k4mQlX^%>$0ko&6bSjYesB{XD z_-Ju5kof3#0+9GV`W+7>KAIm3Bt9y2lK3cY9FX{^bZp_k zFNsgY`H-|n@uPvXM~hC<9$k+D(jJvw0i->O8wsR6`W4b1{R(N17KOA&i$dC?#UVi2 zqj@3iQE3B^_GqylNPBc8q&>>60n#4*)&XgceucD0i(Z!YXi-Relr5w^Dy;%&PhOsF zEC7j*Teu8Jd{inVJ}NB%5+5uMeHlo65I2Cl&e#0T?3Ujz~#lm-$XTn&AJ zN#cXWK;nb!q2~}sd=xkI99N}1xElIAkoKT==yO2Y!&74DSs?Af@6cy}vq&+Ad`ZSRC;3|;zU@?&PAbaRjT$c7AJ6|B}LFrJ+{L8clr9=CGvFijxJ5SbbUOGFL?auQvlWccRayPG*9m{qn0-0pHvlqILFv)gjV|4Qh+p%nS z_Cg@rorBc{ zyB38D+dYrTc2{;clMCCu`#K=oUB6DU-Bo%mO4;sFx{*PayGqvqS?($ovfQ<}7GSyO z+pcbY3Uw^oU8SpmY zU5m4TYH*6 z2zZyEMPZPj#RlL~LD`o84T4IY3=~va57Y}u zrJG&_-XS1v6F-tV)=xm`rWY#@KKMfci-8RS7B{`XWW9jJOx6iJCpMj9lJ=l<)AK;u zgVIfBfwTvUfwTv|o1S8l_MmjrlR(;o(m>jS(oK&uNqbPbiJu}pnD(G_Qy)NkqBN7l z2Umf_2c@|z@j>aP6FesI!ThF&fy4);n~npC4@v`x58?ue4}Ld2%4LZUem6Z@IQU>& zSypAfSlWZpO%HKZ+JnSR$AGj4@tckSX%DV8QRxTM9>i}t45U3M&1Gp1vNw_62h$!b zW|H>cHGC!F1==UBV?a|^sAnnnwkoIWtb|CH1 z?;arS(c-N@+M`7w?NRnlAnj49koKtbW+3fR=}iFb$%)G(@!`m3lK809%Mu@z-UuW< zx)Kr}m2L;7`_)t`BtBZ~0TLfA_F$3t7`zP99-klAb5+`-Qu6y?+M`k-?a`u;_9$*M zkoG9M8%TQ;=T}R66z3%E(fmdr?NPRn_NeqaAnj4qOaX66pXt5DUe01d`@lmOh#K)(>U?B0)uam?_r9-etd}473gS1DzJmhHFqtZb@ z+M`k-?NOam;4@0d$i~z?a^WlkoIWN%hDb#7J#(Jr$HHz_NdfJ z+M}xqAnnnWkoMqr9%hDc{ZhYY_egA*5 z?&#a{`F|xB{qz5p>d#eAtp0HId#eXkS601J^$%5VeE*fc)&J}LTl#;l|HS?u?mx2sTl@Qee_Fn`{9=Cof8p={z4f2}7ytg>XG$iNe6X_e z;I3>Lj`bp*?YpvNcuFp+DIDCzmhre{kR`*>S;R5el_f)n7xDbwl_kSz31rEzJr?o& z-jyZ8X$fS>a9$UcFv*f(Ed;V;IPZZh8P5Ac&cv=P8BTKG!jcJO$#AFwSu&iKg)j4% zEE&#TCRs8Zw?LK*M|2^lWmlFAdtu>=K$Z-vAi$EzcNPoJG0B$Uj0-=>mf^T9d=AK# z;kYe)7RZ)ig9fr?*cc1XGRc-xHESZH5G0Bp_bs$Ry ziwhrSk|l%Rg~xy_8I&$O3S`NkG?NbhOQCe(VJ7VYN&{^IN(0LTl|H~_O9jOp0=^;W z*U1t=S5CezP?Sur5mf5rYl5;50E-2c-UED9Q0cwEB0;6XLP3jn1FZs0TX-k%6+xx@ zfCYj|ZwJ0CXmKwvU(m1cB|)WofEGce!aPBxyMbmwrMCfd1(n_kGznVV1-YqE3$#6lxet}_v zPXnP*Q0Y`)sGw3|h@jFbz-59;Cjx^7Eeh`vv^W7sdz5_@koIWtYJm0>{f+|?AH|IY z5+D5viI0BA0Ev%Eg~UgtLgJ&+(Lmy(MIrIguaNktbQF;IsPuA_5})i^Zg78+_NcTG zNPBcO1W0@II~YiN^g9Shd$cH|J<6^F(jJvw0;D}Eb&~cd4%nIYC{9RwbS0!cTC4)n z9-jsUAnnnjkoIU%NPDzc0i-=z6w)4_Iwe5bqtY@U?LlcPW!_19qBM~BATE&j;J5W< zE=zpy+xjAq_;6%fp92yfl(s$(Bt94kBtBToWr+{6Tc72!#0RCBBtDoABtH1fWr+_K zThH>C#0S5D#0RCVXA1{+5+9Yep5dyr2c@k~0%;FQTgmUvv$P}=$^le7nmnWQ~f45U3gCt8nkS=xir)`x(!2aB!8fV2mTfwTvU zc}&`a`PL&`miC}Dle7nmnWR1VZM~n%(jJx4-<`B4OSJV6koa(9Gf8|@dLNU-N2RoM zXX2y9eL&))MIrIg;+;U^qc|b)@o8{7koYL>4j}PSsgU?+-pdjn#R-Xze)j;0kA8Qf zl=wucgS1Dbw*hI7N^b$u9xamJooSDLZwAsHmEHuTJzBgGNPF~4e|M%mT6B{3Xi-Re zl-&cQJzCrXq&n*a0Ly%I3F;b`qahT+Sfv(V`DYdvv`NNPAQ&q&+IV21t8U+6tsSDqR4i zJt`H_9>oc1k4lBKN7*ev+N08DAnj4_Y>0}`BQR#%=`2GLI{{6p-+W)8a*|*{M|36wY zs^+qb{QG|w-v9sEs;jF$R5hY%;G6#Yf3JW4|Ej{W!h*sV3X= z%7Z&n1fHxd_W~&bha!^{f#VWL5qKKsvJ`=*aSPjhM~XmF0x1Gd)M+MqzGCRE)=1Kg}x(2P$_GBM~a|QCnO4-yqQUomuDT1!px;s(?WwV@jTqr`zbRb1gHY<2X zil9=K^NtijrA|@=#R(~bekTJdf_j{!2I1<<(D0>93 zUeKbKtrPU?Wj_!+evQCdL2-kD?+eNvTsXLW&3TIszUM&K4Zvzai^6vW{ni7k1eIO_ zd`D2Jla+!>>ws?y9?UABOHf<|utLz4&?#uK4EUCy>=IzPpg1r4rr;CA%Q^%tI%yY_ z?PJ;mE%pPJ3HlY53Mv)8A*fVXBA|5MtH9RgzA7Ml z-t$Zr2`HU+4p=B4d){+EtANsZPXk{O5Eob=;CJ2`CSMk?7?>|0d)^aFz9gV@-jj%H zDTf(&^zxjpjklNywkv30oU{TfV2m{^Ns^)4@&2q0MZ^T=CZU0zqu^!L1`fE zLFv3>JSOeIVj%6oRUqv_Pay5V@4O>CChg&A5J-CvH}5c$vW8AN_U!iH}N!#7CuVK;olPA@NZuAL6#1_{8E8 z25FBL7XxXJ7F&U|NAdH4v`3|jfV4-83xKpozh0L1D6R!ad-N-$J^Gyuq&+Ha0@5DE z32Bc?g|tW6vw*Zmr89uEN2Sv%5B8=#DizWml}-cF9+e7dk4mQkX^$3#v`4=}+N07b z0PQI*Q6cg1WKRMTA7xJj5+9WciH}OJ1`;2YP5=@gEnW#EKKi`^NPJW}8c2LpItEC5 zRO%%0(V~;YN57*B2YZQ6l={We9+h4Wq&DS`^YAEe-+F9?cI1(jJux zX^-Lt0cnqZg|tVDLfWH6A??w89gy~@lrs0GJu0mM(jJvo0cnro3P9SUQX%b8wvhIy zv;s(bR4UM(2!_+RK3KNj6)136MR>{t9GIve^RJlkB|qeq5G4$!2SN3AnH) z1KE>owzhLjvL`wGZES+Q*^?~5Hg?3`>`8V}F3X-|&9$)>_GVAAe%e?Vd$T85je+b* zR%0N0k_FhtUf7#G$pQ>yPqOm@*^^joV`J>ip2Tk(OJZ;KBo^DA0J10X8_1r-Vjz1G zziqtFU@v=8BWaaW2c6k z`K48QFECjkeQgJTPYNo%8<-?0?jGQG1(ogtCJI`-1NelXtJ{IA1)m0cfsYF+buvNF zqLYsaiW9C9R4V+A;B!K_Qc&q`;G=>{Zw1B+iW5E}==T<2oS%jX6+S5F_eNl}pwjKY2Lvq&R|typviA$>=>bLwJ|}Jf-X~DLwynVBf_{bf z3O)_42Sy576y76fQ5Yd;QFynY`EFpipwbP%FhPs!fJQ;TtAU|{7S{qp1pPX>Oi<}6 zV6dRlF5q2)N;`o;f)<5K1uZTI8U$sx0RsgsI;j`*+X1{&(4ugOpkE&|Kv3xtpiWTf zQlM5)=`}!&pi-e)Q0XF+R-IS6m_eljm9_!}L2)fWe?g@}g`n*DK)ImB1wfggUoR^a zR4SARifaPiA*ggV&`(hI%*um5{h^@6S-=KCi^6(Ai$dC?`DsAfqtYor+M~ruK-!}? zA?;DNkoIVC0+9A7`${0~QR!7c+N09(K-#0yaX{LmQi1jqm5v1xA1w-rkK%;HN2Ozc z#79@7fy76pR{)8R&xuh$;-lZ;K;om)%Ynp4rM%DJr^F|_)TMqtXT-?NOq&->`(jLthfV4-Y zB|zGv(tbeNqeUlakA9t`Jt$rFDvJ{;L)&-0kX2fu;D2c^rNW0LrwG?4gUaoHIri4T64odpsf#4URoNPJMb z>}f0#A1&spvK-#0<4M5tXI3ev(_8K7VVZAO}2hg7MHXPx^j~EsMJZ~qtcZ?;^Whx6Q#r_O1ml#?n!$TM}GIDJ^H1% zd(s~L3Tcn7gtSMCOM$dUS3=sO>}!Cu$EU#(AnnnwkoKr_5s>z%R7iUiC!{^P64D-J zw*qO8N}Z%Vns<`+sB{64_Na6|koKr_7LfL6aoU^u{=cg3ztvsr_y2Qhr`CR~c69B3 zAK(A~>D%)C|Ns3q{Qm#j`ThUr%RX5)zU+Nv7x(#pZ}|QH1BVh0p5S$SjK!gZgQr&@ z;ou+!5)Kx6-DxgMI5=W;e5S>rgo8s-$H!P4N;r5<*Bvh$I7B!+m37A%q#GQ!T$OHc zKi$fQ>QTGs#Zm?wPjsoch2Qia$gAC;b2Pz z5)Kw^-98?ZaByBTNjTU{nIs%6+Caj=nyR~l$0QtVrn=og!ohA0BpfV>y4#o}94v{t zTY-c_akl^ohe~$=35T+81`-aH-UK8ZD!mDDgd^f^WRPwsPDnS@+XJKDLsvq&;nUzcAl*>*W+2_rqL-x`%DxszH&nV2NHeo>ef^q_(j5@I3eNCuaIykj>r5W;qVEv3P?D#C?p)pUI`=| zDs_@@sI&`6IJCGNNI3M{1|%FRT>>N=DisnAl?n-mN*4nOhvHg+ghRjcfrLYILc*c! zmcoHw5RUkDkZ!278Th9EJ#-~>2r6v?+69%)2HFJ8&jOYSS`?NF`ke`ULr|%cC4%CF zuL~-j0bC;}dn)iXL5sp-LBErLuL>%i0xS|#>SUpy(uqK;perX|5j>bz0}BL|3SSnK zEzB3Rcopy^LBHdH7D082Q&*R^|HBwO2-0Cf=WjNa|D%+0%i+ZyaM>5pkF7m z1eJ~iz96V{1Ta(3;&9;ef_?{MamIOzjSN2LK#PNb>4Fvq1D_QX-vCS#R4RN%P-#6d zRnVgFX+c-Q6hVu^rv&}h0h0xv1~tGZ1(gbu1T9tozbh!N445b=yC0DD=&A%rdyrlG z3Xt~b*UQo#{MNn-q&+CjWoZve18EOR1GFbfYhU6qi4PV7i4WpxUtp5>AiMT?Ao0O( z?Q=llgVNe_K;nba+Gl~p2aAEk2aC05nIt~Qu6-Ive6U!121tDH8%TUmTKg0hiH~Qo z_DQZvd(d0^7?Ad0vG#Ew?ZI#DX&~*vRc#-T_MkM7_Mo)(1e3G}im1fwTv|wa0+82c@+~fwTvuwMT%o2aAEU2fwxVGf8`}SbGRad$jlf zkoIWN%hDb#3bZE&Gm!ZBoH)QF@!^yP5+9Y`%Ovs9)jdGsqu;xM#7Dn(0*Q})g~UgT zLgJ&}JAlMTrF((IM~i!a#7Doofy76pw*iTdN_V4__(Z9Lv`34#0BMgFZwAsHW#3eJ z;DNM9rA!`3dvqnFJz5mf9%cKOv`5)D0%?y*dw{e@r9#@H(yc(+qs8liv`4?2fwV`9 zPSPIzI!Sx9*bSsTTHFYvJ&L;)NPAQ&q&=QRA?@)wu>qhx#e=yHNPP6W7D#+lDkMHC z6%rqnt_Bhx#jOGoAN_U#iI09efy76pP7)t2E(a1H{R)YXO51?MN2N=F#7Ctag#!-| zpD6XJv`3{&fV4+(i-5F8aYEXo>{cM{(V~;IM~m};w8y7`koKrlNPD!{45U3;Yy#3A zWzPoE9>vW9(jNWJ1kxTY&H&OLWlsar9+gf7(jJuxX^$4C0BMgFg|tW60`18fubl)W zJ|0XV@ll+R_^5OukoYKj0+9HqR7iYODkMIN8xJHt`W*u#KKdOCBt9w~2P8f!b&~if zZVcjxPsI87v`4*H0BMing|tVdLfWI!kwDs`QX%cpqLB9JcQ}ytsB{RB_GnQ^d-OXP zNPAQ|2uOQW+5n_ITC4}s9{ttUv`3{iK-#0l3Lx##Z&~sC|Iz&h{NsS92mIxL zhX(xHKL7t{-NCv$>i)29d)@EVt*!f3-Ph`x>t6r&|DLV=KWmTI{_nN-*8Z$^SM9di z?%MCwcGNDcon8Cs+N)|mP}^8Lpthvuzto(q`Ky|TYkpC4cg-Kw++4Gz=0`QFYL?Y3 zsQE(8I=XBKeGDL>O$2& zRXtbr*HtI}#ozyXGr#};#mXs_zf*Zd<OS*1?c&G{~&fo*s+ z%bCsAzydsaVL3Nk0%SRBkp*}(%UQodma`VwhDWoU^($mKt5nExR$LX3<*d>IkmaoG zG9b%Yr6oX?vr3(0Ib(6)D?pYreh0pcMV7M`2foZ8yBTqT>}FgKe340ZGkyoY0F3s3 zH5Lb+13n;NF_S9MA21W@e4ZKf4T;Os6aRbltnD+|E9(V>ADPS@19szL! zpJXyZKASR8m57$6{S z;8CDXKxrnmf)*cOQX^>bJ}g$Bw|GB;DhFB=Dg`ax3lsz`-UIX(6z8NuQ0d)3xuCdx zK$)O8p;SJ(jJuxX^$3#v`4=}+M~tgK-#0<4xrWlp(Q9+cKU&m`@^V*Rr~+JnV<`uk^T53=je0%;FQ18EOR>(4Mrdr(^cB#`!CvHl4l z?ZIy#?ZILo?ZIz7mHji?lZ{$`8c2NbTi*vHK3L2o@!@1=lK5aGlf(ycnIt|a4J1Cu zu0O$7OMFn8N#etEqW(CO#0RB;#0RCqk;Dh3^^XFH4@&DFDjYaMd{kObvX89ue*sGC z9|F=I#MK`K(jJu79|qDMWY<3cq&-?Z1f)G$6w)4Lds*6}QYUGTO78>G9+e&d(jJxW z1JWKX3Tcmi?*P&sE$#)<9{uhH(jJuxX^%>G0cnroZUxdF{oVqkJzDfK+LPqg?*tMb z&SL$|K;ok-Cy9?rog_Yry9r2q6elD;x)Kr}pA$C%iH}c%?LgwAUnhx=uC~7|-~V^M zE#Lp|sriGq<@^7WZ_D@pZ|(2@z4811i~0P&*S`N>{kDAn|K|Vx->-lFfAEnkT2AF= z-fiNER*UD3C?Vk_cqcva&Yw=AB2fXxSx!ELt{3 zAd8ljwV8MFJd#Dr>EF!zbsov0WixH&?KY2O(Q=M9F9xz`S&f@{yUin6wCs}2ybMpe5KbZlMl(hc8Dm^V zQi>U)sbgL)qk%E*eV!*tb+_GJOT4ew{(N5V?>V(R-|zeR25%aR;9ZDEn1ZdEm|!K zEn5BV0JLbexINIK)$cYyi&mxE0xeoCI%&~raWe1){V00?i^p%aILP4h4%9myI8IQ{ zIN)=Feueo07B6}O_^g26i(Utg6|mUkGXk+{a*Tk*CZ86tc+p0_=4b&|7rh1?C7`s) zJOQN_y~1R!z&&x%%fOKWN`p@chzpJo@O#lqT=q!;J;C7uN`p@b=m`!J@O#nE`I?Ul z_zeyfP?)|# z%ibwy@fKhgL5qBN_R)6;%DxfUSx~8y;-k_Vfa0Ul>w)5<(yM{uqta`D;-k{5fa0T4 zq4;R=3ZVGtm*4O5DDiQdba*<|rdp!jJ1RG|2%^mL&3sMJaE(IT1t5*-4g+eBN)H8U zkKzsiYLBj*)E@mF4AdT#3bn@@gc$#E?NQu8K<&}5liH&mq4ua$s68s34b&cQg9Cut zqc|_CJt}oldo(Z99+mD7)E<@Y2h<*w3bbd_gDDgrAIyD$;-kgAf#Rb$q4+3!51{zy zcTb@BXmNL-_~>^xp!ld%C_XCP87Mv~6^f4*rvt@Di$d{H_I4;GJ}KRvLG97vHbCvs z?_{9%sB|h&dlcuS_ULyAs6F}}1Zs~;2Y}k6Qla)}QK&tN8xPbTm5u{yk9wTc9xN_> z1E@Xv^|IQ-4YKrgp!Q%fs6EJD`WlnkgTzEWDEC$5~ze}INBJt7U(xCz{F+JnWVj{&s@ze^tmY7a`6J_^(x zls2h7C|$aSN$o*gP1ZodTo75gG2DJyjOILGQ?ZIMDd-QuBliH)j zRY2`g+!#=MRJsDFJz5lMkGH{HK<(kdY(jf_FqhuVr1)r2C_b7OijPW#;-k{rf#Rdm z+koPu#an>lqu(2W;-k15|MK(yFHieV)1IF8$J6eccE_|g|NH;;n)=SE+fAJ`<+UmQ zc`JVZ-zlS?A3bvPW25_yzI$}~oBsWO*H8X?lP{k9?a8N4UNHHX$#3rW|NYs}GebWf zT0L~<&`m@CaOkq33y0p!@Be$(r0pjS557M5Uk0BW{C9(E-t_PPn>X<{C+;`#Jrj4D zIBnwifj9g6|CUYo&V(~2EShlagilPEJ>hTh`~U8FZu8Fi;n?Kid!B1&O*nZIw6g|* zK_>02?N9#Uy>9@Uch)9oXT5dvq@A@dUo(!&+F5&Up0u+*0KCqmowW<_8qm)A&}L|7 zy&Krbq@6W>^JMeR`r*AlW75vri^+>XJL_G*2B4j_5AZzD&Uy#19%yI1A9xmEXZeSL zO_P?^4x1;Nm(~yOeTK_gTJL4@G|f-+6~Os|O0NXIBWO`LPtdRM zZ9$8E&AEbpF9*IQ=*r1Cf_^UpzA5YuTmqaeyl?a5cLXhZ*;#^qmjd4q6t@I8Q_$~X z;Ol~Zg);<|o)3IYP@I#~1(iDas-W!ifYSsm3SSZQ>t&}3Ds}Q@L8WH`rwA%N1^8{j zC+;-hWI?}9z9i`PRNy2*rA`(JiaQBdDCk#MAZSrIQBd{?z!wEAo(P;E=-0^?1eG2? zbkCn2zgg+=3_kBbar1%W1eG2Od`?iDFkjI8(ZFW~#W^`vQ1&svX9WFv*)f8ygij0l zod+B(s8l#gQ1+3)JV9}X0CNSE9ts>ODBH=W1eFR$2wL>APYU{-0~{`>RQQCTxPySh z1eH4ZxS&PhP(kwt0KX-ubYI{QL5q6>zbPngPvBrdaeDwC6ZE?~aFF0_Fbnt%L8VTL zk4l{sAC)>OK3d!jC_Y-;1t>ns-U*Aur}gTf_NaF!p!TR#s6ASo4%8m~?f}#tEjp<^ zy4oJ7Jt`Gyk4m=#YLB9#=a(V~;uqhBYrM?I5)+N0k=p!R4{s6EOa0&0)4 z#{soRapQs7qc|tE2iYs$0BVmGozR}lHz__SU9pi#@j>Z|SAgP!(iJZQ#RsJ;UIdB{ zu2%dEC_eZNiVuEQY+zD+5Z9#mAg)RA!S9L}xUBea8?1N^al}V)E7mipJ?LHW98i0( zxMCepd$73TS)le{u}SUWE?Dt2liGvDCbb8@O==HHgW7||6;JXtwFkdJ?ZM)TCz#Y8 z#09knr7Iq1QhPAJ;!&XXpfspGDCHwV_xx$?!QzUCf!c%LCbb7~{J7gae_DG`8q^-d z1+@qBD^_tC?df3_o-IB+%t7%{>D^3rY? z)EEQDJ-R*xs6C1kYL7}!25OHMh1#Pyq4ubB zAy9j?DAXQrkQ0E~qf(*vXz@6p_UQLmp!TSAK2Up9>ZJB)QK&uo^|IQdMJKgKzefPI zN2NmTQK?XSR4UXSEglNg9{mcnN2P}Vv}eQFB`RD(??dSi;rvCG(*H8U>Q!k$S z?WtSy_y2!3`poE$M^}&DIr`@Q{{Qfi14s5A+1h{qZ^`gChff{;!tmDq`+xsp(hZaT z{-kAF_3!^}ocQMx*G>G%#0MvC&Ahqe-dZsb2Romz5fx>Y&uHJ-Uq4blwhX4UcP=)f#rhx|jF{wT35j9iQ%6 zR%=)bT~=$@Z0j~KsWm+OL9O9=4{8lNV%_sxR%_VW>-ebGvRcDlX;N!gbL*aCQft@| z>z)N_4bS_!r-53-`dP;Zx|Y=%Hd|0@SQzX0pw+Tk!^6Lh4_Ym&HEfTd*6@h0mCAX4GW`5twCIqT7%Mce1vLQt-)eYYuH8WR$-CWWbr<(DmCi8 z8z?o3<5O45N{xQ`)YY<5qeY?A=t?Lxn)e%&8tTx5)b!_^b$2nTHJTS{jY^jTwML~v ztx+i-=vr25RO+PGXz>=H)@V_vHOl6rUdw8YN^b&cjTW8M8vWh?)EbovwMM0U?rT}C zQ7NC{T2^aRdL>Y6R4UXOm0k|i8ZA1hHTrc@YgBp}P-|3r2~caaDAXGLUJTS4l`aEn zjY^jQwMM0U1bP{*$)bZTsabbEP-?Vz0Z?ib=cLrA^gN){XwgZjQJhd}yeG~9NKJpj zU3V_?x>Jc(0(+vw=MXl?v|>RC*S$yP#6x-GWL_2WAN>6=n*G6Lu3+dMfZP zLD{DPy9!!78F;6l-;;n{1eFT!5L9{su(P16`M}!+{T>bMBJ@%X(BdJ$Hi8xp2BrzR z5~d1T6s8D1I(+`__;p!xlQNrFm+K|!U$L_wwd0Rw_c z_XQ>hD%~3xFKBTep!Vq3N$pYTp2I7CulA^P51{s_ba$ZkXmJ)mdp7wMijPWn0g8`G zcLIu!Mz#ZrkAAlSijRJU;-kfFf#Rb$zoz&odn!qW7nl?u9@(|e1H}iWYo7y(4@%cQ3ltxeu6+t9KDY{s4;I%x!KC=0 zXYG?f@j>?5M}gwQZ4eY6#0A9%ziauR^Y0NKEv|ixFR4A;1#2GxY7gRq+Jm^Y4>PGf z$PQ``vV+=#(xCRBG^jl&UAvlZPZaGkUR4UXSW%~_kk4pWT+N0820NT^yU3)W7e0WNO;-k`=m=qtC z-T)LIl?ug2rQZjNk4lB&qs420;-lZI&_jIEb0ve?qu$Ga+N06Sf!d?%OMu#=I48A7 zaehthQT#HX_UOt)NAiFRMK&T>{h|l`aNqk4i59YL7~V+N09* zf!d=|q4ucsJfQYy(Mj#m@7X}@QJheFR4UXS#hnS%9+f(wJuUdPX8^^=2lF(b_~=(C zJ}MQ8k4jGkijNjg0g8`)PX>yQN>2oek4lB&qtfGn;-k{}C?!5AozI~5Xz^&E_9*Tc zp!O)vN$t`6kwEQHoRiw4E1~vy8ypVQ9>w`JwMV~9F0MV^28RK)N2NyqwMV6g0<}k_ z#Q5Ucqf(N4aqUs5P~-iDSv0mIa9te<%B6)^ZWlE8Trx3 z?IZtm%A9?e?|9^1!)#0BF|H<&TgNF`&WN^W+=OTR>--N;8@rVKD?H}avFpxwylZGv_qpEU{EjeMqMir=l>$Onr? zUkBQae3WPO4WQk~XIe%%bKKW%W-z(CEuRyOB@31novX?K1iz zlXfGYKN|fx&~D_DMM1lf4HjNksjZe*8i8nhbuFw^J;zNFR2XP$yqBcDGS{TY*1 zBOf0c<@|A9tC5c!1+7LtOBA#k`N+}eIxcH9@-d~+XMk2CpE3$sjeIU>^eHB-Mn1_C zv>N&R(dd&*T8(`ACulYD!J^T}n6w)CEYawL0IShI=-e{;D9~=?<6)y~fOaDmgLWh0 zMjv9*ZbWI&Zp32HZp30=({AL$NTaLynsy^fgLb19?;Bq6qjsa>gm$A!$AEUD<~dpX zsNJa2yMT71O78~RjVg80ZdBY|Lo0s7Zp_tk2CYV2-wL!Eb$vU~YSh(jK&w%uw*ak1 z#or9H8ucr*8dWNs;eSJw3SSdcDx5B;^g7_Hf)=j@P80Mid_~YAhmjwhD(Lqr;LCy* zotz@*_iEs`1(jX_oGfVZ65vaM7MB4h30f2u3F;9R3M#!ASRklWI8jik@I}G9Whroi zphXTKKl*~8IN^9frHg^j3!1+GI8IRM`M~D{#hnMt7gTyS@L56G!m)xD&jmgs==U6y z9sf=Z784itHAALknsgwN$l^z0oSWxLfzC zg%1fT74{VrHyc+U-0W&LgMAz*@c`fhg5viD_7)T`ykF4b{=i;>e)j|3Cn%0%%8&LG zRJu3tUO`t*YL6C$+T(4oCs2EoEz};B&H`$WN_PWlk4kq1YL7~V+M`mT_Na6xp!TR# zs68s(4yZjU-5#htD%}>SJu00F)E+GgwMV}~?NR9{KzlYR6^f5ah2o<)q4?-`GEjW< zI|LLTl@0>MM{xr{@lok`p!g_z98i2zIv%COr;X~M_Mmj+HK6t&Zsc{K_8@NL6`=MY zd*o%H_F%C|?ZN!WOH67H7Ms)_EC#g)*P2a8^|s`lX5$*S6e(vfvQ?Llc!d$2h26qDM6#h~^edxWsAsy!$TXipDjP<*gB z@+g-TA0Eu0_#m#!iVsSg6d!Jbp!lG4@j>ax!$9%D;>a4H_~17vJ}4b|kV)~u z;>d$TD^?L7EjFkRkcTp_W`v>zhgk{QQQik_UKBeJ<7fts6C2vQhOA)9H>3s z2DbyXNAo0iRqavftw8Nj>CHgx(Unkp^m_wPd-QuFP7KP%Y-=!!eJ}JGJLG97v5}@{Ik^HWzJ<2{8s68rmQhQV?)E+Gg zwMV~xP3=+X*+A`4=@~%nQR!(w?NO9= z9xXblJz5lMj}~VGwa44w0HF4$l;p0eJu2M`s6ATT^RNB$|C|5(|NExyGWFM|4o-P> z%Fnjq^Z&p6`~Tkj=l}o78+E72LIdOi(C2m|G5(n zp7^1y{`~*%O*n7D*WT3U|JS$Xcqz8>+2MQEx8`_xw{jiOn&Vy5N%H<2~ofyZD;+9Ix_L-ad5CdiESo{|{F#XV9ACMcm5Ufz}-F z>w?xCZ%|j>!lX6F3(S>#!ft(Qju)6K`Rv{L)*LS|SKbV?=6DqtwB~q$*=4OcUcvU= zT64T43|e!%^z3U|b1J=-@79`ADIc+0-OBkCR?wpG zYl41-Z3Ha}(*!N@p}O@`1zibK1YMmDj0!3}4Hyv==VY>=IAK`uZt=1q!Fz%a->sh{ zXps-ntsfNhdjc>~P^psvfw$Ew`5@i;34#{q1LFl{9|OEa@F^9>2`W8u_@1ABS5WB@ z!1;nooqR{oqLcFk{qi}upMG1=BA<}^>A8Y_oqS8sqHvC&Up_AP({BnsaZb(_RC*Bb zJA$%>vjmk2-w?ET@X$R!J#(`-K2-P9uRGB7e!v-mdim(wProLp)XC|B;+%X{P^pvC z1Z4|f5mYLiDyUTWvY@MdfKvo5?hX95plsn}LD_o&UlLTh2XK<0(pkVFL8ZF^3k5AY zSs>_lC*VXurNS2ll}-mv5LCJ?@C8Ao+XKf7D%}S7yr9ylz;S{WoqSHvuao(L7Keb( z3W^hs6_h;yd`3{5lVb#Bj|V<2=-11R7IY;XC8*TP<_XFcijRKBqm=lxQO7Z;J-8Zs z9jHAh9oq=h9`ua82Gkz>HmN-*9eagI?Ll0Z)gJtIS?%F&8GD(_Y7a{Ln%aZKv6qy#lB``W0%Ae(wfqk4l}?9xV#BN58iNwMV7Pf!d=|VQ2pvs?^JBk4kR=YL6Cg z1!|8LZvtwMvTp!tk4motYL6DL1!|9euLf$5O0NNG5076H+S5}yb|sVIqs1$L;-mS? zfa0UY%YovfU!nMDQ7At8y#y#eD)k!_AC+E=5#p1Piy71&jV=Xhk4A;sqfw#uco!@N zYL9v^0BVm)mjJa#rCwHhR4UXS_4qZlM~mkIwMW0_@e_BoNApact3CR4QhT&`Hc)%C zDAXP;o(0q%&7T3(9xa{;)E@nw2Gkyvo(j|+m7WCD9+fTxYL7}!1Zs~Kj|XVarpHex zKFXdC6d#|`V}atM(qn+)qeY?kC{8Fo%03b(KKeZxC_Y-82NWOu9?8!m5}zy{!Jzi2 z_i&*0sPr(P_NY{-Jt`GykK%;dqqswX+M_t3_Gtbfp!R59s68q@7^pqEngi4x{muqz zkA9uh9{nBw)E<@Y57Zu&3bjY2`vJ8_i$d+u?_NOd(c+#!?a}WZK25&n zQK^&K%lQR((T@lo6kK=IM9P<-_3WyMFOPKuA>wgZZf;bkAAns zBJs(hgWBU=Fd3*lDjfxCkFJE;qhBwpJ^B@Dj}|BYwSWHqr_=tyv`eOaciNfLw(jr$ z|Lv5Arra~-mML5F_y1e>=l_c)pF4Te@Be>uKmWhw&;QGZ{@KtqLzlkEpa1{Gpa1`K z@QJ}c8eB1W>)<~bymG7m{{Mx6|1j|A!2JVT^Y{OMi=Y2r@oGDd*Qs+>4X=2$oyW_r zpq&mxOb!A6oG$OOFR})1aNlySF*Kcz(5=$NRp%zMaRb z(K**JY3K1GZqBtpJC7HBbG{F>^LXbu=W3vx$J@|3yoG+XoyV)dIadMgJl_5V?L6N8 z1?@cEr&1^Ey#5BWNlTBn zrgM1n{Ax>2r9w+jr9w+jalCAPwWX)uQxM0}OPqr_erJs?1P&AwFU%IS$ouJ6KPu?g z$pL~EPXs<9Xi?Z-Q1)@ahXs`i`w3bUJ|t*S*jLb^@IgWIyt#gLA3>$OUVilhf)<6n z1^x0C`PKIeT09)sOVBTGkzakEpwfeZJq48t?-f*f5U_`!(mB9;1T6}?3;LZ6yjxJI zFiTLWFjG*eu$!RL1Auo4T6D6j;Dfmz@J>P5djq=&D%}TohoHrMft>~YI(fUG(mk=b z(`Ji%GMM2&SGxn#1zig}3i{m**g?>u@HRo&y8zn@D%}-$tDsUZ+fGp2&cLq=iW9aK z6es+epzNK1Z3J(F9e`I-m?G#`7!|ZQ6&MlpI~kZPs8kphR5}0*2`UvP z2`U{23<@e0CJHJQ1_Ue~_y#aRz+y07z+&(g0rSB)0gJ-M?+W-m@O9vP0i_3S1im96 zE;vs>>47gZ`L=+?;9LRo2mYMNw*-_P`17F^8_(IKw81wWp!C2Ox$0~IiwCX;Y7Z6< zd>*Jh$Ug7|p!Ogxs68m{YibX&4}6x(Y7a^ed=98RC=F^4N`u;i(gW9VS?xjTflmUp z2c-u-4%8l$2DJyJ2R_E6_Mo&$?ZM)Kk1(k{_&sn9PYMv?$ab#a#u|9%Ww+)E@m_0n{FqUIx@2l`aKpk4i5F zYL7|<+Oz3V^0MNi(j`FgQMOQgcw~d(qu<3$ijRJU;-gZb_^9*(p!ld%C_X9`ijPXq z1&WVKsqDt$qeY?k=$DUVZ6rP^bx?b>cs5Xbw0H(kdz5`LPEQtFY4HZdM{$QTDLyI{ijNkB;-k1jfa0T4q4;>~2*pRG zLh(_YP<&K+Fi?DyEfgP>QrV5gM~i$uYa{VVoP*k6d!Mc@j&s>;<%v|e?fe*IF3Q>!S(DnfZBu7*|hjC zY7a_-+Jn+At34>4y^+gm4@zgh1k@gs&VK2C^5_4nr~Ur4^QV1%+DX$sJMHjk2Tt32 z+PkK0KW%vGf1mpEsXv|iljKRf>4j(=$U zJ>zc~|BuK2!T6=)zx6-<{Qo_F-t)>^xd(X7`R6^aykUEQH=BRn^UBMv2TmBiXG6~` zufd#b=y~O3SJ3my%dQ8GW76}=ySE2;v$>(?l{a4x96NN+2A)^${7r)%SKet_OH$x}nFFSC&DKD=#J=IGjn3E3Y3P z;5Fxl9#`J5J#YxnD8T7pJzAxx`<(1_F`|=HXUU@P30Pin1bXMd=>jSfZ&WgOH zd|(e?q5lhb$=GCpz$?oKc4u;;z$@toc(b|Ti-Hz;nYrNvL07^T1YX-duoG~+pi(EF z7nJSfI6s_L+R>Qn0!n?>FO7Og9I$D{u%Ha0^))> z0!mju&*VS>^Q+ebvjvnk`KW-!CI<-kUHu%FeMG=wu)lz~F8i>6xF-7vm|y)gU-KaW z*{h$%;=Y?Ku6~BW2OXfdtM(BPxB4k29}rNw`bl7K0X@O{1lpl+1C3q-Y$Is# z`@l3o@lK`+Ds?hN(4v!3LBCf6BZA_bOcr!?6)-I5R~QmhDohfzC=3eT6PE)M1(jX` zbXL^jGN7}fex1}Fl`aKp5077$)gCP_8NTPwYL6C$+N1f!KA67dQMN#P zHYpW~j~34YijRKJ1d5MJ&j5;#;!XpKk4jGkijT5|;-f_`D?W;IQhZc;5>R}!crs9Y zybTr(-ScO}$1ZkN?a|eVTvdB?MSlOR_UKorJ(@obs6C2vQhPM-r1t1ns6Dz8YL80i z1GPulLhaG-u|VxnDV6=R+M`mT_Gs}4p!Vojs6ATrvf88H!+_eO(nEpTqf(*vsPrJ9 z_NY{-JwA)G0ot?ak=-9CKKeZXC_XB6QhZdpFHn3`x(`r%RJu1%d=w`XAN}qL6d(Nx z#Yd$=@zLV$K=IMfIHnJu2M|s68rmQhQXo3s8Hs=%n`OYGH> z_Na6xp!O)+N$pYTbfEUA)Jg48sZe{gxD8NybVX(VtoA5-6sSG=oeI<*{R*{5rIUf$ zqs1Yh_UKorJt)2Z4WRa@bR0l?dKQ}$AH?1NI+Nmq()%|8#fOLa{#StFgVLb*VDbK! znG_%V2E_-ZLGeM{{V#D@@xkx?F9O8}zxTh0IO3zY`+vru_MrFv4M6Qd@BJ?TwFiqq z?ZM*x&oik#hzn{D=I?)&N$tV!{m%il2c<#n!Q%bvnA9G`-Tw?wdk}a3(?IP(Tu^(E zeg9KTY7h6s{Z9h52a7@N!SDT#GpRj@yZW=S`>Y(5(buK;R~eudhj#mhGR z`G1db)Bd)<|L@+Zw@&>hQ?HzQ(bRLNes$`JQ$IcR(5WAp`pcjH|C1??Px)6$iEo5VdU?REF1aG$QdJxMvfi%#K`QC z_mAv4^45`|$^UKginNN$$v2U7k~eM=;V(~-gELhCT}}=;_$}d zKObH<{FC7ahyUg9&BOm_`10Z39X@;b%frVH&mBH^_(Q|H56>8$I{cQQmxun-(9=VI zJapgC9YZ(v_x~3RePih4q0bE+G4vZl`wYz-+F@v9(i@Zh&q?bi{rgD|Pg*(Yum1ag zADy(5b z+%a(Dz&{wcWZ=64XAXR6VE(`-2j&cXU|_d_w+&35@ZTr=e8NvBJUQWCPZ*o<&nH|z z;qOhjc*3_QoIYW}gkvUre8K?}-Zx>F3BNvJaQv(PuRs4^G2Y+*_sjqO-`Mxs5xfOk zH8ec-y>!;0;}q zcEo<0C+!Gc3$EPAW$g&w(5-w8Xh-n!uW!(f;5As6wIg_q7PKSw2VNc;`yM-j=lzzI zukiJ)2;OC`dw$IzFXe>G+7Y}AUHL4~j^OVIRz3%`BY0gGv?D&e`LcEduRK>i!)5IV-rWW5 z2;RU3?Fe4+t$dox+7Y~gUHK%?j^I6OlXe8JB3C}eq#eP#%$1JDuJ${x`sUlQRU&uY8Ehz9wKkI9L2RuAuCzfg=U)i7S9l37WqgI6_di z@JYejU>R_@p!rLHPY9a77&uJOyzp^Bze|Bb1#g2Tz;6lO2ErkN<`)CMDJc5_;9$Yq zK=_!T?DK(x1aE`$fZq_5EzA+T4bDgQftzLfC9@sq_gvtkg15xkzyX4{!CAmZ1kF3y zU(o#Nz=s9R3;PMmJ_GoWpkF8Z3f>c^03Q_edn&Mxp!t)54+!2M!rp@BPXgXAs8rZX zP`2g-Uf#Oy9$~=9C)Xod0`hp^TIm>%^wQvENEVMyP)|)fSm-*3o``G9}G+vG=C6E zcigPhLG4le9H91iOUwppkFuTA9&ZVu_ULzip!Rqh>C;S?NO;fdp5}yijViiZb0$zo|pv`AI%HJN54A*#mC!V z7ohlf8|(xWA7xJmijTL!_CWDb_IAT#mlhvo3&ls-+W^JK8)OtHJ}R9G6d%nyDL$GP zijOzQ5Kw$nDij}Y1EKhM8wkb6+h7nVKAImG8oQMERAvXY$Gc!WPjx~U0Qrl8WbO7kG;U8_;9xb#fN)>pAQ+kwD@3t>{+1r zU_K~5nCC}A#x5;Bm=B5%=J{EVu}g~&=Et4{iVx<4;)8j9K4k3D;)Cp<_#k`iQ6|L) z*+KEaFFyq`c4_h9ZsDgu#x5;B+y-M00mTRNO^OfZgW`kvu{FphKFV%Td$wMW0pf!d>Aq4wza zE}-^!gWLwx9%T!)N7(}HX<74AAY+#nAGQHMA2N1n@lp28K=D!bjX?2H_6p&MYL7R|QlR!|-fvKQl>B4b&dZ3$@1^(fmn3@$sHm2oxX93<C#{mfoUkfp#!UV$t`3b})DDqN{;+Fi-rVtAKVeH*3%i<}O@xC6jhAckZG~fOarj zX3-TuJD6n>w1au7f_5;^&Z5h>tR2jnS+opj2eV8TT@18?Sxt+U0PSG*$D*Y`JD7)J z(fL3-n1?TD2eTL!oy(*h%mP|;4$ux}H8p7mvu2vKgV`U8&KbJ*26nK!anV_PNh_G= zbE10K$(V0Lim}jp^E0}e-=u{@HV0PA`(|}emYkSd2Kr5I9)@7{VPV7zE!EC@q z3%RTv%rXkv!MbwN4rYM`?O-<3q7#|4gSB`9&<DV3i&M zw1ZW85YP@*+#H}CtY7|h2dh+Q2dne|l(K_Ux<7+fu;TUwTEY6=2WSQB zS7-%mQD_A#ZZDt}tnA%^R(uFSoCkZ@$3pW6Z1jGdk1+v^_3j{1SIZ?pk!u5R37X|K#h3kM51e7j(4)}tA z(%^Ujr3;^8@_7NJ3!es#6HvPF8Q^mQN}J3VP}>5JM~kblNPK)SyQ=o++N)}hO2>fOqs6;{+N0mQfZC%{q4ubh ze>M3BwMUD$0<}krLhVtUFvtICD!mz~J>CX40<}k_LhaGw4M6SDqELI3eGO216n8C9 zdsO;;p!R4{s6FcOvf86kzX9#pbWdCj6d(OMDL(oYijPXK0N(G{s8lFED!m*iK3cpC zC_efXijNkT0mVmgOMv2|?DNq>eA45f_Gol5P)7Iy(^kA8*Pqtcy$+M`8*_H5d< zLh(`d_CWDb>2^TzQJjt9ZY7ep(yav=B{4UrC)E<;JsXZtSY7Z8J z+JoPq_MmjZ&-n(m2c-*M1ZodT7m(cRYY$2nya3GgKQ-c-)E@jcsXh2z@En)b9+WOv z57Zu%HmN-*4QdZc7d*>lw5JC%C_X%xLGeM{f~UEx_~3WJ6F~97;)17u;)Coa#RsJe zo@7#duox5{{4RK$N%2AHf=5wGd{nyNF$T2fK|E>A`|G)VA|E>G||G)VA|E>A`|6Bh4e`|mL|CYc1|Gy`_ zH0eK1+PcsGZ{6?z-}3kWZ~piH|MKVm|0loypPxATNe2t=;u#ME9V~c~XFLRSu;9)Q zI#_T^&v=kY2MccL8TSDlEV!j-@Kc6A>0rTAIb#LT!GdRE20vK%lMWW#pEK?TI#_Un z2OKOq*U#Wb4u8VQ!pER5>0rUl9(1r^N6fgLuitX8m~k7>!GbLnbg*Dc&A5?C2Me~; zjGKTC7A&S2Hv=6k*hN7H3$|3y!GcG8#tmH7!GbN-ck5umgV>~l1zT#ywOrQ0f{iod zYM_G!TWZENKnDvR(HZ>w;ZHhP@Vw99Cli0t!GiTO;|idI1w{!uSg^8Y@MDTU>0rUi z3OZP@n1T)#ti~CaaajioEnWh2uwWa`xESbQp~YoD2Mhf=*>bQ5I#{T536l;MDm@?Q zV4?{Po}3zg0XI#{Um7@&iN7KIKL`W3buEM^=HY&lp29V}Gpq=SV@ z`I*JXI#{UmNT7p-7KIKLT09)+V4>{8fDRTur9uY_l?q!97Bdb4I#{Sw=wRW4IUC?$ z(Vtys@FRzhak9wb90naMwCGhGEVQ^k(7{6S`vDy+6z8Oag?{%1I#}pe=wPAJeSi)Y zDiu0ds8r}+q0-%f4i;M61L$C(MJF9Bl)Wp^!9t}%2Md)79V}ETbg)qAPCy3>l}-mb zSSW6Lpo4`}z0_*e%EW%E;pk9DxnqOj#)F@s~#EoabxuUloGsXcOEO0&j4WNSs z&vMYg0;SVmW75F_i_>2RI#^(F`YXWxem7)Ke;N3&fW;>J30Mq1Bw#VvSHOH<^FaZn z(>L%9Y7a`M{|u--C~Z=E5I222liGvQ>CXbS2aD662Wk)Ir>_HQ4@!gDgVO2GFsVIQ zoc7H?2|uox5{EKYxduPHvrp8gn6d{8?5aiI7hu1WDh z>GVgK6dz;<#RrSi*DxtQ_?^BQC_ZfA>HHS>$B2(grxWJKY7ft1PS@zLUO zOp1@W919d5mCgr>j~0dEqhBv8K3XKXKQ2Cs6N-;Yj|7U3=K00%KPEmY zbx?a$D%2j89tPAN#R;`XrH25uN7)AfwMTIW1GPt`PHKDAXRs3AIOYLhaG-c%b%h8|?T7 zPvCJA{(vg8DdDhs_igg?rd|n%LVqmY#x|^#yF|b!=tpGYPuveONVqmWXofz0F zK_>L8U@R29*jO8B}^P(2+rYlN(uu));xs0m z7*u*P(1}5%3jt0Hz2cg6BG8dRi%vQ+kg-`DM%H#@(Bd&bM+U_S9T`-5G|-WOaLk$q zbYxJRla37fJrd~1pkFWR$e_3*fQ}6MBOMlIY1`{?~en3P7GRf(uqO8vw=KllyhFg%%r}6Y z1uc#P-Yy`n$xebsoXilo4Vp|BP#WwgpfspGD4qE_UsHRyTV`$qY7Z7?z6R7DEC#g) zi$U$dd|y+0P&)HvzNYq|G^jl&o%sTj+Jn-d_F!@51}0Pd-^L?5^Le25pmgSXfcErf z%9&3C#RtDLp9G2zerG-f6d(LHDLyEj`2>^VgR7wU;CJSuOo|UmXHwa<#Ru6z@j+=& ze6Sc4AN&KAOJ* zC_ehV3MfA6xg01y`n?1wK3cpCC_c(|Qhc;16d%p=&fpp1lTyE=_NY{-Ju1Bzs68rO z3e+AgI;lNcTmsY{WiJM5k4lBwqf(*vs8pyuS`=!Ju7uj7MWOa+{sQ1r{-@UBc|h&a zyij|zcn(l|w0Jg9dz5_^PR|p zdK^%Ew0JyFeDpgXC_Y*gijNkL0g8{Z$>%f0M~m~&LwwS6G=tis9CUJ z0JTT)LhaGDPbPiB^R5}}|Jt{o_s68s(AE-Sl-3O>WD%}sDJ)4y71r#5Z?gi&C=!IMH z^Z&0;{x6fCoBZ!4ubF)B!T;6I|NqO0H&6UW6EC0m zyA#iz_~nVmPu%kP{}~gfPJGM2%LD)EZ}{{7>nHsC2@g+LIpMYmKbUaUgkOCA|F8)k zov_!0cTU)D!j?b(|Kj)m{nelUzxR7RVBD)m?J<1s_j*pvwTJ@K|TA)c!80+V#=}daUc#eXeFrK5JCyeJP=m}#-9L0yOzSk4RmO6^h zS$(f3jLmk`RG=q}#dH*(t@2k3^yjvtCIdZTY@DO`Y}NNV-Lcu4bh=|N9L49PHvMh^ z_Sd}EflhZbH$$g8p8h7C?$~Ve_&C+~I^D6d=J9c=?{&Ik|IFi~QJa3Z06TBq%fR{m z&tXl?duixif46|ktgFs*fS!3j8vKrz;i}8d64*sez9FD=-t&A-r#mbLUw4A}d3+q}vNHrM&f{}dn|`$be&?+N zPIp2#g0Bi#3{DfU7<@%Q_Pl5Kno|XoHu{ zz7FVgr);6qoff^U)17{=1v=fS^lG5fok}kUI^C&M=yb>9H}49d)168$13KL)Tj+GB z-%Efw{?Ad|V&FhQzvlz91^o&i6|{H(aDbr2^MH>C%03s^Ur_0Jh~s$Ivv>}JPIu}( z8~Bh{Y4I#zUqRQW0Us1pdIr$xPK&|^oak5BTTrQA)9Fs7rvrOAQK^&n35s*Fr=VXa z?-lfWDzJy3(o=x<2wFTD=yazzq0^mugid#wKN0A3r|gA5r#t;R>2#-GC!Ow8>ZH@1 zN{8eKKh*p6d(N_4HO@hIw?L{JQ65A`aJ?DJ}Ny7C_aii7$`paoda~d)9*n* z@lmOh;-f_;#YeyVn2^6)Af>Yzbh^{x{y^=~uTXmww=Yn8RJspPdo&`{9>whq)E<@Y z1=Job3bjXZLhbQx*&V1oTHF(;J&M}{s6C1kCaP3%LhVuZETHx%j{a`?)dIQ_YLBjV z1!|8_}vp!ldqC_Y*o4-_9QjsuDhvgh){K$jAq#5t%vh@1O5@HM|P&s9)+a6R`G zCbb8pb6*2$4@&251Zoc!yR7!$ckatfY7Z9Y{v0^PZ;ju%F9Ed&rA=xNN`u;i#kntX z*-3s47K7S@xS;l+G^jn?26Lb1YibV`gW7||p!Og;s68m1yPmJ9Jt&>~98h~uI`~2`0q{rE?z#iVsTXJ_-~cEY5ulC_ea|`v_2cusC-O zP<-$^_aUJ8pmgqoh$B9VoBJSx+JoM?tAX01#ruHTqiec)Y3)(zDxmggaSW(ET69u- zlzkUadsKQiPcA)m?SExNI6>5*-gxaHDq4p?Fs6EQQ4X8c(by9n@coR^2 zv?$ab#oY+h9?f45)E+I~0Ms633$&+WOP3WN{eGWG@zLVdK=EM<2gOIFS1~C*D!mdY zK3WutkA5!$ijNjA0g8`)h2o>qrC20BS-hA*?NRSip!TSA2~c}fD%2ibT>#V`l?t^- zrRM{+NAu)&)2|lL;(0*r(eK$n?NRADK<&}uSwQVkoR`%eWjm=o`W0%A7QL+YC{Cz7 z%J#C_qu(=u+M`k`dui=asZe`VdJ0f`w0JU5dwl$a+N10f0oqfh=Pm?_k4ldRijPW< z1B#DI=L5w@rSpFUfByf)@BiDHKmY&Y_y2w4SNQw?mQLRC@BjTx|NQ^||L^~MXz-rF zTmD9W{{LV9{=ffY;E`Y1@BjPR_&@oj-~azt|NK9;q@Bl&d*_nju_f(19-TY+-5X2V zc|7k;+Iig4cV57xoyRSGC%=eeNjs0{HE8E?d)~?K-dNJk|WyoyRjCwDWij z?&LRYENSQQBnRz0R>__GzK$jBJZ|YbPahgv!p?KAG-&1VP~OS!;aJkj<8cjIc|78G zp30<^#}j%dzinelEAPX=2|z24NAJ!PfmR;-?@oTF#*$VZOXkjFfL0z`E@Qnsy%hD`@8_`w%AWJY{=XJCC)0=RrU_ zPxA)@?L5uT0or+*pAEG0G`~O4&QrF~&hs|d4`}BpTWIHb8|(wL^EAH?ve|jbcF@Z6 zF4!Ary1^sRZ3<;VSCJEjX z+X91v7Pki`3f=}@HXsnVV1nRn;AFhOq7L37=yw|?;{?qEzx!Q5rK7<4f)<7E2;MD2 zzC78+=*7d~k}uJ+b^HzUH?D%m*h6m|y-plP?LFU;YAcl7Q^x>wrZ9w?VK_ zKex|gDigtI7;Bw z3FZmN?y|W8w@#BI1LCLBFej!vt@GG2r8Z zx4{a`AG+DRUs8KidN)velr7XA?}_C=?a}XDK<)7c5o(XOftS@DW#0nS9&dx2fZC(^ z>wwy$`D=mNqj{nB=;~^q_IMiz`}_Za=7r+pJ#i&ae7p^W;-mR1fa0Ui-F>!Y@zrln_t=ayTr%Mz5ILzwMX&i0kucJLhaGKPNq4szioB-4w%^wfY zo=pqjIH34wUMN1AKL#j1T09mgKHdgSijU^!1I0(bURHd(LAPaFaiA8&($f#Rd=Lx;x}7a#8lCX0)Y z_k>V)V zgZVq20*ViQ?|2d@K9~=R5BJ0!PcSJy$Zk@6xDA>VAN=0&IF}V4%m>8>*>^m~r1;>s zN%6t_9gi|8KHNHYJiO`8|Nq19|NHBI{(sZI|M&XT|1$NtU%|is_nxi(_y5ix`QPc^ z|J&N1|KIfc|F{0%|NF+k$pc&e@BjVb`0M_!o|GDUelgqFD!lmXwUIb z1noJVs-Qi`##sD3m$m13_!jeic};tc$0cab@lY&&mPvb#Cw?(6o7c4Gc*GX38@hK5 zd(M^9RjoOmu*J`CRcnr?C1}m@7%YC8No$UcvG^&VHAlUJ)*O#c(3+zai=X7O)*Me* z6V_bk*e2~co}>9Q(A(+HwwmrO0NZ4b1D^Db1MBl(3;bt(3;b)(3(@}H9%`li^9HI)bEwR z2e&A7vX7v+tAGy(`t`EC1^r$QykAhMu$Q1x;e7(NTFk5OHG2yBhV0S@R7Xa@TbS2CZlzkpBQ_wGOtJmx%Xr7nNYu+WORM=He-08qO1^o)U z2>Lw@c!!|UQ-PfYpGD#Af=W-u)lQpT@#1;S3Cjrw1#VrJO6x1v1Ab1xDZxd8{ zBCx%nIN_~=eueD>{hk2)x}ehIfo%nq3cn`Mv|t-SzfPtJT09PzDroUoV2Ysmqk&OD zamN57f_|M$7W69&3n~?c1T6}a1pOWf3<@ee1eho&P8bkWdN43SQ1)zKyr9wpfVT)L z-5(eyXc73M?+W_e7dT%~={~@B1TF3boF`~;PvF~v7M+|cXnwDud;jQLn=S6a;2a0) z-5vO*pwd~u*@8-U1Aa%)m2j4z-(7)k2r3oM6tpOOUC`n#z!`$Kf$%j!al+|>es>1G zD(F`@O;D-u6+xv!?NR9tK<&|@aEh1dYI~seXmLBB_9)It?NRnNK<)9K5NeM~h1#RV zA)xl?cMzaGo0JX!#RsJqZUl-CN`o(W8A>mFg-P*2>4mQW#RrQ`iVuD-{5g~2gSZP{ z0*ViQn-m}XUicywiI02p!WX%!_F(bC4M6R|^@TqJY7gQrB+P$Qd+;079{gVTJd@gk z(hJuEwFjj^?ZH)-)gJsdsXh3;@HxJw_F(bCXMx&-t0uJvrA=xNN-tc;WwnQUBB(uB zyzm(&wFkc!J`L0!lm@j2i$U$d?}bltS?xjGg^vTZ2fr6S2Gkz>Uic_bdr*4eBfx>` zLFt8Sfa1ebdf`Jr@lok=p!g_m1yFnxHwF|RW#0u9A7$ST6dx@*DLz_sQhbzsD^Pq? z%E!3=i1?(`t7?x*ZvkqL7KPfQU!nG>^k$&;sPrbF_9)It?NRBCKrY?)E;FEwMW0-2WpQ>ozxzcUIn~eJu1Bt zpgry93$Fl*k4i5AijPV!2a1nMmjT5`r56LmM{ySb#Yd&*0mVmG=K{q?rDp-f$J^j6 z^bnu)oXw#2Xw<7}kK)e&YL7iU z+`Oq<*5SG z9*@MeK-!}?FH3t=>ZHWq0?qrHv`3}a0BMinye#d}uamS#zte!UN2NmAqtdBB+M`k- z?a?CeY}%vWD}l5}rNYhrbQC9~Ju00Hq&>=>1f)GGodD3DCZ*$n#7A-CfW*gJb}W$i zXmJ#f_$Ye>koc%{B#`*1bSRMcXmK!*_~>^~$#0(}J`q>TAnj3ae<1DA;s7A+QJj;s zM{z>h<0+^H(jH|CX^%>UYy7n-PDp$7+XqN{wAdR+dvxU_?a^W{AnoxO^aRo#Ejmei zwCE)5@fbKsdsONq?NOYN_UN|q&@oWei~o@UtIZU<$aa&D$m6C|F5e! z6W{;ufB)}vzyJSFU;jV7@BjZvn=9LVtIdcuP5=GBv)hyu|F7bfe*gcn)(cuc)cS8* z-`e{4|NdV~zyJR){rCS`@csWsScds()e>(0BiV-BElZ{V*@m3rCEWZ+vJJTpGs!mO z-d)0uIFfD1O|@hqkZs6~m`S$bK!AmDB-@bNAeUtua*GGD4Ot6ISS3fY4LR(2O|~K1 zBa>`H?v^F2k|WuM+@gVOLvG$Btdb+yhTN5bY(ws&CBv9x8?xqv_p=RIW=n>a{Pume zp?f8REJN<8C9I1|5NHL(MzMHdJ;yAluMmPyu8c zD!UTMHuM-c$u`t{3Gf|%t2AGN>4#@GSxJi;n=~1pF?35BR3Q zF$jzmI0lQ~Ve$uL;Or+z5;m zI0k{Q3Zx=1Lcsju16+2Qfb6`%aDiix$)y737w_k?VFKm@UlB0Bcn_1I0_GR*1}+gW z9~dHFKJaA$^MSzv<`?hcHD40&yLbmMNZ=SOehK)ZfYQaU0JQ?<0~ZS%kX$xU;211^ zp35#0FrUc)0ojWim|Q3zd+}DFzrdMTycy^xAUjYaa10i2#(du<^BGh-!2IHkyyOA_ z^NTkCeFV)v4V*71Tj(u#41_NT%3cff5|q6P_`Kkmcnat#XnqCoIYHUWfF6R!pbq$~ zpkJZ8pn2glg0h8ff_{bb1W(J8Kv%(Iun73Hpn0K-plmPul;AN~2y_-S{}}K|L8Xra z=L#MJC!Y{J20|ynV<4O(XnsD>QPBLuz}bSb9|AfE%6l6k7wd;WD_5EdIo8avVDEp<6*fINP9GYJCOFM^fn;v z(flny+T)oJ(jJe2koIVP4v_XJdp3~vD0>!=_IM^{l>YX;v`33K0ko&d{7fM6(Y%oO zXkJKsJT2D)iI1{{#7DnE;-h&X@$rC62NEC63yF`iuLTkxkHIt`@zK1H_-I~8e3X49 zkob5ErUHqN=BEIOkLD)>iI0AT#K&VW0Z4rGI}u2HG(Q$dd^{jR;-lYjK;onMaV5Wf zkNCu|gS1D#z9jAO6pR7V9#76FAnnooNFeRe{0JcJ(Y%oMXnrV=_9$COdprh%fwV{S zLfWJGK|tE0`C1_DQMN#Pnq&_E5+7v?iI1{{#K+T810+8B?GGeAns<`;cqXcW#7FZ& z;-l<7K;olpA@T7{^a2teW%mRUACG~M_-I~8d^F!3NPILeBtDw&1|&Y3?+PS7ns<`; zD7y=g_;?ID0f~=Fg~UhMo$yP1;@3giqu-7|+T;0X52QVwoOVFkqj@K3kLJsOv`6zo z+M{_P?a_P%koIW42uOQ0FQh%1F96aW%?oJ{<`*3S(jH_7(jJb%qW754o|s?s4v_eu zG?4gk3<8M{#~_gSAbZhaUX%E6CKkO3BtFOvBt9I2MU6}nA7p2e_;3s|NqjKB=rt}& zd@vtKd@vtKd@vtKd@#RgAFoM#kiBRRkoa&6GD&=pok`-uF<7*l%Mu^V2NECrF51N; z@xlC}9mpm=%3idCLE6LlSoAWG_F#U|D?r+V-$gG1X%FTXZ3faF&O{*XLFuCBnWR0) z&Lr*OOe}hiN!r7iShNvHdoaJ~Ss?Afd?4*X_M&x6(jJb%qP0NUqj@3i(Y%+@o^*cE z(?H^*?A1Wxa}KZyNPILeBtDuK5+BVk0}>yV3W<+O>wv_^WAGG^_;^4TeaP4U&(wea z@4vNeX!}gtm2IDF`$*e++WuABS#5vR_M`v%|NF}SYx(B#GxP8N{m(P<@Bj5H>2b#X z{lBKK|92^FU);L&JFS1;dROZgT5o85dVl}_vqhbX%3B?2b*R7i(cD-(Pxb_7^vDAp46OIgtIu{krs7F3bL6 zF)dvSWPh=7mTmyDzqomqJ`H4lv1FF61G2x^Qki6baa%84%_RGa^^-~V7fU9S>@RNk zK=v26=+b4pCi{yUe(540`-}ClbP16C#r>K|_7}J4QodRA*6c4fMj-o(dvEEZOtQb& z3rimcvcK3EOXmaZuYBMRWP!0UmOjKJ3ydYP^Z_6XjHMaK0wWKBEHGB^()+nA3ycl8 z^j;tfj5W2C?+?8-3yh7CNfsEpB#;Hh3Jzp}u}kurEHHM-(z|(sEHGu?gI^X{{NBYN z`%Ce60@+{s6|%qBD@*w<(p$5?l#R8Y2Xy`b#z zz)u9lIk`^ofJ^{>EO-pY0n-I#`IX+b;VQv1F&em1(64ZXp!re26u|>B9QeMV`4PZmLGw<&Cn#k&cH}PzfQg?cnqA35Oj4e zaGBtl=mZQGlr3B;D7zytOz?m>`HG-~-G+zl^EGWAS7$|rQih+v+%?kqr&6fZd3Ysqj(jNU50BH}$ zpza7jdvXlw-USjL%-6jGBtDq0dmBi6ke$mCAC5sLi4W!ji4W%M4)dDC2ibLR0ErK> z1Bnl3qHaHv#0S}Rdw|4;V^FsbNPI9~w;M=&Fkkm7koX`wkoa&6>UJ?nd@x_P14w)@ zpGo3_?7CN&BtFQldl^W4I1_=y2ibwd2c?0;2c>l{W0Cl{(=$kWI4ps*ha*w<67QV$ z;5U%=aB}KiWRmtEyRHFfZcp9wK-z=(x~)LkgZaA6K-z=fK-z=(y62drJ)DWUXMwZ_ z^K}~l+LJrGZXJ;LXnr-2_^9-0An{=v)U5&%ACJLPK;om)6+q&n`DH-jqj@KZkEf*$ zNPLtnBt9O4B|ze%`Nx68N7+vRiI2yC$t{VG<{twRAI(1sBtDvVlK5zTK9Kk*+shIk zkHN!0;-mQofy76p4*`jfN`=J7GvQ^4k7we+lGV2mpUC#Aw8!(|RcViYg|tWW4*+S8 zXF^DOG=DFU_Gn&6d)N$hcLQmU=7qFJ*+SamF}Mpzdo+IskoGA1c7XO|HPqb(BtG2p zfy77Iw=zk5JO*=s#7DnE;^Q%x1tdQDoed;Dn!gE1d^{jCfW$}hLgJ%&FH3wh?kLI1EJ)Vz=K-!~uA??xp1R(8E_IM!e@feH)(jH}x z1=1d6J4t&y6Jvn1NAp73qj^3K+>-Waegu&AD0?`N_P7m(0%?!tozR|?xo!xM_;?Hk z0f~>YYk|baV=xd%d{pWr@$ncqNqqF%A4q&W2Gu~~;{g#8AN}?L5+BX?0umq3gpl~C zR7iY020ehpNAp7BqwMZL;-gX_@lm#r_;?Ju0f~?2s4M1)Pt1E&+M{`|N_&*u1xR~5 z2144Sc_Ho5eCM`>e^t=Fu(qJ;pQ^5{>e}|wig!!bmfl!AsP&;%m$xcx{dnu|wr*Fx zwfx_e4=k)bz5f;b>;wO6^*~`|NkQRd=Y8t)C1=gA>H3oyU4Q(O8CQ3`Vdjh-x9)y@2@&h|7EygcgiF_#=K{leOsfycc9Qw3jZ z{&f_*eCj`V^~rB_+0)CXHNVwaZ?)*H`W`R6hPS%9`K?;=TjI~^gtscbz4<7%>;~yu zQ``6W8)QJ)Kc01d^Uta!_u9#Cbz#{*7VJJVZ`Gf-`uj8UR{eOZQB7~vvfH+A-`c*_ z$DOOb)hPUB^G~bb^%k6lfwlcFJnp^v@m6!2-|DRATlQ9ck9#W*mN!V#x;(A7@@F;a z*jxRs1wX6)wf!zW{%1A(>E+)oDL5-XtFbM5r|RQ>+xwN37alzJlWIW@`u3~sd;IS@ zr~RXq<>a^Gw12d+ocvat_K$cwpY#jlv^U?*Ej;ZfZHB(p+&LeqEGMsqi+QV$RF;$9 zY9McQY`LG_!n%mlKK9tbYRQe$ueRodd+@lQ)oHzz_u!c3pH+*N45#7vboy3bZ+@%7 z-7UBY`_)#T@C&Ty)O@h0aAOPJs;0Kzfa5nqMW;V?;`H9CA8&QE6DJ<`K2NXs0>AV> z_o;!;87KS-eXnB&t0kWrKIEz=);G;0F7{DKaj=R?` zidSV8YHF*GH|wUZJ@%72}-_QK;o||AUf=C6|{BDLE5g|DRp_pPdMzKp_j>pKB?V8}DEKpq(K_;GzlCV61UGqFJP z1H<+0ndE^XPea#t0P?_)$B%(LFytBG`bs8wV92AsH=c}*S|@|<*i376%8A&(L>$pb?k3ue;%z;JyLm*s&W4^7t> z0(oG_)6jKCfIKkdX=s24hWUEvy2DKJ#E@s6>)r(N#E>Vo>l%SPG32>mAWsbO8^{ww z%&&Wc%RY1T8U4EbKsN!|>-GWX2^@n!R{_6)PYak|w};ER2*?h6O5lL3+r^}_fcbU1 zQToXyrR#PxIM)HEAXj}t;1mQp37mq!IRfU_y~1lc3YcH_GH|wl`9KE&^MQ{G$X@pn zm$es=oyo@p9wM)Mo=H0arR!b z+Ux3o0ztn_?){~pc_#PH6+9D5fSU!)F9PNWDqRTtLf{$wy2pXpg2&(q;OByVg;|2; zz3gX#2jsDm)%V_X)USgZ9Vq@WV5Xq#`M?c=vV|FfvW1@to}7n)>jlj}1pGwM{DZ)C zf=ZqISnwD)nJ#z?gdYhWg9m_X1!W6A6qJ1raE+ks`+*+_9+10%X@VBL>}o;tPNoW4 z6s{69e^AmxzNAr_`v`6!kfV4;1LfWHjA?;DN zZ;Y5+5y&0TLhmjs_ARkAasZ zJ|2T%K;olc-!1XcypzO7*+Sx@>{=l4(eEH2@zMN1An{Rl4UqUKTS$ELDfhicX%FV>4*+Qovg`K)X%7|yX%ANhe;e2`uLERgu%H<0*n zChFHRNqjg4_3MDd2lMqCfW$}HtAWJFW3U29d^EobNPINEqGa{2iBFU+W03ZE3hIEg z$5XHbNPCq16p;2P+ezBv`4G|`%`XDd9?dTV(jLt}38X#x<DCPnZA4^2f^mzWk2zo6D~+pIZLy@{#3V zDz7g8OnJxh(z4V4@BfV{JyZYvzYqTX|Bw3L|NHR2|KGFqnf&|z=eO$G>f@*M-~U^^ zFw2k|dE3O&)eEx>xsA3>0V<4W?~e?!3|TmVEJN<&Z6kO|mLV%*+ejeGkgc$7IFMz?R@gQK$TDPsW|C#d z?Y?aolPp8_Y%a?(WM2fb47ppk4dSvaLl$TzS%xgBZG)L)8L}pGS(YIyVp}znEJKz@ zAj|NJ)1Lev1x&IGFJ{sU$TA!R^aQdDSu5MR16hVF&}}_{EJN0QAj^TE(-P<^a9RSN7C0>pySc23zyZnR zQvye)VF#1W0;i>67w}1e1Jdv+aIV17$>b9PrzNlHByd0)Ug5HH1P(~U%Rong0}?n} z;7~QZ#H5430SSCu;OGR}3q-ZyCCq=U$$Z0$yri82j!{DcP$h6!8lDF#1rAG~t-t}v zYbpc|SSIBHrzLMtCU9CB_^7zBRN#O#Yy?UKj!wg~KpTP6((oKmEN~_Qtp$!wph)0= z7tgJvs~K2p*6{OnxDF zbQS`$1y76cbHM{5%o030PXIp?G%wsFct9QpZWKHqj{!3U57nbU;^Uzb5+BcmmnA+P zgZV(>i5I*|ByK!n7{Ga)2Co|bEY#K#jh4QP%}!!8Ao1}WT?r&U9uOh%@lXkgkEcaQd^A59XpT>yIX(@Om^8;Hkob7QCNOD^Ps2pc z1o6q4@Fi)FXF^DOJUPB3?eTz21kxT4*m!{UH0>5XD=kQTJUT++<317+A5Y5|Ao20E z2+i?n7!4#oo)#yGj|ap_;^Wa71tdNm10nHoos0kyA5V*r_;{#>0*Q|Yq!vhgJUT++ z<7pWH9E;CDAn|G5Eyv zE>Ba_63MH5JTI3R(< zhoket8(fz7a6n!-03<$SDUkSZT3&dKN#er>d0`)r_^>nri4Vshkoa(@Uf9iLi4Ujc zg*_#!pCCS(e_;=Uw1)%s!mB{q!!gJt?co^Z^=S_$Czqu?oT)(C!_vrQv?m{EUf_e% z6NwL}<%L&(#D@d&!plJ7!_j%+rM9g$7kr}Ctp)tK{_}1BSpJ{NtIBqk{ibY6S)Y=I zlKCaqwOLTSsrWw>|Dd>Y>(^S{TC}F<-?!;d@|mLVmf!H_{@1F_U;1C+OND<^_?^P4 zvo@Ud^Rq4}*jw-v-}lkt|5x};z9%E!zw)JH-z{D}@ch30sxPjsIq93J`wd?_|C7z% z#POwn`8$37@;jZ|{7!va@J{^Ah2y{LtKVgd=YOL4dpHXIwgqohed4#Z)$mrGj=j~d zPW`R=UR>M%_-`hv;dkns=3n0zPyL;0s!#f!s6LD5cjPD4^xb(6pJb`;fZD#t|JeSH zoPF$<@$jkt;2-i<=P#b$;m@BCUU1@f1{PgfFtYjA-GUSH;qTP9`G>w>#J7i!%J*+I zA1S_*u;20Dp6}uOSo04(@YH|Rob(glsdZVw-||jhI`30wm$Vsn)uA zu9)$ItG{*K4`*I7{fZesKJKUE?K0q!tA<_0OULojujHlvA1?pN)ElQ?J>qA7`v3ps zSL6D`8Hc?tjLeEVPv?#O<8gWd7Jh<sPhWG z%lf2`Igi|U?Dw_>JLE&&iXVLDu^;^8!_)7izu)5FxuHd`@bJuN(JN{y+7#3@-%TIb zA^9-M?+D)qd_wOlI3xTm!4|KV3;Whyc*1%azW9-!wD_G^2q%f{S2^>n#$%dJ`6DE6 zb@Jc+IDhdYKW_dFIeESCf)m2jukAU1O57=b_R0@^;ydyC@uTM7k5m41&i6#)>4eXs zl`}tZ&$Qt8gAark9{+vcd>DA-hs{5!Q(g)Dq%NxMfBea*IqoNQ%6p2p;`8na+l6!f zgJb9XNwx9(!@`t=tRc!$~{iN(3y=D6H-Sa1$b6)VL4b}o1 z)#U8>zt^ITtD0?`a@z;`_s;ts@72E(@oe+2;^cGA-&H^1FOd0yV;j8%=lsLp=_CAp zT;$(3IpHVu!SDaySM^`3Hdn2w`j`LvfB&WOxys*GE~@;;%6tD6{rmr?|Mmaxm7a;O z|NniPJKEgb=K3~QwHe>$t8E6gxu8wUzy5zF{{6r1MdzHMfB$b-)4%_>@^^V2+kM(^ zelw$Fn$76W-6i>rn2F}c#84i*=_16&~> zE-*#FRbKObfito2FqcghP`dDK;CljRVqs&+%B_={l;*1MIzZ{dMy{GDAa3Csz;^_c zE<6BC5U`lZw*|~Ee2vL?0gHie3HV*OpUF4@iwk!H-xTn>@Ks=}fYOCKfNuy`T(}Du zBj9)8E5O$UlrDS`7%iZ5VFPfvfYOD}1ET~iF5C)yO~CKMjlf6&i-E5S_+9uMlMw*6Tq>Y+;RYtd1eE5ouLxLNxR%LKL07^hg0fcwLj?V<0=_IL&dFdw z*}|6uEj|ql5|r(0z9?vM1>$Otid(_pVh6ge0|p9OdI46mZew`#fTD%=de6)BQkoai+79jD_ zqLai&S56Wi^$3ZN=7q#Zi*td*NAt6R#7B#BfW*gRFdK`+$Bmjn+M`}ylJ;nE7LfKR z?j|7ZQJj$WX#RR2?NQteAnj49leEWUFdayHR4SxBDizWml}-cF9xV!KkA5csX^%>$ z0BMg(Cj)7ZN+$qmk4nb_X^%?B0cnp)#{y}OH`y2Zt z`jWIqaf5)gNAa~l+M{bB?NOq&@n55=eU#C!{?peH=)8l>Hcx_NdfJ+M`k@X^%=D2GSlaJ_Mva z`h5UMdsO-$koKt5%V7}ch{^AOUXy3I!))cq(zNtXg6gS1bX+YK#r+wdKAZv;{F_1OI zO|fq*ldLK3-hC5+tSOH1zHva-6gS_#F+kQ7H{ZUIK-Ls1XWs}QYl<6o-*6ynin}V4 z<~0?_n&P(HH;l`&rr1n@tSN5)eS=F@{hBr9GTJwUtFooIEB6fs*i!ktyl)VYHN`C& z$eQ97-B-&bYl;OH$eQ974P;HR!19``DHdQRSySBB`v&p`SyQaGOtPlfW`V3J?&MsS zHN`f|Bx{Oowy%aa$eLmW@9P6(O|iE3RRdX5?9)KjluErUYf7cPfvhPl_5!k|^xFf- zn$ludAZtp$U4X19EuITxP3gBikTs>!4nWqFN}Xg)sk8#fno_BdHAP!kcKM<6?7MLdJ z%E{G&vY!T~3Mv(@60|5>DR^{*D+G^$Fhx+Q@O?q0tAWXaN}mG0CumWaBMNeeGC{UsB}K?O+kwf0b>RI3f~Y^dOt8m z(Bi$o*9FB1qXm`T4O}j0{!U<&pi(Da6I6O97Dpbn=v7~Jpx!%x5rP)y0hbAiyB!!V zC{DOk(3LPuQ1)#=+T)qH1xS1Jdn=IksMJZ?qbnipQK^vjC{9RwG%ut*%AO0PJt`H_ z9xdJkq&p@6sO4mjP*y7M-L$`W4b1m6iZ$k4lSyv`33Y zK-!~UA??wkkoM?TNPART2&6qK71AD*?l}UaJt*Dt9+386F_W|hzk8_c-=#e$4WvC- z-19b*vhkJd?Bsahaq&C=H}N$lmiDm!&-@-Lnx$dr+E5+Jn+P&oW7SP#Q>k zu()Rfle7oFnWQ}^%_QwXX&~)U+&W&9_ULytkoIU%NPCpM3K*pxl?rK(N>>21C;1E{ zKHQ~y7BNYDv{(luK5XGk5+9X5$t3a7qLBFL_fa76(c)u3;-laBK;olPCy9^Zd`;q` zUoT61^!qSMiBFV1#31ca=>tI8qf#O5(c=9;+N0llfwV`9PSPGN3TcnB?*Y;tE#CQO z|NQ?qRdcI;S~a!m+f^g~mHqwy|E>Ii^1mscTmIA2`1}6{O8;AFL+LZ6D@uP;`f%yr zmEKnRv(jrzTl)3?Gx6X5J2U_O-|7ANzr)eL|Nk%i`G4j9Y*6l&`a4Tk?r+|pfoxE2 z9sU)ImHV?nxpnGq1+qc8b?R>evOzidnPh`217LyXBX%Gglsl~c zdM4SR++p?C0okD3I`z|mY*22hOtL}QU-j2AY2KiLY*6m7`e{tELD`e_R|46fte^VH zKsG3QGLQ|*0<53HBpZ}eop&sN#kI*`WFz3S@&S&Pg_?vTK2C zP+biMvO$$S2*?Iish4GgDx2?3*v|%y#eod6K-JqH$O2WVzyfVjS_5Q*s?otyL8U@ZfhYz(Cup&PNe@B4g}`S8 zmGZ@v{oMtX76G3Tv?z2F^edbvXwf(5DqwN#5#ZAT7T3N9bP+JW_8lyKs>xyoogJWO z?K@ocNdb#%-v-VV5Fhx2fVe;>;j_SDE;~oy7_5C0=qR8xmz^!p!Av>`_+8t`Wgiz% zy7mCjUO?$uzPPggV**Oo?gQEh=m}H__+7h)Nu_|&wY!0~0X^mwa){^0!r650IdZq28smy23iRy&1(t;#I5CPDErS6 zP#P!@uqgcVF9po6T?fn+u(Pyldl?rK(O6LM;kK%;1N2RlYv`1G$+N080K-%Lmmq-t(jHw+ z0@5BW3Tcn#Cjhjk$>Mk*@llVH!A=zCB=J$HkoYKjERgtkbjARQkK%;HN53P1#7DoQ zfW$|oqYy`YB5nkOv`3@EfwV`9!+^9$aYEYTDHsf-Jz5+Jq&>v`4>vfV4-8UY7Rg*UQo#mG%PC9xe6+ z(jNUfNqbc4B<)dYS0L@tVi%x`zXbgXw5Mr5cLEY0Ep`SHA9t;j#7B!l;-g<7@zG)j zAo0;}J0S5NqbPb<{c(!4|>+T4WvCNUGpZ8_Mmi4 zBarqWE|au}W3c88CTS0{*Bk)S9+V3E(jF`Z=K4#(@0!<`q&+ANq&+BIvzrO+Nj}%S z3M4)#4J1BT3?x2ST=NQ-B|caTBtBRSBtG2PYhL2A#0RBoUIr2$ECv!EEatMr2ia?$ z=d#2HrE8uqS-Fq+XfcDd2a9VqbJdUiN#lCWvq0K|(lr}_vW=Wxx2FY`~M%Uyzex>|NrfZ|GQ#G#qTQCRs2)M6BYkZaaYB!DrQ#vpkiXh0-!m)*y9{v9R*R#L4C!VP-UHLluE9>-` z{y-KOcjYq_;q@#qR&XX+VBD2~<^}c)f1-Px1?H`jLG~B7>oYXq_3STh*Fg3c_t7)G znPh))hh>ue#ZC1LMR`5@i<>Ht{l)G2Ob;g6U))sB(2du#zqlu!Ar-G@e{mz{vg|Kz z#Aisw>)Bu2ErIMWcHT4RmaaUI{l#4w$o}Hqdxkn3$o}H4e5NCi{lzwXhB_R`{^G6- zWPhXx?9e>@Sw)Gpy|c*q@UP^peP5jzc>aPNX3Ed zFZ^!U15EK(fW-~_f$t0W-LMOoEMRd15jpTZ0lyoF$bm@$7B}nwzANB&!z;i<0i}WO z2q@h^9S%$ou(+WC__l!G4O@Zn0u|c8-aqgy0lynq^#{fYSlmDa4t!I<$c7ETSOJTH zZwQDBj1f2n8`g2z*9H7$GFspmWOBKH(o9APDy0Yqz9!Jl4XbfA@~A87aNw&BG`b2H zA?SJqaG9W9VYr|;;Zi}R!Z1N`6y?BI1YHS31&_fJ;1WTlPXR*&&DQ~67E~$>78Lgc z@FhXNj{$=O{R&?cwD>qsD`@di;9^194+8@Ql?oRLDt!w zXz^~KM$qq_Kwm+nLbag9dB6pNeuX}QN^b|w7gQ?r7IfuhUl3I4q?e%5TY%3CTD%SD zDR>NS!Q$tRTJ)+O4%9mr_^hDPIY4(orL%$02wHT~P0+8C^8_slT?H))pB9uYbP;ql z3;2|v#hE~7LBBTvpAN}!{l(y74Nf)>53gP`9@ zK-#0l$w1npUngmgN`dksgU+4PDp$7JGgY^@6#Ur4g%61 zEjmei^y?(;QK^%(M~k&U+M{0~?a|^uAnnob03hvAX>TCyQK^vjsI(7|_9(6gkoKsw z8<6&BQAm3<-vvl}wAd9$d-U5GNPAT3WoeH}g|tVdodDX?be9T=k4mZR?-L&_3W<;6 zgv3Xs6+q&n9wG7Z7?c2skABO5#7DnE;-lZPl9j(FK2hpR(jHwE0cnpG3xTvpJwn=p z`SnMDv`6y=K-!~UA?;C|uSt85o!6v2SPY~+$PT1EC|&;^uSt7Qy8c}t?Lq1KcYw49 zaqG$S@6#TXu73kadyu{U0Fd^ebp3uH?ZM*uJwV!n-}SqJ%awq|K-z=f^}Cp)Jy;CT zp6uE{;)Cqo)_54@v`x4;I&N#v<|2Vg_jsr(peayd>>GX&~*v;`(Qqq&?^fq&>)9zkx~G zqpP(*+Jn;d>wvTe*_ot0T6B{3cqX0((jJuxX^-Mo0cnp)g|tW6tAVsfrS$jrX^%>m z0O$MruF{1-+M`k-?NRCDK-#0lM}f3Qzw?2#hubeed$PILKg=ZY(XWvBXwlasK3aST zNPLw20Fd~oR7iZZC?r1mrN6&Vd{lZrkoc(dZd?(cxVoD`+N06CfV4-WLfWHvA??xP zoj}^7#XEqsM~gz*qxsu_v`3|c`S)p$u7tElrCyfyDEn3*?a}WoK-!~4A??xcTp;by z;vAr@zoGgS(jJuxX^%>018I*+X8>uBO0Nad9+gf9(jJvw1Ef7FoeI#Ntja**qtYvx zBtFWX{Ad6C|8MX6|If^S|8Hi=>Hhcso-6)s@uK3>|Nj5CiuM|LUZ>2ok6q%$v+~b?M6W>aCxUDzO15zGt*v;Hx zZ>2ok*MXFW#gfZX9&YkXQXWq3W^S>!QXUpdAm!oi4WvBWVw<`7-b#5`Ihmw9+@qVh z-`+}jxUT~#5Bn#tNqM-*H*+VxmGZFkHqR1gi$cnyY$4^*;xHiP(c(}bj|Vh`t1&+JX-7lq&&)YlJaQLNy?+&Za~VTQX%D0 zX=fniQE4Y2<lN0s8mRKR9XR~JSr^%QXZ8GDUV8plt-l{K+2;y zA?49;5m4xFudal%1eF#71%gToN>?8KrJzM&uE3etbOg9rK1AZ!CanpX_dI52n{6s+Mrrk`g6EGk6v4GM|dzefYP@2h)1e9*t#pGH6rJG&> zekkB-6Q7q4UnAgmQv>h=0i}Uy0v0!IWpcHE`AwUFsRBv^R|$v!*RV zM~hC<9xXaadz8HzNPD#CB<<1fDj@AqsgU-lbP165sI(49dvvu3NPATJB#`!~bRm%T zX#O!E?NQw0K-#0-10+5w zy&Fh;6elD;D!mIxe3X4Bkoc(7N#dhYA@NbEZ;<$?)Yl|FDxC);J}RAqMdITU%^>Yj z?`>R__NY`ydsKQWkoIWNN!p`DCuxu3gtSNVbAYr*ze3uh#koM*qhBX!j~0pX;j~A; z(}A={r89uEN2N~E9+e7dj~1^1(jNUz1=1dsUJ0ZyVjs+4QZ)PF!QID4;KKdO4Bt9w?5+9WciH{b2gT%*UFamMJ zC*npiNPE;f5=eWrI2=fObTtAB>K(Jz8Y)hqOnFLfWJ3a{=1Zv^S~j9}*vLSt0RJoRIkFw*!#)s7FYAl-(Xk zeDo_MJ}MOwA7!^MS@{Rz6N~K_q&?~_0n#3omH}yx7At_XM{!Ql9%cKQv`2AH(jH|y zNqh8L45U3O71AD+7656FN`Bt9q&BtDqm*nm>vqtXo0 z9>i^Yp4X>6h}*aoNPFpeVbDP(Dbn z7zLz4tdbQYfmDc-pGhjj$AD#RvO z(Thnc#3oqL6G(;F1c6kDO%OvAwXlLd?M#JO!7I7|sStO6AQj>s52Qlu z$rU7NXDY-t%p?_Jv#sdNBo$JekP4}^6OanAwgah<7M-L*`t4Y8+2r69$d|6Ow9WYo>>65^h1eGoV1_@ep@g_$oZVH36N4;K^_GnZ{d$c$SNPDy>q&-@k2&6q8iSa<%qf#en zj~1PzJ^CF7q&+Gf4WvCPrN2AV9+d(+(jF}eX^(z~0cnp)g|tVdgMhS0i-Uo*N54+e z9xV<8(jNWx2htvu4gk^~mDT`hkK(+H_B1K21`;1-3yF_P`v8fL7JCDUkA8aqiH}O1 zBtDAk1tdNy^|HiA*+Sx@(jFx%cMzY5>&_tU(N$Lluoy^uu(<3EE=zo{xNJX=_+T-R_;3uC?O~Gmpmf=OloB76=Bl&@ zSGg+fLFuyHyd>>Gb|CFRTp;a1b|CFRTp;a1>9SqCLE3})Wjlbh2c?;$Jt$rF5|gwC zrOUPgX%9-5JrATkC|%Y7q&-;7WoZw718EORmp#X2X%7~ctpm~?{4QG!q&-?(1*ARt z71AD+dRf||MIr6cua~7gT3iOuo-FHSbwJ`nOP4(bBt9w?5+5xJiI0ALP2!_cCy9?r zm!OCEM9-59(jN6L1kxV$3TclqNlq&+J2vb0CpLfWH6FH3v0 zI3GxRlv`cq&+IV8%TQ;C!{?p71AD$!JRyKL66KmQ-D`sb=wsYZKQ}Nx3(G{0e^so3_#km!2D+zOs2`zbLz|?258+WtWwGw6Fi~DEVEz ze(q%MszWnNSIy6z%vn2hJ&-$@^Lc0nkUN?4d1yM2JDH<@=vsg~IUh<7@edfy&#lan zJTw)^t;{YtbS02mnY|Fmt<3reN>1(gbO1(gan3o7jf%n?*7{6f%T zS75fF-*bVV3ySLu%o6nLMaDCk$1DX3JqLC_-q(9t6^1pNv>6;vu* zFKDp>_=%w3vXWJgTzAwW|IX1PKX!oL#v{OVL8XPjj|7z#0oMvzbn-(%i^4U67KI-O zn9sXS6R_C$9+RsDEH=IaOcnTW)%Z4Wm4L;-l>&Yn-(+%yfVjXE0i}(NOujE5yYT=p zSwLwc|C-Sw-xE;U$Uk88$Rq)!jr)M_3MdUs6i^!Yj)2m}JzO?HKxyFH0!kZqGZ`;n zvGG;lTLOL?Uk1hrC~bTN_@;o;z*qsLjW03zhJeMu7y-YHFEaVMfYQKd0gHjl1^hNP zaM>sUrH#)6UlUN;xDllzo0K+gX7E)9h->6uKzd|^fVjqIfy)H^Hf{ih3y90)QURrb zVS*N)=CZE{S`>x~o|aX>C4x#<07C>V3SSoVy9^jCXi@l*px-6HAVH;dz!wFTE(B@? zl|BhvEU47UKtZKX02c`=6$S_@6)qH1`Z&;EP^r*QQ0Zepji6GYub@T#Iip9a1uY5} z2+Do{=p*P#IA74O&|A>&{XpWQMJI`mvhM{FA1w-rkACmPBJpv(Hr~x3?NRTYK-!~H zA?;D=9YETnI3ev(sgU+4`*tAhQRyu}+M`k-?NRA0Anj49koKr_HjwscQAm6AI}=EI zv?!!K`n?WFd$cH|J^H;CNPAQ|9Y}jr>Ll&aqLB9JSD-yj7Ow#kAN@`P5+9WciH}OX zEb&q4WFYZTsgU?+aT1XD=yyDj_^5OukoaiP%Mu^`P5=@gEeeT`7RLdJkFv+1l=wuc zgS1Dbqk*(XrDK4!N2N?2PJ6T{q&@l-(jJwL0MZ^U4h7O4{SE=r9$gIv(jF}i0@5D+ z4g}I3%?|+59+mb7(jJvMNqbb<2S|HVS`DNv`5+PfV4-8PSPIz3Tcl@%Yd{;rA0v6 zqf)~9aN46%A?-ow!6QK0gVKX<18EQ94!#4VJ@`F%7)X2Y8%TSwc<@aoX%Bu69strF zlpbsZ(jJr^d;>^(aFt2ggWpVOPn6~j5+5uE5+5uce2q6qe6Scud^i&a_b^F(uoy^u z@OzNtKAiZVG?4h9G?yhlSUmVDmnA;3l2_pIDrK?9cyys5<`N|3Cig|9z{vSDjN;R{4HqW99#-e5vyPtXy5WxUyw`|9@87 zAGMv__8V=7wY{iqueP6R+pg_L`}+UCt$+V-dhz#*zgaxI_~PQ;#h)&2Uwk@W|G%Z^ zhN5Xj-zgeZ^yQ+{`TGC=Q8>Tw*M+wip78hoSItX>xLbBsm#&(Z3UT-EBv$iMAx?21 z721&@WYs(>A(q+B5+5eymR0yS+q(UeSq(X=bq(b=Jae&vPLipW5lIEpCC=E1MXvcmgsSrv7sSrwc z>_I6NQt1x5GcOTB=??NTFA+j%AQ2)JJ6>Tzgz{&wKq`dNKq`dn9fW6IDul%y&jYCt z7I$m~QXypTpeXZFA(ZZT4oHO%mq{vw-yO7OUMhs&Kq`dNyr#KAc}*&W(p;7bAv=%? zVR6R>-Ypfv?+#)$FBL**AQe(6v6`0(sdP1v3aNAjkP4|(NQKlxpXQ}PTBJ|&QXwr0 zsgSZ40jZG3fY!`Qg;Xk}LfngiR7j;xQXyqO0W?=AlT=8hPoR_vMJe5xmk4QbK9C6M z_hEntHCYtS6|^XP;^>VT=p?B00Vd}ND!m8jD5&&q;B0}rXUAPY2SJN>0v{KYJr8Iv zDDDp6V}j;y2igg`^0F#Hi$bN~G4Qgsg2&)Cph8folX5|&PRaz83Z;S;=K>{ye&+yf z1eMMPiUlps0$L0D6^aCv&IDQsDisO^U0n~HC1~+Fpg{1BWAfL(6tu|XujdLLgKL4C z1&@I+N6?~|{X$Uow31bSJ^QHAYZ(08fl8+WvjleSjw^wm30f3x61-)F8wJfz0cHv+ zoe10@sB|1KLs02h;HQF0g|tVdqk*(Xi=%+FN53P0v`330fwV`9LfWG%FH3tgKMY8F z^ed!2S{x3fJz5lKPm_5sOMJ9A7)X5dI|N94R5}Pqd{inVK3W_ABtH5b2qZo#bu!r> zN2UFN#7B!l;-lYcAn{SDkoYLB21tDL+Y3m1^xG4Q#3wgqZw6_PdV2tAk4k$2X^%>s zq&+GX(jJuxX^%>~0cnp)I|FHtN;?8+k4ifLX^%>sq&+Ha2c$hJtpw5@Emi<&j~0cr zN7*Gn+N07kAnj3{le9;1LfWJ3A|UNib|FA}nv@EOj}{An#7DnE;)BxdM}Wb;Mx{;? zA6#vJ2S|MI8%TUm8c2MQz5QJ-OMFn8N#cXJ?T48pKKR}KCXo2xcl(=&BR-1T-pC;B zLGSkcK-z=2?FWFg2XWh91JWME1=1d5=QU{$7BfkEI3L^h@tU*;rQ7!aX%9-b?*h^u zlx}|+NPDoj{S_eX!SD8$fV2mt+Z%wi2c_Ge2htvtZr=)|Jtz&NJy_hnnMvA%#qAq` zvAnifv_O(Elqe=sb4;FJ-;)CBn;)BKQ8+c9PqhH@3@lok& zAn{S@Dj@Mu=?Wn6(V~|nKKk{t#7Ct<;-kfuB7KOA&ze3uh#cP1HN59j6v`33h(jNUz0n#3o zUJ0Z%@|kf8?`~H*W^{Xv95{m+;XjA8NOb<0biQ#QnN; zERfGe+tG-ZO9fWr);_>6L2*vLBB)dtDzMFR*(HKXea#R-rM-cCHd3jO&qiA83FNbp ze!BtrY^2ieKt3C(RLEx|EqYl#8|k+TuJ~*eSDhK;qmf3>1@h5IqfYo}ls__T?F8hr zk*A;|(EQmbljhGxndGyP7QHN=jr7|d$Y&##b0D9MR9eX-pN&*n0_3xiN{fJeHd1LZ zkk3Xc<+~>Tn9oM!a?5)_Pk*BL4SY_Zoq-+#vbVg$WuFzWxaD1-yMW)oX9RA)Er*$O z6L7WVP2fBMi-E2JuC_EX$!8-h2J+d6W3c4_lYBPf7;Je1$Y&#z2AV$`V^d^W;jAfJt}xMdHMd^W=TmREs%HbUu^S5eAmBb8>5k47ln@(NewqY=5> zvIF3wQU2^3$Y&$&(p=X3*(lKb*(lKb*=Wm4yg@!2aSXP+2;{R7egpYzgwid~Gs$No zly2Dwl=y>UG0;Z9@0N8;iUpJgS_>+Dnn{tMMWL0TtJOfEphe*{#} z&qgX;2IRAmN}mGq*+`{A^Jk+#^Jk+ieAndL`D~&BmFJ{^4Uo9PXhUD z#Jw2EXCwVOY5r^!$Y&#!E-YF3HlK|m?lG>)MYXp|+oWj>J4Ml8`x z^4Un)4>8GSBW}M;^4UngPV(7^J3EliM%;^A9%PdCXz_j^?a}YOK-#0ydw{e@i+2HO zkACk2(jG0|2Bbauy%k7%RC)`L_NY`yd$c$gNPF}vq&+IV2}paiI15O7^g9zsd)SVd z(4MBd)Yl|F$`%qIZ&_cH_^4D!d{jCENPHA`J&^e5m$1H__~=(ie7rHeEb-CrbwJ{y z((6!4e4>;Vzn%7|bSjYccrOZRj~1^4(jH|`2GSlaI!Sx<>m=<_sgU+)QAm6AE2KRt zodBdgDjf@?Jt`dsq&+HilJ=-{G?4bFl*+!H_Gob^koM?TNPAQ&q&+Gf0;D}E71ADE z4FYIS)2^)r5+7v`01_X?4FnP&?@}T0(V~|nK3WtKA1(F=5+4sp4UqV#)Jfu_I3e-T zRW*?KXi-RfG~WwId^Fz^rNk#ndoxITRN4bbdsIr8-%fi}>Ll&aqLB9JsvD5@sI<%f z%ia5i=~rcK@xlE1r+7{AVezhi5-2|Ec>*XtDjfrgkFuQd-x<1U=*vUr4*lh!6Nf%G^y#5lLmwKNJh-=?|DQGRO9RIb zEE?F`-~abJldqcm<;myn)z|-@o%s6`ADOr}zyI&Y{`r4n-|l3>y|(G-!Le_5GT|BD zbQI9Zgr{ZGLZFigTX)luKqnKP{!R0NP9{A4o8|$XOn5|tP9{9?0Vk7=)tlyUSw|C| z@t~s#OJdVuOgftIzy}>oczA=3COo2>4(76sCOk-+W&s^dc#=0A3UoAK6*TE+!m|@} zG+|?Gnl&)?ZH^{B)(twDurM|q$m=_q@K^_(On9s}9l)fM36E&d$%JP-=w!me*t9>F zbu!_p+_VqS$%LnW()V-hGGT|mz76PP!rE@q$pocMI+>vK_4l}}lL;1sPA2$${T(KqOi=pzTRzWy4Q zbu_`^>#yO8qlvCw=L;C$?qq`a*IxxXnP9Y+bTYwp(8&a)uk&?|Z+9|5X|L&Ig3>0P zOt2VqGQn@q$podZzr+XVWP;Myp9eabp!D_UfKDbTef?RWlL<}58 z`W0%AN`>0vBYQG%ivK$*Jqf5iiaPwMTJIYLDif)E;FEwMUDG0JTTI2LiQ6 ziw6OHa|N(V~;uqu>32+N07Tp!TR#s6AR70BVnZCjzxci{pXXgWrui zfZC(QaRBYtVo-c=)dwg(+y)!p;j-d`(v4ez z;=|q2r1+pTC_X3+iVsSI;)BwS?_iPmXt6=Bfy*R(r6x@l~Mq;CJIIK5)4R|B<2r9$md=>tIR zQR)3a?NRByK<&|@P|sK3a5Ad=z&bP<)hq4N!cvcr{Rblzk;od{oLe1N<)W$(2{t z9`#-Y)E>q8lG>wQq4p?Vs68qbYLBjj+N0mgfZC(qD}dUgMWOa+QK&sy6l#yR!KFa$ zQRyW>?NR9^Ki22}|E-_@_YbGvx|hHI@7>`|!+*TjzyEK+)Ptvfc&;REQ%^cciXwu+&gFhO4W$@n&t{wbmgAWY;{lQxX|Hj}IgI^jvd+?VB zPZ&IE@Kb{a4vq|tA9#0Q)4(4OJUj6F1CI>+-Yctqbavd`CC)2p7NC`=TBKWR zoBZ9$_e}oX$u~^?t;v4>|LK!|e)7?i=T1Io@{Gw7C;gw3-k9{iP5Qy4KbZ8-COt6e z?@zjA(%+bL#iTDyI(yPDPdZ`JXC@ss>8B@6pY&4`-xoZI{HGIFP5gTk zZ<_dxiI+`WF>%?%Uz~W{#3LpiGVvo5hbHWp@V`&kFyV(2o|*8!OjtAFA5FMz!rz*3 z^@OiXIB&vVnQ+pCpP4X!!t4pVzW%>u{Hx>t?f7-$|M~dUj%c}WH~3!tJ=-#Wf|Vt zZdR`^X*a7>Xg8}=Xg6z7XgBMZ1$t+@S&KruS#d(US*1d|S@SH-JKN1FWq;k-ZdR$# zZdNJF?9O(xN`-c_N`-c_7B2?a&3#383p?-5mb0=i0$R>gXv+ma%URjy0WD{ho(;5| zRk{plIjhu3%UPvPTFxq63bdS6dOFZ@*5YYE%UN+k%UPwT04-GHey8K=;N7l<8O(N|>j7YvpiyC_pzF!NL4rz!j|sZ+vI7PEP6U2h z(3O`RASm0(M+IFu*BLdP#7t|hPcUkR0T$9>^tDyE^ ze)Bp$TJ1r0PyalK|y1E&tJ<7fbs6Fa& zQhO99)E<@I2-F^L1EKbK8wj;WrQZZx=;-kegfa0Them=w<#3!Z87}Oq>dR6UF zsZe`VdOA>h6erXkl?t^-*{1@vN2R9#wMV5V1GPtsLhaF_P{h|l^ze&9>tN|J8F+gozxy>9}UzVl^z4oo?VOAN%2wXQ9$ug>3pF0_>_{| zJBp7=h2o>qLxAF=Qla>$bQVy2wCJSxDDGgO_^9+ip!jHhf1voN^gzTBpTv1p?NQu* zKt`m8WX!8$em*)(^@m>!ZucD$hZavdS*mx{246RRXnj zBT!a(LbmeH$XAh7*T>ck45}&*;?~!Is>%bh^;Mv%vWtSM%3=wsD(hqGD_mAp*?C)E z0;($Oqe)d|u>@6>$F0k%Dw}ERdR|jiS&dtt1*$3!d{9-{SzFgKsj4i%t=|W#Dobzc zQ$ST^O>KP=sH!}?TgQN^$}S12D$n@VCzw=Kwpo*^$~N2j7?Y~1IH9Vt&9*)YR8=hs zRh2EX^%0<|s#Kt=yOgd5%Bo7&0A*EiLRnR*mz7mz3uRS{4+3RXzfQ`kO792Cs!CU( zl&q%IK~>e&N}#H$^j@HD540)uK>UHGdUQRaGif zRh0@=Ri#$~RaK<|RqeC5t(OC3Ri#$|WmSt#%BmKHvZ|{~fwHR7OMtRUy|-QrlvVu- zWmTno;dd2TO`LhM+~^GQr#6XyB`Y;)F{Dl?q=Gv?yF6 z_%I(1d|6QGQNYE5N}c?=pg6v~d*4O7#X0zr1NF`WE)*0$2l%3(QYRM(Ds{3#P^pvU zf=Zp7FKAIXPtc<9Yl5;51ApbiQRxs+ zdsI3M)E+HP25OJu27ub5(uqLr(foLz_Na6mPl*(e($S2 z=zaGsp!T4&N$tT^liGvQCbb7~LG8isyPNp{wFhxcY7a_-+QSX8KY@Cj)E>nN zwMW@&fZF3d;cIG-vW42C())qhqtXX}+N07{Kdz5_xPSe`8aelPoqhBY*N54Yx(V`!%_~`cQla*EPh1St9xV#BM~fE%wMW_K0kub^ z7XYZJInR46{`5sHr%PXLOKvW4QKQla>Gw;T`rs{cDGJ$_(pCGp9k zgW98B!o0HfsFZ%MtUX$EQhO99)E;FY4b&bjI;lO%J_@KkDm@aYJt|!Y)E<={4%8l% z&H-wVO6LQ$N2N|`j}{LDYL6D3)E;He`ZJ&Z|NrUd|3CPF{QUp_G_bcn|Nrw-4xjSz zDSP+x|F56)wMiFE`jttiP1>8E|NrEKhbF9?@Ou+(obZ$W{QvK^oVi)Iv(3KSa^?o# z&d&R8%bAB_`&B^8nH#)G%b9z+*R-5j65H8;-)%W_g9j~VZsYANz3;Z1*)rQN0b0)7 z#zD)O+c;=BQ-tj-umuTF$Jg?d+`Yww!s8wx0#Cocmf{&~|1` zZ9jW(Y<1h2&9r?f(01l|+s*=8-F9Yy1#M?GQ_yy1XKg=?%i7MYsqJjQ)oo|i)OMEM z>b5hRY5S=_+nJrUoej9U?aZ3$vbHm8s!7|KH5Ig-*-YC{8W>y6c6KvuXB)0=IkSwm zv-4KBoLNTO*=(y@&bks>&Mc$tY_ruZXEsLAa#oy|wVaiG9ME#sqR?_yHVbTZ%UO#; z%UQo{v(+tUl?p9qEwaE?x16=eYFpiMR`xug<*d>}ftIsM4+dJ!S`=E&x|#*Bocr8l z`~E=NS-%GYZD%qRw4GJzWo>7bjsk6GmF@?$omDEdowX>mo%Opf(0111K0w=9zte%X zvlfN6vwnwxwzC$6wzGbRvB-ALqJx&RdWV2t^3SHy0pJutrIUeQ6jUmlEGSO+f}r2= zz)6CB#{s_}s8l#nP^s|q0!rWC4lEH+8Y~u2`u z0j2M6296U@`u+ys^8yxwV+H)a{~D8@5m4IX7y)tbzry5m0!o9U1uVY*5|hsg=n0Mz z(DVL_Ogq=3@kPywaECj^wfzn04m z5m5U6)4<0Clm-V2D1HAaCbI=CJ_*bc^g9O36tpNDBxq6in4s)OfCB}U3O_BV^a0=i zL5r(^j|%!-3G6Ru@qXYVf`0D>_7hZk5Ab0@rFR4S3W~c6_>iDqVIM)iURHcmdIwN^ zR4No7Eegd)zqbO#M~mOW74h*QYfyVMdJ9+89*uqrs6ASAQhT&0)E@7Tn}FJ*MJKgK zi#G$cN7-Ihd$j1J_UKorJu1Bcs68sZesJtNwMV5w?NRAw{Z+M{_VwMUCiYLBNy` zciRh0Y7gdv+Jn-d_Fz7!Jy_iK9IvT8_}%scp!Q&K+j^k(;CI{if!c%8ZO;I;2c=DF z4@!gDgVHXmJt*C_j@Q&4lx}+(s68qj18R>-p8#l2UEKBqdvQg4akN5BY|9jv6|2xyKn*QbK zzc&4h>Ax`jnCYLMK5P1irca*sU#4xI_V1@XH|-CnJvQw-)9#-3cc)!H&9DFe%Cys_ zEuMDNv`0454gb>c@xzOT4;}vK z@bJ`~Q{SHYAE&-J^KMXxT zw0GbC|CzzV{(^k}|D${T{r^)xfbai5{l9+y|GEPAkqcJubL-&Px&rr6;1;03Ep#$4 zwvNDY->u%~TMX*kA-k`tZ}Whgnbfy^fSZ8&_F>=#puSDo4fSpEZm4e)c0+yp3~(K< zsc#E_Yk>MTe>c>(BY>-!)VEInmjm@}Ja7e2-(~`r0=xURdY_Ad`nErl3xWFf)4&Bl zeH+{j^=&S29uxZJv3&JDoO#w2xJAI(K!F?BJt=S>-#saCvv)&*J7_l)xK9Hdjn);o z!*)Y~J90M^xGBIgE-P?{151Gdcj#^?aQgwAX4Vxrl`cgbflHh(sc#w;>YEmY`lk3( zfcmD=(}4P>QlY+S@noRB>Gvd{zNyqneN(AW-&DE;sBc<49;k2nJr1aEDi!LR7LNhy zn|_Z3>YGXz0`={azTZQyHm2X5D-!0DGm(>el|9L6p}wh9sBg+10_vMeCj<3O zrQ?D6rbSLe>*^bRXY2s#8%l%vhSC{ZnbbFw&Ugo)Z+@=0dd6Eofy3gAH-Q3&-x-^M zabAYS85;-3{_q{ie2Iw{H6o$j~OrV`pX5x&v+U54FOkOcA0?1F8iv0xZqL&^D|!L zHD3`hKjQ`95&>~dzAT`0#`8=r7LYyTIpEg?ECv?|hzq_XpftEpz~YScyylAnx512O zfC~ha&iFpCLO|(^wZL)#r8Axe&KI;OoG0k_3EBJz881)E@ob573@n7FPkqM{z5G;=_|Y<6fZn=vOE{D!m6NK3e4WB>f@r@rmoI z+M{c)sy({$^|eRWPHK-z?*eL%7KPfQMWOb18{7`m9>qDSJ^FQ0d-N;R9+ln()E+Gg zwMUCW?a`u8do+IwPF9m4Nt_M>nJ}SKkC_Y-e5GX!Ar9$!1;&NOOpIlwQp!TR| zIZ%7ldmd1G)GO2;Z;5k(+M{15wMV5w?NN`H)gG0e1JoXs3bjY`X9KlIi)R6~N7>7O z+M_rpwMTJ6?NOXidz9^KYLBC0cwv*j|OUwN{<0(&#tFbC_X9`ijPW<0*a4H7Xrn{r}Rjm_^5OqP<&J>6d#q& z!6Na=;v5FGM~jC6wMW;70<}k_hXA!laYF6UuTXomDAXQh&jMC<*+S=o7us=|HRJt!vd$hO@aJ7Hc`W*#ok4g#a z+S;Qyq4ubB2&g^Eo($9;l?t?{jXJsmC_X41-3}BVp3?zks68kh{Q*#WP&)b?PIFmqtYjt6d#oe#Yb^Z0L4e8V?gmy_M?C1>;M05Wc|p$7S_OA+Ft$qzu|FH|04bTzb_7a5I_I#A5Ok? z@?VUf|L4E|9~l4s`2XS0{~vpZ#CF0R$J&0V#`5ruV^u#?V_7-lSk({JSZ>yFhXOU0 zRnVly@>m8nmZxgm!CY2jc}B;vgCDA~JUipqnh(`j?)Gs90yUOrXWV{3jpcC}$D(|w z#&WlhV}(9cV|jX;)L7P3P-9s@<5-~&)mR??aRUQm57AiH)VN^=C6?!C+(e+n@>q`> z2b5TrQIitO${9DFNr`2#1SOVT5|mipuG`7heW=9p#^lazK#Aq;x}e1J4(iUWOiC>8 zt?pzWKU89QzphD%<(<5s#PWt=P-1yIbtn7yp%TkmmOI}DN-Xc7?qoSXL}L2_W>8~! z2Q{d%ytle@Gnds^-VNRP22f*ppERhkywMueSl&+E$=-gb#_~q%PPX$yHI{c!ce0Ql zstmc(4Blib`6ciVuLj$miJkAet&RmO^M|#>7c~&rt402>zWeF`_n;*Bv07XS)L8wl25PKIg&M0;FRQUC zT?N!wl{%@hDivz1O78}0tV-_yYOG3y8mrRVff}pQTY(y@MWM#(m#^Edp|L4-P-3-s z6HsCmcOy_@btRNoEea*p+u#PE#A^PVK#5i9bwG(#>9s(KRp~Xr?!>l-RC+P6SWw&rzzKp%mjgd1DDFbwc)@$Z%YIhSuW+28(sO~&3o1PuI95>UIl#{d zDs^&dsOPA_Neqop!VqMD4_P}cOg)F6z65N zM{z>!QTE|L?a`u>+T%ST(4JjN{bOKFU4_C_XAZ2#dt0XYoJ=wMV`C1GPt``vSE`r9$md={`X1 z(V|d$^efaJl@0^7M{yH@+M{2g_ULy!PnNwFjj;b^x_U+2erPgT)>10ksEl zJGKI~2R%XU!D3K*xD9r^&1JQR$8X0wK<(i+*zwlj*!O5pkGYfY6(7tuDLyFm1AMRe zptMQxL1|EYP`cv{E-OA*42lnagW`kI9j|g(@j>a14M6e1;*O0#@xgDC;)Bv&Q+!am zgP)lDJ>sL%2DJyJJ6_`TwFiqkUIc0n7I(Y=)E;E-cpj)dC~Z=EP#V-8l@@)G>6@E^;-k2SnG_$M-=O$t(GO63H2)w_d{nv`C_Y*gijRJU z;-k0+fa0UL`+?%4-&H{IQJheGybbOFijRKz!teKpPfAxZs68sZ3#dIR6>5)4?*M9# z7KPfQMWOa6`!=BVsPq<~_NermK<&{L$^BmK(eDjF?a}XbK<&}u^+4^>qLbRAd7<{G z^lG5?sPrnJ_GnS4J^B@Dk4mouYL7+)+EXNVTmcjxEnW^3AD`b#f#Rdm%YfqJZEy)t ze6%POAN^ho6d#p3DLz^hijNk(toSHfC_XB^5GXz>6^f4*c|-Gi#3zf(8PpzKp99n$ zl?t^-rRM^*N2N|`k4lBwqf(*vsPxbN{=dEb{{NquK7ab`>HAKfGHu(mEz@3|_UHTj z|DO!sHT*vfUpM@l!xs+!wc%5Te{T55;ZF`9Fg)$g@%jH-Lw_>#!qERZ^u*Bje&X-{ z|LowL!H*4&4o(=@I=PLN03`^LE7S z!-4iOZ(ufQAM>8&?0HPu$Gp!ldk)Y(=3R@ReaxGDvkzm^KIW~3pnc5S9zpwEka??Q_5nZ(nRirXA22ZXLl!dYW7nX4thoKTs(s9xk+b&&+Q+=PF?%}DK31ud z_OVKxw2!qYw2$>W47886=%jtDMWKDH>>;3ijM7=#f%Y-3X6*pl$0(h(4QLHZKLHihSv)*CSKF04X&Qm{ZALDn{n?U;*i$VJszd`#LrL#73S^F4^v)%yO$5@=T z31}Z9d)7vveT>p3?Bl-j8?=yd6||61+G|?KC=FW3hwX+IGD>G{;6t~NQ96r5+z(sG zC=Cwwzk||QFEg1fpmf&DD4n%S>8w{6%yfX#;2;5UvtDHKF#*4`o&ydP5EuNkfb3b% zGC4p%T$7Iqhzs@?FhA=DT=o$G*}Y~z0j0CnGx@Nf#ixON1^qq=d`M8~6Tm)#N*@7c z2wHp;7!~yEWJFNu!@zVwi%zBqT3iDR3(8&%Ochl6ATT6o@d02^(62BcXi=CV@L&d$ z1ugo~CJDN_ADAepRG1)mPpkyS3;K2PQ-Vr4ko|C+phYfw;TwW}Igq_@&2Dk`GWfa! z_1+C!EohN5+zY=g=-SCuf=cfKeoN5eZNQa+;)JgWiW9C7G=B^5n}Qa<1zav@(aCQJ zTD%#!Oz@t#3HYj@QqFBJTq>yaTHq^!O0NMf5wytR>V+>0`n?>uSWw&*z^@DXy$rZW z(65($Nl>Yi3k5A+3Vcz}h;V_R?2CZnqu+~x;-gZb_^4DUKAQJ6#Yd$=@lmNze6%PO zAH`h=6d#oe#Ygk!0mVn9oX%b#KCahU7ci(jS`=!JemRi6Pquan}VtNB3j(V|d%^g9nIK8h2Hk9vgS zqeY?kC|f8#Diw;4x6WZe@lh#XVSa)5ByJ9a+M_tHsy*sG6sSE~JQ%1wS`=!J7K!-_ zwa5G8K%n-h^dO-2Xi=y=`W0%AO7{ak?cbD2_XTQ?O7{V3k4lGu+M~tkK<&}*08o2W zIuWQnDjg5h9+b}90n{Fp&fE^v9v-rp?*X+3r8BnzwFlWV-v(+AegoRmQ#$h&Q)2DJxqGdJ^} zsXgcoY7Z7?Zemh@(1ZofBn$#Zr&fLJH_TV?DJy@Li8k1@MsSy{{9+U>P2lF#u z;I7N|Waow*LEJt%EbdsO-~ zliH)wCxP0dQj+^ewMV6o0kmhAxJQ8EqhF!;C{8Fo$`*=`7S{m9M~e>w#Yc;42FCt~ z_+-RE?a`<&sXa;*YL9w_+M_sMQ+vFP9t3KSu7%p8Qla*!^Z}suXmK@Ad$hO;s6AQ~ zYL6C$+T(3-FHn0_>ZJClRH!{Fy&b4MD!l`!Jt}oldsIqt|ETt;RH!{Fy%DHATKpzZ zd$f21P=W57Zu&UJKM7l?t^-rB?y8r-R1KD}my}dYyR%P<-@z8G49MdK}aq z|K5e#qtVO%8(;swedKSCTr=|3k>w+2j+{L5-~0amZ%+U1>6c93oA3XB`2+d+|3BH! z|NDRb{QuJi7k>ah|Nq7*U!QX6UjF?5e=}+AUjO|6{U?49-~a!oKmUJi#|LiD(MS0v zl8z5-kI_f?9v_Ym-fE*f)oVLFaI22;ysz!_z#`2cGw!(*vtybS1Cp z^uUrCWi71j^uYEQy&LHCz%B|pJ+P%lIf<|3^w2SOlufX<;{yw0^j4tb0}pbr=lC#s z85Mp+nZJ3g??Mp+AM z_Z%OBjt?xEpyLDEBk1_RE*ia>*K~Z)BHLqa#|IY1D0^XT#|M>OiBgUaDRt24L5o7C z2mM|Kbb3(fr9h_#Eef3;^m{ST=|QCz0i7PSD0F(z?}b382Q513^q^lSogTF4q|<|b zg-#DDT@G}5P^r-AL8a#coF4j&aP%CYx+P_eh&I39P&%?>VC)Y#J}7Qv2ZK%z zxC%NwptqNFdO+#ORxa!GfW@HG1L8*BV{*2CyC@xb2k7*GxRJMkP7k;WIz6B#==6Z> zk+-;v(?fno-UK>6AZ}zc(D4DkP0rYDvB_T+usE`b%T5=t82lvxiz6GDoF-s#+tN=Mc)DLyD2Sql^&lm^8|i%(&Z_+;^EuBts+d5)4h1#Q1q4ucsVW9T#$d0T5 zYL6C$+N0kGf!f334Qh`{A7D~@R4UXSm97G6j~0d6qu+ah+M~t0f!d?ryMWrG(mR0K z!-E;np58ecxs6HjQK?XTR4No7mEHstAC=w=6dx_#0u&$p-T)LIm3|W_K3WutkA82! z;(@y@`jXnC-s^zcqtfev+M~s5f!d?RYk=CL?5lv??uV z<85#`Py2Gkyv3bjY2mjbm%r9$md>BT_pQK?XSw0IFvd-QuDPSwQhooKSpJx(p~jKFp^Njy+v`6n6$td{lZGP<)hqGEjUJ zcM4E^RO+PoXpx_e^fdA5S#(f)6n7F(d%Pu<0JTTILhVuM2|(>psgv5HxZ{A@qtau6 z+M_rpwMV5w?eR7^8mK)gJqD;fDqRTF9+e&i)E<={3Dh2y3bjY2zNYr5RH!{Foe$I= zl?t^-r9$md=^UW;sPtff_UziVLh(`Qfk5$5+$^B@_>>+56dx@f02Ci(?++9oEegd) zzxx2iN2Q}c@zLTau82>rrZcEL8XX2|kK%`b+M`7$wMW-ZYL6Bt1GPtS13>Lj_IRN7 z=yxJedsOPA_9#xMJt`Gy53;B40BR2wr*8*p4}Pb=2h<)c2DJx^)3-9IJy;BC4;H7t z!=(0LF{nM<6Vu;jQhQK3{VkyOV6jQCWdtoX0-j(4EhtGmm|~p*x=kWF9MgLw7z8;=EIV?tGr3Cf)fwyz@?G(w)z9)TBF~ z=P2mT=i%)Gbm#N%2Hp8QVSRw^e0JVEBCw%j7b`31*u~>E??fgYyLfcwod9&~;t88~ zJkYU=%`}hgzM*3mPi4@ti&Zd>O}(LG7f)Ewv5P%9k4?RyV;9?S9{YGh$1a}Apko&c zY~G|$xoI|S(1#gdrE3f|DMiw!uB<-B38Pd{tB$sB>*I&ap%*oIH- z+O1u6m;=`7Jht|RPYNpagB>bpk+r|!6M}xd><~eV?DGvD7xcR?aIm0Kmiva;f)<5Y zf<}ayf<}ac1kJPRH+)P`ws4@JU!h}{eua)*-Ucl64IR5wN(44^>{6+dj$K+5I(F%o zRllKQmr8|>T`Fa}Z|K;i(s4k?E|ogz*oDQp?C=d8yYM^rZJ=WpO6Rh}H+1a6V$iV* zzjN8g8#;DjF_`Kf4!?6ZF&Pq2I(H*5DBx-?zsO?4z%EyFS>YR|I6&{**MP|a;^)2s zOcHR_WTJq@xvw&rAaEDVeHj=pU@`b90rPWTU@}fXsgpnXhJaEhe{zk0#o+4#7K5t= zEC!vrFhBQsUel=yrE`A(aOz5F(6I}PLB}rq1|7SwIQLmz)3FP`bH5LC>_X|>XMm1f zC~eZQ3yX8tG3nTa#kp&Nj$OzOI(A{P%Q|-9cka_%*0D>aj{zOK6es+;|JN#g6u3xG z_QSxJ1TC%sE)?{;8u+51(g%PG1TEeVtPu2j|G?OvEZ?ov!TAnUx)L}~(4z2bf)?)u z&J~n>7x1fs7Viem5fpb1@GF9{ZwJm66n6*EsY|6!I(2E$NvAF?3Y@xj-4nM09lKO| z8_=;!rQZTNcJY)39lNyXq+^$Ug^pb+y#?slrMR1bj$JCf5$M>Z#cu)~yEK12(6LK# zUe>Wozc&EIM~hxoe3UH|AC+DO6d#oe#Yd%A0>wwAmjcB{rI!Q6M~fE&#YewF@lol; zSR_6kP#e@9^DAXSP?g!K!l^y`p9+f(&Jt`Gyj~0d6qhF!+XmMYl z_9$*2p!TSg%Ki!M*|iOZf#Rb@q4?-`2q->2m_qSU=>SlCR5~6gJ}R9E6d#p3DLyEj zvtw}Vwc>-)IopBagVLb*U~$en17oidAH~gihpTE2uIIc7)E@NCc?+mLSPW_p7Uyhc zQhSg+=MA9tpfspGDDAS^gVH&hxUBYIan44d_FyrnJ;dusG*sp!Q&K&Wk|p!D3K*uo%=HEC#iQdt%P>yr%Y`bj}Mv?Llc!dr&&(2TW*B zpV-fN7AQW5o3kD$K0M}gz7G^1{LXm>C_X3+iVx!EtYcDq@H^*ep!nc-&RU@OsPrkI z_-IimKKgwEC_XCX_g%b3d{X)tgW99GM}gX-(uaZCqwLi{?NRB2KX`W?bknm-~adU)cdC1zL&rM@4pOg9{l%%&kg?J;NJZHzeNLw z4t#WA?|=W_xs&()_y7IliF^0^|9*^r|9`^ZEV~hCeejGgyBTPG za8EaBeQw{->*%bim zqjPza_6K`=*=0=HA8d(bmjZkC$FfU+_6N^(llBMC=(0-&9{)Y|hs&rz>x1XDm$W{3 z#+O~p>sue}ub}n810S?Lc&wLQ#AU4yw%M`^fz}6WYS{%q>x0L7*?BT%h&A zW8I|nL42FEK3HJO&f&7w2M_PEvw_wJ3#>`&gVh$aK6G_Dm$g1v&Oz&g-MH*DCan*) z*|JlB)`u3Iv_7(g;20&S^myQNg5rdu1^pfed{)r!vA|J+7LNu# zBhZTANI}^PnJf}ix)41Jck4Nl!4VGB>s5yf8Wk1@v|`yDV7{QM!+}o=x)$aM`W5C1 z`kfEV5mYLCN>J%M;4nd@!Y2il`rkQJQ0XDSCj>1DhX`7n1$mF# zX#%c-VFACvQ~|%ikbuQA-{u1h3RnyV1T3EU7LzFg7K6zG;(|#6O3!?g%O(okEoZ&~ zOb}4oWW0dVGdD8%DFLOyI01{oZQl?O7hEGC`^?vvd|kj|ldA<}pZN-t-xg3BTqR)f z%omvamVn(kBKUzwP4PN}pix>kbt67;urG(noLj zoKSm|?Paw`aZYNF=AG0Y{jLORk4owx3S7VX*7`z6xN4?i@Rqavf z)j;i0>6Jk3(Unkpv?$ab{ayjo9xV#BM~jyOwa0tnGNAS-&dX|#e!Z;r=vSycD)lwB zM~jyLwMUCW?NOXidsKQ6Ph1#R|V}RPD#p8h5qhBYrN2NytwMRWpYL6D3)E;FEwMW@P?a|^yAc6lxC^mu?4Y58{^Y0BR5Bm%azo9{eud2GkzJ1+@pi zT~>SW8`K_@2DJyJOSkd?Y7gRq+Jn-d_8=~(Jtz%o54XWmGX3q^gVLpM0<{OFLG3~5 z(l?mY9+WP94WKC)$T zP4Pk8(jNfD2c=8b1H}i~OP?8d{M*DwaSdt@MwdRrRka6;OTQ1)9>gzQ3)CLOEnNrH z9+WnzJ;)Afj~1Wivf88HCxP0d#V3H;qqs4k_NdfJ?NOYQ+M`mT_IOV`@;~_efA4<& z->#qkzt=ziZ}-pt|94Z@PyH8D_xAJu4-HKo+}qFpKZu|IchCR#e*WL%tGXq*jaOVY z`1q=BNuJ7}TassQ1@T?gEym;Iu7wv1|5fZtXG`FWY2ME#aTedA@GC8+dpCZ7>hDjX@OR9GaaloGG%IHb~fK*u313LS?O zHwV~r911!P>6a|8>Nupu!+?%M-V;tb4k_+npyQB!g^ok|JqXxy911uN^%=~H{jkV+ z$bGzGf3Dhd99pq2&~Zrdqd>13eekV=IE{Qp#`@KHgf!v2Cvg^vg-74{QQx_k%lVF9JVz5+^@Z)5Ty0j0}{ z{Hl&axLQu5S9Ki1;_|nFjzh>^{ua=22-(Yt@2ZYNC=EIep)}|?gwo}kxoppIDCjtZ z#pQ1>={SVAE819TixsnBsq zrPTYrjzd}`*!OiD((j`{$03zI0(2bG;)6iPA^i#+hg7--=s2WOq2rKBy{zL9>ow>& zq|yhNbR1Htu;)0md==1fNWb?09fwqUFTioAw-%P)HSqX-oQHfCyQ<@mdhg<@jzd}$ zIu7ag4xr-@kKgj!fsRA^y$z^6iW6#&es2Y8j}~tRYL6C$+N1fKfZC%{C$&e5LhVtH zP&@iw>^C_df>Lh;e!B|!1fuan~A<988Id{lZa;)qY;mNTe5>OBvr zJ&HRQs69T|boIX4qs6m<+M~sDfZC&ZFRMLT6l#xtmjSg$rAvX@qn^`&+M^z!_9*)_ zp!O(Rs6D#!vf86;C$&eVrvSCbd*WoE_NdfJ?NO;vdsIq{@2fp3JprgaDm@;kJt}oV zdn)Ggqk-b1#Up{@qeY?k_%I8_N2Lpa;-gZb_$W>&J}R9D9OQpTi}Qivqj@LAN2T+z zNPMzLWbdmziX*c3)gE0R1k@h=9t_kT#mxe0k4n9)_9#xMJ(}Mis6ARd0H{667HW@5 zy{z`AbU&c>s8pyuiW6#&e)j=tkA8*Pqf(*vsB}6|d$cIj9xV#BN7(~F?NKRVy|4DD zbRtlDwCIHP>JpWao_F%C|?cp{!|79k%2aCa1{1YJV{Fj*29>fK;2XR5|LH7ACa#`)cVw2j# z4RZeTOll8GgW7}Ap!T5j{O7o=_Mr6q9{{xnr9tgMX;6DmdOk5;S$hz7{xd-B!EY1V z(^={Kbxev6kL>wtfpeUw^a-H&sB{b{J}P|_C_XBE3@AP-by9p(Dij|r3dKjij{wC- zrE3sJd=j^YLG97#13>N3;%cDwDE@w+_Ndg$YLDW`@5*2HPoUqGK<&}*y+G|zDPdh% zdsKQiP;DS}J~6QWUVr`n%acEd zum7*w%dh`W8NY4(mhrESe}4SG96vVxyW{T}|GVRF82?-2FCPD^IdNEP4cJZS(Xm;yZD+w6=M|7V!-`TUy&Zdrex~+{Qs`n>%;W z{an`C=AjB&+uY!bRx)XAb594YZ62gWe2>nS);15)B7Sev7S^_pTZ6VX%WM(fytAdP z%|o^5uEDX*ZEbeZBEAu4b6cBbw&*sXt)+}dVK1+8ti z;i7LcX>GISg4Q;H3tHRk$wk+3S!-L1R|BnWEnWq*w%I?6t^``!D!l?|ZENu|ptY^V zOMuq47KPTf<}U(T+bX>fXl<+XVxYCH(hGprwn~N8wifvjTbo(iSzOMbt*z^Gfws0v zg|@az&jZ@pDm@EmYb)+-pslUar9fL-2|`<2rDp(bZIuda?LG?(THCtvHLY#$meYaO zHnHlm*0$ojthMcJ;AO3C{R*vZm7W5$wpA*$wpDr((Ark%$v|scrNS5de^cp+z)6Bi zj|F}~P^oaDpv9wspBMCd6tF~4sguQmN)HE45L7xJ_&GswPL3D!dl>Muf_{bL1jPxT z7xXI}E9mzyl>W?ar4Ej9ptwVU&k6cH2sm2M@4>)l1uf13juP~HAn+MMiw6Kl3hEIS z3Ci9dSSV=3$q|CG_X7?Wd}M_Mf)<7Og13S2X+d%O0`mlw3UdW-gHd3Ppwj8Urv#M_ z1BVG(6h0|vQ8-jk_5kn+L8U{$Ap%Ml?f^b6pfosGKT69u;^!o%*d{p`YL9+}+M`mT_NerBp!TTrTR`nm z+$})u(XW%*!xIp14b&dR3AIPRLhaF_Poc@N2NmT@isUVs6ARd1gJe)oCVY#WgiIC9+e&h)E+GgwMV}~ z?NO;vd$i~Ws6G1K52!s_JOH3Q<+DlgQR%)+ijPY70g8`Gh2rDGJPH&al@0^NN2NnR z@lokyp!leCB2av^I36fIT69u;kbT5!L4}Ej!w}&nn`n91mhJIn_n4wP(%^LbizW)F8!2djO|G=FCHxK;vfy)Q}{J;P2 z<5TvVGB|nrO@LID8zFQqJ9eI8WH7QqCjVq?B{F2c?`w}4X4G73sLYbq$^JO@E3=Yd_ogS2T+ z$`|nPZ7Ss~uqLIP3@zBiWKYV2QqG!Mz{9txl(VLSQqDFDNO=eD1+Q{hE$4wjy| zM9W<)4N5t?WWg(3Rm$043tj~Fq&z6)?5_pSGb!b4j0MjDrJRis>`8f0%2}EVe!yj= zoNc(^S)i0-altb{DaY@EbwDY{;)1n6DaY@ECxKFq#RX3TrCf_bDMxmfm2#Cn!K9R{ zbPOovT6`2J<@$XDDCH^@O1VlO21>aWg;K6XVNc3~Qm%O?rCf^-0;OEp4*;c{y}w{J zP|Ee|q?D_46;R5xD3o&j3Z#6O(v?`GSLqEvDOagb$`vP+a+O{WlyYTX4U}?~ zUIUbJl?tU?rB?x^T%}h6rCf_w0HvHPH!0=HzLZHR*YD*(DOc%bKq=RvP|7tglya5& z0ZO?Rg;K7?i-A(EY>v2_O1Vk}Qr;;)sO9=~Qp=|ZD5d2obx_Jxx*RCwDm@$6lkx@U z0;OD~X90Us9_&eZP|B6PjLS+nU2js#ReCy;Qm)d|fKsl~QwPUhFXbv-0$k%CM~f!| zUl;Uy5^%Mk(i4H-78G|paFw9nV}Rch^m{CDrJz#bYl2F>>$XWqcr>%=EL^BB|~_09om zj}NI(d(*Lqp)(V|d$^y_7{ zN2U7!zv7=wi=#m8(eHGi_GnS4Jz5+BYL6BNfZC&Z!uopcQK?XS)H4pKJ&2pX9jHAh z4Qdav1KQJVFn=qT6(5w&-v$&Pl+J$-C_aemvf_i%p!gs=C_Y&1HN^+N^WWhE6d#n% ze+wu+SPY5}e&@f1QsSf12DJyJ^EdO7+JnWQ_TV?DJy@LoCYRM7{LbG9)E<=1-vrbi zl+J$*s6B`aY7gRq&-?d*?D?;7S?$5%{Fi~+gZcR{0<{OF^PdN54@&1h2h<)c2DJyj z^Vc(}Jtz%o4@&1h!=(0LasFDM_TYE^Q$X!OX_MNc(kGeJ9+f@;(4L;(`C~xw(V~;$ zqeUmhM?Fr8kK!H!ijPW#;-hS#_^>DDKLQjVl|Bj-A1(5OpkF6GiSw%3qw5EO+N0iw zf!d?1H9+mrub0&xl?t^-*+T8n;%eYy{z3J-3aC9Q6>5)4h1#Q1q4ucs9-#K9^lqT` zsPs0V_NY{-Ju1Bws68rmQhT&`Gf;cZJClRH!{FJrAfoDm@pdJt|!a)E<>C18R>J&jMpIG)E>nh^FR3h|Nq|4|Nq|fd#8VU`riHg|EaMK;Jnv0v01I%*940k@g|UQhx4X6m@K7x|45$GtnI(q;HGm}( z)Bv9MB?mL90W6s%e2d++HGn!SIRK~u?3E?^0X2Z7xny6U2C$2o)Bu*u621@a+8V%G zSTYLK0Jg^xzV+?e8o-VSY5=>a%W437rOBQKEE(oCdm6BWf0B0X?glIwU{C|p%Qwhf zTLV-&ad2$so(3=(+qtI!OE`t@tO3Ygyd9_kZ2BeRfEs|`CN%)Ri?=b^(}17`pfsof zC=F@=N*8bCH8p^>zxZvS2H04y$k zgGmiQ_Tr5|4M6GQ4L}V*>0*wQJ8J++7rzYD0F*9%38(=mUHk%215mp7MW6_ocyAoQYR-1 z%3cY4K~U)`;3Pq%!Y>Fa^|BKME#3|Myr5rUiJ;QkfyIJK?*L8^RC*imbAn2}?07+? z94UAHtf0kj0mljY6+SPhR5(`9;w`|>2yEfSx1jWx-AWyN&Vd#=c}FX9XVF z#oq*u5>$Ev@EJj+PL32*dL6Jx(4w$V(4ugJpv9|!!v!r~2`mu24TSlEO0NPwEvWPg zV4k4T%YeCpu7o*)emNfQ{FI>IOM%*>-;03Sqf(*vDDFal_U!U|9#DL=cmYs+l)W4% zJ}ULH;-k`Yfa0Ulvw-5G(zAi$qeY?k=yw@Vd{nv=C_Y*|11LWF6^f4*h2o>%Gq6Z} zdN3W-9`&9M)Ewd25IShu?M%ed{@AsSib3I=7ea|`P z`Fg*u_qoq7$E*ebk&pQfDBt-S@<~<};vTc^55zrYEyO*>E5tpfD8xPH+Yg9)46ZK_ z_n2=Z5cimGJrMU8X)O@<7^x8Vn4%E(n6D7`5b5aGfVhW9191<*jednn+(W*jUj*VF z@*VvW5cd#i4vTw;G?loA6*qbphs8Za8i;#{G!XX?>F8%T4EJPZkA4=2d`K~eMLy)4 zO5{Uuqo3li$cNxY?*t+r!cHafA;r-ImGarEO+xQ9q{PTWJJqaWd%xQ9qbZwKNYA|3rO5cd%2 z=!bx~hZF;G5BZMnrV{rMX)19Kkp|)(BfXo$;vORv;vOU21jIcC*9F8qMtUm{_n6}C zK-^>U>w&n(NHOMXagUJ-agSLEagSN81#nMKq}KzHkI7q!d`#X-y zNLK=pkC6(Ik68(kkNNVey{{pk1ZN@cG3#rAxW`1U0S5cf41PHf_n5DhxW{}ufw;$f zg}BFjg}BE^y+GV!q(aM~*JC&G+!7^b!5c4o30x=I$CJ^&5Wdbn|Lt?@l&WU*#5);~hn1|IrVHyzg z7~FIq=3(Td67v|`R4Or#VV?)YJmz~25c3$Rm6*p!Cj&8$kqR-7DV_zyJmz~Q5c3%6 zBp~K7#nXY9$9%2CJVt6I<}o-S<}uP!fSAXyPbNjolN2pPJf=7ihY8(E7Z z9=l)+5b+r4NkGJ7iXMh|@&k9P=y!dnC*`Demh6a5{NYLRe==8KTM@XAh_}Ti_mY*6o_>ELqOa^^5eUK zxQ9psaStg5;vVuHe;A?`8KG7$F|TnUJK zjI;p6J%-%}h+F=3qa&UaH&K-L^|$y zDv=M#kJ|-AK13Rbd`NNJvs5A<@(n~jM4H1QA0i$1OnKv_$j3;>J;Nz+55bMw3B*0* z8;Ek?jgl-k8@7kL)haU1L7WnOC|0h-*MZi z#69FY?olA_A<}V=?0NtHV$)BX9&38DzyCkD@jZ>dkKh0QT>YE>{r}aqzn|a#|GV;= z{r&$#|G)72|E#@5Q9123mgTl6DyQ?uz6?a=jDoQ*0Z}=lAP|)^3Ib6%>tHNPbWv2! zIvC3mT@;nG4#u)77e(c)gFsZy+6zSGEQ+zuaadH&3=c%*EQ+zL_F)c-${ACE zsGQL@b}N-$m8TMwvtY+QKqV??N{qd~ym1jKcYKV!p8_V2g~r|oMCGjhKvd5B8ha0w zsGOlWb`ubl8_(T9RL(Fw&1;NQJ1}6oshV6xRV!xhdWRMCGO^MCGP<0}z#)l@OI1=^7v^H&P)g zXVj1F1fp_NTnpo~xYzLxpQ)~mGa)T41aw8R@a(p|s6^P1BQHaXTSBT0@ zaTXAjn{Nvcm7Agvm7DK$ASyS~X+TtNq(W3~q~`!pxsjd)MCC?$CJ>dIl@OJi;^{zC zZoWcPZt^DsQMr){QMr+xQr`HD-6|h@3WccL6g?^`cln+KMCC?09*D|~bPN!c8>xpy zR&T~w01aOvMio$0F zlNZhuj8r&7Fva1(B*A=}fzJp=Dx5ADsqksR6ou0S^BoMFDj4aJz$t=}9sztxFjC=U z!AK7UJ}DUK!N5ep6omM(Sa4kC6&-kC6&-kC9dZagUMW(r?5)q&Vg^ zAnqaGF|Pn|50Q>}6^MI?bj-^@+(U4IxQBcLaSthud5Oc~9>N~;A`tfwTp;ctxEvPu z5cZfCI1KkB>>M^&AjL7yQHgxWHxT&{>6l$qA|E0RL_S11<{2uH4=Ij$5{P`rcgzkT z@*&bOj{}hpDUNv*hsue$ZE{Pz`K10 zL^|dnAnu_J#@q+QJ*1d(;vP~A#66@KhZP_;GUioZv`SB z^IZo-K1M1;KBjmR5c!y|mB`0PtwcUXdIJ#o80mFD5uLU9>Q{)eTegpX= zI16!)iFQ^tUJ~~hyb$*o>2e_MF~trb?lHwBK-^NUh+Wo)p`F$j9JXfyl?Og~-QzX91CqkqVKIDGHH~`3jMbk+uMl zkC9FTA|E3?4~TqB@f;xXF<<^P=q1P}ky?m*Oz|ur?lHy5K-^>4R^lEbJrjs~Oz|`z z?lE5>?lCwa?lCwa?lIq!fw;%y5$h#!kHHCXkNKVm#66}s28er1(MsH7^2Y*kkCBcB z;vRz&;vVxo4v2fqSBQIzRET>_(W~K}e7G=XBoO%+=_nxbISd#9L_S739Ef}jt{I4Y zj7NxkOmPSh`Ix*A`Ix*A`IxT|`55VuK;&bJgMi4#dCrv9f5hc|q=;TsM2HtcAe z-#D}J{>E1upK2Q4^u4C1n||EXU3jkW&xP%UzbU@0ST2q$9$Wlk@v`DY#al|lN{5x| zi~m!6q4+PwM~hoZUn-qd`a$XX(sxT&l>VUfcQw_emuilvc~{Nknp0~|tZA>gujY=L zwKacQ^JIB&`90-+<(l$m$|sfosJx*3)$*T}e_q~M{)h4d<+~~aDibTmS7ukHR=!pF z^V+7`s>**Ta%E zR`-0}PwH#yht{88zoP!~`mfjDUH_L2jSUCXzt}Lk;i!hQ8Ag+;n<`CHnwB^H@&8l*73Sr?FBHDew7zM5;Sm3;I^y^G z->H3~n)gk;aloUc#|xR-2LVr4ZtwZ~nC}F3P|5Upzd&X8qP%gyb}Cs$!>MdSX)lkGzVSP$fNJJ1T}WKj+UZsMFpo>R^_clDf8v{L;@&pFis=Zy5Q_W)~w>V za2AK{-p$@P?@VB@&x8vEju7aEd8bf0Sl|)N8(F#I+t~+swH;K_f*!U6NS}Dv{NkjZ zhvOqSuk^`1&u8{)9F~6M0`oe7n8_cyy!f3xhqawRC2I4TUc(Q~3(Glehf>Kl#2>m9 znA!W-x=QbO{fDmRoXD9=w_VI(+0^)R9;FgddbKH)J9@t5i3d7=5OAnh0f)EHWz5SjH^XpUV0KRV)v7qe`4j1CD~^BeD0xgc5mfUAWPS$;PZ)3eG2CQiNvQM zWKH@Mhw)#?>x782G^Mt6f+RDJrE~S!r z0bEEQT)F!_!Hr+LzWkBbe@+L7WsgL17fu8+*tqnCKDlFeKhO*5s-ExuJ>3Rqz^II2AZ=_fxQPWzy!HIb|y8 zcpuwURGK}^m+INd9n14t`#`S;vYfrz8lc>JH7mv4kKn?UKqB$6UCY(dd|Y78U?7`D ze$Jf!9G16`{!pIWRXNAQW^q^+t%uQk%RktA>779DsJW0#ubi>FGUp^JS@k|P@>!no z&ZtZUuUW>Kvxa@(aA0 zhn)?i-}s>m4hJ%xIA_5TKsL@if(1tcdD^_z3kZ05?-*QgD3|W-ojDIsY1{ok7fh+W z^7Y4dI)~)~KAabUxYJjMwXi(N`3R;1bG(2*bOz8n`4*hVIn#GP>bZkz|Fh@PsC)rK zb$Q;-`KUSPs)WS@om*SEW5vOqAKag|C~pF{2b3&#HHWq!||N?z*~1ewz;f@6?p^3&$(z&-GA?SY!@*CR%B`Vw4Vcx z^BkY{E+88!pEfPF^e`(v>dUB{yBjV#42VlO?4rZ#-`;a+9ziQDwxV|dUUX#rgx4SF zy-p9sbS}|4N5nRNQSvtP==R8#3+Vf0#5ierZe=DorOHZoY(U}*~=QFkb!JbQV zfw@SpGfR`Fa8V0T=zXBHOJ}v<0|l05x^RKH&r+%FeFUt=&R&UM)Y9~I#2a5AKR{mpS}LrSb!aw{ysS_@U5uL7oNe@ak%IBLuWM>d(Pp3wv$h1=7CRp zSL3H&|2ecvXOcI`&cRq{5f20VKW=ROiL~>yFZnSc0aj= zbYe#am(O&4<&N(ju=}xjPDk3`AG(!FF5vT-Lgn)wX1jD#d2jF4W&wu^{?Ilct?Xl? zN54DJimy&f(;2U);A{QG-IeyOO$%Rt3JW;reO7p>7Pj&fGE{vEXE&|yIn0-82ZxRH zFdrMU>bns?hb_E@OZO_L{l%tV>=`I61t0^33(O|DWsx4|%wst(>)m7pdKc5Y#y-6B z+5L0o9k}Q7|6lN){LO#<|Dnc#jc;wNX?UgK-x{85*w%1g!yOI#|NVc%>)&60P<=yv zpSoYvJzcjy-~YG&fB&y6~mYakvYp7(@a`&%gHIPxuJ-$HZ6nFmudGpFWzLsk_EGFajW6Me)3yHf}sbs!$ z!>^^2N>(rT#9Fv+e5%oB`Mh;2-sTfOVDNi|Y#53kEU&J?X=>>8Yq{jVVi zv%Q-63ax^Xo&a1R7^yHzuywdSye>Nk^X10zy6i{HSD5KxMtWR%<2v3qcyl&|xZD)E zqr7gqN0~1-k=K1$Fj8(JubU6h&+u{ILC^S3fZF?DYuu`Wq)R*hXT8`y0+zDAbSQ=6h7w#%y$5AmSBp)X9e@^ z2b?JwX(MokV2ZWCB*7HRz-I)*7P12|o)VDFjrsNg@@B^r3&5$KW7r;+y_UgM0iUvB z@CDG~>{Ezz<_;j+86ute2r$BPNO9&?;3$C< zXFd#MJ41>y9|DG1A;p;w0NG0uTwtgbvYL4xl_3K8&b$|he8?&g`4CSa@*$o;;U2(Q@jd@drVP?drZ;8a8K6n%q2kNV~SS*k&pRa4n#gi zx)_LjOz~16@-etedEJpuUU!d*dkk?A5ciml5ce3o=f^!JVkPdeS%kR9;4cB<9<#O* z_ZX>_xW|^j#p~i8Q@psc@#eV4eCGpkk6Cfp&2f+UE&$>l^YyT}$9#pj$4KV@agQkq zagX`70dbF!T8Vp%RET?wbQTcz80j=1?lDp!?lID-K-^=bX997Lk)963JqBkb?lDp; zagSl22H>8aNQKD9NQKD9NcmTGHzS{9g>i3=dyIEH5ce4GNkH6VJVM-K)K-@!Cfw+eh191=e&Ul3j#66@q<7FW3p(kd% z2*f=^8i;#{bOx5aIqo6SK-@#5Gm!DkaStiZ*a5^n1UKU`0QY!5V(pAafXIh@XFLi- zJ_MIay#Ay44Eya(wT=JX_QM>ibN z@UDiw4b}Dg^Y{P0SGT1>IKzbtv;{%Gu0#tj+HGtUCvke)}baC6^K<{vFI}FHh zW?2U^oLL}kgQ#RUvkck}0WzFfEp3OCH*R1!+uv;mQ^;&)6|@ZiGMj1kHm2N$%w}d$ zAhVgy4`eno%-WcY8#0?2W`WFRhFKfaa6@J@^DC9iX69F0BbCf%rc@xanJLxA(A<#O z%nEH|WNpZ7W=gd&<~C$DGnm?#Y#TD0nJa{QJN(C~UnNn>` z!wnhE%pyLT-nb#dnMpAFB_P9@xiXuPwIRcq;AS(-He@&xX(}1cq!`F>X3WiIWNqjj z&VdYPQk?xPl?-R{oz2YKkm1Y-p1l*ua3;msPXigw1-zBhRkLnoy{=Zkl9R%vl){cGMmYFHe+r>W;2lnGMfo5kl9SWfy`#| zoz2YLkl9S6vzewFGMkAsmCR-mnf(Bj%w|#yWHu9aAhVfBXW!3Znavm_mCR=HO(nCL z;8I~W=N(-t8P0UeY~ERH$Z#go+4lm6c$kq|d6!^tn}CA_^Su>#r(lY=0S5`DD7-^3 z`Srj6frUByCgAOY`K|@}3q~ruO)yfSpJ0l@TLtsI4meOS#WlcN1oK@D^c9SBHIX*$ zj?_Y<1yj5RXb{X-s27a%YM@RqxaB~tV5C+mf?*3~!AOM~!ALuRl3=C77@9 zRlyXemp9(lvOBA(6lPj5#3{fG!QjsWz9N|QIly$mNQEy8MmiaoCYa*cz?TGrI}?~H z7`AY}V7|f>!QjpUz9^WlmAJ=zCjoJfk)963Jw|#O5ce3V5ce3V5ce4A$w1s=q!WR- z$4G^^$4G^^#}rQj;vVxI58$4jNKXVJA5#<}AM+grL_S6;L_S6;L_S8^3`9Q0GaQI~ z%y%#l`55UCAo4M6E0K>WT8Vs2(MsfF^87R7+mKHt>Jb#;9wR*rhF-0NnG2cUgxW}x7xW`Bj0^%OS7UCZB72+Nv72+Nv9RS2VM%o{UdyG_wdyG_w zdyG_wdyKRZhopq=C4HNLwG{oVbS+191=ewmwQF?jglg;vVu1#63jX`Y?yZJwzIa zdx*64Au4eXkp|)(B5i$uO5DR*Z0!bcPgZH`{XpbH*n!B$NV}*+K1M1;KBjml5c!xd zmc1?VF}T}+$j3;nL_UVS4v2hAaUH=Sp9Hs_Lfm7b9u@Z({8}LHF;XG!F~u8zxW^QM zAH+R|jZ1$J_ZZw7Anq|zD{+ruuLR;AQ@j?4drVP?dkkBMdyG_wdkjv9dyEuK{~+!$ zY$5J3I1h_^j8uqw47(GEdyModAnq|zA?`87B>?V;SObxdDO!nq%=dC2@?l}NUIs)y zM!Fb?e2nyBAo4L%A@VWOg+SzEit~ZU$9!9X$j3 z4>TOS-|zpgtNTvfWpx+T&8qui-K4s4b;s`4`~Mx4zpva|*-*Km@+Xxgm2Xt$RK8p} zyYi{Z$15W$AE+E$X{uC}|D*g&`5(&Ay4qU0Rw~no;^f>9o=(N+U}jEFDsMOQ}%&KgDN@PZS?6{&n%T;$IZ6DSo?nNpVi` z%f+*cpDKJJJvBCoJ6LV$rdMfb~(<2Z+v066YKqY=+N^M>T#7|6|K>UP6Hs3@g zeqwqA;wPrz=CxGfCnip=7C*7vHm{))KQTQvUk}7jM+2*Y_=$i$#9-UJgi7?p zWZZl?5Ir$K1JM)XXY*xLq9-QK=1T$els6-rF9zZ#MphtxGVDcE;wOeoD!qOR#82kS z1(w85=DQGxpKOB#K>TEb%m?Bp!)^!SCuUwM@sm9TFbLi}Xdvw--?uv>um$!?hj#7~Aj1Bjn&gXuv0WY|{XC);2u5I-5V5I@-l=K%4O z`3muqZ6NgeY4harrX~0($xo&bJsI|yK=foAoDM`!hCK<0o@|5D0Q8hMbU7@3GWnCK z#7`!F3J^b;yp{OLKcx~s znf!57;wSSx7KooreiRTt*%Kpy_{rpj_{row>{OqrVUGY#5o`nDQ-aA42Tm4DUihS7 z^3A|R!Q=-669gk20*n_--pV+^o;VCRNw5tL2gVA9EsPOt0}uOzVAz9z69vOQ6!^H{ znjZ*^7Hp7#B>%D9$$QiZ7EJyi;CR8X2LQ(ju596>f<4g>I99L?gpUY@EsPRugTBBq zg2^8Uj1)}15ja{f`Fdc4VAy5gD8cnx0)`9rL;)Bkn7q&|*b{w#p@LxxLj-!F>s8>x z0?Bv11`HNRK9vs%B;WNCl_Ld`?|K>dpg`DxBLu<@L_YLH*DD+r`H*}r5c!aNAo3yk zt`|8h@*(U%qD(;~Rx^{9(+(Q?1Jq5%)bV1jXK-@#}U5^8C56O2u2E;u?+Vv<9_Yij1b|CJd z4Z0o%;vVwtdIX4jNWN<;5cd#vAnqaToD=sDc2_rt;hu!u^#Bn05O&vnK;%Q%fyjq^ zyY8V9`H*~97ZCXv_9h_mG3>j6$j7ifEb=kZJAuf@NQKD9`$*%kI63qa8FP2Rw5shUkpS(CND%jCcg-Xe9ZR}Ao4Na zi-E|;o>%}xKK8_XAo4MJE0K@M3z3h>dsyUS*h1uEq#hRe7`Bzj$2PDM`PeOUfXK(> zg~-RSg~-P?Xagc2!=431K8D=_L_YS!4Dv-j$=5>MV;4*X;vVyz2E;w)YbEZnKh6W< z9(&>(Anq}FA?`7GA?`73A?~paCIfMg$qR9h`JM&DJ?48R5ck*kI9b#A|I0<4MaXBFGN0ObpjCi81`{MDWud<vAnq|=A?`8x!+^NQunz~~9`hXt#63oOC=mA;=^!BPu_q1z;vU<; zbK)NJ72+O~7vdhn_MEuKunz*_9`hXl#62e8AHY2kcq);PVOxoO902t|f7O0J|F-=m{)Kx7|IU4WV@uutbKRwfwjfT%axy1{@?Nb|Ayk96qgjg z@uuJZ|1O{Z|EBl<8@saqU`@^AmS&CIUsKUg|}-u=hC>#1b_LFWg0_aF1P&DoXx2mKw${)1UG?>Z{ke=uYM*?%wq zb6EBttd@D)8tuydgDDlr{)166ZzYxNKNvsrxU<=n{Rg999``T1vj1S1&07v+|G^p$ zWdFgGns;?&<6YT*Fn;EB0NH=AUIW>GFlBOB_8*LodE5ZKEBg^~Tdf$TpR zIrF%)c~|xy%&!3ZkGwMoWCOzZn0GOUWdp)Io_9%k<6Ue(9CP!y<#|{39}Kg33xMoD zOtBrv{=?w7&3RY$A4b{+WdDKI=W#RhuIxWdk=vYiW&dHm+_JnY`wt`KX69YJ`;S2O zALeT%`wxTjoa{fCMf0Ws*?-`gK=vO7=V94@nD0~|`w#OKvi~qr?vvh?{fChX*?$-* zw>j_1{=-Pm2D1M!QX%^fQxvlQFyFI)>_1F#5|I6eDGI&&5B{dW#=ElrFj6boe;Da0 zK=vO-dNPpxhmi`|e;Da_Ao~xT7Rdg?e66tm$UD?|V}NWx%y%@AvH?k?qbX$nVT#8B z*?*X?ko|{|jsmj(Fwzk~_8+DwWdC8lgMsWnTyaBy>_3duO7_3e32q60p8{}{x`w#QAlKqE~TFL&yNQLY_Oz|)v`w#OS1Z4kVq=y38e;DZ@K=vP| zI1tGG!+fpu?my-o3}pXdqyvELKa5n!{=@a#AISd0Nc#cVe;8>ako|{|)&tpp7^#r` zhbekk_8;bJCHoH}6|(A?^_8&yr{ydQV2f?M1{Rfe@KSw3|4|<|~7m)o2 zkp{B=AjLrTAEem+EQe+PL5hLwKS;6t87kR-&<5>0f$TqsG?4uVkp>3X@1z)byFk9} zPjXIwfk*?95396&2bIW&6x$yIA|LV%L_S2?{wS5mhe+GE1Cb9|@vlHP-WBk&WU`8wEZC>MLsUf_6ImW?jh3ldx5xzNCRpu!XqCNQJn^NN)q;9#aH1#XaV`9*BF4bR7`)nBq-9++&JD++&Js zfw;#Mg}BEyxB-ZJj8uqw%<6g|?lICeK-^=b*8#XEx6;~I1CfuB3XzYI3XzYIt^^_< zQ@jRnK=D#SgeI0J}#Oi_q?40|dN_n4v(_n7Z_ z0Pg8om{Wkr$CYg*@-b2?k&lsDiF{0PG7$NguMqi|;@LptW4>nrk&h`(0wN#t6(S!a zJq?I_jPx{uLp}-4Lfm7bCjoJf!A%6>9wW69_t*tO++(Cd++(Cd++(C;fVjs zDIN#JJ?48X5ce3VmAJ=9M*?w=k&Xc39wQwN#63pZ48%P~D#SfTIs}M&j8uqwOi_q? z%y%#l_ZaCQAnq~J!vWmWlj31OV$an4w92WPGZy@d=(z(x5iF-(qKYy`tQ{2Nuo%;-cdm_m|^EzmVa7)to&g4?($!j*Zk7=|Lx1?|6i>+ujVr~C)IqU zW^m1WYWmgGlwK+QTj|Ntw$gp2J4$Oye_Fb#^oRTW`Ty67(~6%fo?QG`ad`3l#e<3s z#Xf~!6rL{pxX@kLTv%WDUSWCRkNJ~)7x2gTe*5SD7go1apId!;_1NlB)gP)JSpC-O zQq_M}?W+2xs;yN&th&AG#;R+puB=*AHMeSd)#s~D>HYlw``MCSSmLQ{9FrA-fbi=O!S#6nkPlkX?%1vIfX5#pJIC zvP-dBt^=}5u?;*dyA)f;N_Hu>&T1gL6nnx-b}4qtN+7!w8{`@wyA&Iw6UZ*bHny*upPFvJ9LP4sp0JW_irpe) zn_`1_Shgwlgph5DJ#iV3Z3?OgWSe4xTuLR|6x(1ikZp<$vIxjF#dZ_2O|d~P0kTc8 z4Xk9FVuJ|Trq~k~1KFn76AOWCQ*5gFK(;A1$O0hS6dS}!wkbAe`?50kTW6b!GtBrPv@sb}9D6bRfGF`)DeVU5c$U1;{SN zZn2VGiVZRi$S%d!IS*i$azMdu5wcCOTP6e9rr0fK1KFn7EoTDRrr0f$fNWFjmeYW2 zQ)~kv+Z4M+$Tr1p5wcCOsZIg1O|e0&WSe4xSjjfU200nXHpLk>9>_MuZn2VWirq31 z$Tr1p5wcCOL4<5mO#UPw+Z4NH43KS#O?4uWZHnC@WSe472-&9CRHK1xQ*0e8*{0Yn zCji-|*dWIN*{0YNLbfUP(MTZM6kF$58iZ|18su0CagUud3W$5`7Av?XAAqD1`Sf;6 z_mH|NIV}tYqA|D$>hmM zw^)gMY!D&xu?>XC$8PbQ$j5FGA|E@f7KnW8mU>{1e9A!NV^0WsK6J~roj~NnY)K{ZVYY00l1k)5w`_YHh*3dK$zFL_YSB7l?f9mM$Rju_tZ^A|G34 zJrMcWAh!XLj}3Aw5cx1cwygysAG_sxAo8(6)&P-@4Pqtou??;RA|D$>h^0ALD1A67N?Q$UUu_vrVKK6tV`Pe#(fXK%N zxs(P$K53A}6yhF}7kb^3Q{tX#PoWa`*b_qBW9wWD;GX*dz+`QwXo;G)0}=F9VsT48!hMfJ{?77|1kb$aFtXCDRnAb-xH?nlkgcUn*}}%`|mPcE3a+ z!<1Q;qcTiUK=*T07^e9xvXf{S(Rx@>!gxtO1E^gnOT)-N`nM4O;KleHAnw`?dwK^q|z$T2Hp2lxj>*n0<#2~D(8GvpeIsk5$K8TdpT#OK_QYD?^8(8+m9qs~=Q=8%6YL3p z=vjiTvl95MU{45V3igC>hG0`&3rrI1BjGcG-Es|Zx?s0-0-qLa5cWK)P7`bp;Z(r} z5l#_okPhHef(;^^EZA;KfKLi`i!f2JTZ9RM-6D(^?3T-cae`qBCkb}TWx!a$1`);x zwvO-#!Jb$QoG93Ci-3;{_R*!lXu$?y&$8-cf~|8gaDrgBSUFy>TdW)>*dPmlj|w)( zLK@`Q-3_vk!bdFF6KrNyjS}n@;TXX-XahzHw%#n@Xu+On1x5(Aj+LVXdqNm4*kLn( zVS=qQ9cUKp7Ar#qyJZRx`PeP~(8$MbIR}V*?3VL@$j5FGA|JbDG7$OLEkfjDw+OxR z={_6il~4DXK(BlPk&oSCCGxRbCIOL;4RSIN`Pe#EA|JcuG@w^Lfyl>hIh{)6V}qOm zL_W5TSL>Be_e3D_u_uIH`2>396Nr3lkTDz<`Pd*Q0+EkBVI}ghsYU~Pe$j3f99Ef~u5HB71*gAuN$j1f|A|D$>h=M}_jHmB=T_TZnt?4T$!~cQ zh%4 zEb^gSwmby%%4Z9Eot2RfO|j(xx&`^zEjgvvJzMVMsJMro+Hx-t_s}3)?g4O59Jl3e zAo8&%gviHk*#tyBjH4}g0+Ejm(gj35wvLs^$8PbQ$j6?r68YFVw*irlts_J}cFRpb z^A{w$2(L^08a42O=N4MTmUtmeoMyW48#AkKM8ohV?`Q)(3$2M5r^ZtL>n|=R(PUEM4>AUZW4KFwR ztYJsP-}B9X8~9$lKjGW)zR@s;?*crVZyEIa@(yo!XV16i)&I2qvHA!7Ha)&Cu;-ig zTKSH>GwUbt4T3}Y9>KTQ*Vg^F-@aG($nNjrTg|ue`7MJjb?5T^d}HfI@jZP5`L@1N z?SH=h?R~X3@?Cyc)-Kxpy?%Z};RwFv@8Dnl)<3_!u=3}XPQDHB;(ROMXDfa`pxC;5KF-ftniif>D7=Q|U7zMb&s zd{bfHnnLOSl%6d;QF^%a*QMJ^e^I)o^zG6mrLUEyl|ENGx%9Ep@Y4HB2bCI1eTu&* zK3)8AvAejrxW4$k;_~7j7Z(;UC{8J!QJhdbt~j(fsQC6`ZQ;KQ&li4Dc%<;Rg-wN< z3#$vu3X2OD7Fr7D7EUjWEsQFBs4%eb)K|6$UVUTrwbfTv|6z4| z^;fDVSD#vaV)fD0M^wM7x^H!L)k{_XTJ?C<-&NgH^@FPGtG-)xMb#fvwN-to>a40y zR-I5a?3dpDS2q4zl+5f}JspUWX~5M}fhd^;6^N2qo~x%&iIQ0YsYJ=Fq1ES5iIQpB z92OBN@ftP9s@+ltjN{;YS^wQ8SkYMC9~94 zpFkx_X3PhoWCqb{{^t8GlOVDA^P}EJ|h;uRa2Zl1)*Fk`3-~AWAlD zelu)Wlx#d!qGVG%42Y6V{!k!FHc~55vME}Ll5K-SfGF8Wg(%rbg(%rb`E9aYQL>Q^ z0HS0gwGt&8>489$Y@|YzY>JIQlx)8I2HCDC*{sSylx)7WK$L90R-$B6?GH4r0{ zVjxB)#Z~-f*sfk9ui6E~$V9s8IUq(R(pAp_F*1?nFpQkH#HmEdq?k&SOp2?X;hZR$ z-~v%H$*JSyd(~qc79|thsvSU-Ounlg2cl&1 z&0$e8DX!X1B}yjWK$J|RtF}^!l8JQHLqL>FaH}2wqGa+7M9JhEh?0qP)%^sAk_~Rv zeVh^_6Yr{fff$(-12M8G-a{ouHuyV%7}*pz0Wq?{S&5O2^mZUdHbpBjvTblH5F;Du zI$)sjn4<7*!Qj>chX`h6wx}(k*);ZCK%~zpr2r*!dnGX6b=+j@mk<5f+=1D^c75gInX4S;?+Q-V2VP6V2VqC zdck-u2kHbP6(S!a6)IMY^fDmwF|5TvE(IbV!@3xVd<<(L5c!yo5c!zg zd?4~M?RFsYF}c>t#-Bw#CN~R+e9Wf}h7}hxe^65$YY#{bAxyeB6V{(&# z*vGKW0%9LyJQIk0Ozt!w_A$9rfG_tZcQO$Bn4A#%7}i7}_Ay2w_A#vSKED-yc9M1e%>|;J7f!N0wn}OKJuskgGF;gqCkI4-IVjq(e zVjsgA48%U>Bg8&tdN>gK7^4vTnA{OS>|;Jc>|>0F0kMx^39*lv4g_K!lRFfMeGJPA z_UVc7U?BQ2tV4k4$FL3pq8~Hu2aNL^!xEw&V-%tv*IZv9`Z25nf#}B=twcYD)d)mC z##j$TKPFcKq92nh1JRGkS&4p3PKbU;Zslu0^g~!HUj?Ec@>z*Ae-{0a>B{GU=!Y0r zz5ql&Bo~N&NG=flkX#`8A-R>$aZdC@a=BXcLnNt0KZLb%7l%bZWV-ShAo?NGl}`iF z56Ptx{g7NB`XQ{9J2@=+A*_{80nrbcu6zTB-Li}S`>wx&j zu&ng@ClLSG6l1Z*BOCz5lB& zz5ZYEz{1}Y7W7&AOaJl3<$d~8ee{6#a-XWP?|Ih;$_K1$9{APPfiu6_dj7!K2dwFH z(XTDEwSKwfO9Rj4m?>YLeeQWP&Y#jeqWtFl+?bQ(L8qjebaj% zZl6Ec_lG;=s8P*te7H4VIpDtE^;*qCMvgk_s8Pd)?)5~PxzvUGbE#pxCVMxKmm0D^ zmtrjp8TQ6U)#qRK=Tf{_Z|EN$RiDn^{Zc-=H?9yb^{M^2)bJ6bnuq_&6D*8b|Kri+ zJ_lr?4BoefXdcP}Vd=i18^^By@yOl>cEBb3dZ}Tfjv6*<$ljM~{?PhIS)d1G1bz6V zGsaBZvp$=L4ja|Xi?VkE4daAyzxjkA!$%F>yL&z1nBR0l^Qfbad1HdZ#;*T|L-#zp zhJAc?LwL;@uzUY(7U93|d7=6|wQrXi#-)xLIjZ@Xy%QX}e#d9`JgR-XR5O#Lng8#- zaCm}0AJcoOeScIVM-3S|YUti+G>=*Tb6?!_)Vcfm{AhLt!`^e3m+I$-{q7HnOEvSj z-uO~IKWBd~HJoPul~?`wv-amw!+u39Ji+Hr-JeS}j~F%d4daSSy=8wcHIycO!}_B` zKfgbhV!97~!;Bfb{wMG1z0?7Jv~SJO%rI^~YSdACCphe+^*he(xfDV_Zyzr;l!r8A z)KMe$YKEahSUBhGd021iTE}pyFZ_NkHFE6wt+V!AYRW!7!y!yWmf_ydkjDC#*}a#l z+Q&uM%&_88Z`=@asn*}mrJ5Umbij{$FLl5^?i88*j)pfh79Xxu4f_3Ds+nKs-SepS zbywu08h#ADwO3;`H~gZ{)xD2u-!CN>6@&d~-XQFCsbPcH|D6-L=iR|Qd-l#_*T2xW_b2==_TVQB{gns%^F2=c zT`tA&dE*|HId;VF{-{Qb8a{H=@Lw5;&wXisE;WoE`4#^^_qqMKR5QW8q20!=fA00o z;6D0)82eMC*1UJHEP~fNcVCz0FqbAXWAD!ObI(1U`{pjiR^q3h?%hg!eBT;(7(0?- zzw*wKf%wxCdSCT@716LEL-JDXy(<~!=l^f1`r!V3{=d3$S>xiy3*W@w|J$GM|9j)# z|J%Rs|9j)#|C?KxUip0GlsEbJ|8J?euI4*6m(^VKCjS2a%f+7+cNG7=cyDn-@y-1G zzy1CGzc>E>LWY_r{&CWqfF`Blq68C${WtAot$536)Cjy>a(1kb7_3OI&s)hvnWIH^>6H_r?vf zWs|7n-WxX-mz@se-W#{UmYo9R-W#{|mQ4h5?~S{R%T5Mz?~NN|f!urJUSbZ*y*KVM z26FF>yJa~n_ujadxa=e@kb7_3z+5(_vhj)Bd*jApAot$5u^7m`H*V1_JCVb3?~VI{ zf!urJF5|KjsN}OB?sG0X7RYBm+%-+5_p_g6!>Q!6AMQUc8v*3AA8zZVlFxp)UA?TC zN}D%}xv{ux2rygV_TjR@K&!yL(Pezl@WcfI_YwoM1S7TbRlyX67QuW6l{Y>yb9bbJ zD9o^6iUWbK2&Q;2FkLWgK4*C1%YwmKnI@R8l`jeAD@+xPR5)KS(*D2{!ASc7Ula`P zK;S&VNc#fk3T9>H9KqxpfiDQ=D@+#5SNObOq_x1=f+?1P&k5!$69w|^covu-kZ%VcVLUNjpba{nA<}U@k#;;o z;Uo)W-SH$aRv@?zKBstMj6l8}JAh9J1lRF6aH2qPseD`@-;T$qj238vjz@rx38dKZ zC~$&6zNs895NY5zffNHD709<^E9V?5kYdNfz()j94CIp^!tUU6iYM~P50M7)$q$is zJU}I%{19m%pZpMMAfNmYX~+E>Hrz`SX<(Q@q=9CENIUN3u%Uv%-3bg4%u4vMV7|g& z!AREu9}-OQHsDCX6xRbE6iiV#LNG<)1A@Wb1RO3H>GcHn{@uaxImZ)+SujyPvv}ft zg57pKFi0>(EAJJ|mro|1I8-pW)xdiM^R+TiFyCu{cMC=;93q&a@GimNI)Q@)BjwYK zC*CQT{MA4{_%Tus%LhM3+5zN)A5**v$Ok{>E98S8Q@jGm2S4U}IS}`l;$=YGW4>16 z9(o=xA$E<|7#}rQn;vVyz2*f?EQY*M8Gd-2a$4EUa@-b2&@-fnrfXK&4M+1?M zksb#`KBhPdh5g~-Q9OF-mfqXCXaai0#q)VR%;vOPRCGH`(rO!}_d&p|( z(?Hxqic5C_aSvIg68Dh&(j8Rd9wJ@(6cG2&AgRPXL>h>DNHGxiknhq*IVbKR(m>op zih;O?6a#S&DF)&ml3%)&3&cG{x^z1b_Yi3+xF_Rv>BCeaAMy=EJ}k^YF-0NnG2fejxW`D>196X$t_9*ABfSBLdrVP?d(3wY5cinkbwJ!> zRx5$H$4IXM;vOTl68G2!oj}}UibC9DR-P007^#)G$4G^^$2Pbch)-$1 zT)Vn3sq&wdU6p^TY_0sTa(m^*%C(g%D~tGD zhhO*p|6j|Gm;bJOPx%Ms>&xFQUs3*pa$EUJ<+IA4ET2#wRz9r!j&gm?|J1xt^Di}z z)@-Tis`>Tr|KD5Fzot@pwe;_$r%FF6-Cx>Rx~a6P)KU6oX?|&D>73H1OJhpMl#VRD zyL4cwSo}@z|36D%@K5^Fn9gTZM}YvkOxT zpDj!*9A9WI{QCF*->JT=`l9Mt)nBZhR6VZx*y;~gA6osk>T=b8RXtbr&sE#2{-)~A zs_$2=tXf)iY1O={8C74Xdj0+X&J1T7yz_<1#+@0?v~efnaA$@yE2NWgxHH3<*6-W} zWH_^2a#)5l%O#NE%%bRIHtx)DrrSFidOI1;+46Tj31m96lmnU0bbBDvnfcSn)ZCfr z%nC^*)0vUe`8btKXI51wvvFspGm9dXOlL-0=VMedoe@+H%XDU%1u~r(8Jote%I zut26WGpm!Sxiiz5X%@(IW&(CH0e5CPv&cJ{fIBmt8Et_~XBKQHLvLrMGqbJpzVgPM zOlOB)=e-m%oEdGMcLN#D481^xGo!7O*|;;qnQ7M91!Oogz&h^)GMricowouR&dj+^ zM%&H|XCt+e;cSXRhO@zWScbE~2^r4j%b?uJaLzlBPA1^aOlKp#9>{byQYPTeOlRW} zGMyPuwAHl5VR5t$P>w=LA3k8#J z1uhay(aHkBHfRAZ6pVBhFkdjm>A*a}Wj+;X7ff*)Fjp{ND{}->oC17JFkhifFvatL z*@F3=1GEZ8DqJ9#;$&c!V7_MoUlok>Y@kIjQemcGRvtD(Fw!%DuLy>HIxt-@-$}ri z1tUETm?jvh@Fl@Wg{gv(PAqTy$@#leoJe7c1>-#l_@ZE>!g+!zo(P;PnBo}V9Ko=U z1HK>_=?TDO!AM5~pBIeuSm12INJjym6AVr`OEBM&z-I;XZ3fO1Oi?&PFyAAANrI6I zpAk$^I9)Ks!+}o=26q^6nqcyW0;dY*YvmNd6s>$pFh${H!LWr-3Pw5*m?)UyA;1K| z;DqslkqYAklRpSJNib3&@-fA}K;&b-2Lh3g!Sx3sAM>>m`Iv7%Qbayki=H3%7;hsG z_n2Zm5cimGEfDvZq7e6(ZwWZohh}g>++(CwK-@#vD_#TQ9wY4o#63isO58)Ffw+fA zSG>YuaSti3coB$u$alpHK-@!cE1n199wJ@w91!;q_KIhKxQ9psaSxFO;vP~A#66_A zVkhUsJ){`GJxPAWlT;!fB26XoA-EM!QHgxWHxT)dZ_bH)h%^xSkm8ERIVbWV-xbLC zCy@`qt#}NGe28?#Rv_{rxD}58kq?os*h-4X#}rp=rx5qh5;-OAA;lFBQ#sgYK)x#; z0^%MbUC|B1JwzIadx&(!{Z!%}B3$X4clQR#VNdV$lrIq+#0@D~ok3j$`9ki?t5vB>CJQ zkE_u-_MEfJes7=eAD^>-%(;8M-dA(I@6Xrs@w(>M1vq>pPT=s7(kXz$N8(g*_^4YZ z0uCREn*=y~BzrvI@R8q%h$DO~ZUO~okBn-Svq!Ek1e`sxC~)@3B8mH|vq!E3&K{W` z4LEz`cNF04kzZAuJ+e3kaQ4WrD$X7$9SJylq*UPSk;M^!vqyf11I`{PRmIsOi-Q4Y zkNge2_y6_x|Gvok|NVD=|8Mm_?eG8pGWI~MA$CWs zA~yd^{{8=dkGv3hBGMB1MWiP3lgOgTk0LW8SA4<0|Gzu*cIcJRZ$poT{_FSu&)fI+ z{~!F&!-IWTH!S(!haMhm{<`oWO(>cTsH{t^yo)L;OW7XGqg>Q zy8cu=J?PcCK7gkOo6_Lv!7ixlOU2WJQBucl`_R*aUEpP&9{m9}%ZHvG?6x}g$A_LC zOq{x|i3dMqdT4*R;Nigzuj|Gt4-Y1mD;^#U#yYmqhaMhm_qwithX+H-;Nih`uRENI zhX;ee;NiiLs$=VY=;6UAGI)5f_v;R!;^DzqsXGwx@L-m?;^D!Na>c`g5n=G~U_=-^ zJlOkn9eDr`52k5dd%(kkacuDLV6YiHJecQoDVBM7oC0J3hKFCKxZ>#{^9d@R9+Dja z`e~VDhk%m>>WKp2q&D+{69tm3Wqk!|1695zU>4Qx0s08=Te}lDL4f(%_ki94dZPAS z;CKP%Yu^HT2{7-d5AiMSzpsRoeseKVRQh;Aqx(G0DI6^>A7!DWUxAtYOIZQws_yIZ# zP+I#ul|u!{HXI_L4QijGaItYkPSH2>^eC;+W?FCq@eGDiR&<2K_fHtUYrIHm8(Y22N838>}+XAEo zm^Y*ZGOtQfAoC9Z34zSt55xuXdk+v3s153Ys6cH{i{HpTzl{{aD#))^g#_w?TA-ak z{jmlp5J)zaoj($&4XEtASs?Q@z)b>KybG8ukYB+M1!{vkfg1&CkZRxu0{Kh`MJR5 z0`hRdM*JTgCzoANd^zIDFI-syKYq6Jr2}kIV}kJ~BTV zaQMi)z~LkF0*8-ej{+P%YJ-u0!$;;v01hAd9S%5rWPTXn@KH|)96mBX6ma-R_7K3~ zqc#`}IDBNjKe7oQ%kD?P*(2E}0nQ$^guvM&*?j?Lk7V}-oIUc}3vl+xufW+Or2=P< zlnR_Z>Z2Zjvq#<14RH2Ic2B_BqXrQ;dt|;l;OvokUE}PL`K|!jli%5g0}dbUY=Of^ ze!Bn;A5D->fWt>^a0uY=k!)2QK9b!5aQMh?N5J7D^X&nLkGe(R@R504=U_Rtds zXAj+CaQ5JL?OQB!_Rte+-vFFF$Tm28kZmA)97Jn(u*~6ud4t0TzXpd7+kEXSEOYqK z27(V9KFD6n5#j@f53<+3062W;iM7uI4j*K%eFkv&pw!^-LEPHss5pG^>x#n%zXpd7 zt+VzimbHb?+9v^r53S>h!w1<0hYxLFaQI-}*EoDIzjhlB;PAox+O2@Y2idMTd}xEU zk5O^>$o#{A!$;;fCLa8N@UeLnoINtX5ped%`~!fqN9OMboIUb;FW~Hvd4aP>J#i1< z?2&navq$FF1I`|qZv>n@GG7lkdnCISAbWi3SbG=X@R9j7fWt?!YXFB2Lt`yD|AE6t z=C#b>BlD^_d}LnW@R9jyz~LkFD*%U&%r6HVKJt4T;P8=oRUAI*iKT$UN3vCM_^1s8 z4j(DiGKY_pF8R{0|8LFRn46y4|M&m8{@>&I zMMpNWTlRQ<(Or$~mXAEYXefi{7yG@Dt@DxR7jvbNZSaxj7c-)f-SUy=7kk{xJinML zu6Ta2$9;|G7el6zz4wvl7o)(-JiplRjdxJ-{9+U|-jR6lBj%Szi3=WIZ2m?z*hd~; z?Dxhhz~hVQ)5!k#$m5Ic+Q|O+$m5IY(O3d_e6gz=ivW)=Lbb6N@c1GfTw#3qOl$D` zVw4y>znC}%&oAam<2)X~^NU^GI3Mu*Vk0-s0X)Cht_II9CQjpADxP0V99KNQm;{Zp zsd#=dWDK5P3>kyx7vtFA`NhO(yn$;xznD0UvjER8ria1vOR}d?@%$n;44z*yKZA(hm)bz!`K30{19*N(wqTTQ zyxL$g=Fi<{elmrTD#-jK;2eR>UkHp4$h_cefy@hr3uJy2aF#&gMgYSEYJ=gxnF9G0 z3>By+h5_FYs3!zN1caU8>jKHvqYW0Q4YceGfn*N_1_>lvaJoP}F$5SWka@vr0+}BK z3=qh?;8cOk3;GLWUT}&)<_7@%1Txxx(Zx3`4$W;zFLZCLt0EY`?J_Q^mkhlcU zSs>Xl;820OB?25GkZdhGSfB>cvQ7fY791o{ABBJe1(K}?I6$B_P^F_lN(EmPs0|8$ z4g$4-;41>PfuOwr^9_4|LILI*b^$p7<{NebSpl*e-Ul)Q+MwY*AT7YWAtgYmAt}Io z!&@v%2vBN>3y^Jy3FwxFH(3@HV9}L`0E-Q8VKJPy=t4*Z+Nj|TE^+qI629KqgI~dJ zXAk{haQ4tf4Lhhfd+^)v3gGOa4H{kqoISKb!wZ132lEY21I`}I8=O6uZ+Mc5vj_7H zj|0vg%p06N_-)umh3s(~G&}}4eDK?_6>#`qzM&Ox_|PB*hYzxSjl&1O28R#ky{s*K z8d`V&hYzwF9swLa$Tm29B>Q114j;*W0C4z7b`#+6k!*p(M@sJp96mCCFW~Tzc@EFJ z9X=Ab9&q?boWS8D*^P+@cN0F!Ul*J`>W@ZNIeXL}0%wmb3Y9+?+7dn9`X;Ox<4xC(IgNcL2~*(1M`0B4W&?N3tgZ&K}90062T(cRb+ik@<0evq!SW0?r=E9s@XgBzrXA?2+tIfU`#%Q{e28 z`H=wG<6+$}0&w_9_AtQVBiRCnk1PrtKJq&haQMjlV8G#{o)9>EBzp+p@R3r1!$-1- z_T3I2vZJ9t;P8=ORUAGtKM-*E90Uvi96mCyYaBk3EpYfqHeZX|P54;03eFz&M?b*X zBl7}hk7V}+oIPp-fwM>E1j?2%uAvqwGA190|8c2~gJqn_vjID2GX z6=#pk9}YNsWM1Ixk?c-@vqxcrgTn{E^?UUC|8wvE_ho+m|DXB#zi;N~Os7mH{Ym=0^lRzo z)4xtXoW48#Uw{99VETk~*YpAD&wu~_v+w`cKXqK{@YGjQk>rQTHb$-j2Nz`)%y8SaYmCc6)3|?3UQydjG$j(LY9CjQ%G2 zNc6twn&?lXCD9-{D|%&geDvJt;OL3bW1@#dv(bXce?;{9|MAGC$UTu&k*dhT$jy;! zBas;V56ugGKQuLTacFetZ@m9sk>O8oNTAmZJ|r+? z3_c_slOi7ym~u@o06ruzSDJXwlp-Gzm=Oja5}032yfaFX4+%`ECf*sP$cF@` zN7GY@jYS+1Gz^<~$CDzT5twpKycbH5&j`#5gU<-er6%4BrO0OlrkpE2BQSlMcrTM8 zpAp#ZO&bB95!lpCyvIn9&j^h3rh5UO5lEya-j}4vX9Ome!Dj?EwU_yfz@|3%jKIWd zx`%6gMqqd}@m?lHJ|i%-UGW)#S=O|kiq8nlGB5KPfmzm6OT}jdCU6sPY*OSig3PPp zGlI+ud`6IY0cQliQV2=Ey}=H~)FBgp(5z-I)RzZviuL9%ZE zd`6ILfzJq%E$|sZvIRaPNa^)}&j>O<3-B31eKZsB89}lIJ|jr>HGt0uYLIDw&j|7> z@EJjV1wJFlufS&nHON$eGeTarz=s6M)-oRw)H;&^9}*;6;6s9B3)&6|O%nkh64W3Q z03Q-${u0241o;*Ckf1iuG9MDu1_B=vBwNdTNKhM$1$;=*X1);cAwlK^J|w6o#sNMg zs13$po~2_>7>Q5crHB^8%j{WWFEZGlFEF1o(^~*?j?@5!4gC0iO|Mz9--_ zg3PPpGlI+uu4x6psqn^+*hmYFe5WwN1))6>-)Dv3f@R4j)96s{f32^wRK{^5s zAGLwN;Un7z0uCS9&H)Y|+0FnCAK6yL;UmE*;6i=YQXc~xKC&H4Y`m55aZ^PoID2Hi z0C4umyujIm-wk^Kvd8Ds4SN8G4{cy@_+Wm+E-DTm%x~BUID9a_;eEj2!^Si?e2~52 zT`CSAWE&hl_%%3u$m|X8u*~5@>uh)vaQI+;!&`vEhd$cyI^gg@_6E)dw>o@~ZE*O| z6B~9=arj`~;P64VAHd;*>%28R#kH#|kf;e+`Nj{^=L%x`!SaQI-};PAox z295x?I(#s{VH@D^!S;q$z~O^!gTqI*AEDy#VbgDT7$AK7B}jwQN46iJ;`EX2Ccx<< z+xG)bAK6yL=_A4S08SsN7dU-n`yRTI^ify3;P8?8^{jIENOnEo@R8qIz~Q5wr~w>4 zlC6rvM@j__A2o=UIegRxcLEL{wSg)QAIZK8=%i<@HV`;`WM1A;lrHRumo`U$h^SeBl7}>kIV}kKJr@zIDFIwC4j?6Z6I*?NVdS? zqc$i896pj=1UP)u1_FnV%+CiLKHA!I0KzA~=><+7nV$_fedJf*^idn!2snMz1~()( z&UgAq_AJ2Zqc#vYePmwX^pWkEfYV2|rvXkM*%ml`kQfb5{XQA2}5` zeWZRO(3UtRKC(RlaQdhZ#sf|t*&YWt zePnwK;PjExv4GP@>Q!<2NU$nSAN7GMP9HfHIDMpk6yWrc`q6;XN47@-P9F&tIDMpE z;PjF05rET2`+NxC^pSdj(?_;>v(@>ek9X!^3JxEc7dU)mejwoRk@*3D!$;=(0S+IT z7Z5&9@D2U`hwuM?vETpy+pqusvETo{GBZANZf0=i#7y_h!Jm8m|M&g=e`D%rf5*@N z|8Kwl|3>2Xi6;}A6ZabRgOmYiaF8;7 zHZxZ$9Hi`BR~)2_#?8#43I{10c{8)9!a>St+|2l?aF8<0HZyT52vQ%5H!~J0oTQAO z&20V(Cn@vG6(=c^&EOGq%yCHgH#p;4pNyH zI7nr_FW?}R`96SyRNc}GaFEJ;Z@@t+zgp%Xl~OHpkg6vH4pQ}mz(FddJpl))%=Z8s zq%z+faFD871P)Ru)iMXE%&X!cRZj>Uq>|kYaF9wiu*5;C2I&kqNM-(Tz(FeWod5@^ zly(3dq>?RgkdmsK+XD_#$rd6V3Yva zE!%)|1;}<~q=24id4$S20?fCxB6~z$cFSWF&Q?KP@Gvl3AoKSFX9;9}BQQ)L^G(2+ z0{PXlp#mvY9uYLG_Y zG=a>k;_#7dL0kB=)B_G5cB#SPqc*6e;_y)$2pm3Y1A)Uw<^>KPnO_4qd}RJEz~LkF zcLEL{nZFHi_{jVUz~LjmRe-}sZLl10_^1s84j-9c0yunRz6@~q$b1Rl@R4kR!$-0g z0S+Ja#C-e`KHAJJ#T1-95R~2WE8svJw z*`qeN0dV$6sleHzHqbI>kJ>=s?2+tQfU`%kRdM#nqAFxhzFV#V96pjg6L9#bCj<^3 z^~4Oo;Un3)#^Ix(F%@w5$ow?G;Un_`hmXu_nZrlsRdM*pyebYKnV$lr^ts9WWWeDg z*_;iQIDFIw7Xl6+nV$eSd}Lk~hmXt)96mBX25|VuufXA>HW&>!d?Z`o@KH~UPHZeE zd@OrZa$~u(N3w?l&K|YIFu>U(^Fsk=kIW04Ju=S=gK}q&WOGg^clM|a1_I6=`Q@BY z?(C6yUE}PLMS-(N=KBH89?2Fsd*ru2;OtQ!^##bD{G3q5;Un260S+I@7C3z5SMX{0 z^adP0@++9CM^jG-96pjQaQMitz~LkFy#R-gWD6WVYMq{d!$-2a0}daxfxzJ-^IZUk zk7NrRK5BzbfWt@T1r8sXKLl|2NNGpF;iER_062VPUf}SN><-8#d@Nf9XOCp30B4V6 z#{g%K{3ZZrkIWP8<<1`YjR4LbDJ=k;J;>g)7jX8V)Zpwv_NF~loIP~Qrrm(E2c@n! zdyu_p7Zqm@t_;o|dScT~DkG$a7B@J27!6+L@WH$*4j;^KdY@|?K6J~bcL9eFvJDO& z{2ClS_}%ml%N#!B&8D{ihYvmBio*xl28R!A;AIXU%x`*wYaBk9H#mGSzv*=<4j*K1 z+5tFxXoF3!0uCSiZh8@L_+Wn13xLCip4jvp;PAoxrsn~N53)Bs12}wWgH2B(oA8lr zU*hbc3%ttNgZWL{xWw6m>`jjY&K}xe6PaJ`>_PUXt$?$KHgLt+gZWLZRGdAMt!sKp zkJ_N+e|Y_WbK$jxlMBC9IHK_M!ajvZ6&_fa%AnKmIS@|L>eEOokF4B>w)_ z|G$fGi$4@!AOCrLd3-^9cKo~XN%0Hf!{evLd&mFL*Z*%uUy44(yD{D$T^n5yEsf5N zUKhP8`t9hb=#c2i(H_x5qq%6i$or8m^ZWl_;Pro{#}^&h%9g0~_+qoPvRNuUzSz61 zuKG{P*Ze>$ddVVoVT3Z0mFNRF(!-xfh!(g3>;THzL*3C zk1qywYdzO^d@&YU8v&0mCcP^jUrcR-#}|{nbq&irzSIUa0OQL)KWy;)QX5oL@%)nc z6@cfL%r6H#zhwS4!1GJyRq_0i`K5s8mt+e(ztje0fajNF3y#%ipf(Wn5Xk%@;243- z3%Uy=TX3{MN{fMR0+|;aC6IYRSAk>~0Y?hdI`e@p0?D3>-y`<XfIGtOalr9k}b#y)CPjAK<2LkG6D^NDL`5v^AmuSK;{KW zfn<*d5(3G-5Qq!Z6JvpxK(bYd3e*PUfQUfm#{gl0WD7z9wSl0WKuSje1p>7Ju>3~? zwSnMff!aWDlR$n)0<#5b1HlgkYJ-u9jmvM`=XV5!AE=-%7zW%RP!|jZzAun@!Sw>k z9s*n^knBOgEP-SX2EHdygY*Yx3gmYnaIHXXpvpA@`5gd!SD>Ca378>}Y{7JaWcLH6 z3FKFm?+DZ_y@9C$`RxN-Es%Ltt`ew0dI47oB)catMW8lN@5peiOw!q<|HV`;`WM0=ee5ABJ z;P6o!=s@R4~fbNI-72J?iEC$|dD9?6aY&K|Wv1aS7qyeiHfnODWx zBiRCHkJ_LBaP~;Hz}bV}Eqj3xde)fVvKw&rpw!^(pq~h$syusOn>@B;fID2T2 zE$;(lk7XMiKD5D>cc?ggFmG`9AbZPOR2)9E!In1whY#jmarj_<%j;AeKA7L~GT`t* z>6TXjhYzy1ya+gaXoD@!0S+HzZ+QW5_|Pp|o&g*_$o4Xa53&soA7mRGKFBsWeCU=f zPxAl{AI$sF96rc)#o>c&gTsfO*uszVEhl{B*9B(}U9jaT9?aQ87i@VFaQ0w+%T}PL zZYZ+1JO(&>@au}R2lK8tduWg?91WH`doXWs_F#TXD-~yt%xjsmN9H#I&K{Y67;yH; zuPV+SwZZ)W+2aAQr3rBOu(J&gAGN_fR2)8%-3T~*BwOI{QBMdQK9XGzIDFIwcL5F` znXdsHK9a49!$)m!2jK9L`D(!7BiSnehmXYF1~_~qy9#jls6mzk4j)-m#o;6K0*8-! zLg4UG>ny<{;bV)sKBfC1@k;?`kHia{JrchJXv>~0Wq`9s=2da_$h<1f9+~Gfu-w@r z*^2;YkJ^Bv!E$Gh%nO`7@(V0;_Q?D^z}cgom;*R_WPU#2?2&9v4a=N8lC5QAPktKQ z3^;t`SK#o`0Jsrw_^2nY2OK^!KNE2HNcIfC;iERV25|Vu{4~JfBl7}>kNjQ*IDFIw zlK_X0+F&x^@R4~{96mBX5peiO_9cMBM{OXOs^=rW699*g+F(53@R4kR!$-2mCpIo4 zeC$^RXOEg?Ea2>s>~VmzN3sRZ9?8}+XOEg?G~n!!Y*m~+l061!%bqPG0cVe7>l$Z| z+CUX&kNgUpJu=VPV41T=Juw_`_QU(*#c*eWDf_E!Bl7}>kIeUsChlu@QY_k@Ujx`!_@9OE75=Gk zN8w9_&lUcraBJb_!UxhXrxxcPFPxj3S~$IMN@`VldF+Zzl%HI0$Ue(&_urRYnLRgq zLHf+>>6rtv+4K{c4>GT1UdlY1c{KA-rXjN|b5rJu%(>~qGDjz_NPnDeh(DBGnZ7A~ zF@LrHfYb%4M^n+%O{vq9k0vgTPvGA90=f+mX7AK;y zi<39Su8XZoJ`{g6epuq!!d|fp5{Jdkjh&giAa!*7ip0ms1L7YfPEWm*yf}7pq9J)p z?1R|Rxe>|Jvo96in0_vKU*hESL&>)j(~~d74vQU-&L*cP&rN-h{2+T$ZhR~oi>6m4 z-j1CfKRR`8?BnFe@sne(#TO@TNgSVS;P3oDl#IrfC9?5`^wEg}G8f06NFA0~nLIP~ zMEdwlCb=w?O+JynFMe_I_~dn|qKA59*XUYvX_b!Ku^?4{Jw#C3_qsgqL| zCpIRIPDisJC!bBM%1lo+WZuqPm%bo-Q|i9t;?&#eTXJ1fA7>Y5yQQzoe4JXDIX(S; z_JjDxxsACOQwO9T%H5k;ob8-n`N3$On-dT80^yB!d_$uCM^Z)(d|GNYK?+*O)??Cpjf<&-v-np@d z^l|Rx=@0n0^yA|a_wljv?(+%?!aIYCtzYMTs3!##kEZz8IjC5BWkEq?a8R)-2A>@) zd3O{c@n%rE^{f2%3xg%U<74=)pkn(FK6VMp|MDHyRR!h$I)-(>49Z)R{P#11ve$<3 z-yizq<c+_KSn~ca9Cp zHebufBZBg|7xS@qFz5CQSof2l7{)9X;AX=8GM`*l>D0O!|w-6cYU9A z9fHayr}23I5iG6!8vOI1~lz2A_AktwF^rBUyiYP*T#LJ3lU1{Nc^~JEMa| z>o4TL-xHMo>pJe&>| zZ{zc6_wAr^VHEBWEV-S}H*$2a@J|^&o*$IeUCqZ4L0QoV>Zb>bH+AJ>VX$=L**wls zLDiZr)Gr7YHyz01TpUzB@NKw#uVcqzkbiJwH}gEg(}P>@`XT?lS5WcO>0JNsLFIG0Z)<`@?_bBdXM&}V>iHZI zR6eikrU#2&)bo5fSpEw={xL!2Ti=CG4wn4>+VtB6@nG3Da7R%2Z-qR+@Q7g14*Dc~ zcu;yroR6(Rc_W9K@Z@08(|SJbgR&*u@6a!UiYM_L>K0V}jJ}Ty3YOIJ{KE5sWp~j3 z;SYk+S9zRJYp~=OJZ`9GP}!osUKlLe%I6h1IjCHfWL>9V(L*QjaaXWp*QL}u1sJ_qp(2g5|Gw=K7^U)$P;^`UaKTQq<20mcE(bW7nXfi2D{kFDPGx|Iqh?;t$91 z@z`MbF7{3MgrM?|{5#=Sf{HuTmz6=~V~4^mK}F?Q9(Qd}@jxH`d+(s)FZ5OT@}_nXM^R>sDB>g@wngNNx^~#m@koW z!Q7{^@GU{rTJ~M&FG1x8KY*_d7TkFxk3TJ_x>J3+C#YJ&yb0YMRL!NIL#u-Y#r*q` z?m^|p>WlvjDz|XI3c|ns3{H3b#7^kzZf$A4nKhTaLPe%?QO0Q;tBE|?9fZjI{my)n4; zcOgDL|H+@V-473zzciZX8#*oc@$w(?Fw29gNC{(Ey!wT#cZ z-P=LcE%<47QBZZy>C}e>^NZ>0@WP;Kb&UVME?BVAB*s|>2{8^rokf?Ku><74Nb zs*&g0?wR10dzd4UvB51rV;@I)aG$kbtAkrg<*h?7??0~OachEkFY)ZiI7gMuGFc5zPkY00Df=VOAZ#cZe0Q$bar_HTkGv+Uo4iigkU zhDA;f=Du(PpYH`hRTcZ7;PN2Y_ze~=3g+I=^NKLX>+l~sJ*c{a{tdqxRIOlNhrSY2 ztzwpd5L}royESo0PYve*^ZBP3xg#epU8i&V}EJC3=S%r4~6e%?&CjH z6jc5@_qE`gLDh22!BIg~={dPc1<`1!fkD-}fqZ;|2RVz6n}e#d zPOSSiH}9KVOsIaKCg{SGWYdMW1QnZ)F1&<8M%Asz4!^$lor!#)7wf&7Ov`An~Xj|{3RroeCV@nEhS!M~*K%Qz}m z+mEBYxjpR`1XWA9ZQ*`A&}cqhPP?-_@~xo!zKN{+1D{8?LWH-YGw!CLLp+Do=dYoFZvJgy7A7F5oS zwkxbHXwT->$3(Dvx8yMt9-Per{`Tao!F6BpIDHXowy*;J8@(p9^V~*CH~v^ zWAP>N+v9I1IwpoEPD^|@F)8u$#PY1FAn^bgZB(wC*jrq4dDA7d}ZeiM6yuRyGc{WMk*3u3ckSH{Nk zRfWN^6JyT4?U*L+RO;gm7br-PgZY@g!W2yM7YTbYlfWNAi0EPqp zs#2y*B@V9jI6tv7=w~Y!C%{6>Whc9~a|A)8bZ(DfZB}4UKx^4Zrmt8*sWnuDSyQ1#;D`pdkHw!SVZ+4G_qc zDw_p8_Eq`|WWEcP)q(>AJX$}2lnPE3NU6Zz(UDT}C+)9E_YzR)t7THEirYXIJ5lMQ ziu@8kX+Iw+%~0vBiu5F+$L625{HoGR75Pm7{+5pXatKZBRYevfRE`x$b`0>hbflE< zN&QY0S&T$i<{w(FLb&2vI(8M}l5SchqYUcQT>^ zKywO>vcMecy@OKU{Yv4NvmSOO>4v@L<4X&B23eFe44)`u(X5lML|_|RO%{Q(bP?sf4fmiZ>~w2S)zzKPuU z;=aIiJpfO;_#~iBWAPZkcN7c7eE{E4?sYL!VT~J-d*Fxm9p%OsGd$M#j-s)+N3wZs zTZh7^wje0R82#hqE^PgD;*4M^+L(E|W$ys34~fk4~cDW+l9wr~5aX8}2Z zK7$!7^EXNKx#beS+kX#e<+WeYGTnn&iNEA4x^MLLntk6FsVgo>9-Xgn6Bp2YYrm>% zbVsjenI||8uz((2dw?psJ2O-JCJ8rj!A>d%s-oMgYtGsS3*H47+P-GNJ1jd$AdPdV z3>EMcR9WMx%?(*V_pUuy6@8-fsSFZucNXlR;$1Dli>P?Caz_`?mTNsqbl;W(9vF00 zaT&`zO@Rf^QDH85$P_Q7;%Uk?u6#`uDQRSxN1kNe#xf63ZtnuRcdf6{jbESo#;12w zl{FrqJh=rAr>5pBY{24sxW=D>`b}`+zUNcin0Y_HOt<#|DyOQV+j~E7ia-|b1soO9 z$OEkLGv!_{;1gZrp~*E1>RHy7Ld8u~I_m*+d$r8>O}BRq%N%2}&_cydb$joia=Nb3 zjn|%YAL#a0QyHv^Zu~YX?nK?uD)yRQ!B2?6@Jdj!O-@I|28bhTRIlH$=mZdr*6t9)KINkQS@;z1DoAk!o#@Mlx8I zhFu92tJknA2CQDgPT)q;uqy(b-nxnN0QVdB+Hk!7QDhnXlNP$8?4MfqsBYrTz%g2; z+j}F>U7$NEaL4N=&H}orqT4$Ya3krC&di>i??m0v8C1GxnQo%Mn@KlOaJVYE*Mh?Y zx}(#w*BAIR&>fu$C~)~Xw7P|p0S`Of#ED$vy{+3j9`HQS9UYe~%P-R%9Y@8@r#m_} zyCMH*x}&23Kbr37NR}1q-_ac%k^NJCneM2-%XCMFu`Howx}$=)KzDRVZeo6!?&uII z9^Sg6gMqM?>5ldXLIT}UfzJoJiG;-3AE~0-+ZVW5pgSsXV(7m027GeR9qp65HUE$5 zUh4sF)HS-Jf*%NUM|2fz=lJDOvePY$|?8Q@A?quZM)JU#ztx}ymylU30j6-*N7j)n@W z^2>BbBUC1;qB|M_E)j4Oi+2GR3%I=opAWdB#qU!2wkq6F!$ks(!S^^k`e|#ZzQ;0W zqh_M6@yUT3?}|?j8n>!=2ysJ-UjRI6xK+i^0UkBn5QE1C&$ReSz8ui*E1~25zW4u2 zXj+6Qdd)s0jl4k}7#Vt{wVJ%! z<`*7p-ql3hw(skb4ge9i?Rr5Jr~!O{W`h{o#>eVAsd#*Z_f`D*ggw6cE-KgR0oeUs z<`*lmebDw|Wi=;=ZJsi0-qi%=w&}Wt-M^YB-R4&=Y~Izk0pC%D&AXcP+~yyEVvifH zR)w#jtR`f)c^EMyR+j-DMvRZuC4djzj8IqnGKQVJnq1xH$wUsVCRevzu190AtR`2t zc}x*XtLFlK8N-X`)kNtwk0}yrHBq|lQe7j9*8`qea&-gXnI(&=cxK5wxw_3WOX39M z^#C$I6Yv0&MP1{UK8&f=GXM`TDZK`Z3@}@~hJxpp^lFulS5i6+IA4z}rGha6DV+-V zOEnTF7_Ex@P62$-mqmf6p)5`Y&ebwmRK-U!#`fw-K--*LJpmY@WwLk);GrqMs`z{+ zrGm4xOyUUkZ9etO?>NARHTe|`)iQ}219^L-J=0ng%8I8g-|?F+QMP*~j?@QVv6?F0C*CyRm;bdCIKS#N=q3XT^@si2oY zN_zmu2_&v3;4`88s^T-D{B{R=Xql9D1C9~MVi&*%M2R~bXgeUTJ_P8dWhCV41A(Ii zQmSQL1yb4xI8q>`f-V9n?FbwpkkSlrxIju%z+nO@Ri(2)N(F}sBrXB?G$Ow-;9yno zTeBDFB#_b&aF9Ss3xER!D6QE893a4=ujwejZ_REhUlpLVW*6c*|x8+JfCd-m9qzN zH7@|p9+VoKJ(#a~j*7Dfr3PmY;%c6x;_N|b%~pWyu|-!LKA3mK;e*ne$64m^L8&Va zA1v0iQgQf5TnpgvL8&VaADMrcio-`r9|0UbQo0dv_(kCfH`&K@bf190|8+zPIWJ`z_9IDF)HKH%_C8weae5?2H`eB@UZhmZWu0~|iGsEWf! zerF?&@Ugf#6r4TMdo$qdk>1&Wvq$0t&K`-o5pecM_6>luM;29a_Q<>{&K@bf9&q+Z zoWR*5rLzEMk7Qp1ID2Gq8sO}axEX-6M@m(3_Q?EIfU`$RrvlC%Srj;XLRz}X|eV*#?q!@6cP;PBCoQ^nyUzheN0k0cBS96s`^YaBlE zI}&jC$fCgEBfrA{hmVx%0USQEI0A6^s3(SEk?^s_p%k1wvN#xU_Q>KOz}X{W}__vqu&O0L~uCR>j#Pi>f$#pI|4X-q%?w3 z!pBMz6r4R0r&Z1#`6Y{g*@L)M?^1F0AkN_I!LPyDgZWkOu*}(m#Z~VC&K~@_;_SiV zsyFkm|9k#@umAt+@BjZSw=|c3|G&#}V{>QmljXbJ)7xo-oK=IyJs_F zfp;ls-tO7Vt~Pi!)9k!UN%MBkX10OBvzcc1GS6oEn|CQ`-tO5F)-H*>=xn z`rF{y%;x7^N}9KOHq+7#Cjp+#G`p8En|%^*=tITBnPxY5I5V<%|B>eH9?nduhMs_j zGxMu~F}K~rnG|YZvTgTpX20?-BhA}AoEcfX|48$84`)sp4Tk_8&de`^hchFq;Xo=L z&P*xZa-?~?hckP;p#$LI%*f*XN1C^LI5V<*jfXQMtD$|Oc{{^dgQ+;-1qlo~vn5m(PN z-0s)!%AoKaf;Cg9lfQK_m>z__EKgDpC()wp8cs66P{wct-8FBSb0yFijk!`qEfH=c70+iNoW7&5F zSTxKK&<6F7QJF44sbQJ`rS*?c`Hlc_^{v2E0ejN5J>55z*vFWU^(K>-zTn$ z!Wb1~bSZG2K(3bnqXkl`$~Og4s>&#VEDFvQ$Zr`iQXq>Zz&Qf>T?C8}$YK$2wm^R8 z0>cHeI3GAmAXoE%VFJn4vNHt|Cm1S_-sNr1ygN+)2E@bUJWK*8A~y<-4pkCcuBoISF5A>izhMOBU(aYF%TkMyYG>`@yG0h~RO zEpYb8?;yb0BfkRyXOEPs;_Q)9fwMh`v49fDeVn7 zd}L7-hmS1w0vtY)-2-s=NNIP#;UlH0IDBNW8{qJfMJ;pqNOo5&5>vmCb_#m$CeZb*^-@5kzhYx=1-US>!D6M-3aQGmu?k&LK zgWtN>0f!G3>)rqyKFBsWd{A2VCKZPdO6ztcntwz1NNL>;3eFys*1ZBadr)d{_Mo)x zWh%}dEE=3W_^o?^in9l$24@fA>YkzE?7?r{Q-HGvi*-)}&K_jfJq|c~P+IpS;Os%1 z!P$e~x@}aPJ@_>^dr(^U7!_v^;_4m&oIQv$ID7D0*FweFBXI&}4{cDl5ped%uYm0F ztgU+(aQHB5U2*tG_We{GK2rJs;P8>sCcxn%rS}33A1S>DaQH~+dcff$r2>bKEY<@K zABk%O96nOI25|Vu{9S;|bNa=FG*&~Zf0cVf=mH^HkSu6vbJ+in2aP~-cG2rZx(nWx?M@m(3_DE?F;Ovpb zd4RJ=eg)1RS)2KKrk}ldr$w zcWdg#)b!NE)cL7lsZ&$EQXP`Jl7C9RoZOylO>W?C_kBNkadLF>8_9mjW0U;VzR&%& z{)-YL6MYj$C(`k~@xR1>9ltw%SG+P_9KR`kO?+JZ?Dz@s13vec`RB)`#V(DV`d8nL zZ;ft381K{MG%>|IPi+{>A;bL$8Dy_I;Oq4Buh@ zd;WLa|GnP|DBx%L$y*(y;j;v#fKIq zhQWsxHeV@2Z=DY<%!1NKLJ#DBMu#a;+7kM0{-GHRr3}4wKD4m?OE-pg7tqEUETs?g z|NG3s#4z~tWMY&u^Va#y!dxh2%&qg8g;7x27@m}WWJW{KORK~CelDM#Tv|oNpBrz0iRiywsJfzK>bIuY=hMM@_|_x<>u zlun?+nZ+-)N=E}ew8+&Mz=sz39SKa)GKteNA6g`P6yQUPERK%W?sugJ@S#OYM@6^q zcclmLp+$c606w&+TSm71W`M-$AN8R{;zj^Iw8;E$z=syeR>g-FDHZt8BBjG)!}jmR z;jtg=w>XStKD0>oFe(S{Q>y>pEiQ{%fcO8dnV`3I22 zepGyBk>9?+xw?l^+6(ZRMM?!evq-7HXBH{#0r<=!r2?N>q_ivGGmDgVjd#ueqf*+1 z3TGC-U@q+tADFLj=qc?;#fKJI>=3^^U(wi8#fKJIY!CR*B602G59gQ3h$=p`XaM8@ zA6jHlm9|4mX$J72MGYeGp+$ZZfDbKFnu$N3e`t+LE%Tv8eq)JFGUBf~l&08m99q2N zw901|>D7bz%p&nAz-Jb9PTj8HjV|0aG*b^<=L zptNLH;`jMwC@taDNTbgzC@py(@RWZ@mizU1=Xms`Z*@K>vXMn@?X!tc8CSWrgoIUt0d75R1 zs)ApG!v~87-*^0$JjpVL53YcDpSmh}ipqg{07gT})8jr(GT^TK=N6^1B+=YJ_}JAFE}5z8<+`kG6}zWI6=#oH zq6BdENclHH1nb4W3^05 z1r8s{9+wU0KLbXkuQ^Z4;e5CY{+{RB&9VML$llgx~dJbWk z!$(Rx<^Ej24DVi&yvqxPZI8GJ0?$q{RQmSj5JyP1S@Y?-KJ5q7>$W;z- z_Q-DraP~-?z}X|&DZtqy*@CY6N2OHDoIO&SDtvvvI4yJb$ZrI2_Q;~Z*(2EnfU`$R z1rDWCuT|Nh^> z-~ZSD|IF6_?&S6V5BGhy|F6H-|7f-;``NDmd?VX0dn|u)b|Ab`cMBCr%|L@Hf{PNoXe@%?OGkA;Bkp^#Z`n!BN%e=*D zX~WmFL1@qNs?gh??!EFVmU)Y_-O85&y|s*9HF%FRehl8@?3VH+Eb|^`ew7okcl&(F zEGjPpyvLbE&jGy089%Ogk27)% z-s4P}a)R`3pD!6KziQICG)=n(#xP&dGAJ^KS2P=4AOa zz{}&^ zs(e*$}(U%ImV>;{u-%%;;o@idr0n^*&!p_JP3Fs>l^V zy58qYxe{Ediez^Le7=-l!4;}#n|A;v3#7DT?4$h__0T?F%A%HCre%^X@cB|o6M)Z` zQc5VUzeLNVGzMHOkWy792xKt?d|M#D1;BWLl&W%(KuQbZC+t_MWjkIZA#1DJEqj^DS*jqe>;=H* zOZ=8S51gqA7Rz2p-215!FZ1~l^JUMlY>1ZO*YI@#77adMBD?Hqmic^%Y{MWeL#daY zEBa<_*Z0xCBa2Od!$%hH1spyye{b^YPd8@Sdcd;Sm}QMv zBz&|n%NpAXY)qhey|YK+Ym@tamsb|oQ1N7t-x|Q#Bc*o&&K@ZhID4e@4#3$Xr7KeV zewUYlSXNEN*(0SZ0B4V6R{=g>O5Ae5*&{syXOH|Y0errc`K5rfM}Adt_Q)?;y589% zr2?NXWw8i2NcWH}TQ(0Md-6(){_3^7mvwAYI-g|@A1M_$d}LnW@R3D5n!`ta=K>BN zDV>vgHZMW0ZlGc#@;f`VC;$3EyYyx%4j=iQ4LE$H^!oI`{Yqy6pDLY+()d25GusMM zI+N?2JyJR?eN+AtDJ7-XJA0&*lwR-bkGti$nOY%?8z$~4qPkH#uPYwWKrPok+@-izqlc#g6XK@Q>Fb9&Fe1Tr?g*NK}!2^y|YJ3duK=Q zSK5b)vqwsM0?r;O?G8A5q_i90?2*!L*{Am_)iP&~ly(7}JyI&TQ1?R?iQIM09$6GP zdnCIf;Ovpo4!~GlBZ~rOkNoBUXOEPoa>wUC1J0Xe?Ws6>G_M$2dA1M_K)kCW% z^k@zrDJ{sY%Rhw5EjH zJt#Fedr(^X6cxYlL8-yngVNHc{^~_~=`$>I_Tablao~9Uqlhbg66hr$F%4vo4_p48 zY)=6eeT~Bh^M)R(pw!D8J}52S_7DC3|6l+7|Cjmw|NPelzU=S+w|%W(VETmg7ybSJ z&%XcPXMU343%>u~{+}+m+&^D1ke@L4BJcmVJ*uBMsO6^)%0BaR2mk2%|Lx@`5qA8I zpGEjb-v7_P|IZd}aZ9patLFo5Np@xR{6upLEvb#@f;*CCub#sycO)CRdLH18Wbanb z1>BMBSA#o}Em}=pxA-{3-mAV5@NtNpTs<4`afr=ZP2jiqIK+Ofo&|JOf3roaX97MB zk*WqChuE*x)2R43#D1-w0r)t?eyyGg_&CHyteyh+IK<{P_&CJgGkD4{Xsai(%*P=H zVD)6c$04@0D?SdfMXO2g79WS$ZiWN)ZPDuSRD2v_k5`l4Ej|u0wyP%qJ`S;8UGZ^< zaaui=ijPBV>*~=!+i|FxTyM$gp_#2-<_XB8_OgsBj9^1rz@V)ji8zi!7B_@laY#yg13nH(so+LEfRy$Ed>oRv9)OQSQYvUW4pnyt zd>oR+Zh((N@_RTiOOGa{0w0H@v$>dt_VL$XM&ZjPgOcO|4C*V5*iR%bV6-b=mY5@^zxJsZlAmle)DUi}!qIna?AuG*MxIzVqBk(s( z7RWCdzlqaO-lAZVKo$i)4q<-fUSOgs5=UNd@^MH?3jiO7kiBvb&~_a1H9iiZbmeX; z-_`@5bmcB!ya0=?_&9{$l{=~UIE2!bWb`Hw1MFq0ZLcC z$g&Xv#2L;OAa3RJRE7(Xz4960ECCi>879E|%IB!~ID}Gzk3%S3`6QLL9 zbmh|&d>TUOO3o6S2J6Ati@t=@kS!Vp36Q;##0DQyCL9Fo#|03U~>RN&)~lr{oB4oPV} z;Ny^#)&eK!(~;5|z}X{sYQW(m zr2>bKlmQZo_NU4@Nd)SyO=K;n@QaTH8_DHF~*(0Ub0L~sModGy|q;wkK?2$zQ*^~D>1#tLC zoWS9ujVW;WNVdS?Bc+o7hmTxM1{^-JI1zC8NSwgoBXPRM;Un`C0EdryVtlgsVTX^D z3LHLCdSRmZVZz52RdDvm;)Q^-N3KT$&K_AD2RM7=cP!xSkwsOUJ+i24oISEAaQ4Xj z2*BARrNaPck1PtDJ@PvgaP~;)V8GcUi-Q1XkNge*oISEQ5ODU$Z$H4YaP}a3#rss8Jt#Fedr-RKJu1!~EV}Z4*n9Ih zxymx_zq-1*x_U=siL7Bu*b=&{x|7g^u!RJWH6S1&vLqcKO-Pyu2*@TPG7chQfEXhp z2E;5#2rrP3aTr9#iKv8-3?gC&8DtQUVR#jk`F*dewmwT2Rnb4*&*wL3|M1Im?sLv_ zuKT&K=d5M#LEnXM(SrB*{C^>qyT;~&RtsMTY(7Zp7Ml-REqs+0n-7(H;VXd62jSde z^Feuo%?Gi)n9T=C7rso4%?GU(z698OkaXdTfXxT37QTp9n2)q_gS`i>4E7#UV&O(Y z>^*30u=kJ>3!kIK-h-rWvG*XU!QO+U3!h~%dk>N>TnpHH5N_eqfV~Gv7ycBm_aOGd zCjom8k}iA-u=gP8!Y2TG50Wl?9I*FD(jNi#9;x^!VDFKN0(+0deh9GlNJW9YN5VY} z*n1@Dg8<&++4#cy0h^B`eE_ieNX7eO&i_|*Ebh3Y<0~CkbqsXO=s30G;~kSax;l36 z*tVmV@BjUw?WMMLZBMp6(zc}S+ikbBeX;G*wpndww4Km4xviS-{~gCa8CH~psRnWi5%Rr~$Fm6>}p-^|>Uxh69&Gc$8q=9tXEnOtU6=3|-G#{X%2yRo|O z|Gk+W-b z)IX;lOx=@Okow2e)v0Q}|94~k=j-RxpHqKw{gL$(>-VeQwSMdRO!EEY8_C}$pH2QG z`6zEC#C-pc`m@fpg!EcI5^ybHR4u2Ru5&G6Brm5>u5&G6@Gaj4a4o?EmQ!fgxt1`- z-Qrq8Wm-GxlZg0xl+ukY&`mQV_oQG(aGmQVl9Q99*Ai4*_B`NPg1*b116)fG&MiCY7^1IRb|}=JWt7l$+Y1nG z8C7%Lb^`QWMr~a8F#-A-MhKA9u&n?|4ciEibQvXd-PQsmHEbo2q-$vTs6diZHP>w^ zkcz8;j|ik9g>u~%0xJ443gx;EfmBpWyFmIpSZ zXc9?&DDZKCBvs2%0;zZ~aHK#gYOx~(5_=M0^O2;z zsEGNvR8FM9-Xj$!0QMfKI1aG)NGrA2dnBn^>^(|}EMV`EifXa^)L(Pr%+Iv3CdTJ(5%{_8tj03b6M`-(3NFkMtc0*n1?Y zz}_QCcL3}?l5{J;-Xj$S_8#fm4%mC7;ue6tNBXJ-@5xJ=25df3F$36qq;Cqa`AAYN zX7iDXTFmAn6}6bnM`8m^O2+pRK$F&VuA*H5ArVk3t;a-ID@?heV5|W&)9p= z%3$w7(xrc*#omK(Zn5`}25zzUAl%Y-S^^(@j^ku-_gQRY;_aN!gL0arRNV@bz zz}|zTOP>Mo9uLf=&jB_cR9yNjVDmx6rN01dK8U^aX~5=#ic5bA*nH4x=~}?%gH}tQ z0&G6WW3c%!vX?$Vi_Hh+4K^Q?H`sj8cj=QXX7fSPrH}KeBFsmUYN=n^d!*uz0DF)0 zT?5#Aq@uvyBYjr`_8zII7JHBM#ms+c?~$Yedyga)*n6bnLx8R+TN$&^jJ(6?@VDFKN%K&?i^t}(T_ejOXfW1e;-3{1#B=#b}-XneQ1nfPMRDk!m zh%UVyu=y}b4K^Q%eJd?CA4z%(VDpirUjb}BQt@WM<|BR8V)K!t0-KK{y$P`SNUIx= z2lKH!H_%}3k)qcD_8w_{Enx4FqH3}CC?(Wl?~$ZxvG+(twb*;4@6~|4M=Gkt-XpE9 z1nfN$TVU^zzE=SD9_cHv_ej!<0eg>BoCnx@q@uvyBe4endyga)*n6a+z}_Q$X9M;g zN!kzCdnD<(fW1eO_5t=D33oPN?~$YeyvLrs^mM@Hqp>Kk`AE`J0h^B`JqfV+NK%2# zM=A^qxWW=l{Vk5Bw~pZx1X^>D`0s&i}vccM*oa|3B>c|D!M2{rBu!vgf@`kG^F0 zA5#Fke|G^2?w?=G?!PT9cM)Uv&j5D=xWA?xOZHp@*#5UJfbD+@Y|9yZtfZcy2FdMM@Hxx0@(c}>G`zS{Uxcu?k`CNcK>Vv z?EX^mTw3h@(sz2(qrbuZ^OBwc*#0HynSkwIk_v49lJv~Xqrbuat)d$2{t`~{c7JJo zDq#1QzNZ0pe+j1+yTA0E2H5?j;z@wrUt+7p?l0j4c7I8FJYe^iaB8vpOHzT|Uukd@ zP;mbxdrkrD{*rVuVE31bhXQtg>3c9>_m`v-0lU8>9S7L`C222EaQ`KHW&yjuBo)~G zrJ}&@FMT@!yT2qI3)uZ7sle_pN%sZp{*qLH`|C6^54L|vsutV7Bo)~HCFv-@_Ajk= z2WSHSKs6$N&Gjq>dPyT4T20kHc^MSF5styFV(9{tICDN8i!!0Cs?}b{SweAKQf&B!iIQn^DtN?x8GDd)kZrN9W zaE5&Zi0#Gp79iZ{XIX*02T2X~9+V&b3@!E^Bpv+}VDF*u8tgr&IQplw*n3cM^b>%+ z2eA$I9!dHmTI@ZNbPZtdk&2H3_8zJD5P^+kAK9;igNVt0edyn*8 z4A^_5ufX0T74HV@J<@j(VDFKN0(*~y6WDtsoWR~A^)L( zJHXx}eYXMZJ(5&l?~!lBS{7J9!c5^*n6Z^2C(-?(iDLA=n8Wl zY(6MI>H}JAJ`y_#*nFg70Fq{=%@HIguFq3u!!a9AJN8jL+-^>@SSO znG*o}3uDw^e_`|+>@SRQufYDo7&q8o7`-#QGpp{!UsS1QcC#|u3*&X>Sitr|!I;?z z*j^aCGxr5-FAPzG?S%pF7~2aYdFGxhW_w|b&)gd*+RMyQfbE45Hgk8t_CjTwxf5V} zp-#>m3D{m3{WEt3Y%h#{1NP!MwimO%Pzu~)f1!fT+<_ST3!~p)f1x-V>@SppncK0L z{e{s#b4$SfLUEp%0qidlE(zFQq?N$_g4lf@0QMJ2ngHxCDBt%N!2W`8Ud;Z2aBi`` zAhuiVF9_H79x?V8BsJJyP_ge%wAf$BiN1FM`wNm9>@P^#_b!s+FOt+Dwii_FdxsF) z3;OoG4%l80uJ0|t_JY2BZveIz^flOCP|;v}LEpaDSgdF-eJ=vG7qseo1+cxKmBIFc zJO=E=CpvvEvzYw_vHJ!A`wKPPV1GeHuiE}Xg7m$>V)hp#b&LH472RTgL0^OY1xfp! zBgX!Mq@TR;_Y`1%LEpY70Q(Cn_B{^RUnHEs{vxp-1?(?UaSdR9k=SanzevT^ zfc-@(3hXaZQH$AMr2J~M8d16{hk&gGl2#6 zr9hHi4}4xA6$Muar0;dW@rD~9fTIv#kM7#pHSfG@+ z4EU@-il}9tKq)Z~xJV#Lwb+0_DhlQblm&{JBan(}xlkbG2Y}fE33oAYfk67IrC%U@ z1+xTFaW-J@k-p~x_8v*97JH8*71(8<6k-n1vdyj;h2-tfhoZvX^w3MF!*n1?L zV(dMVv=^}VNH~GLM>&DZ-ed2PiUNC&R20~Iq&${;kG)62WdVDS^i_+!N5ZMa-Xlo` z_8uv}H(>9Pq?qwN_8v((3b6M`(%k`jkF?qqn5520U$xkKB&k~LJrY}B?~#fEdyn)T z3E(|>Nk;%SA4$3;VDpir?SRckk_v1-lC&AH`AE_Xl43rV6feHV-XpD2fW1fhCINeo z^cC!<9gw~Pdygbd0QMdvo$&!+?~!n7vG<^_TkJguXR!Am_KbH~%-(~(Gu{L2J*emw zdk-oa>^+D*;~f^W_n@L%>^*2@u=k*%!QO+uGu|e~-a{J9cnz@kAnA-(ft}PjBz23u z2T5nVLW{izNe%WMR5aLo(09hmEN1UPQUl)OvFOEYKIl8+B^I;!AgRITL$RLm94$5< zBsJK4P;tgHwAg&mcg8OOn-7xCSc{67k5rtomWB>(6M1L+6tMRo>5QiUdk>P%cmlBZ zAgRILgQNy~55gJjJ?J~*aboN}()UMzy+@J?>^+iHi`jdm$fJP0M~VpSJ^=4#rNM)My+^{a*kXH+lxMNUSE_ST{sF+=BT0!_Z10h9O8|S1^t~6b_efs>-eWH{ z*nA|ZT5LXyxEc2WHXrG`7_j+BUxCd>`U-45lJri%<|9c3HXo_D5U}}3-&=tTwFi=P zK49~aq_+SzA4z&sX4PWM$CBPmgS|(RV!w;+J(5&l?~ztF0`?y1dp%(9k-h?ZkMtGT zdnD;~fW1e;sm0zSeXj-VJjA<0|2qFKe?RcNrqi2_YdW;4r)ke7 z{r+F_@ACV9oBRI%FB<-(;h~1_H!N)UYQwb+pZ&Z1{@?xef6MRxty=EdOcwW3=9arQ zllcbMW|H0D+Dzj1QvjE{Hk0fI*Jkp&pK6%@EYxDOvr?XmN3-m>FE0DNOx$(c#XohXosYMCaGzJe13%9f*n;{}pb zaGXGr9t9jLkcxt11X5Ap69cIz__$i6{1o6Qfg}|iDUhU-fg=QxR4`Q_6%Pfb2&Ce{ zz~KUkJqegB(7@!RCI4N1sn`n~surmzI7Fb4-3=TpkcwI0Ac0gAOcF@!vA}@>NxC;M zQ6Nc20S5>q=}t)6Taa`l4g0G>!tDS|5J=zcfbjyUI06_akcw*Q5lH#1fNp_=+Xl!9 zr0)^T>_~n=oCn}Er9(5l2kBOAmv+uF#@UB4*0}C!U^_Ki-Z&GEs$`6y#z{w zW?)Z&l-Jru3nXa<7$uOTf;|M1G!5)7kfeg$1X3{x>?)AHf?WitIO{LKNCEm9b{3%G ztPg0h`Jk^`Y(A(s>m6EbKB#E0`5^YJw`j5XAnB~v0h z5x{#qWDPbS2ByL0BNeY_F`JKa;#$DwBNf$R^O3&S0X82=isk0N%P&c<1Z+N%^fJKa zBS|sVr8XZ)DzN!T(u)C`kAxclY(CQWe8A=-ea}Tw%*Ug&p9Xu6Bs~|f_h^((2kbqP zRABFsq-O&59!YvOVDFKnX8`sdX>}T4@6jm5f0x>OB#&C`JyJwq?~(Fa>@Xc&DKD`1 zNX3%@dykYC*n6bnNr1gaX>dGX?~#hf0`?y1E3o%S#iIdxkAxH8J$Xrw0&G4~ehOgo zk)%feHXo^|#cV#(_h7*0BNYz?Y(CO=GGOzOq*~18BNclAn~zi!*nFg-z~&?6Cjd4d zNjeVUFdqxoNrSyd!tD##d!+R!z}_RR1@<1PxHn+$k-loN_ee#7y+``)3fOxj=}5rd zBT07x>^)LZVDFKN0(+0d-VU($NK%2lN0JKcJyLN5VDFK>+W__+Nh+}SNYX6;dyga) z*n1>tJ7DjTqyoGrUr_}%9~ItKz~&?2)ME3Iq|JcMM`EV{n~zi!*nA{h60rFo_W2(G zHXrG$#cVzZcm4+z?*IR7@BioT|8M^L|H1qJoB#fQ`Tqak^8SDM`TxJ={r{o&|2O~r z|KR=q+TZ_=zyDvw`~Ry}x;Qf^2F_?&wbI3zabTc0d)_v1IxViw3<`s*Gvi=@qPNo3 znbbG9I+NfAS7%Dwz%&+fbtb0=sEsRKok{(HV*yuZ5`2IPxYE^`oF140xH?m&2B>B$ zU7aaY23KdYeSp%o($$&DG%zW%Y9-ZKm1%(bwbI3zS~4&WaB-$g4Rix8&Wy@|Ea2kI zpc)tpxHvPc-Qwa*%^IN2t#omw6bw-3R=PM-z#QY^%-|iMw5@b;rkc6M#hC&&Kxtd) z;!FWExHwb53@*+TFoTOTm1%$qxYEU$YG!b8rkWXCoGGpY6up%$&Qg&=xsu}SIfud3 zS;A?tVs##%0MTjO0$iOX>6U=2vm~W9 zu5@*lq!hiCuFldb4Y)c>UxBN$^re8Ubaj@#0#|2AnnY5nvm~8M&0Fc>jHGk_1h_aO zslmk=t>(TI6tS_gNN82#|E{ zGfk@=yh?zibDsvT6d>u`wZP{Es5tjY;0ggM8ZH+gw&5}XlFofHv+BXm6(oI}kW1Ad z6;}h72&C_$z{LVdD)_8Gl0FE`6G+8}fQtmuS1khqN%{aVS0G961?C7O+%n)ofwU6L z7D(*-fC~f?PA&Zc>8qAm0*3kA#lZOjNh&x`AV~%13M8pura+S34fF{puZ9@{NqQG8 z(*;uTPT(AY^t~N8TOi>U0A~p#oZw7>#GVg)Mj){TX9y&zR`6+oBvs4l0!ex+@F{^L zy%{)7AW3fmJ}Hn^Hv*>$r0)&DDFW#$I9VWlZ$Q#d6ePW#hLhAFNv{S@6iCu5fN26r zDzNuR#mfMDkMx}f*n1?Yz}_QC1@<1PH~`ptq?N$lBS{7J9tqbE*n5-)eSp13VxJ4x zd!(Yk-Xj$S_8y6?7<-Q-Rg1kxlB&htBS{5#PhQgLfXzpe3T!@7@pQoEBNYWUA8B0_ekGKfW1eO3hX_SbR1ysk#GWgk0ce?dnC5N z-Xj$S_8#dgu=hyPv4Fit!tD*%dnAv*-XncS0rnnAsup{XgxeFa_b4Z{n7v103+z3T zREyy~`GG00`Dn;$F`JJh#aJJ-`AAZM%}0{%0N8w_;&y<|N5YK&Y(5fu8^GoxeFZij z2`8}mNYbqUn~%g6*nA}EmI#OWSh#i?>^+hf`+d;fBY6e(9;uiC>^;&q4cL1msleVN z6_bFyNBSlJdk-qkc@MDnpq0VigH{H65Bkpe6N}k~*n7x{Ij;bCk4<6D%Ye-X z<>w3nHXkINgUhb4`5>vm=7XejUZln5gQRm_0Bk-;I_G)7=7Vqsn-7xCd5#vF4=NgL zJ}5uuSz2s9sOT1(5Bkn|HnVC4<|9exJi}7<9weRfG+^&RQiHt*N$0Gk#omL8bAAfg zdr)!ClYqSkvFAJi*n5z4&f|c+N0P1q>^+iHVDFKn0(*}neH5_wNYaM^dyga)*n1@D z1Ax6pTHO!Wd!+9&z}_Q$1@<1PxCF5GNNj<m^O2-l%;qCW7XdaOsVK1dNZ*Bk%|}`-0Bk;z^mf4JBe8EqILybw z&8NZMBdu=%>^+iKVDFKn*zXE^k5m-cd!(5YKBM=D+i*n6b!bvpmw zA~`Pl`+xt?5%&v#e`(im0IqL;s(n@avi9$^-`f7A_RHEYXg{<4#P%ue`?v4gzH|GQ z?G0^zZX5pj|KjfgcJRx9|K0j(>#tg$ZvE%h2V3uHUC{cEtyi~R)Y{kj$=0J=4{FV} z?$J78nCJgLU;3>;egA*gmaSVd&F?qA(fr%yXPbZ0{Alyi<~y6e-h6%Y=bHPQKhr#| z`S9im&HFU()cldauLoAT|6iARC-Wbf=QBUc{3x>`vp91{<|~=2G6R_znNu?#&rHg6 zWp>YOn`v(RYvUh>{HEY{8|OEEx$%m|3meaF{6ymsjR!Q2ZQP}CtH#Fkd+9%><8%8&5*U;9GNc~spmDInd)~5a`^+4)-soPWkkh(H8H#I$VO6sW8fvL{aZmDfj zP4$1Nf0N%Ie6Idq>sQw=ufMDQ8}&ETUtT}E{;c|w>ZjKC){m(lS^v@cbn?&1*OR|V zK9l@$^5NtUl8cgGOJ0|}Bzb=F)5+tLhmjzGe@&~G+jdCxjV}SV9rAYL3xI8h5#biw z4kcpai?m=nb*YKK^MHMa9CVC*hmmKn?~wRj%)Uc<8|*s_cY}S0df^!R4&!6vv#i>_ z(+fNU*muSOPXP8EM#07>0s9VhY2)L7eP;sjBf!41e*x?}4EK#|XtD1wro5PahvKpE z(Wce;Tk#C)jSm6#9mf8~)qs76TIR*rw>&9i7)w&h08si4r4kf~1+o5Q0Tt%mfE%qIy&YggLM+tHl zVBb+5Ed=a4%85mQeMe#|#=fI8&|>x-C5XVjqoi5@*msm}0{f1V>UO}sqimTE*msmI zw*dAXCCCkceMbp$9bn&49trF_N|0*-`;Kx#E%qJd(ba%`N2w#Q?@0M80Q-(|LSWxf z9$gC9ca%r-0Q-&-R$$ETMY z2LStyazcyQca%9=%)X-p(PH);r9nSn-%)}H>^n*wfqh45a6Vw)Q5y6C_8ok9<8oDEDAC=ImO0Rkn+nLw{VsdGB8zd$*01~5UOY!QqX zC?`$>#tD=yf*yeq?2UN9183$P`0RLFM+aU60oO0V)p{01xlT9z$k$dWCE~>^O+2u2E&hn>LA0;PdAvy(t|rW@E%plrzkI|!6v`vThw zlpte)?F32?!N&y3Bf$uPvPCi53X~IqZ3If4J%OzS%89)Jn~(BncfjVO1QFPLlpu<+ z`6#K>V)Ie9>MIbpE(kYF3$rN!Pu8aUqGLmIfn-b3na z_!Em2y=TKa0N&#~+VBQo^C2fTyam{NNCQLBd<-@p(!gNzAwj$Xn-3Yb;WbuZ^C2hP zV)G$e++y<~4K}>aVm2QVWWy_f&4<+4FbLRuNRSOL12!KL#9;FwLA;pFhXgU$e8`Cn z&l6+wAtyGx0N8v;oej?cHXjmX!$zQJJ{z6|Y(A8e4Zi?vJ|u{tXg(X((qi*Ld4tUd zqWKtXKIFuP$63tgqnr@fd`O)Qt4RaQ$7%2*8tgqv z13}SyHmnAU-ea)$C@0p?V((G5JOto9t`i#`25dgm3AfmMlr3tp`6wqI0BkgXdCVYY(C1P`v9Ad5=1RFAEm)! zz~-X_5!if`I(Gp!ALYc|fXzqQBCz==Cl&!VA7#rzz~-Zzm=D-|lr6UaMe{M(e3TQn z(o!^^4L1WeALWF==92|(0&G4?kgotXAIiyw8v&aSVy~yz>Q=n%V*TETjrmCI_50Fb z??G&Xy$4Cx?@f!nhaRlo6|nbkJPh_8cEDioL96v6S^-uc~n-9l*{g!~uhhyl)Y(CU8x7d6zyiF>5HXn+cTWmgz zxb<7mV)J3Z7;HWanDystYv5BX}a`H(v6n`yE6Q0>>J0hj)p!ys{s&4-+DjLnA>efBRbX7eE@ z3^pIq;MqUXV)G$I4K^QA^x1c5vH6gq&%RT`^Z$RZ_y5c1|Mji!w*J2Lh1Q?9KHj>r z_3!ii|6udq>-qno=l|vV{}*NYGM~&GojE9z&FqmGk!flCU^CDEzn;E6{ke4U`+pPC z`=obDeCERwoNtH|F!&pHa(PCy@pg%k?~TV<}h|QQMK22nnT5L zi>EnMf=yKIHJ;{BFbtmNP>U4v*j1_?4A)K6^T#~Rp%!hr5AZaHDz%9c{+OpZjQ34c z?Z-ULp)k3HX^v-+Zt*;aBD0CA{g~%D6q!wT0-onE-VL7TP%sRh=U^|6@jQpI>lV** zs5qM_`;U2^Lt!#_oWW*=Q|BlPhI0js_e~hWV>1QRl}$GSeFEy&rW=460&2KhJkO!X zxW)4vs>i15Sj_Vrij2YY9E!}Qt7-8(hf-qjJcr7*=`vb8&ruo(JkL>rTn~7jqdc0I zS^XIE94E-7GEnCgNp%AbCe(hfTuZ1DuJgt$|HfNIm(vVfTuai zmh%CoIX=zU)DL)`qtxjGJkP_2;CYU+(Uh5=1RW2$W%`0aFFa7PU+fC|lHWxIhVVD&TpJQb#SG=O{r=20YJE>Igi~ zQGy6O&ryO*13b@Bf(Sg%QBoZZc%GwdITr9dN7Glt)tl&vTR@ zM*yDZD0S50d5*GWGT?cRvgJ^~^Bg6}B*60=r4DDPk1@}2PE4f1(;TINz|$P1k=E>K zj&h1 z2t3bG9x;V_%<~*2h`{q4CCGMw=Q&EM5rF48$`-YFo}&a&i|08?9f9XL%9d>a&vTS5 zTLGTuC|d-c=O{t80Jc=Ol_0Hv=Q+xwX2A0tC5RUDJV&Y14tSoU1W}CVIm(F);CYU+ zMc{dkk}3^&o}+9@0X83HOOgb^e4HQ&8tgqv5P`jioET&V^%&mcOCVme&4&aVe3urR z4;92vG#`V_hddg5o5gHC6sp0unpUs2`H&NX?*KL*QpYVe9}+|{t8G5y(cl|^&4&c> zVm2RAXYh4eism!;8esDwbp~GnY(Aup!RAA@7;HWy$l%K?X7eF+1_uF~582`tn-2*x z_#!PfA5v%VdBEmFwhX=i*nG$dx7d8h34_gt)bV0A9};A6BQZ7~GHmc!plCjW&jCgA zG1z=a121OtA$10yVKJKzsWbRAP&A*xUjQ~A62xHhAwdS$(qi)=!v>!MY(8Ym;7jt-sdGPI^HEYQ18hFZi3b6jkFrIJ*?g2#TFmC7Y*_*n z&1djFz~-ZzxEHYbD0S`zY(7dIfz3zRvKX-WC_w}^AEk~Kv-v1n?gVT;N{~f>%|{8c z5U}|uj}`z$^KpyKM+u@9n~zdQD=3=J;O#)sd<-@pC5T#VK1!-v0h^DqQR)ba<}-LKVDnLe z97|4MKF*1wX|VSwS&jnmo_vC+#pa`&P>an+*)|!l`6zV`1#CXbiGu-~k5We~u=yxK zCIL1d<c&KAm$NueG@ZG+zH*ISAVbjdaq{jbh{O8QN%ni*iG#}A&SIeCC z@3o)SczF7U>ArM#`u&zY8o%1KW7`qU_wg(9i|c3B@0ENlxg>c(a=*H_SnV)>i95r8 zjjM})i60OBt9v=|UM5j@*e*M6o!R}6b0(j2%!SiG+dt!oOUnQMkp8mgIB;}! z*znJ9&c<{57dC!SH5=~=Z#*AfzgOL4!l&-C<6fDr?8plTMqY5?z>JX>^)A2X#M*YM ztGhSb)7w2>J9WVFd!|*hQ$vo(&~P?>!scu|mn&@i_-Zyjh8_CyN#FBy%-zPRVm~Lo72V81}~_li@9Op)N|FTyLibV&f%=Nwr63dwZGbo4RDA2Q^qW_!Ckd%JrMJ!>8n_H!d=UpRfn$lTQB-#wTJ*RsT-A;oOozwQBi?;KFB!_o-{Rv`r0nK)O1~az;&14T@)d?Hi9>6@{vtjgy9!m z6$AO=nhywT8XwuIwz_8$JJ(HYOzzZrYs31wFEux{p53}_>ielnQv25bwtji?>EySP z=W&;MWM)d!MJ)?DR(71c7Av<%Z0dx|@rK zsP4|8{t`b=?8=Vm+`p4ilnYNe$Fr)#|30f4ml>mL5czsDbg!naxvxCzmQ}mAJ{j)} zncmbji!Ui|BJo(YtIG9e$A_z9wtjlzW5rd~{d~x(#;&=qTvwKrrtSG-7`s=wscXK+ zd1s;L?L*cz%)Gs*M<=H?!I768v*zBZVuQb^1Ln+>>nTokZyBp|Q=PLFp zf9mzZ5hqPM+~-Th!`MwkaOTM&x#!AaKN2rgyK%--?5a*Ft*VA3#j!$j^ep}0Qck`f zbtgvpft_?k`@!X#g6aRH`hKvg&d{pT-x@MP{(H!(7|^&wVH;Iy6~@;?3xX1n2rqz%a8@)_k9nhx|Nm%#cG>u>f@Uc5?a< zoV8^ynm1<6_gjm@c}z(2*pSTE>b_q(BvlU_=G{G!2`j7mD68_osq2f>A5Ph_!GqY- z^vT5hnj*T1m|jyvj)-hc5oF2t_aVY%DLGh!AU$0A2};YVb}p`}ma>H3b_cb^C%(T^ zX;n2099ESJt}5HKCNWs)kkF4{iuN>Lughn{OB;#kCPFoF*kp)A?&_7*x=%?Fg7rEX{?`>^53v?1s$ROH2%6?>R?IW#&c4H1LRwydq& zmx%mnSPi3-bC}LxKXNT=6Ti)`YM;!|8P-MY6*K=~k9(G@KfyBE)B2l=!!{bxO+=+( z8;!^jQEAvlBRIO>FCE<&JK&rrJPzg&GEnOJULirceR30;F|k{vc}DfMfg#w{+ZkMy zW(}Gv=F7~Kq1jt`BA$&HcMhx9EZKuCIVIE&5-S?Ptn*XFjn^`Z>zvTr6SCp91Xhb&=m8wZJB1c4}Y7&je5>cuqfdMj)X+yGjuxcp*+^Y#s z$|y{lT;>OK4TXu@3Zd)U+TW*&tExT~eLW>?Q><$E!A1nm9V`Le^n0Hic}1G zq>PQTmi(&f7FRnCJUSy6Y1Vw7lbOHAsx%4UI$mK_d)2g8;j1)lsT~rd>K{sUJl(O7 z_xICn>)I}8>uqanY3F|bea)9NPj3E5(~JB{-shU8G<`JlQf6u9^30Lx-=!Z&UzI*O z{jr8u8dfx1le)J4_w^5Dwrza5HPiB3b$|5_mHw_v{vmlo-5=}LB%X-=Wyg{ML;j7q z=9c$#>&pe@oMVoh+?Cut@!r(He<__5P0$RZCwwy6O~g}EDn|qzN)hw9o-kyq;cbMo zkcjD%D@Oz^Slh@RRyiVgQcdZp`_rLhLVhN*_N3zuJ7vgj`J6s9q0f!I=9c%%XC`Y8 zIrlRk8p2j?(Ur3D5g)PWEGQ^14444dDzk*ms9;ySC8xU&e+6_bZ!PndswoNFn5oPPzX=Eb(MqNN3QavyCGXYa2^jc{&=x8A?#cZg%XBbU7s2m)MX#ZV(r`U(Hss z>b~Yp`2>5qimhZNJ_eo_e@1LqLbB+9B}yB4Fg7H3E-UfhleOpb<=JXOc=)Lh5|d)+ zADT33E2UX(;$Pynk_%>~s?mG8OOQWcF(ZoCc@d$Q|fz6=5tdwM*8k@Nc3>Uhvdp3 zaa{>*#XHtj3i;1yNc0M*daq}WtYgf$XTPFF|GiPgjl?Cs9;^r+V&&J)#gN4N(f#7g zFJ^e@T24N{-j6$AaUnd-QV59|_j;Bfuwy=8WowBU_k;v5^Eh3$E*`K`qFo^(bij0o zc~&BSh%btZh+MTLLU;P}oqsnjBy?XR*LpzW8=3q@_Q`xYHX^uNUCb%!#$aFCuPQ@2 znN+-oedW9I;aj2S?|-_ucuaDQ>+Os&m2$m{sj6I34SIdH?astnZk`to)_0;^XWktg z^11f@M6SkJ9x43i^6B-@qg&|=pZ{gGm9lmH{IJ6gof4d|MnklfvUSA@pN$@|KkGEp zxe_-Vb>}va_41)V>vS@oUVn}2ODM!gY<4N+vAB@Vn62mFNi0@|Z#>guL&>hVw~0EwT|JLW4`Q@9b%%h)6ApiO_E8CRP3r zM<;Cx33gr+_B&24hs16r8q)WPa!71ff+6Zk?xb=^6kC6 z`2YJ6Xj=W0U!B{%@BXiC0r=Iqoq=}1ug+~>0KYmn0%)eiug)C+?4DWu6tB+lO56Qk zYo)<&&SeWr`OUeVfDA2ub8c(_{N~)K0{G3jZGaSu`OUd43oU+gZgioAH|O+)yZmB) zb*>&r6606r_5pZR`zgOV*HD18V!Hb7zxe}N{Oa69;61>v&g}yH1*q3zdlta2&h-?) zug+}^{E5Z<>fFdY{KT)$?FYQmwE8E0b?#%p>wsUK+qVFIb#Au;_|>`n3*cAh4g_8$ z#;?vL3*h&*yMb3|xkUTc3%mqeEEos8418A52@C@B1mg>EkzfMwA}s@gZ2_%du3$`| zWsaZ`c!8D+1x*E*El2~;({h0z2mAu)7mzJCKMTwf>;XIjoG&1CZvI7P^-s>r=Y&Jf zRRfuG^IDdgDIjy)w>|+0=9U=(vgPKVveh`{e{D?tRO zs6}}sI9Z@P+S zCJU5di-5xfN*%QvDp2aEIiH;N}Wl7%}1#tu=yx;CIB`cTCyKKKW9&U1s%@xQ|n3 z2O4ZXN}Uma%}3cHu=%J2Z3EbRlsa1iHXqfAtpJ;kN`qQ#K1!-B0Gp3eM_}_&hUs|N ze3W5ovH2)l1U4UKSTkVrQR=h;HXo&qT5LW_9f8e9sgnV0KFXF9VDnLe2y8w|5P{7{ zd6WcfKFXE^VDlmOzWM=R^HJ)k#pXlmeDz(x=0oay^-qA!hiv)kJAloHZ29WjfX#=b z`sy2P4WCNvoO&_QuvhBEmj7vau<4$ry)(aQpVZir{#E)1>C4ld4R1I6pQejjzR)tQ zWtZl+n!nd}Z`&DdV;U~tNr1C6osGY1T+n=4>jQCDsDn2KUv(Xs-9IE zvR9$&sZ&?nqk9PX$8Y{n#Zw*SRfVqmvsZQhl3!KmdAi}A3oNcmPbLShS$1*hx$ctU zZq;V8qf!Qy3_U}EJs?mS@B@Tt1>rEdPHx)n~) zlUjN|E^x?ltm?+iSyeW23qz~o7Fi+bYuGD>Q0V>%t4h36`>J^CGx`=4t13O0U03y9 z`MVsUr)0EOXKc=1@yufAfo-iy&k^JcM1HTPuK3yR#s8H2akZjyH<-g0zLmD(XS=Z~ z7p&xu%a1WKawhOvc1%R$0f{Y(8_yr5DJy||ziuVeUk+&0 zf2j0Dl}Pl|6)$X4>eQF3?E{G&dEp_q?}}e>XSQy%`p__$9XWnrM!pC6yEWc%Zq@LL za8AuE&p54S`Rw?@^3>C+mhUPo-&x)AT|HX9>GZ^BSl((LSv(R`R{Wk%0fhb|Uu~&S zcqi}(BYqcptevv-ALvv_=W1R+^6}bVAHNAb{F0rz;uYO?@}4FSD(>os?3KP8z%U3V zUUuw?SLU&*{4h8uI1J(=rmpy%9(K)dyxK9Stj|UsP#wGCccrH#!ecN#V(N-t?pfM+ zwLRzUHHu#3F87LGjvlV(@exgL4|!-eP$tK$_%)>=f175%BTkue^pK24J|5f)-fScp zemSz(kE-5Ab6LWHxxpX0J=ofn(EHZbBT~GlPFeAvTWm)DcK49N0T(3cUeluo`R!a= zWzy+sUW#exnS`k;eyh9k`Bi;T<*GD=B!xr0AG6{mZga;UdHTTc2_1Q)>K`tE3?)y4 z{mv12bZ9I_F!%xHY6fT(!O|1G6Ur~py6}$E7D8h!H)X}39_aPHR`E7{-fd&o!~rS2)th{z zO3k~l&T)|hZU6F+v!7}eWK|4~@ZIC7E7tE$*o5X+I%O%JW>mXZtV$nY z2o2f5X+{mJqKb#!gV8g_<GRvyU=dU%aiiaOU zPgCaF(z6pIQ;#Q_*QdueywQGed!l8e-UZ+-{|O!G_GjDgYFO=e{70qUNj=V+085*$ zX!>~5cA4L29?pCzb8_3y+ZOT0zyWc8EiZ@vQjhDeVG6%V$6xB@;$LEY?B8RF;vYTM zzp>x=s^$_Nv59Y#o^Q~1|2jDr>*0wb)%(F7B@!!Sj9}ST027OuqPZR?# z4Q+wki=1&Q;OmtGf+a!$XIBmgK60#pQm12gDfG>=KtQEfUgZvElLDHHM~Q&3w|%4hBD&h#!AQM06XJnc>rbGmglyN}N?WB0K=tD<*pRsd8|TYK$>)3T|S|ZTI&S7ynFf zNOCcY_eDe3v&IpSs~8YEk5hmy26+s}ZXxvL6a|#(QhY$r7!^?Ja(qBg2L+TK=#LKw z%Af#VPOi|0(8ItA*r#$pbeHz7C189@I`L#NAgnVUM>!3iKz0*QI;_z$@rF6_UZrq{Ri>m_Zr&%Ib?2Bcl@O{#3%QRi7$tw{IV0SO7JXAt2 z+V!+wUHALqy23|am3&;|{EV%lBF}FR$^Wd?|b75F#J;7-O zdsN4ZCe;V9N9DOxsL!!m$PrMQON9ftp~6GjkzFd!rD6j@S5@f4a1)m-B}kVlgT-Ba z7%r1z19D?;yPw%wvF?^0&z75c6VbOL8Na3XJYy?F&@M-6!0W4;!&kYWKRZBo7%BvW zD#XP3*K;i?@90e*G9%FUM?wW)Jn>vW+U$6JZeiDAd@^?X%!_#QrFfVFqq#7@3%$#t znN;dSB7#Rj5xS!0!&9MBG|>D`l97V5L+<`3;l!Z3Ht?5&B?YrM(IjJ|cA4 ztWreKgL?G*|1pVGiH@Ije6!=+j-HNW`_J1Kwx8cVzP+LCnYKIgUjt}e-}>Fwxvi60 zTX+ipdo2Sk2eq^||9kV|=6TJBG`bg%*%nve`W)9D6+4!5rrHz+0 z9?`gUdN92_eMS1n^tKJZYj~jHs)nN*KE^NCuSi{;IwrNfz8g?~UHu95J0<^g_K|nZd`qvSZO#gS=yyLSZXk zhzkkL-yOnj#6n-9S*dGq!S3gjFQutwOuk^yF?q~fv#^mbM)!-kT5y)(q%6%gFX7^K z>9Y?$#68hBjkQ}`e#)Ck%x*;@oGnaH3%eC~i!QID?qvr~+kCi~q85(uzs2<=d{s=+ zmrld#{w*?CxVRh_qWggP!uVFTTPfY|OT1O>R+u*xw(@3lD_pgT>HZ$YkeGtRXSd?g zc=uvR;%9MN$pvee6O4x!@=9JF7ZF#&e@8v3+#E zxTzD0P#SMv+DJ?}!oflZOe3;%p0Z!uMnV^S+%^I=RkKwx5Bm4;0(b#R{nTRblS=_ zxVVtgc~f2BP5bozKORLUNUBd#eL6>$bm@eLi&PwwU zafd7HkYw=>xiVhJmaj*%g}Vr$S(`%2r+{CN+e%zW>B9txm~zC|ZlYu5hgTH45;Ina z2wu08@;|)1)RmZW#8V)lt}yC<$hm3$ctvM=e7L43xDgewAAYX1k-tPc&re2#s*yIr z>Fltho`~RXxhIztHxf4<`NV(daB06TE``J-Bq7lP_QTRib6na-Lfre(Q*gl#9pzI} zkDCOhM-C}pNDO=~p%@a%N#*?y2PzyeJvA8Eh!5D@QtzXuk$TWDI19<;&;K9GpZ}lN zF}|ar{h9V}xA*fdf2M7H+g)uJwoPnnYJHCL|2eG(wl;JAzqn;y%OQLp@K??EHh;GH z(B>`teZWgg-v_)bGc~hybfu2om{tD;w_#482%q>FD+N!H$z#d zM=Ilr+|qLOeKR!BhYcxL-|(n)NX$v#(sK2EBW}lnH%vwKi@>&W8jqG&qFnTc~q^4}Fk^gm4!-CZv3E?1pGxVrLOcOZB%aE+TZDLHo6&Tz}t) z%7XQVio8O~^*81i$A^^bZ}|L_-bYQ5LAaz;e=m=AB|d`so3C@>Q>WN%s3)aMgOLi9 z4++*^AFopVttvzbwxo19u`cjcoV@gOC1xw-0vtYd@{WbBuzAPI1vn-rF|26ST2d;& zk!tF#gs$+qFXaLpD`e=NhIg!7fMZ5+)UkBLD8Plm^5v-bv6i)@RDly;j^=TE$ehwv z!e>HspZm~Jms@gSIV5f?aUtdVZq;l>v#2Gd`$plZhxaRdN~?(eV(RzC9k0-B9jh{{ z)RXXq8E+)U;+LFX3JIS(4I6S^DI`39&WFUL{<-ClxI-MCc&Ya@i@lFMUZJON-TS`M zM#5J!*ss`2rAua%LjD>(#$5CcUd^zM(<|&3lY&rwsVC=@BBFhdMrf#oH#Oz(o}89 zr;7(Hd~ucE6=WU~opmlby||I!m-+I&k3N5<1NNzMNK}?+i1zEW;(o;pNFsu+>YjYE z7_ndUaB;mqMwC-ayA?Bp<32Zb`;t>iA>kJiZhW%9Yp%_5HX?9bva(lK9wiNbFW(LXIhhL?$lz9gCSC@VrA|2#3$<;zB%x zKVA-rJ;X6vIjR^ExjE*o#7xOGIwvQWB4W1@icp3fR@|++@Vy>3!gIQziv|igv>X!6 zu=tQeiXoBvBl)cawRcwzE_UVkxQ&E8LWk?1S|WNBF{ze_ZbckeON8eW6H8r>sjIv$ z5vq7?t=~%Qm3pDE;jq-N)9vZ!)AL%-Z<*CGv*A|__cnYseNX0lnSsnfnbyXCZ(Q8m z-@Jcwx@le0olUcwCN?#QLUa3ZD4t(*H4el1{ecRQg z+f2dYSquq3)TNNpU4XjDL#tFVBzmHF+tuZ}0F$Fh#)B0xJ666zv?00`=2^k+yD#Mn zF|Wslgtn4;A(5*w`w7W%jU<09B5)z5I9|fjnT9PAYs;5N9*f(r@EtQk?kHc22$c2G zRzh7NBv-x`5x9jvT!@q`J7?fpL_UNw>(ExxiYZ&cm!h5FG4fE%m}_pkzI4)iNF<_% zt%OdNm}=d2^@QR<4*qR?X5sP_um98+O8Ft5_$5>mrzI-iWb@YgFyCHgvujU*!zm-{$2)ze28N23(jn{%hQ3LX#l%{lTqs*7GSkJhB?wk(F!MUNOE z(JL6YeW82?5VIA%@f<#ryX_03D{X~Wz=NKr@$!X|A4L;JuNDVWOyYm3bfq8>JzzY8 z7k*TNjeK$cqL9%+sheP-k*^4DKMXfox_J#WxLfMTbqto_GM|Xh#Zh(SI_lA|S*(y? z;#+yHLlu+{Jb>qMuiv2v6(nt?d?D)Xi02IxQoayX%~sr(@|A*U;`0J^Xhx;J+`vgj zp)boKJEm8Lg2z}}xq*rHut!W!;0JGlc`K!fMIyRmoR~zfdffJ<^7YhcK_bCIA=c(L;=H)_ly<>k&QK5@}CrfYw_V@gE}T42xAhu_rs*k-IM z`JKAbm9x4b-zD_6xE(__gtkS59x<$OTXC!EPJSoxuYaFasptcwp$g>pK_s>Wv$V;+91Gyy!I{N3kqGk!;wne5~rK`3c!#2YL7)=;XO655J|WRzBd;}?|GM4-ps3CFr+*Nq;(D=nfX&w}F2s@bthYmUs+ZQ(; z`fTWwhu`GpTg^$LZ_5SCcy`RgZG}#flWlZ z{U+yDHFle8Ao_k?@LEgD&&%bw7VFYo=-{fbuD4r?Ia>EpwMEn)Mh#65vWy%md+mP1 zTrcc`tV-9#Y9568(oLjLzljUhc+}Y=zAO|<5sH$o2-fCYtcmlP;6zGAX@}vGEjFON z&0oICACEs&s}ids*Ms95!Qa#s*ZivDiqeeWS7W;Dfvk#546Ta2+PAc-8uqF?^1h(< zYD8&OHS84=_t4eeTzlJ)DPmv-HO!X`3mxP#Rp=Zb+p*J-arQT@DmV7wH@BvP`4_fM zEPs`-xN)jv$UR6mPC#l-T&|ji&V{q>>xOir2A%l2R_KZ%Q?56;lw9)|(096m$)ho# z$y=%?wFC+uzY>k|hg4{7Ax|8X5Dp8da*U-N5f+tBvCwu{=@TQ6>%+`47UOD#vVY}0&Y z^T(S0qiJQ+7n)9J+Bx%w%&N?nGpA(sXneczM~yc%o}PXpeM@>w!}|^Y+HhOLjE1_@ z&r{z@%}VWG|K0kQ*v-Vm`XR~(w}MEJN<6+#}mIE@^@cixIbSjsN?o$ zX=DT+wCdcSuZ-xJhf=5hz`Cr?&7C`m2ZEP_@*&~pA?goI{Le?rA;F7I!-lLa-8M-) zF!W)g;*P~^)WCn64#fQkR0b8g{^!!8p4&m&@CXgk}aKN zgr1U6@43_xJf-C+mD?U|D~`|jh@d?>qPA`DfX;1?GW*CEf!K|N>W?>4vd)+YPN;*k zu5R6&d9> z4;8i%y0h+Mr8A}B_bTLhig@Iz$`Qe1X9od zM+CRwew1E2i9NcZlLJRwR&g7lrw|;$lO7fN5xRZpV|8#bqB~MeqsJ<%#CqhCVn}>P zVh+~Dl_R1D>rrm`*CcF;h=2Dn`WiBy{=A2Y8@z zM6?7wGPiO>D1900kCg8##Ef;GqYoZnOTy)!3c80P+>zOpBZ3Fm5f@a5&@-rklUqlW z-ZqIjyhKDR=_9i$ZzE(1lCX4@BYqpfQ#S9_d6l;jJn?h{ubK>dbR#okTIGn4iaNgB*srjS(C1~k5wWjy zU%&2#h=@F+&>hUjoOCbU*RKma4eg^96Qcb(x$=GmCFyQIAd%x@UEzE^boV^3V&sID zjqs95rOwAlqRZUF&1!gZBG`9JQo5WSTOmSMNF8xP#chP%66@|*kjRxDuuFt)wimh{ z)ZG)I<0@|?bbO`Av6UlY4i+~UDjclP*_gY|tVU-`-rI>6MXakypD10i`r+kt!ulpbz*B% z%X2N?ZJE<@U`tE$#>__>U-I|-wn`txSNyJSI3~3+wIgruU-x(V%YXmRZ~iA95B@P8 z1OGaX*UXKFL%x}R&?Wha#CyY4UM|P$9m-%$>?YzVDsQY7g@~X}DPlf_w^BqX3yGLM zT-_~fBQyabB0F5&%}0dKakCyq1S_u|K`JEXj{GuV$Pn@&q0_1?L-3CBNDo~NDue`!LynNX@<Ou7oa$sPlZ-Hn?Bbey`$25?_n# z7a^f*3D&;+#C`ZlLLad3`?l)JZl$eM6Ov1hNMyNPoLA-Yxcv$zm^Q*4so^s}@*9@f z^yd@V?TZ`PKAJ2<#2l|}iW>=jUNfJP+;R(+ylmst#BHTZx^ZJA8bV4gm{;7daOd@M zM&yexY$RJc3lDscgWZaa;BYPAoH~EFB0b56gwBvNQxduJN+IDNaQ=I%Hjq1P(k|e^RUB)U_`}`P=dvU{#8O%QZjnk(l8^ng{B}GJh;= zt{ysxBAvr>xD$O8sp#v7TkzDil67x$l$Xpe>)kDN|d?jBf zs)@)Fk;PW3kB~(yz*X`QUD3Vbt%=Z3X}vJf$K}()!3sa3OxOA3Y0&GlgyeF?kVu_y zNa#sB=lveVkVN3+|GeofgrpJ|y0S3ZdqRTK1Mim} ze#ocF!l>}^Av>2ts@RH*XuuN5A1U^Gk+)CKI+S7@DYbuAtZ6zk;_Dne>?udm#a%^P=HxBZ;#HARIrG>JRe7S=Q zsrh^fPboOY+yM#Zi^RW!Yn;QUJ|WR#dOQz(<&e3+Y&x zm{BT7FR@fV=beaw{A)`{#WC@ z^*g6VG=92qpY(6j^V8GQ+co?=?vEw;OI)`Ze?GIX8Wt<9qe{4wZum-@9)6~ZJWzcp%SkMW`c!8SX6By#IA}1LRrdpqv}MUF7VD$@Dfgr zHC4 zXp5n%9vFGSg#*L?&a%d}*2IIBp_>u8vC9`V4s(PQ!J7-A_g-^!qxAk(qK0n7tcq^v zQJB&Zst(Vfqpr*-m|4Mh&J0-T2n!o1=z)qc*xKU6QC#*w_lifYh|L zwj;ut_>w`;By&y2CVo;}Qx#9u=Tn4dHhIA$IJ9LJ=MH;pxzNUwYQYmJZM){GsgfPD zDh`P5bk}-7^maw)fHZ$*vknLaDtzCT15%#Dhm(!VVv&aea%_9E4oJ+ZI3PM3sP%ww zk{tHcmN_*a5V@qT0Yo$8|6}jX<7BI<`_ZcEd3M6f%@r-YqM)41nFka}&vWt7>zMTP2v#E98IF{yH8b} z>a)-3=G49T{&~M!ekwPYT5IpU_S$Q&z4mwQHGYVO5DMh&QQ0E`+OAk2hp>V`$hBo9 z0&zKE@1ZoL`B!mrI&nEgTrz}HNCF@f@Ooy%;5vcha|B^g%W8*WYuowL(Ae?Yd8y?JctNW2JY z`lUz67NrX*S6gWPz`4mbgcW4_!jeQPkS#80Xh*p1Gv_2*4$AIdGkn`;&P}$&AEj7f z(Ue1JezVHsb$nbO(7->OP|v}NgtCHcpHs1H!71>1tbk5=C+5gj1e~y({AVt{rT!VQ zOKbOIb>FSKqwboz0le4$!`e^R?l*t0>At2nHO)6&*7%=|UuwLi(QXtQs~R3_cyGgc z!_^I~^?y}=d;M$c2kMWvJ<|3^ZEI~WYinx#%hr#y?zHx{KD*@y{!g14{M3J<{u9mL zO-Ny%c+-JTL+lgycz>$?H)QAE}^s8Rp9q{D1mxJp9cX6n79pu5Ck?=LcrB0&Xxy$jlUUWx8ml8K226JG3-@^W@rNJ zk%2>%00J+59lN&FMAg~YJzyh|^5u1*#X?zLgeKsB#2}G?*Fngr__9CvQ*yge0lhE2 zCZc`yuwh`wgFi?I17>36gb1<)h#UP=G`lhXKb{DJeJNBi-}J^z@Ep)^0>4W|y5u?C;RMv6 zU-pjIBWzpnFKUi*8adan(eJgA9Po!g-%gy)s!4sAyE54^Jdw=VYwLDa&*c#lUrH@5 zxvz;6*Ha^YAP!o-3l$k$h$%WhE)uvXrLj~UH5Pv_U};Z)>@a1A`$-8I1jmmipo9#9 zV@DGNjX#ioM|FwPEVS^RUdCI}9??P!AFpj(b62oAdGXoBFN0ev|_N^~3@ zgT{g5C<1EGE!E$Py`Z`(R(D<6w>_`+{q^@XJk~tW@{-nnY9kHxXD$dyL)2j>*>d@0tK-#FvJxv@C5)xz}%^+Z%Ey_nRoNUhYS zZmil?;n{yYrxDIe1FOrQ8dfT9mH+0cVI_gpEl&+A5v;t3*7?bbT$_Kn)GPlZbca8o z;))&iky6CodmhH_SG?eg_=HM0D?Fj{a5=H=2@iQd9;hi&Q2Ha(e6;+|N9>6wzk)xS z)!D*0D%9%0({UUNbAN6#72u`SJgdwq=6{&4`<};&w>>YaPedF$HaK!g>ARDYd+&Ly zzchu3s8dK1#c-JLJAioR=dtb*tN4D@PJtDDJWuj9Z!N#S75iAHd2Z>KJ*Ac1ZsTf)T7>dihVmOE7`ry3W(}!IPDhARfPMVg2ixyyfp3@z4CND z7MT@}`oP-wMTH6c8oa8?dqr+feg0~auzK3Lup+l?)L9Fx;3pM(6&hp0AP9dgsL#T~J@wZg!c&87seP_idN|-oC15*UIaiCCCE=&B+fMzHssH}$~|8r=bfuusdSk`sq{)$ zYSUcOvy1jrI+Z&@Bp4tGtQ9VZE6_x;)F}07c`!zxFYb|pwz`l9beCG@V(S}XI6?#( zKXuPzjfXNK57W~@cTCgQdO{c_4+B;fmL~R~VB8R_5ZkO&bIEo_yQpM6z1(9JS+)p% z5>@nBe8NgOCsycH&|r8LKe|Q4634C?aNr)pA+sQ>gdWkjVgn{Y%V4iAEwPGj5z#Ab z9zj_lrz4O;19xF3Ey&4bl% zl~@srnDH=w%sr1izjQplqHm^WsJt~m6JY?Tpgx%>at%^E0z`24IOu?$`d{kfn z;PO#^49W99e1K5*!udZqK*Gu&k`P+rUy5;YGuHB#Ew{C7wRAP#(R@wwK=Xx7KWzGR z<4+nt*LYLobmI#e{<(gsUaosjUApdNb&a(js?F7Q)IP1|+11~#zN`A$>XGW_RK33H z`H5F0UJ`#t+)VsDaevih&39^Uui0yOpy4eIuWWd6{ePA}h$4i3VqZPvgYicC)7tDF zk_&6$7B5qX)fisD{1T*_fAds8VPSrwQ%ImFueT^|Xs2#}_?4wL;{P?>vBtStcc52+ zOPkvte#Mhe_{Sk6ZZ3}_@gIRU2(HC{!6k#j8%HDx3FGiC>cYoCy$~XRV&>>^P!xRC zJ+UiF`nz4eC@)SRc}?7B-_ZbWA_~(N-X+>w0>#>sQ21>e8N|fV6#io{Zs~4+ICB(5 z&~FFD*ijTnC-QHRLQUV3O*s83aqSZoPPl?zc{iG2(hZ_RKrwvOI08Eek*;?K8r}w# z1WhQ29d(y%BnmPg-mPgk1$AN}ZIDRD5p7Tu{F6(Unh(+j?&%J11Fu2*eQH9nQ4s|h zIj;7OYJ+kJNgG{9Q3T(K21RE@6r@)jM^TW7kk82>y=t$Bg0Fk5tnKlBYAb-piAaOr zgpyueeRLbtyH})F#HBw}OOV9kwv8AS;q59XQcr9NJO6f*&57K|rStmsNm*Z+dRbi{i!~3+x5xRoR6+b^G6w zXj5S(sM#j4PT*_R$`Tq!6Q4~a0WeZ2y5;7l% z!1>n)krfG79NI>J0>?_Xc!Wz4yTxyD3vEy_9~Bf|D76uz4nv1hytPabp$*b2Zy$)% zD-9H$Wr#$f;B@)Rih4y5_~hoZC@a5Sg^nEa@pDhxV|V&TPQZb%)czwHIp!awyWtex zP9D-mh_<)XSI1slvlnaL#|wbVZMCQa_;SPowpyOi{M@F`HBC4EbK_eYU)=D;2BZF0 z_3uIq;4#DiNCcn*=li{y+iRbOSilo?@2OvEU>p9k@qwnBnoqZMwXU~5UiY%#U&Lq3g+y=c?Vcjh6bNr&i=h^F0wf-?jP4aE zh1Z;spm5$_uC{TOKZ(Z)>fVV*lijEU; zxd3bIm#GXcuRm`t61aG{_am`*;k}Sfo&CnLClhakBq;=W^oSq_vq?^!eS+Mu6c%!j zf?QbyruG}g5_+*%wo zU_^iZ;^HIPfFDkoFi?CG$hkvg1rvs$&_43nKR>)zur26Sfa1HaIiw8{DvkY_@)Xgl zKlkEF0qFu~0E$2x-}E8|GzGal!(Ah_1)&Yk*QY6Pn7}0m{S;sQR}QQ-|LP=RbMh2| z--_|4&OW|%$jAk>f!jgMD$k!;5Cn6c`7AkoemG#bc)r8#%ew#)*)!qD?^S>fM9 z&-Cv#XyegCXPbnL!>r-A2%;uzwgsf85&;Kxz(>7XsDP{>TAZ7y^?K^;w+@{_w1FuJ z`WKH%hxID_%@{m0SoTlLkD?RrO~lB_`7@v;k3Q>&HbS0Z!J)U@hJVi8*F{KZ-nRo{ zJ|219A#J!6fg3xarRp`YhS*yYt?z7UOvLK;8s}qgscmTbO!fQXKZ^Zv=&}1Z_>cSP zGnX8H-iuD0X?xzu+%ah)(uITDcUXvWpTbWfS*=MIVHD7r1FXkU;7MK&CrXB~&Jby;UbRW%tyP!-11ctz3#QMP2ERue@DP_H?fd^sbp(Yr|T8t2gT4^s6g6h9KdI$@cL;JV(VgC{ zo`J66&aRR1ZC$a~Pj?w3I}^D%fwKgiwH$`EHIoqqsHrAFO=X)mEZtOWRv@Y@tF~?K z@0({X`#%yq4+%0d5*rzj*F;9=EuB$hEHGQLY%I81Otzx3vENJVubg?|@e?Obo@ohM zf_R6%YT1j6K~pf2vMoDn*uWNNlb2>zUE2T?VP`LcU9ioSCHx!A2M2TQvVfKF%z`MC z%|fWzm3h-L9jtpxSD~FcFSCv4*TH%&t`IZ+f?2U;mOFuM|Kn**6XVQt19+mL$3 z$L6Pc(w!@2M{0Re7|aiddG53%oE~M3etC3sdneszr257A^v+aAW@DvSn%i7W=ND(q z(_(61GnJl8?Wl|9Qm3=AEwiw%im5Rcy26MKYcQ(HvJCWCuti;WEKV1ATa+~$W>+Pq z!*n=CQ=#LUZAgj@!>92u3%n|Du{R}t9jo3?ojG~@*hMGLGzA3S5T8k{+UZean+PrK zHw@b;+p)8`%aiVJt{9zxP3T^=S900ZUMly{2XdR+c6KFMB6c@97FL+!w34`aQ3-=~J#$P=uvpdRRUP8S1|qV$Y)YKT>$by5A}gA@=4|yXxZG(b~>oqWS6rSSMBWO$-+;L*x9Q~9pW^uXBI%&O7b*Sj&NYnz)r^ZAs~ zsg7^-4h)~(=v&YxCnSh$m{k>9lT~Obya5;mQO5?S!zdVK9 zUU>ZClXDl*URy)FGn3!4b0apKhlk#mquq+Nd~PqKQZv&4l^4Bb*$4*LrHV+kfivjoLb2e{qQ$suE|dsH@u zcgFbb#r|!3VIiB>n1%5^siPw|xVN*w4-E9J45^&6vS7}23wdQw@9&@9X4<#d89{f1 zouQ@CzC}|SmWI?dV|9^pU?JeHFq{ONB03tZ1G>a$oFl0`tgqACftfpN+BDI-F2 zVL?QWA$y6X;|G=^)~c!~bFnuk64y1Ix%l|W3r?OH4sq3bk#20w zwGsz@b45q@HOXN;Yuc;H9+G@RkC~TNnQ50S^3{$f;>^G7OBg0xeRyL-?Q8`U;1Z-7;WQv9$%Q!kXIQZ@f z%XxWyN13xG)U-NoOtx=KO-^?2jLGTKwwl^W_wHoYCuYY7rY5&%4U4y|!P%`zV=BL~ zlv?hdnG-s*bMo|N&xq9BH9wu#r1g|GEQ_!Qx(J-EqZ4av3yfhJ9Ao2X#XImh$pK1H zb-2eIW7wDkkvAnq7ZsTiu(@-pWU->`z#rjZ3}dfP!0k&OyX5%E*ZF6IoCIgcK`^^Q zjv(pzd^Tk+9o!+;AG&YJosWY*yJEf%T0WiH$|NT;$O$WZ&aT#ra!Jly==p?~@lKbh z@EVVOk=IntRB#v&B*@w31#qjdE! z&X~BUE_Y))1#g>U9Lvz4_J#o`L$Mf3(G}IvG=s-XYn-J^$Z8TL7GLNLqZt}j0Wa}z z0wj}D)mm6@nC}}BE%8sqo*TcYw(hd{Qv9N(HzlsAe_{3K60z#5s{Xm^!&R@WeOt|4 zHP2~0*6@|YH)m%Yi$`*1Sds(Du)TNwkYI5O{c1dzD-)ir~66>R`p{jopdnq_YNT&=)7qTUZAFgcUUyL|D@*pgr zSyW&TtmaCrq9l12qz*YDW*cNR>9LBa)PTF-hLz5=#QOLlNsXvTsl!>}0q`I9f|VN= zPJGtOxp!siUKAnFOT{|x{GoTp5`SBN*Dzk&C$B#i6%=w5{84wlE=Qmg#rgQqlg~%* zo&V76{eI!ee_v1lk~bW9db#_~9}(mcBo*n61(y>ERpVOJ7Y>(^b9d+8msibCqxK3n zPJxRpu=>%IH^3)TQ1l7g3Ck7k4ygNGzV$(Ro4+| zBriEoH(q3b1UndQ1s)h6E?|PJ{%Y(4;l;KG?2~S1cyI1PX z4Y2x$bg5U72MBin|D&L%kkvmB(1NQw=f{d~`t2AIySFu$-2xsP9d5%Zzyu-iuD#+{ zdRsy7oj)b_X9abRXpLPk3Y-=H%E0J;LQ;JSql@rl3Ngn5dJ4yb_FS|Y zJr8>)t~3g8qjLF327o8qidY4}aYP{40}7{=h}wpmRRZClz!E$J;v6oJ5CZc4-}9^E zv9`N`{#Sw9zXWdp{G$2G&9SCOnyzos8vn8J{SDu0cxyv<{n>h_?uNQ6>*{MiUz@G@ zXw8EA?q9t2MfJaIoNay`vIdHu>hD#3#`jsNO2)3CKlKn`)uW}!i1ZL05Bml58vw=> z@Bt|wRX02}tdI**b>&mT3Xgs!e)iO`!ponD4?H!jptyL2^KPaGA4`xatsYDZT2Bl!n zLfxZf4?7kVi5uSYoh6A#$_jVB%izIsRP5g>5D6Stzncq%d+-${k;ET~&I)@cg*N9; z-T$EX%17)D&u=X)98gfc2bquYQsc2ZDr!80)mVvD;(L{`qC`^v9l2U9z0sQ!LT`` zOE9< zlezzaYYtyGIB(L~LcRAtfa7|h?N|jH6p1@fYqsUUi&7!G3dwcx=b4fvNRomIGh4yH zNo`<%<2(lLr8k-%EFcg3M@^(vXhaQ@7*Fh+Ab?P?Ewq)CHwLPn? zwXMD_(fZ%5|K9rZ)*rQgzx6wn*KsZGB_w z^{v0-b_KmT@P|43S?285k;fW{XEJC1{C7(Ke3j?30qn{G#Z1Bkfj$51pA(fS2=2_2 zJ6Z=>9h}bn`3sI+a>2>b18Bl48XAtr8)CzDibRs^G$23}QfNF6+$I4NmVW_EN`E?? z+3HRMLA&dwAOJ$BXkl0%$>41u&P86)H~?X7UDp-EGF4zubenfn%>cqlQ-GURW!=#M znv`aHdPb-B>~vSEdn_|_dTnV?9v;%hoiS&#eRwI`zR63&&cIFz$iAV|BdW3`^mX@l zo3q_>3oFLfO3u_LyE+Cp^{ldIsk`0n3sR;>=m-8wbwt}_bW7ubk#|_e5Cxl20gqu# zWG9%4005D5{VXR`PaeuPm7<18ysWP0ZDAgF$ zba5q>1xPKOytJ$PvSMOQvY1)Zxs*+9=2Ch(*_Q{ZJ;1VO`#QU&?9TF9 z`(SEM+|~^yJ>1?mFtf3{y*R$c$P@fJ*S<17xSgAs-7yCRMrLvg!lGa@O9QK8GXrz& zt6Ud=QPbTEGCwr1Gc`4k;VdL*7?6>p$N*0nCV)|j<{+0wvv~=~SVvNj6oC~a>A=Sd z1f*s`%>`Knu8`Lq+cC+?^2Evt4g0UGKQ{IBlkGvV_NLZs;QC6sswQQDQvl1hv&i^J z8mE%;`NjF(1IV=*J7po2Dee8{(&CRx;^jl_f&tJaYqO35P?~KEf+7Ilh`&O-n#l?_ zfny3PfSR(XT8aaBro63gOzaGCJ*Ts|MSeim#}s{duX7@`DDfN4y16kbcR0Nx!|O|v zWBsX>#iic-=HlwW9)jUBGgCu7ed*n$5ewF5V|8z6RLS?PPS{-osvz4)pRouw4GJrY zCP4BEEU1ZOc*&4tOtGqC$yi8IVpP~MfaGN!sBO+>G*Q=N*b76E%(8g-`u&BvWBn&j zULCLnvB_7+tXIo){zGW*k#H|URok3 z2^cFo%<@8rqJXC)4A}t!9oaz`pMY*d!W_VthR)%iVJ93Q95q#gm5^3;wokM3+pA9B z*0v}+GBMQ++_i4V5TMH7G7?r5$pnB9Dgwg;-e*EXIhofCSbr=ypj>S@ zBO)?>7@fuP5n$F#)zA#vR>~4q>h_mvk1ZZQd38{Mr_wOXHiWg5UdlKnJ?3C@RZZZr zkL7aE@M2D05Qmwwb!30!VW$1REZX4kL@5;UPeXT9Kh!BE)TL z$O=%Ao`6I)gEPjKouORs%JlO1#?a8NvpG02G?$q;Z7(gYv$@gfc5}LadU-BqOiqio zG(R?^Y-#55PB+`jIn3NV$EP!k((Xjx@>b_iij}v!J65;mjdo4}yd4V%AW9yh=6L8R zk3=x!s5vY$X9Qfp=%&mPtTFykM}m!}JB;o)u)`wH!f;DS8qvz4mTUK4Rda0c;*(be zMLk2(XgpKF@er}XE6Ev>{*j#MoyeU^_CjZUsURJx45lU73!}X1nvF}{pO-iVE-&+Ob}a)+z*nl!W%kLY;3p~f@<&%Kav}DcK56?-r3x=Hv5NE zy=!)PMHN@qM5bqbE5ER~F`XIT8qvGj+a)gDxoVl)yZy^)N1aplCNk*-Rmv}H_Mf(U zvQx9mL+umH%IMl6z`{r|Q-CQF@FhCXXI%wIRWu~za##}V6gE1|!8Qza=Xv}_!(M0z zm<!Avd(qhVz8 z>2y&ykrWjsJj-z;jpH!0rer8OI&MhFTqI~~Y-hG)u%^sOnj>C!+Q*$%j+GKuwPetkx+nrb2w@#0Y$ZI>9siCQ{4XEy% zv~72E>+KtzQ|tNyGt{n0lVfRSj7JiV1Gqh7*+@_n0p(>>0X7%;8c0j!0j37x8Xulm z2wgN}2oDL027v;r0y2>}Tfh*wvT~}``{Px|lnYMw29&cNxOO{@RG6d;ZwnfqoLtJM z;WYSA@a9t1PQi<{Q%NMwJoK4#4#}a(OUX|?jg-TL%E?F*&}38PWvC-O1Vd@ZM?!sW-#>~?2?0A2!o!vOSEu?ese9}`pqq%vm zw?moNRkk;;_fL$gOOw#Kfz9lKz9)8O`jmOC9lq}HNY666G|k#ea{nT4B00cTkklob zFr2`51E{WH50l}GAp_Nfcg;GIE-8Y+n5JzIU9}5|Nl;o-lnue)l>^>^RJA{wIM#l_ zN$G$_KCj@)4(V?GEHY;ySYlIQP*jqjOiLD71i4glvfyYXFD1Vy2vj(Q1mrM@YBEyg zSV@(T0w8j#%quKBRhF!A)JT_2!-0c{)F~*B=y0|v=tf`nx-2j5&83`ldeB_$S}jZ8f)(wcX<2s`u5Ds_}FS{-RjIt=DVlZiFrJ_Hr1nU zj7-@>Qhta}4ci8sE#!G3uhW4;0AxI)D-sR?Nae+O^UMu-eBW@xGQO|7VFBO!H%#K& zxuGB5$8UH!zJKQia$VVR!=?Dn-Ea}Uw{Ca_zVkQK;d}G?Yw)dKzm5yPUtVwH@9Wpk z<9qe`QG9n@--Yjm>v6M~Sh@ZbzEjtq#JMti{e}4ZYp!p>->pxA@Plo5H^+*A3vi?z*e-U3(qrNzHYnCso&>C-I+Ohn~dWcpZ8Y|MfoUNn(Ek z-?4oM|MIK-SK#|6`={~!-TiKS|9JmOeE;?S6=-*8{{{H_5BHDb`)~GJ@%^3sDtv$Y z436UQ2hXhFJALLg_~o@{(36;O20e*?@C(mg-&>X+9p;C2Y%+v zJ8toyAEx*CA6y>Peg`xH*BO5JpGYWDrD#Ek0+kPV#6Js>h0;HYK*@V-sK;&}QKb-ek+5rmcaS2RTV&20gg|O;p)g|G=l zg{lAwE1(L#S*PI5qzxVj*dxZl`@^rUx;Z6^6Jg?|YTofgL4o}(wDH<73i{#h>L15= z?Spl+e79Fc7jWbn8m*`N#v4PJwX<1v}$WgtkH5S~hRQ ze>LqqSStoWCM{lasKeiB#X2~xBmuFr>( zP(z8u8t;6$NAizh9it{*s68DMt}2s+w&GtU0$GX#j#uc|JA|LpG;Y2>czQX}I*3ZUgE ziiYpTY=9~X0~z-ZoeU(DLLiwRg>KytY$S+ffq*}Gfk#5kJZS~NWj}0$D9Z;4*rU+O zXQ@_P$S;l92FVA?k6(S38Vg8pGfts|Nh{=9x6sOuf+SFUN??TKWSJz`u>c9tuMc1e z7h9o+U+9?M;PLf;6BEk!G3CMouAu;=guL$Lml#pW_j`LOt&*U?O*=IdP`nSLFU&oy zlDO|hB7}dX@X!`V^F|Wv7J2^Gzv=~$2&a!AAx||?H%pM$d&^5WC@+vuTMAM94`S}a z*CPfGCx)7OqG9j7wA8WqKw$34-6Svn=fa=R5WF?f2CMz}TSV`s}Fp-m;^g}3$m%Y}^O_NSHl zMVm^Of;O&bgm3dG0{VhBXbQCPF{wlmT#}@mTyPdYMiMg)n-V;j@6TaN@-3|~fq*9p zB>xkbc#zN;4Uq6h339tY5;U&l)|#>vgaqO$kpxB`Lelb$m_T4Fg;s*bf;`IWUtq+B zeFPmVtSvq`6o5DV(?~qSk9gApPqaY~8t-eynl zs@Uv;6zJ7$o|_k3CIqGJmlYYuZAz(ELFFP(5(X(gj8n>CmW#akO;KRhKm1~E3WF8` z$uHD4M7s5%ol+ygfgqcVGWRZpRiX$P2-Jkar=VLOB8hAT&AKC?j3iyvzjG1I`p^+e z5l#pVL_s5;==K^3jy(jG&{C_%#MrH|#s?bnjW22VW&I=dH`INw_CM-gQUB8V#)eNc zI1N(UBW*XdO|~_(-rt&Q?QHo)%bhKD%ZcW%HQ(5LRnxyTeWYoj>4Ms0HD9gSuTiW2 zvHAnm^VLtQ`eM~JRea*_6MvMLOf<$Hh;PL&k9`jfkYW)(30;52p)oB))j-NBx_ zK1t5~m5mPWD;`j$G!&fRCsoJ^;znjMwFGIdCFX zt|)J*=dOQ!-{$U!9_C*rA9$jNIdls9F74ET6CkM-iX0n095+f0 z>e|bI^mv54!P4-6Xr#|&U`37#1xcM3D@f|2fNWMaKH#E(dZia}-Ot=wyzagpzqX8R zXBo7SKZiEp)6ii8aKf>#!rsDo1&=lj$79~1!{1w;x$9$|S6a>)cBg~j)Nw}i8y%tN zu8)yZQYB`dg$!{Jr1Bpy8?HlK87GoPNtcxYr`yeACjj`vHTq#OYEJXD@ zwBpWrP*kuxlv7GX_1ucPg_H$=7!Se@fp`Naa@wd&RHWc+;LOV0bsMo@p@YCC1ApIt zp28q*BVo77nnnl*9uT$3^xpO1-}M&qbE0{7EP1v&7)9y1>%(2=&?(qY>IHss0K$pM zboo!OjhCU_=U?n^?tjJFKe2g#DvXWFcC|f`vC~s7uK)@-G ziAI`E9^N$keacJ6`~SycFN&|kfbxHH+lyQImVa%zzvY$9zihs*`3=p3%@;I%qv^d( zW)su+qK1EJ_*BE|>L0E9@47G6K2ZC{+M(KK*E~`4z8b40QT4Y~A5VNU@%}`6{IBEh zjjwp0WZd_Oy`TCV8VNY?A8LQ)=6Sg468lo5NhUAs5;H?3>hWO37j1lf>`Pw80Gyn| zC?Fos=Zw8SdgEBT)QvFDfAX!*#M}rMUvxozEkIRPPuAYZ+i7!mGLsp~Y`f2wmAXQn zbW+I^eOG?+tz?_-bg9Tc3}>wTs@=C;{(Czfv@E=;6QF+eC*S(?hFJVe)x{T`sISG7 zuW3N%t&~aL9K8}xlP2wKHj_}PxM6iU(VYkYF~b3y*`#EW{ZMp@8gwe~h%uuw^06RWeZo0$Is?9iT>= zE799T+Ht8(a_LoJnpjIV7T@IKuJ*^*Kcgk{AI7N}tCEeFi~doiGmR; zDF?xsRw%a;HRPuM21bPo$&$ZR++z#oBFf7;?#=?)!@^Q0Yp^Oi-;p;du!6ayTuzMp z)xUvp6SQJ^HeVHeHVG7^xE+viUWKz+qHd{XV=qelNuvIi`oWs6>R(iUysA3!CsjYF zdRJAd{&?NPb>n#N?=NcKR6AGOTJtfy5coLq^=I(X-$z=uTb|i$RU6I6n;veuu1RhD zY2*7EXR4&e=7tBG#>yWsFMn=~{r-W^M=?G0pQ>vseCUp2c$vg=pg{gmpa535%OugE zh!5SBSYfa51H3pEyjnaLCCck`hw{>@uC4H)yF*#2U{!XU&Z}1nSmB9~ON5{sAwh#c___DqvjmFf zTETea0b+EpD1Pk~AuITqm9v7_DNMLnQ+VX3(5oAwh`smTcLRP|Z2W;J6l6gI;{Zg6 zKin(y-TMy6kg&pnHlng3o-gfsb8PRu?|@%b?ACel(!dJN)>FYst@*Zl>*$J?e%Xb& z_f`_ep~K3q(vhfqK!fTI)ToUgc%!C7fv1Q47L)J2_f~?-EHwYdr~*dgcs1U?M)*_r z-in|{VU5JzNUi8l3N((8Mdgj-KuJfM&^Y23hc+HU(R1(F*Fw1N$or!X9MM8(mS2Vf zIC+C`I!vv0r%IJpjWvlmbTl?Y$LI zAof%Hcxix<-byPrj zS4Uk0q5BH5Rsgca_Ein2N{RbR)tM4mc(Mxf^@It;CcRjs~=452Ju(zZLMT3Mlxt>y8{C zd2f=MatyG%(jxD)WYeUROi6CB7t)Nb>~NuQ#Z2`ItPWT9P>PoLSWJ!G6Ki`Ha{VQ| z)%OTq<4d*5tyL|Lw)|f$%Pne4ZS%{T8=C&2>HSUXO;#%u-AC%S>N@M5R{NdW+iQDjpIP(Wnvd7))$~^PS0AeysXBp7fYXVK;y;Ri zHvZh$kI`WC4;>+J|Nm2GZhaphb%jZeJ$x{q0u`#Tw*~Lt2?^Or3Yzp4iUa`>gg^bp z18I=AzORe|{K~=X9<&lllGu+q9>g;CC`ICSjNVHUcgF+ zOw75U)QCSVyEGKaH|1-d6%)wrdxXH~?TieC?6QT)zb@D@*f9U8*&Y2eN+hv&hmp|e zOwtN53x$roJ18*Nb^n=`uYPUp77usp%la>j9wx&-k%Yn`fC#q{U)KK-6g&Y#xD+SC zdPSwABf;s`_hI`lP@D{-pp}?VG&C1&ZL@2PlY$-}^hIZpGdZ)(DO9 zB_w16FU-B~C6&TRfCs1cX+m<1NAk9yh(Y4F#YDvKMTDZ*%G<&^7Dj?lL{Y>cHV>|P zNXK?dB(a|cTL~vYs$Q{UPXxyTlHl(3UJ|!1NbHHwR{SJc792h@e?mG& zBERmu#Q!Wf`$3ZCOw1w|=PpUez6w8_>K7<@#BqxhVQtV9L|t%EUR0NV3L6P!EZk*` zTk;}_FT=bbVnpKn{c=fgHC`m~y%bO&LHx{5;!Y&4#*6X_S@{5ZQO89x7P~|erY_+m z9<(VIvgzTZOetmCS7T?%jkP-~CxQY)%%8GIps>kpb%7!{E1?vEUK&Z*S^)`VUC2K1 zno=Vn?hYvYkya#U-}>GKk0Nv+6a^75(ua%F7_v>E5lUKwC=Emc2=JumTito4mGPp|%B^=qry#(Nw7uHp6uy@9R& zLH)bxN9(KWK3BJ1_ww3*sr^XpPVK3h@7H{)CWYL9SkJGK@r9!(0tbFV@z$d# zaIE&9-v~u{RfqHn0YksBArzN~wt>g;jv63=xA?t#gpQ6JAi3-IFLpw4)Bs6xN|1sK zuy7|Bp=>fjl9&&G-wH&YFcC(FY|c z3n*b*Grx3%q?S-C1I-?CkBv<)Zo&I6)U`1kU1>r_z z1xU6Ftn@8(u=+6ZkSbchR~#432oYrG_e7)r5MJ$K(p!Xs`Mqg@NLB8l+A ze)x~UnEpG7db|5V|3UD{VFYLzTKp6=&G+1W2i(evIg!^!D3xUHz60LoVS@-EK-2Iw zpMs{LEO)?jD@;qoYfeZOceq#({tX5O?GDfQ`+-1*QD7MGPbwUS+cx!T5v<%Da9f@N zPDCJAmIM-yx)31{qML!$bBE-yic-lCmImb^+*C$N&Cx5tWA&@3mIj)Jg-9KTz=|oc zN>oK>h1Z0ri#sg7+hJ*nr;&r#a2N)xB|%Wrrs-qk;9i+&0xJS}^V?otx%;C%X!|Mx zk*@19hf?X4uGFTvq-PiHsdOrLAP>+LD`Em9M(=_|@BU~vNL`R<9r=eNvj}PGrrPrU z5$O$&A_D>oqSk%y-T!N>B#wk0Z7L*kyNNf8{LT;5_9G;sUyy8MT?1$)7+h<9UF?@0 zt7up7m~Wut5Zm(i3d`~XWc>Trl7LSAR;g3|%)8#ZKkseA(f4z7 z7kANtRrWa&Byzi(=!w=}32FBbBIPUzr|$lo7d%Sz_%^0PC|Vys0IH2DcD$v8WPK_? zCbazPIjCqTE9li{%lkt_Z%G6zq}WjItI+y*8B`l}qD1)4P%V0Zt&f*Mwb5C@9tB>+ zM6b%3ThW&@c^{ZQaS~R8CG|N!R`4x8fct>L!jYmWqDT_JfWV`48fP4Gz$zGqsA}at zT@-j4u=no!No=67JR<6X1Ox>@BDC9vL+vdkR*^*&+AESESh>_8D;OCnU?Pwr2u-mY zW7U7sqQ?Irc4O_+>;I~;qv=ys^R4f$LtTackN)hx`pn#g&pUB)vs@{or6t~QED^77 z=(AT>jfd`AS{=%psD5D|DCpF^Mrv#=qLjwvN$+P@3{9b~Ui+$T=CYY|vb{HXDUWJB z42wT}p>_s}>~W#>aU6?vM9z?9o7D`I`m%YO6J=dO?F^2yIY%^j)K)PxSr<_O1plI% zlenGUULVh{%VziHP`*do=wIqxoMeXjJ2Y`i82|b3snVm z7cE0Txj)u16_iy$Su>PJvM?tG$LJ;$i{~xWsyxNds>fI{O*h+UM3EdJ*!pu5*3yBAke=~BhLl62u=L8puA z4CyMN;+0qvm8zi9sH_7n;9#Yax25N~?S-gn)WSU_zyeZnehJrK(FDiy)SR(4f zSe%T~d!_}Imn9D6v>cP=Ek%%dwU$G%Kvju7nAo2@GkxJj7oB{SU%bR(#399$kH(lbj+4&A(Y@lzZXJMi{)j2l0voboaPb%_C&yc;om3GA4 z4RJZQEvCiJj@*zUag+U-y$wt69nTE3ukCRQQ_H&p`LVf8Wpiq`dv|hWVrX=Q7%7xf zH1H%K3P6e|qR41EM5vf7Dj2DbzzI-O2PFYH=rT+Ms!5_=CrX(CkE+t;(#o!=bofS~UO0r~!6%3P?HB?K9I zYko@|XczW2XWHkS_VsL5>znF0t+HFr^1$qBk2A2$GhI8gql3b1W{J=B>{(K$w9ZWI z&TI@0u67$NDo*j7$S5kQ_oOJOpJiJDLrf9&2-$Q55$Z0ml8Hi`vW#+ZqHLi`nJ$qc zlQ_6=f~+fcE!G~V#y$`6rp~{_4WOms7QudWW@@c#R8nYS$lIu zzdTv`uUB++6RQxY!kL`N*$&Ed_O2Oy*ztJOuwi+XJtY*R&7b1r(6VNzx2A|9Oatn& zqTnTmLb52Y#tD$N!Z|3IX*dp#vR4YH*|x+sRH5DuEdG)ZpdfxpyU>UXO3~f&JpYCd(Za=-eBu+Z(`bfs% za%ygNcYI)Pc6f9G-Q^a>7FVt8NNPRGTt4cBvCCf-qXbXiR9adI!)CFTzQqvHXgi#7j;ZP`5LGeS5=S|cN z(>TknRd|%%jonWii&q}M=#rCX>Ovfgj=Z@{%af&F zT`>{eu}}*F=T3>CRZ#^vLDZ)NGk|h{63YJ=qYMBnJ zFuc&Yy}Pif+L`sOmEF0a;qe`du_ycbIw!S$b7WwBl{H7!yR-5pW94=SXPxYJ_fC$_ zwhKLjefmt_#^%C&kJ`m=FHCn1jpoMLg}Eg#mQlG7hQmZvP6!l5R1MwI8B;=qKFKr{ zoc=9YP%NxIMuI;HdBcF~sO}3Z4!_TlBvUqQ;#jD1?Eg+Au8W^})$tc;C(axX(dwC0 z+Oo|RrZ1n}%#CESxuxXz5(@J%Gxla~9X0t?!C%nAQs@3C*dZgqm}x;Ad%uqOh`I5_g*ApmmDC z!!^-t;zpssA8%Olw6HNJu5AdjtGn{v`t0($r3`a+e|BOozdb&{?QYqld&0o%?yfnu z(U;zI21b<5k-fRSk@o3~wZJayrPj0^u6Gz!RV8P#b7`2J8OjWcD(nNcO3Z?QJy4S* z2Gu2Pl%i7&3B~(R6%WO%SxDWMQHaun)(h}IGz2afT^8Y?V&h>YrB*>uUWq-B*niEL znF~)`OdnW?cURw+aU6Tq3a#4NZKNOi44&8`2bRLmu9)b(qLb+TflA=6h+P*?kV|@w zx{hHYR-xD^T`X}N%4ds~in_ZfV#tyDiJXWErVfuKj%^BmXD!SFZ^(UXS=H)KPim{e zygk=FH@ZHu*|9u6B1t=wYWsFN+ut#|oSMvct;1&+o@Fvl*FrYEK0e>E$j;8`Q%jv1 zJG-N$9h(@SVQ$7=80gqW2YA>OjgcLbc*n5J2K;sgTcBWZsMd+{xHyMNmrk^=0W=nn{KC9 z(kPdhyBr&$`>QKPXIwWLR^8QMQnlK5EaZx(6ml#KEve`@ng!+5WW^L6)S%S_+k~g9 z6YFiDPB>03nra9duV4pr9KqrA{9dZPOG?>W4%eQ}OtaaQU2C;{nN#})rwvp}T$M8Y zy=%_4J<~nO^epXeGX2i!q0{X6HZ#=AO8MOp5tTp}m&}#vg`tcf%v!_i>r`MOUw{z>yS%>%WM*4|J%QCr{eM8ogZ-(IiRU(xjIrmr^bHz_Tz zYW`B&-EGfneFF%xbxz%hhK~CGXiPVrYdd$SdPPx(0}4h4^awnzAq$~lx9?vMYQ7gTvqq^Qv$tR%4d=u^W= z1S>Cs7%>6`(9xjkzYM%{7E^s7`?x^XC{vn`mQ@9uqsEnB2P#d zD-o>9QLaa$&MmIXgAlr^FO^x*Y1OC~uA|JgmD<#eRaBgHA37{*9B!LgDk@)-Js_)S znVat1k_RdMKoB0RJX!ez{8>`P{P12OI!vMDz{-?)iF7@YL`<8y@jCN+$eA? z8UzNc5HJsBHnI(1R)(}xzzmNVP{>g9>rGde`W26cjzPc3tMD|+2dv&q5ZM(D5%)=W zftk9dJayljhrp_UTl1lO+{Tf%POT{sjhAznqrq&z3KtuA+QHwr09GW)sgi(wffcTL z1FYUckh&F$1UD{#B~r^1a}L}@fmOs5KlF-RCI@m&G3USSu{y6ghpd{aW1Pnq-&#p){@-Lw`xBiRf#maN+AWCuAAEpu{TT6XK^tTYue#LVO z>=6x`2P>e)iyBuS)n1a9nDNS#Z}Y?ee~*AyD^_0I7*b-#0DsTBxT-|#U`1W0p;tG1 zSN73aks>vLWH-o)WS3MZb{J%=b^q!_uiiw^u`a7hY#;U(3X|Z%W<6F>RsqLgARag+ zx=ct?W}tPjB00MSncN&zf4~Y?jFdxx)k&6f!SddG@XZx>9fVMzaSs_2-7sNw1{eCN z``%Q>Lrz5D;@`vg4U0Qi~oYUEsc1!>V)rM>t4 z0m0@M3|6!^Eg*Gr0HGhRf{MNcK(NYXMQ~JptOVZ@-^cs^qp{Y9TmP_isa0xCv^>)C z?v_;ZO0(MZ$MsEh&9&dG{ZP$Es{gurx9Yo9AFtZ0dUoRbiMtZlCPoq`;-m4uukNXS zX7%kgTQ!}vo3+1P+fw&L-3RGU>@(-_35gZN|33CkqQV7BN99?Q%_6w32!qNwERy(J;j8*$jt3%*QF-}DH1lc4vmUFdyh2L>6;Yy5JMkHhBMlUZY{(65dO`#PEO-9njZ^TKd0FM;H z`b9xANgmaWNDC@bgtb9YNQ44eLD4BtaP`(33Fy|H6d^(z?l|B+MW+yIo)P1b)L5XP za+4t|9FwSI9ap?$`#V%sg6B{&BgE+`kWiVEWJcgs`cLyDyXnSqN)VMfc{qtvY9;oK zpuFI1QfF<_N;!Ejigvjj8}(YDGK~uzqn`hBNxWRs_)US1VFwP$G`?}zYvtbqBm{Zs z--viT!N=kJT9`>H7qHMTD&|E7?Hz@l95K@4!-;*TF7dIZKw9Zx~pSc zUup1kIv5!W;;FuaDn@csQ;8t<$AOU$STfZHAt8=QK_z`9$z8ibUZbQ=IfSIzBMFWK zsNs-Iz#F?f66zHLG7`)@HH~CeIz5sQOH7dBezQtQI?5!0;ghTcilqMKF{iym5~K1B z3mv19()juh#2j*hcO@3PE36fogh;H#BMB-#=7kOo5t3$)}Ha zB1LGoC<>y-qSr0z4U0k})KQFY{CZ3v2ik(X-VoLbO+s2B2UnLQPCciDR*-z?w=PMc z>9IKP9Z=)cb4rJi#D2||T8U9FG8D(+U-<$A=3G%G2~$ccm_SH`Qyxi(r-wkJ&r&8` z4I@YAg2bqFZql&;8k{Gsc+s;Ml>!}3LWE4hXN6XRE1$IDA3kZtd9g4Ch1m+cM-eiUB(7MH@wBE3 z0v!vIxLTR4h{SE>c_oq<^%@BgGBRc;6(eJLZiyrwvK6^2h;R}d26c$p-u6`F*Mh1^RN z#`2R;5^DHp#W_|c3F;W`QGz7Gvpo{(T^%wOgq;04#=H1`JjvJknU>k+c;kZ&3yJNz z|El_a{JFL7ujxh~{(t>vf4bp9=Asi*Wn|mQmUun>SKrV9RNG1_OMtJ*OS`%+D`GZ* zhR*`Tx!bvvO`(1s;Fx`R0N|3B2JxB&V2^l82t{QAYp0o#-;zRqqbyR*F3KA74Qw{?R_54ZOX%xvs#FOIJ<@&v!m zwXcj1Zs%rZcg#V7k(u0ruqc?!(!lE2%)ngxD%Yi0%yjpH%nuFhOic}BILl%IRI~`7 z6#zEFlmQ0R9L6y;o0kARawNs#9Yv5Nov}3mphDg<8Q}C)M&o$hu^m%KDn+r#1>n^} zO~d|j?S+fSPhK4qZ2eR^XX8G;LtjcSWt>gaE8Il=L5{sVsRI6=9JX^gBzzVM}2kDg&T>fbm3RREU7`>!t>*k|f#?wj!Gr2gr|MYmUgO zriT0j+2D+^WoIbYyE45zzA-ek>ue5=49#UGPTNaM>uhdxy4{@apI)BJ8I#kZEzOS& zDO;MkywlD0at<>$&++NZqO?2Fx4hLklw#%W?vB;1d7~XTc^RNBz;+}aNI(t=Ai!z^ zd1=`WYdZk*bAa#5tjY@l{*gd50f1(Jt<-^&=UG`5Bv!Yzvascv+WlA8UpV#jlkFkG z?oE*d8c4GsWi=@aoRS=c#%`xplg6p!e137h_W;0Z2B1{vciQ{SrNtkYw3!cuV;Yvq zvdExNI8(80K~R85H}F>oSTk9{#^_8zMRE&3OqSwcwDPvPF|jkm^_*mI&+~M?&46iRuj`gQj7MFVSn~SRhd%#!D%uEgS^rd%~Ml4-1HdgnB zMwNWu>V(}jpb9{31M`VQ8jDAs2WA{89<0ik$U>G3Nyds&bzq1s0oWVdc&Sv}YQnr1Qmxi5zofN~1L#IbnWlQMm?(a5d zyXO{GjIEWNsZVxw3~uUKWzSM~yW1C}OpnlSDvs)iHdZ_kl#nRW3k*@P85P)17E4Mt z0WF7Ak+)$nNS}dPvx3L~Xv{LEE$J+PuLN{6HPOLcp5&8;j)k2~*_!~(Ysgzk>`y)8 z!r==}a%JgyMtB^F2LNk(`pd&g0F^8!XEIqM84!7gt>==%C}#?LOnz}0%!+Fj`0zXg zQDZGdb^zAqOx}?J^b>Va6E(=#LZ%XIo#Cj+50FF-^0#abinEfN8cogR)67g}%w!gJ z1wLhGM=Wk-a$`-@m67eOF>A6rv$VX}JI1Eg2ZgjbHE+%i2&cQ&I_*`N%a2YOnf|54 zEoF1HozHfzjSg+Y>Y^v2g3Kcowtyyrkv!ZC4!P+fRw^aFBZQDyrOK#j;=$c$+{G<+#qAlfZ5eK z{4-<@^r)(-8YC{Q>};QA=eJj#zO8K-=@Falx5j7ork5vjV}m1;Q)yw^mby|*W-2oW z7_ga|-t3*)Ssjqfh3VOzwV{O$JI{CaO$=qMZgyDFOfl8{|FZWcv67u>dLA=bm1MHS zlG`o1GDVemOR4Ivc2$sP9@J{NW1iVES{k+`0bW>w4MAQR zg3;R4M&P11h5^G`cq14v;FSevYe0bM=a0De=FPmp5(FGDfuib=m(d*fGIt%79Yk%itjZPfESDtV zn-6C!ncw~Bw)@>z*&n_6y{Dn~Wpn7mV7-sLvO<0{74xPkD62Qsvn}|}4usGEVa-`hW9yL95rw%9%v+y0qFOF0yuzj! z98bNn60Fy~bvkD`vDRp8X_KiIN-TEUZhzUBS9S#_77pw3EIR3V`(t`E3#_(zs?KL! zOW$_a>5`vV)mx)nxEdN4r+vji%V!D|v>j+kt9o1UF66 zWi#6G&5%@_=apo#U99E@`Es&2=&VzDbyjaT<92OZIax`)EycH1cvmVE47k4aT)n)c za%k&&KN5Gs%V>S!bVIqYt=G!4P+9RPrcBof^?Zx8q!@^i5OKik<;~`PS}0S|6nKib zx{l@|8?`k8EqW;)RQV-*m0v-AdwkY+zw^y)?Za2*XK#{EZ|KMDsP<=jzkg#8RjD~{ zYJ=_Uy)1^X1F;>_7=I`fpy+n+yw75?mv{^(kM zap@eM`t*C3oaQ#M{>w9OLcUGI>O%1mCY&gF8iTLT|NLAFdSA(f-xVD2v zRSzs#lPyC*31Idl@v5UdLgawb(zi_{Jcw!$9I1|*iZ2YKe`*hd*(~c#QcAj94Q6iN zIXTrtwQv}h)op1qiLdl>I95TRTUzX!%}RMPT=b&z+BRO7svQMFd%{{4>V8h&=9FRH zM>W=Sq+ZDI1IjE5j=y6fYw;A@F;VpKFIEZpNQ=12C;)sR7;w;JP>-RsRcuJ?NM+t8 zEJ;3}hM?|$7ZqLd*{k3A?9K1JJ>4%vUxtM4*+a#3^VQP=ptPEA=9}XJ4NE#sgK$@R zJ)Ek1wL6eaSSBcEBb!g;T=E)rm?ZI%l)0(k;H#13R z^^moVwt7}4t~T4Mr=pkT#L%2_3lSkg{MV>XP3jK?<$*=U^bvgeG-*;#1W+`!AvBU| z$Pq8Up{piZkcVUV?l+?U|K!=f{@|m({p??V|L?u{>8JL0{^t+Z-}@JzY+ruzYi|8N zwV(ab>(_7gZ@*-r-Fy8Ef$v2({Y0rAp1A%B-ABZqQRc3_0Zq(Bz?Y{`bo>df0OECDvzMs`6Hq`YnP< z*ELiWV@ULn{i98{0tXS35KPKF4Ph#JaaZMqb1`A?(d)B=Tnp*@^e8`T-L5Q}<5kS4*j9Bq zYK-H9x=E5%Wc0nhL))V176(tG%ITx1;@fuuEzki-5Zuy@^9>NndP0^X6YeAhlq-XV=FyBPh1@ScR0A)R>XfVgF47xF z)%hrx^w!egSn^MLB9CZ_)8%Ms2&q zDs!hDkPaX9weC1C=!JCiljq;ucK*Vv&wu!4`tFVXfjHW%zdHG=bz(Ji=U4+gI^GD9 z-+@07&G_9zceVicm-*r#awqh?)8o-MDpymm%5|Zk36Lz~2;kc!T7HS1NEU|pZ6zE= z$a}tn4w7PW#g^1ryU4lSg^@gfTh zkh1e0nLS?vWCE7bbabiYT|I;()!`GG7RQg!*V3(*9B%v1Q)yqlx2fTbQ2R6tHpUtwj(7 zY49DFHcY2iL)#Gpuv@!YmLWo2)K6Y8#*i0^dY z?d0rbJ~Zkd`_pD)T{L35LEhhP3TjsB_E1I6mDQ}<@IYR1S-?%f_5~*D*_7F!vLP;{ zLVShXikWSAh^UYxUPIL(SB)Z8^bTvP_dGzd8)#Cd>`L}*mNS5@6 zT!=l#wTc}(1K=HST@6JnW+>QNU>f0R9DiVX3cffpRvkUJ*CQ?ZrcB9^(N>dC*bef| zZD*Q_X123(>&@sp1dvdTZ2n9ay zo=}FHk|`jk7yPn@DbolIZeIWJ_2<9%%|~Csx!$0v%zph#DvHS@<%31f?jZgeTGL+W z{zn(pbQSq2BGZXKrp~-8+=U;*%}>G+G|~v~jo-Pc7Qnj%k}KVJo>T_&b;uipdgGAd zALd^U=Nu|`1d|a9*fHRwRRKy`Qm-eV5rdoV8;WdmtsIAH8+Eu!X<`P`Ub-MRb5=8F z^Uspnqg*GdPlhRF8Qr&6$&xC!wcc=Z93M-CUazv6dZ$5a;BSU%;pi+pHJ+)pk3Tx*$k%`3jYV+2kaYkC7ryWtSzS(i z>UlR6ANwL~8P@9~bAhRU7gsJvPV;tO-z(bHkWEVhO6l};2Y5%)eHv=f?w(DExXu6% z9%N6?-G*EeM*_Tv3bF>|KP(8^@Q>_u}*G68`kcM@IknINCYYnuPKM+>9>OiTMLtdmG zWhj9*8WfryfcTAsIxy)(sro4kWl|=`jzsx|${;|J{>*LrFTVQXvo}9~bj)wgLFMJg z553QOwT1u(dh_Z0ZF6+f7+#FD)Gt-}<|k2q<<2h$s(o95;S12zu|b+}6XDFrDco08 z6wQG|6)OQrpp{0+ERzvU$5I0+5?Aczs?&7)%|T{FDZATA`B9>?8~2KhU2*M5m2~|W zHnQpAVec23o#H+@s07FLd@K2zaB`PCcFNKzv9PpJY8W+&r^6tOY8y>D)q?BT6c4;7 z{F&OrvB{yLG;I(m+94VxI#N7da0LKq4ak$|s!7qfo&=<5gR#?FR9e*y^5OSx|KM|x z4X<=3FaQ7U8v1W?>kpDWA%(O#P}SR|L3rixCS0e}UB zg&C2d@%l2OONX<{-ZQ5;DbL z6|>q)$I7R6KWXJc+2UeUpBV>xy>iuAyf;a=!n&_%Ak5rM(SFeW5CaIqSi*6Y$;yt8 zkB{h*DDAoH)O%Rc0uBJSgcyY3q~Y(6H0P@s zE?>;t&h}|dnkRB{#M!==7VfG|l}i3 zlalE(3na8TWDSjbO8RAHsRg1=78WNeh@&f$8o-CO&u-^``Bfd*_ibvh1%f7+4LN@} zg}ZQ>2;*&W9;ul)XY~90Wm^8HxLR#6pECNX@x2W31cVXs_UZdv0g>Tak%Pk`PAd)= zD~3-Brb5Czqvs3vDG79#ZUmP)OgCIz=>fLMuHu}g&4^J7iq-VcipN?}>Cj9B!}>0o z4@EbX?ncX1lUjJ@YSVpm6R+xNPtI==tlirDQgp_%yN63VK0Lo+5bx z-1{P(>H!TAeHrr~rtu*$|L-xYAWt~-%rtG3o1oR$Z#atZ`U2(DTnEU7I)QHa0bZBM zmihU>5uxXIzWcq~QRwv>;Fj;cJ@N~l_44Jj)b@Y+&o&!cD1QcU{+=h`xxjZFQS$tZ zF`R(5X8v{-aLvD}oect;@%QZkFWz5w_JBBl*;fl6fokeH1JfQxNm%W9j5HO`7H~0x zdg@IkwfMCF8PmB6S18Nfr!jPjo#b9|UPx9zfHw2acy&-3GdkSvUQbL;)u_E2&I@52 z_>A#nuI%#@c^m0162rzfJ#xs)#lsZ+smdo#W3OoKKZo6a4DR6@EXv|;~cs~%>I zcsN-KYyb}vGD=`o7jJwea#ZM0;z zo|S7=Ios-tyiDT|KlnR_2I1~FR32FEb#yY_#E-e28u#6moj`pzlj*uTjaR20?fg6k?M@AwDfJvFpX1 z!LBSvTJHerpVe2&eG^SQ=CwK_@9#z#oQLJc5MaCm%jq-rw^c3b}Q`M=gL&3?6%oobU#(!i%Um zd(c}AFv#q#>XKbmLh+8A4cdK4rpD2j!rQI{p27qU?uj8x8a-Ka8D&ctN4lWj5C}rH zOaj_{S|d@%d6stO z`)NMEANHs!4tB!DOk6-BgO_2$EBv9?TS>~Y^Rk|w3oa8-~Rk{ak52o5wpR|B_FaO=Vc znHEZ=OJc|@910ar;O@dd4dXiQI)03hG`L1RrV;qKk+|LS>6%m<=D+{^cJ$*PFt6)A ziW$FqLAR1C5siajPKEw30KGrr(tL9C=2Pko0&xwuVdv7|ug|gK(%u6vJkWUTtAl1? zXlPKW+qB3ABsmoqL&b0eBCDtjYyj!#^k9WiL0KS=0SVFGlqbvbwrU&){-GqLYcM6< zbT3^}63Jw(oSP}WGLLJCs1>aqz3SK=E6t&@nWRUNQ)J>ycDX9WV`)$t&r@=!-rUR4 zK9c~4a6tz1glRJg0EaaEr9oBTz`3$yV}1+;LxFVy|AAtNdn<-H)S)3C;2Vae371k* z-*%&T1v`h|Uf*nR_j^gJOF8%(x6YeaxTcLCr9QfTag$%BzW(J^)?|e0;sPMvJ@H`i zJapei=Ce1hW!@dPK)|oVR8jK{Ff);Vu%7j==yVcM9SJHS44M)->B zRB{H#3#|Hj)b(TCiy*7O~J+n=S0> zraBL#)!vQe>Y?7Y6G}k<8WxN&#f>2BXd&=DMl(Gd*h-a|sA6~QE1qXD%EO1w!uFXE zAqAq2gFj_sZy5r@fLIF|3I6Ki?%%}Z&G`2)z5GkBe+*vxUNLu`G@J>nD`yJL>?&Xj z@n_AD^6_JrMm6crcp1)vODEXem2}R7-J)bZ_~vqBu0?2&S5Z2 zdS258Nnpgtc5kkurF0a+P*>Y_+xjZIS?IG(Bw?2e32QWBgEmH=K;ph(-Lf$nc#5FL>q=JbOHWjINl55hiv^>%DKjmUVZl2oBg8z za*xfHFu8mW#NvNKu>djr`j?#Nip%`~hCiK|iBcIz>JpxnFV(9tgpm#L0|u}SW0c!u zQEm<19*U2Xdi2H=S^Z(?4isJ$0doqP@7zwrNm z`S96qy!^voWB>o_`d8o9%~zkji#y!04n7vQ zj4MTdOBt}C91vwd^SEBSt2u?&E&e4vz65xS;g#xh5qWkZMdu(xMLN_UtVQGLg!^7 zif|&(@tCJ-hqHMQ7X2jyB6`LW&)_9aqV9(kDMPX(Y{tS1a!0*=#YFEeztbRkt{; zGpG@uw~IxmLr-QfC3G0IQ)prSOv^$kZP2>V6!PxUpi?cV_|`i3=|U`^v?gv+2?j4L zCba4e@zK>@!Q^@Z{3&a z#pvgJg|)j#$rZjn05@%cQ$j>@Van5`VU0>0lFoRk&NRTlMwc{&6Dbo?NWHS8X9fjh z5e_HklWpS=m9x4PujsLcHT2cxUg;LPa!pV}aDnoLhC*l9rn80yoi`7L6U7 zu$1(`G|FzOm|SGZDQ4Pa_ReSV*@q$ck|20AzVu!oN|?4%u1tsB|Fkpq-&yE3ZDlaM?^rk9OJbWZu?E%tQOo4=RG+-r_ zxtHwC?fiZ)%QrKV?RvRgB-QRPyzN93mK7+wdL+EBg}rv85@Y|!$UT+nhrv8NkZLWp zJ*wvpt94jI_7UIAH@(SWQE4TIli1p_9V!a!s^Luw$q#1YRJ8(WW@fSGUzb=UY@i*SR!so;Nwqeyfqi>*vy#vQX z?1Q;}!jMMz&x2DtQSMq11({9|BcNI#tO_7YF=%D|fGA(-&Vflxi7ua#!Sxw>3wM0F zvGjUrM}lcG7gIZ0JXD=YOSu#%`+?ch#+h{ZR5?-lR@(d8sazc{DfYwmsD4Uq^qO@# zji#qXPFlvMC%>L5X}!)UzRt}xhmr&Kc?gviA()UFvSfwsfxrqSQGBpoAUw>82O;5n zPmquW;|qy};uFGHNr7OY_kz<`q(9FIPrrKoQ*ed%idMm>6VT0YcA8Ntg<|tna0ObY zqM}9n8L-V%fRTXf7ka_39QxZ3M;L%#$5@rf1_;Z_3~F&-1Z5q<8(TGG zq09<^h@k>Aebc12edzB`lSEifk1P90eluQJ?fCdu4`#)_Z%4|#v776Z){K6YirsKB zxm>@L_L~{MF-<0oiChibjIvt!{x6$_ zJf_?rlcwn*AGB$EXXeSSwG)-(JU*@^w%vJkm_3B{lXh6KyY?|xjcj7_MlqtXeK-|q z9Add`cih&L-t9Mbval~y_Vtq$ zH&gXVycv{Mqi$a`0W!aMe*4!{(P_n> z-r1KqO5OJ}+nfzhOeOeh))DhVPyrQTF9C zAv$|f9fa@Dub&)E(Hd6~07ycRv)Duft-)to3Iz~CMo$!9 zl7R0t##Jy%TpOj6;J8rjZj|MEFiy3%C3Bq~j7z7?+^+SHiReQ25{6urL;GQ(D+l%1 z`ZNz0y4iSc)g4Dy`?k4j=N3{;@Agq)xx2%17jxSgeK2b7=z%SvKj6+mxS%|Mt3rJu zGtq&APO*)O)-{+haje7wCU4wbWIhZ{Y$^(cQk*sy-G^BCM4RzB?|t>lSD$_Ue({CK z^5bVreD_bc5{0L(*c!(`7&u_K2E+ZTAQk~Q>-p?~0wCUYMqHP-9bJWd719zNGYT(; zOg$N?rOulUp|U52l$42JhIB=ehQI=tpHB`I%Z@G5yH4HPNyDM*cUZ{cRko&7>dQ{d zkd_lGm27UkX&RAg{M1i2m7S|qs;A_llWq@+&4OO^lC|wAyW6)T@uELHjJ6Ks`v+k$lzMM{ z;JLD)Ef*uxOGR_@IM)sbXA#}Ga~F?X_yXzabRICqdiT|X+;+c6iAv`BE#YDt@SWJs zN4_NmzzHx#eCCz_3bFYI4u;3zifJX1BSg=-(^&b1wSNrh+rqNZ+%@v`u{<=rb!;{r zjr>yGC@85!N***UuP~k+yWXjro~^6xrIxCMt5V4frw}ck3PyZ;EXHeEsof~2))tZ` z8XqR9a1)^Q3Z@7foGY93KAl6T<)%U|qf_ISxCkFf55Pr+h`0cFh)U^vh?M3} z$+>@3ke!b2hO~2SPSe(7no4#(o*o@;#22#>1WaO@DxUbN+Tq>1@7{~3?mVi-1dJ^9OSq)ehIVo&9E0S0j3n41n zu2Buw=eb@&%B`ig7hSm3Wi-`qd#qyIwWRSp7C#>3&cYN+JB&SL6>GuR+h_h3DZ{nJ^?h&A$@%);4O8<>n}}eKPPjAl`)9h--H$F@0G2VX zz7*{|u>JjE-_5Ph?YsSekPr;69^Ab|{HZM+ry4NC6)BM$lu9 zCb0oelb5|od)|t5j`_Hii$^%~+BQ1P%xkA{Nh$Dwlu=_kY1L2tc5i#Cj`QnjvbJ(( zN9~l>hc!8uoXgCw=KW*G$XTu7cA2!4KGqSA32g-xGlM3w8t6R}13}7w><`bIEAALQ z1gv28>ywPx-!y3!fgWA3Sxl3 zqC~@q;(`TuOjBLBW(+XHnM8B!=cR#K4SSnztl1u&g1p&@9fvUb3xSs&AME)z_g#%iD!kja(Q!WMP|on5TKK65ouHxp>zaTl+C$6d7v^4%ntVXXhJ!9fI{j zn)YnWCWvG}%4p!}BvVU7g|=Y(z#*=b(k47?I2zBYssHRi$z%F;7%V`EtnL4Lx~Wp^Hj& z=G{`n?r-8fX+N!ox*4n1Ev};RPQIHBr3SrdERr-vBWvD{9-U!Fo(=&2OLGY=CPHrp zAeJsp5I_%Vg(p<{IIFmD$HdMc096TK1i=&6*g;}y8KmvA(%1wKhV*@w3TQv$7B_xh zoU;G!DT`bD@!Q7cY5y~Esf6A>@U5NC{fb;5RQ)Q53XvP+iB3XLcd0ALY2cK;C^6X| z2=qkDM%Nz@IiULX9OmtVY4R`&qR4qQeVVNlv~_%&+(Lls%~J81Jk#=(&N1w?hN_p# z9r9(>uT4A2$+`-4@37uZa)y^{=f_Teduqr>yIo2SifMK*O2iBE$wcL*Q0%D$58I;KVg#^sNlIfI**&~Cwa=3*40eM z4#t2 znvv#vg`z_72(C|OE*R1d*)IeQo@ujgIJ8QFN+H0okVN&%GYAfG7vPMEUeJlqKtap` zra%$%JGaxnc7~wdTgWIf-LtF%v3GLgOod8wxPEelBlG>lXL;*;&s}bEYQ8xMvEf-N z{SYh8Den=nMY=lNLp=uZModeYtWY^aL?pl1g4jZtL^#Ir$AZc3sT9`%6hX?6nynt4 zY$)4@J<*A2)of;{PSEZzyj88BMa$zs+*qbI!LYwidi_HrqD8AFi1x{hMxeJGtz)xM z_riKpn#s*g;pi5M)3rpr6&qVIp0H>|d5zFn(A&dIFsK{Q4;n7-lrF?8@YC_70Xl`I z2+s)Kr%uWcJ-?z;w;=?zenPP5{+AD2=Y1^m=_E6TN*%9CKR4 z;`z0BtUbu$fatDeJrxg)p3j~`*fyZkAgbcZXd>$YrLd3@xY%IS1gr_&6E;fEsa6+C z7ln|c&!Qd0KMj+;*sPe@`N?qhxahC-csAjj;(9@iH+_4p_IvAOA!sajQv-@!Dws#5 zQZ()rjBYa*UhKQAQ?701VSot38fX;(Vp@7OP$!CVSX&})cw!wSV4ejC$@jq0Q%VnT zRGxuq=%XzoVKagCr58x+Oyjqo-#Wkh>Wd%0nZF-2xX@KWo)9lS)iGVzlkJz0_*$ek zz`pwjFAFg5{`%XLC$2Gt!KF!+zr23J08JD?V&-OAz!aXx42CLHoUp_AR|qa-bS|z~ zAdYJo`+;3^vFc~7q}`jur|sGFH1dv<*j5@GQiXcL?(|c|PQy=)wtFStl!Ae!^~0G% z#$VL5e1B3rs*&1sOZS@@CK75c5_FEaTB|+nwkrETFrI*fUciVUw*8pazx7vMz4_7SSLQA+Q}fB`&W5e% zB296Q3~BE|G{szBEMmOpGTQ(w!oeoagL{94rNVtVVLn{nZ{dRLR0_<1AVbLk>;yR9 z#0UeXHXt?Q4rYbOuFte530#v~MU}tEI@Q9-+{B&UG_?&_lh~Yga{FCrX6=uW-Nco0 zsNmG(I4KF` zAu}rYK|(R4(AZO*1Drz-fbzt`?2v?+7>CR4hH>h{kHf%92_VRM#tRcQn);XT`v0## z`egk5|NP}gAN{=-;ZK$C{qyhqA0KX>|D_MU{D5B(~GrjxqSB=NZ!=1P%)$l{cX6kbf2-6c^3vl>9*$j+`A4ngW zinCbMQ7JUV4FT&C{!qN0Z2bio29?tTSD%}wZA|a>#^H5;7giP(Yo5w3hF*RjS;zV? zvQJZE60NUHD_?I`7Ke3pTxy3Cr>X3P^P>q~8?187<+g3RSWg(Oav^tUPS&sk1IF`g zj}`d?9f(+UiXk6;hDEsm){9DvYC-}MW)G)DTIbE=hRDo5WmbYCh(vOaFj8XHqFA?u zya0sz?*};QO?uP!JEjN(Bu-ZRp+!d&BC+SxM0~-V1*pN~+s6rj_mJ*hP|cXrvlKMMN@_gWY`Rp(e8Jnu3UTwB z+fnW{edtxCY1Iz|GID>c_bik1v5KM49CafwO7-DT@Ban?rTp;?E(|}pff$K30TR=j zJFThsU&QIN)fptnYu6XDE?zb+OivM|sgap^ne67}v^ChDoG-W`a8ZD~-2}jpd}}<^ z*k!8bkYTMVwRWLWu2!wlTu%(wiCSv8@@r#^5O%r1EibK5K9{Jb4)c;)jah|6YP^Z% zkLzqOj4ZU_Znei2W8zL@O|lYIB;F+<=-cF8h|{=PFuFI+G(B1=pn4i4A$JjDPHK53 z147^@U}o$fn923nWsL^X1`N`TZ*G5{75nU;P$Rg%VMmldcL>X)_;3?OVR6P*E>8fh zT;fCgTa*^}cUdScu9ldnfpGEUlkw4c+cbu5j5-~GsxU}^Oop));w-YC3C5uWbS68w z)ac6HMLs-89n#@LWe^H4M$L4tns$uiF1lGYO3_)U6g$PW_NW0xcm%C^u^%@JXkTh^ zd6m!BD|)^eiR6dLQ=uG5m*-(u0d>M?#Xvv{Pk042GP5%Sd`(s`q?kYFLYr{wSilT>EhYxd@e_$XS?vK!gkNF`-i z!=KNTGWJTHM^>X^FFno;)OilS5hLE~ggf&-Z2|=sU?5Ne0Tp`%*bvZmJw?X0MW@_C z!|Nd*f_BQbVVp4Ufb^%?&mI_9rTPb!$Jiq zH0d{CA$D7>26O)EJBNHWI*YIHnENVRAvlD8dJkKPGrkj~>(V1Zx_%!duDf`G_raC5 zsds2ig)oab9TPASl5JqBUO>A9!53==if6$zJNZb{Y`fvC+HcNs(E^N%#Apso zg_53@lTM!?LCMZgnOeuN9grQ3nI}~)%nTX#m=J(AAT4kKZE2v1VH3ZGsPIh(K{~jA zE`M|TM~PR6v)&657l2zZ)EONUl%LL+V)Mn~0$rVn?3c$bGJt5dd4tb|e|QJvRvzY} z5Jj&BV!@i>LQ`W>s8g-s`YUoXXH4KF%3;00%>wTPHsn{pN2^jljOzMU>Swo&p3+RN z{B3qn97gIZU0v?sfn?oBUzsb(`fq<^cj#I1$`9qflX4x1qg2CZcv?!6T?8xDxKc2 znVcu8jhbV*&HBNOOc<`z5q=!<(ZR(X8%A$30RF7{b%SDR-oyvEY&RA9ok%OKo zH#TOm4R;8VC+#PqHWD6VxDYoRZ(s1s9z$jzDga9k&R}>zwjiAF{_$hth04SR>kCL! zZUA9g)bH5Q{$cvnk3N4#D0D|fe@0&c|76Xa=4nk4o{fDF!-pq+rF0Wk$^G#{D!6ug z>E@Xr0w1GQfn-Nf0pkbB8@E@7(*bUXGm@~>q!$=vy?dniq6&SlXr^u;@(?=C9+h!x(4hW(0e^?Qee?j2(Lq!O;z z6MmctJ}qa^6NGeu{++22eBB{F8^j+xiJ5l-s1UBmcR0pyzJxPq0Vs@6X~DF^O`9?0 z3*bZ@rp)u(as2gbq!ph&2@@}$MYeOsFxN{8Vu9#9E{|Mlinn%T-zt3*tq48;{b_&8 zWS2@pG0;L9%m)PQ1MM2WAxXpv4Q)6b2*oPq;em}-2P_MTRyAA>W6UdWn#}jRz14mh z)xxP$-_JCM%@(A=dApbJTbWsV-<=ozbga1AF7)~k>yTA2muu}qaeQix`{sClf}v9E zS5EOloKS%{3<3{m4+tTquFxvrr5JdzLu18S5kV)^Os)W~I#_B`;*tHpwU8M>M`HSm z(}_532^NO()m{Jpcb|XwhtEIw{(t@H?|<+A{NV3?@^@ZJAN|7@zx$p4<=4^9pZ}e= zLG9ckUBlw^>gA}g+z_fCh8ALO^T_Xu4RR1x|aS(<`c;DYa&qWv!E|`@>kLRY@u(L}qqv6ph3> z)~P8c)?59mZ) z!&n(QlHhx}Q01T%ge3UZFsnt4>)=cVKt<^u2*V>_Wby>b9K|o`m=52ed^957d_Rt7^B@Rf=80nz zZu>OykeQha@`CY#BYCAOGeGuaCZ<4ZR19~Me}?1$_A0U)ehXN3%tI+E4fC&1@hpn3 ze_MpIE6q_s*gvoO%!Vi|1+2b#&)4f7qH4AnuhFPNB88{_sBt1V-QVZy z?uy(JdLam}6hI8Y$dL3SFhe+WE)8-~&!W86&_oKd0?b#_%ug!Dtl!mRlX`L;Cn6SR z+eW>xss!WqD4RQ0l6$2!TpgD2buioqQf)VrPNRluC#$p0QIAA(gQ4RzC!K|oIhxU^ z`H~7mkFE#5+yn*z7?ti+`RZsu-p}8FW?HvoS-bs>|pat z28|P6jbeXu+wZ*k(T|=|DQNd|!szb;$Ul}s+zXZLMt!{}4u);sjkw!(c zx(b5qvZoZX%WBmKtqTq9G;N$FJ3ZDsPKC?+u-IPDyy?|i#wY?+6Vn^YsE!LHvO z&AM_p6y)7)qg}CU$6_?Q-Wv==afd~uLwg2}g@XuRyc_~Z6Ve{OYgnReoS?hcaOM|Q zb&x_KLppeg1kACK(Nn4sI*=skdhE8>7CqB@;&svZ-hjD_6phILK1IXIycR~N)v*XsAdN!4<3ySLWA|i;f{2ME=$Bzb zs1OWqe5JuUn13uYEG{W%$@OxUo0qEFa1vpW_g?UU3Yg4KOP4p`A-=qY3K;3Ug$gJiE_kALl_Y>k zV-HhS>QI0eCT+ao0^<-Q0YQ{!!ipU|X3!8Dd`vO0m{5+RYBLt`N{ftC4=0b~X_{3j zwY)QthwY5y78=u3Bi`u^taP10QP}D9W6cGJsh*)+&Dcy z!ln}%2n^i0?*b{Hr2|gn%Q2asbNP`c6K&unFx;VvqI44FDI_C`QZzx#QCzG=RL^^X za2VUK$ZfMJ(8R~KL{$H0py1voz+(dCKLTPR!wXNVvIVj^cLx`uVR(WC=4yW5wq8hZ z##?+qx?1?NH^rd)$5h1ksY5}db;Q*@ak6k6DErW~k)!Ads7P%KTZ&$zIvL5WeQ&uN zR&$e0DUr7;rOm2c8|nwMpD)z{$hH-{ zsUh&;?TbyAX1o9sSM4xEzJ_pYc|w~ea96h5)nuMzly}iw7JPvU2=(Rq&J=KTgQqn^ z8*hmD-@|i21sLTlwzJL607O(7a4)cAq0Z_-3gS>XT4p;y8p3yv z#ua5UPN~9PSuN%_;iJCO!rJ!K4YrkJXB$l&8@tRt6=`)D{+|*RYuh@ct#F|;>#C7u z=Gf^B%xya?>FHLZK3(*ePCYuWFEi_Ku27SM z{-a^9l72Y6J;u~%A?qjgd8{Ax6RE=NuxiXEr$lx-=!a{qsaM|ViMFy2+n6@&}_9l~yp9o`%JAzO>fwQR1~Lf*HGfw^NJAApiN zE~GQI#Gq6#ai75aLe87Xbi0w-jG3va6*K5^Ws0p+E7aWhNqIDK@nM{Ij~(wc4^5Yi zXkk|xCqt9maa>JqwxiOnoIhgzl-AUh)#+%{^k^LKXhN{e>Lw(^hG1a{S~{#)9Ley~ zVvvV{w?vtPq7pYE@D)Tph|}N`Lbbpd2O}9YY<%_h3sRtF{nh7CE6M_CIX+E%&k}gA z`ZF=ye~PqV%z`u+UMAY%hsS;;+(Ny6UoLA`$2YKVU^;OLFehLYga^1xK5>QfEii{c zt<3AnW+`U!1O=?A40)MusEc)DyC|HjT!-aVWLB`Mhqir^$e?2z}5EG2TG$M>|JArO87F zj0rr%8MN7GRZ!0`*x~<4c_>{N@kl-)1UfBB6$T|X?H{TN`FHR7|9|@7_y5aJ-+b?% zefYOOSw5Fu{@|nk;lK{b){0DM8}GhF!JsU3-u(TnRNWPR&t^KLLFmEeeg5of{|VAC6$FqhH^SYTfwx6 zKT4?FZu81x`he{zj;y?sEUys!M=R9p3IA^sO(V*FG&siDW|l##sQF=30wk~w1)DIc zA@0qYM2%>@hzjSAUcLUoZ(n1dQj9vztl_}%&JAJWL8m6r4H;#7D9kTE{VI`T5S4X? zOstr)t~cPJf`xO2;of?xeG5084Mx7^nbr zu$^boofPd<5Q#0L&^pf7{u~krnwwR4u zDPuTD7}{PsO|+68%9K)eXFQ)OCG;7?b|-$A@KY+^`wkSo-Hi3}SW zNiz5sf-NKJ4>?3*QVvKclPTt^h%>Mf#IewadWv}4G*ZZ)d#@p~{NhJX^2y6*Ie#|h zRewA`<$v}G4I7qVI24f8Ar@;h5m?{`%m5R`-@;u+_4pHpQbH+kp11zaO*R&aRBKS= z&%uJVMR%Q&eYH~pw8NBwv;sB`uw>w1&!$96)bl=8Yx)|#CzI$R*5yUD>+x_xVy@+->Y|LiE<`u z9_BGVaZx(D%jCX24a#Mfb^@E)kh zo5n4ED;2tKZ0YF0LBg^U`y+TPFm=$1kRCZyMmPpo3r5;_NeWvWW^I(5GHjK~>Ez6< zq7%*OgLb{J85g5cQ+CwUc&BU5c! zN4653#Y62$tC4C84GlIbR)`k=Y%UGQ%3^~EYorVpqfr6dqeEZ^9#(ZU736F3Igl={ zRgeZiDliZLSf>4iZIP$m?76Rg_{BBQMNFU8V)@qfIC1BQbob27{c?a`5i4kr-(oIT zdr{_&%+e9aGOYHA#t6)jdYfldT)^VO1d6YML70Iw%@_~16iWQL77XJQfeo9F_3PAbEM!=_1Q4>^W6s4rnkBtu z6Pi~GPC-#1q450+l@&ffgjy9102dh2oABOY`pcBTW6c{RUzR&M%LW^V^>JxEE)Gi0 zoOI!q7vo8{VNTX|A+%Hu4K=DZqV*;wD1%M{sejWi?$SBw)X1F>2U@XwA~xW#Az8*%-_kC=L**065qox?tLST7Qfn$;4C{=*!uGMZ?4>6=DnhJ}fX{N!@H?*{}S{$dDvxvJ8a_SKuJ z8sIgqwhnXi>DWXB2jgFm2Ud z@Mg$znt;&#!&mAPwfPy4%0XHo%H9m8H*qvpGm5SEZ?3Rwy~r@dPad>w*eG~!Yu>Zs z%6KarG_Dd?=->^&dS>cpyj}&C04X{5_)JVh_JY+fcx7M#0$D?$XHYrv;yvUx&Oxx!WPiD$|?1BJ&=UV8p-H%>Vt-uFT* z;HvACO?qvJy;QjdgFNB#0gVjxil`iV8Z1qUWTB#GDIIo!V$~vioZ_gFjvjWUV<-q8 zSP{F>v*xj=PKKM^cF~WQ6XRnelkDnxcz#^QI)_@9D%Uel%T}|oE31u=KCfE)K~+~v zd7}VHz#Hjds&e?{49+~l5YZQ(MWPbmHp@m42nHlr1&=@cd9h0&yo!4-HVskqpkhH! zM&uO_Q4M1RZ6%)H4u1an3r_qAQwX!LF4fghQib8>fL4_$;3v5fQ)e!yRzVpfxRiBo=}OV7?_aYa8zKg6Sx2o z(NYf;(;d3geWzIsOZE2A$z-HSAroY@`m|fkaE}vKX3$)X5|**-HYSHtY26w$EpLP&jn1kXZt1i`1Vy;B?Wr>df#hA$?R9rD!03(D^ig1vK1-aZ6i=d&I%7N%c z7~_e%4GzP}@&`7Up#O)@rJ)eAP+i3D`u~6S;rIWWPxIgTS0DbJ=U;s9Uw!hoU;gl; z|M7!=_M-i7YQz5>`1$S6H?My9gZBZrv!IMF^qhnv&f0&hoW7_asn#*|X3}@})K?MF znzrKc;@ik~){j|l9nXxbT2odpIxGp~ErUS@c*vSSL0K1N5KJ6MvTSC6??TAKPbxsH z2cfCQ4&D4%Qi_Ju7{w;@V#8|JE7~Yjpn6GXjM6GpPNljbIlk$HK_Ki#r5-(Iwx#TT zaPZ^>OY$?R#Nw0&(XgR0%hP#jlj&#j(S|0?Dr&HvIoj;7UW{j9dDQ8Q2Z>(Nit6EE zI?BLbtt;D{on6ejkz@0?Y%ZcZgxc0{ys0&SEu)2WR>EKrSWQNPP6lC|C6Ht>{@}m? zeE4j@%giBBiUD=Au>-Y(IAM$cfLa)lP!)s2B7rlN7fhZ^tHx0~!`H8W@a7j!q>*9( zGV}*%0^YmF5uc0U&2fvm{QRp(l^gsk$pPn)wf1&oef>h?n;X#n16kmS1;-4vDK>uR z3(eXmK0CL=XJTw22=#Fup$g4)_fxy;*353HTiE)e-eJ4*i=dMDQEi;?$Gu_O-fsq@RbSnXrX3?;l#F!C9@kg98HJ+$Bx$6Ib4v1V<1dG@B70t(m(nfm%HQ}0jR!Gmgu7w#Tc<}|MX zg(wNJmcaoHr#wV*SZqV61ytfXLnPu?qtxR~ErM}xS$FoLj)2x=FwXIy2#<6yIS6I8V;SPbSE2ruLX*uTQ zdO5sY(-ToT;F1n4lEeb;0HazkjNlT9CKWv)d$3^NFn>ZUAXZO7apK!xUju8N=%cB# z;LJh}V8$(1zPW9&Ui1e~X_B}g<(w_M?B2i4@ip56ph#YRdWpu@#v*sLqPGyNaTS8~ zsiRra&R9}x0ib2#h{cM7b5O>;$AZj2WliL!d!Z=B8uYMO=C$}hO7`WH({7AUlZxFk zO8d4GDi_?)v@w=i_3^$*+m+Ak_lrz0bBYzb62rm1d< zD*RK+{yB4zVEyXHSBMv4Hxh?9KoTiz<({G|P4=cy?q65{j~~52EtE;`7XD}5=_3M{ zbTuU7&V?Z&v_xD_Xru*FRdM2sNM35l=R#e%#LI7sFX@W&9caK1ellZ^UIp|J*ZK?6e^0n$(n zPMVbln%#PS>rY;@?&}xN-UnQmqeh18zZCL|_ajDgxI#np@Z(F!_?7AJQqR3*BpO#C zS+*IbsyfJCu9*%pkt3!j{`Ysna|8mUjrs{ra(0O_wP=0zG;No4d&L zxDCZ&_S=He5n}f^mzAU}CV4EnQ0SNlztnS#sHriiFR`E$tVN0nBp6hGIPCN8VHzNO zhR&fwZBS(Vd@SY+k9Pyy(^uZYhF8dl7bPcCoco_$CJhe+>pMo=1u1y&uw|LkwWNn+ zh4bT%Q$s=8BP=TTUFf2Q!vGR7zRn_T02`Pi_^nzhKDIf$DW$?NGMTgzRc%}gy4(6G zH;;O`2VHXTj@MeY06uKKQ0x}5xeiRk_IY9-O%SNNcLIw=%eWqx*Yrdeb zQkDAi+fx4(dt9&heSRESZTtNv2ti^pUk$0>&Og1gADhkQyE`cyld%g4z}_$spl{DZJF0cO%+cZwE-;ES%1-v)4=6axo`ZIZ~+`c4Ep!uGzmse9Y5Uy9={ z7p#+|$_tGi%!2qSUD<<7^>V znf(duM*j6Qm$aqaNrs7Z{5nV%r5dLw80rB-N8D*yJdE03nAqVW1b>zxHZPk6Tmh#^ zR$fqADrOnAMeyo}Kf31j`Eky_$<4iqPk4oH_z!939>w2?zeVUmHF5XQR|T;{B;`+r z496ZR4exe@YIkEX4cD7%=ZjM{7$Yz%I147gumKpR!~ErZp*HY~nPS{PkLU2h2}qnZ z)@E*OEnvD1eW@$gasLel{YIk{s>uVTJ3aRLwL~>K)*{(_*`7Buq0lH&UCC;9*NqG^ zhtkd+hEHobR!|!IP(6xGi<^n!mJK@@j}Kg|g|?q?!~{loIH3n2YyrTs7=~NG_Hj@c z=>DSZ5Wei_4uN1KG|Si>iB+t~oiw@h=_k$ypM3BSUVQ(*dXfBO^u2%n!9V!UzxeQP ze*FJD|8pPxqkjjw`wu?3U7TM32v?rZpJs-SMR$p^pV?@{**UABb2r^*FM3bR{V)CJ z<%!F5zc!rB1tJgeZs^^F7(ojQ`QN%pP|x2a-O9OiKbJk~+XD0YD~E5XaJfK}ha(md z40C=#6B1Vf%^p`oEZXP=czH1s5wMJ|G!tpLGd-2d#ppQF-m1CdWVbWr`mSd;bE9c3 z(y0|Uok(U9CzOTD`dnIU8#`wjx1;q)q_0GSF>LJ0wCYuoQ~})>^3!l1Y8?)+WLDfi zh){r^V#Y5-c#x~bt1oy>m|p?WVR8zPMWnmu-2^Zn+10}m9f?7y1fXR95oOPR!Y1T5 zzj*oXk)NCX6jtVfB>luQ28VFgYzni@%L8}HF@d;Y5eq4gUEtfE4=-4Fs=eFvKe%sD zd|i9{;0mFCW5W<^a8@8&Y{g;He=(2g36B;448Tkz)p(rpB7)*~r&_prz>9RlYQ|-( zCl8fKEUJtM*`ZkxqERHbLY&s@yWvo6FlcDqUem9j#BJ_t%O;!G*QLF^Jd_K&RVhBG zZ?sIwGErYZO+#)>s1lY_d@AZ5JdwoyU=;!x6e#v6#B_=@T0JUcA7f@!%5Js8ZnBvu(}5hSbkq}k zh-n%&q+L=UoD%pZS0VYC;l*98GMa<#+H)0Ng~#237*{BUm-4T!hy-NGswdj+i|IAYLr#6?$I? zEA|UoXND=9Ztyp*bo=5SzkI04zopyfItve^?SdTg@a(02|5j5v>kd~DJHD^#oOqwd(BSL5Ij79TFTmal8$cz?o&LdIigm;=C4<65IZ^)jiJi z1$+vpVI`dn+|fy9ou2d~;Y{{qEf>(s! z2}vL%cw!vmT$TqR0h<69a+4bp3}k-?7UJHK{feUt&%492#`aAOQpn5rl;~SbsaBkRF`Xek=@*m5Y8%x5`QqiE>4MD>0o}+e;htR%xVc) zKN6CLQH%stfr&A|rHHUmD3OSLMkoM^FQDI$fcHM?qT?-!3=fzAS-7zManu{4*jSWG zr$QWvFO@{}Ch7T)(HAg7n*Merb$s#iEf?*c_^9HglzYV#D?#(mQvPReDCW|?> z4!y$qNh4fyDvAOaRTW zKCn~>RV&_&11{iS+*`|UE##!=$$XN}9v@W}eBOgNDnHkDw&S6_lqBO7iBu(uGKWf! z#1xob(E%5kzNpAAAaVuvVT8sbVhBz=dAR69WBK4#JQ^r&v*pO-b^x`Q!^_In8hcnrE||D05Jzm~+^1&=ZaN!s0PcZhq<&N|n-4@d%6;PdfN;;#83ZoP+{OVb>m@ z2rhoF=RX+6mF+;kC_w)s`hD`~_dnovJVXcFTTf9~=wdjmD6tsR=#}kuQ_&B(rvJO~ z-kXs#1+Nj(t^bPH!>nftF0qF9zZubuoFJ%GEp9=<7I;MkD;W}+E*iD3;B6h_5mHv$FTwNB~g-zwjzP~+(*EQ_K z)P56ANO&qy2MmTqO8=E$C?X>>SSid(a6_PRF06BiE?b#e3NFa&{-aEJYiD<+Bpyta zOGk&(hx;qV<^8<8ynifDC%NTNZc8dA7owaLi?1&&h1F7gYIQ$QT0S`5U8cTVcFg5+wik`qczmb;fWS#HuklIA2M5MN(tW5L6&aWs<$!~`8vEu<-34??d z7~kNngsMS`kjlZ^;7igY3SAB0jz)4dm^=z3Lj{5sg}Bhjg1oi5#?2q5Qt=>yE&~2g zk*}6#`Mt$WdHZMyL-5^yDqSk^`**8Hi!h& z@PW5HT?}tjU`2x;5y8+Xya1OeeC7y42ksDk1APeH`zRL^NjZo)18+ndav&XI9SWWw z;eOEY(DfIAvuKe>9g_oTX!)-^9iT+Lw%$fS^Fk(7L|$pNTHMGeuwtFHb(U+$bD>^| zt&c8m%u;ZAu~tvjR6Uov8IayAb_xXBDx>IU3Z*`Y_bKvARVbXW8zX;+>;Wi%f*3>; zm>{PIlt5}#37wJiFNv9{sg3N+-u(K$R9~7Cc2lABT4rl)k*&>F%b~5==~-!YVSQ_L zbH&f??5kXT$(vl}5|ylYkl|u6wKkQL*JByf#E_Q4^J~d?;RxZw)IE}-rRfEVgaCL> zp^?J5$fJNB^eqV&2-rfc6Qpx$2!_Vo(=)KnjNGEr z@s-U}7d@$p?M5yax>&V(0W?c6Zc?Uh4uwNuuh%~?0$OamrktTDfjsSOT4*T*qJ>(5 zZ1E%-Vv+I;QzA(e3a`Mf5Q3qQVuDB(bRUDs{%~e%HnuUl5M7M;juyAK)wLo&cfcoS zqVmiMO7|Wj<#};`N|EL&X+ASM$ER|Y*tR6ZLMKxJ?y$JOxpBO|r|d7qPv%pR!+Nba z=`SEREspL>c!#3KDOCOdS?u9IK#)oTuY9z+#k&@bERa!*5Es~=LF%Yx2r@=#43y0R zKmx`iQ5^^(Cr3*4^gvO1&Mm;Kr7!>)1K`_7)jEp;+Ip+%zt+)8J-JeKPpy#4c-u%4fb?i{aWw}O< z%AvsKL40{io(z`f4-TZsQbn1~$7Ye1gy2AwPXvz#6=O;;j4SC=<|5+w?OsE!Sh?_- z_g9p(kG8hO(_Nw1BI| zPkTBDFI2Gok??wQgcoF2FY!~GTTcN$Kf3mG?Ge%g%>bTI*i+yMMP(J_X2OX;UT*U5 z!`dPsSOR~K+&2VsL%o5C6_KSGka6m??}EKz`y$enrIo@#dSP8W3D3r6lydqc zrBvc;vH9tf&}^xygcde4@HPsQdEeAdCMGQIaM{HIn?Ed-qw8VV3`73#9zu84*yHKL zLb{M&kpgK9kLLo^2QOZqcyJ=(3t3f2Sb?t$tT+x!djf@U6A7fe1rY{E&K*ixhyIH< z2!+g3J3XYf!-9qW+`fFzmBeYk=7O{Y!;%i+4keIWg&K?P54g!t%o8f3##2?zR%;aF zkG@Tful0wVZSqjFSQd<0_UVLF?i-QY=un6-L5iJ#nG>oRX~YPWMglLa(ugOcs;v}k zfmA;(QWQ2e1+g&AA8oItl8MTclw1wQcaxLoyck|rCSyu^%d3VWTye4x-r3qKrE8JY zWMnmZnB4Gl#bRZ@B5Vb>=69C4a5+-h_RTLurl7STq6#`LaxC!rN11Dw0m)iRJ>0)W&$CBdZBS@V~YR~#A#u%$XQ3@F_`DFJ;_G=|KIoZERFp<^Y??F z9#H!ShN~lgIx6)3($Leoe0%@z|M``dpAKKR^IuJrMsgqCSGJlzJlKfdLL+I^Nk$b1*lpkvLM%0?35qFFaFK*dC0IKshrc7~p*c(}hq%Wa{dvo0Nc*nQv;> zcHuMcheyS#``5}@dbeu7(-r@DL~m%SzhTeU6#iz=I%Njfq7^T0)ZOP1502-cicU}P z7o+Df)e%Jc8D3b3TSsFTxGOpMEl}SHW`f17`O@L>-sEv)j`M~>`IF^oemY$B?r!gI z@2;noHheP~c1;c~refmk{OZEaNic(GU%9lg!m;`7^gOqf-OudHsQ}WjQ}gli_V(lv ziuEEL2z9+6)WPZCHi1+}H!rYe^gTss4vNPjHQEnk!s0_Yzi8A+K@F(UiH9o!jSxDi zXm0Fa0ZyvZr(U=nG~13;R}{64WWC8u8#`RDBHp50L&u~uUtNa{@(nj2Fl-;U2SF*K zVmzuyAVCsFapWo{(W{OK7v2$st;-@_H>mjw2Nli%k1XkEHB^pgOBrdYmR+y-4wsNe z9?n!w4i=8Pf(fWdBWh>i zZ42iwqGwSb3ATOYkOYrGw=X{(r8o?WF+j^AnnZM2uBbL5jLtm8V$~Bo(h5|K9Rj}b znMZd^t!#QWiZ~e~o(TPp3~6rPcOFI!MEfD=UV;Bw#XAP&d{M`OQUQQS7Ud8VNJvDq z91004_K%u877We%<`b*I$#M)uE5R<4656q< zAXxer+O?tLBK6xr_iGq5pshhaB~=MNR)h|qBmfG6Ly>}Q9tKP-4cfETVv#%Of&Xdu z^v6j}u*79)`oF24@ELZnUM-_S2qNGbA2h;wJ9ZO3mJmFi_9HXNYTS0CT!b&7LraVG8fB})lc0U1Kcm7^)MY_YOVzVsy-iy; zXH-wK&!`X)ZIMLGIZT=;piIa{Y#AKW#1~M&0*-9d3qcw01e&}fI1Roxl(pp7kJF1j z|NLHjdn&k-oApoElm7Yn;?i0*cNB?c)T8-qSUQ|7rsrdYN-}n|5uE4!vqu5B6p9=L zr;-Jci=KGpQfc96Wg&c0+elWRx&l4;n2&p15 zRRly4eZ=)rZ4ubPsWBab5Cs$;Mp+&%SOe4DJpHi?x7x;Jxe*7QtH?ErGS) z9RkCi55|$5*xX8N=L8*W7P9H`<_;UfCHBqEr?%$m%jx8#?>JXqDi)8H4t!JIRXGwb zM;3*R#bWuO=nKQptsZ16>4nO)w-!%UOEKPCn}Wj#jku5;h;(@bSj3U#hQgyF*ahm= zBWM#fjL>5N6)Pwi7R9K6^(3?j*o;wUUByEdW$aO-M?y3fLJ$w>b$SyiWR`Z##Bzt= zT}IKdavT~gMYNfEVy{=JTQGIKF}`WG+-C=G%z5R`I; zKM_=fS9l;mRk2VE5EYvc-kV6GZwTu0#8sqmvWcl=x*9C*=TpJh=E+J$#JYS>)V8KST^XDy*X19R38Q7Cq<*?P$t_v|NN|qHP{-5xfmB;*#P^jTs;+5P67# zJ)8m|i2N%kzyg1S*#Fa^3%9jZVbSmm<%>MI6#8urDFpY`o)oPQu0zM#%c2=6M9+WQ zuua4l!)y=3bOND;2zVobhl{6`9mA4=Yw8h!V0#3{p^LHtwwJAh>z$|HQ9@PJY;3#zb)%8*`A zKi+S!03mh=axuYE&an_E_JEd02R_Jn1_C`JKRu8c2#jou+&-!dop*oT{ULYV9UcCM z;RlB+!@}ru&i&Q7_Yb?ymCwEG+}OyM&VTCso6o=E{0qkZW$d$K_m0KKeC-kS^#-%|>Z2+7&!TC)9Jl}gBFzZd27jGsZ)(F77ntBJWZ0iz{;V9BF<&gMe}rK>1K{kf z*M0o{KiW6eWTj#M1h&LmC=zSxz0MTE1mAXd|LFCd0a#(eXQoH4|G#zKgft;a6N339 z!5#kS<;@waJWB)MEyUt3F)wWbykt1Uyuv`i-KJ9&uz&DK!NT$Yfop8bBXK4^Oxc{z zd;j;J)%^1HrlAqm4i+@wvmooP`~Q6t0OD=We4e|Xg${(o$CM{i@gy=8Ii6F|^s&Le zX#h4jA(}3ZFcfnABH%*=-@73%vJ;-k#dS|r&7-Kg3~RsYNh4m{7zNhv37(q}Oh+JL zll)Kc*3gyMwtKdgh$~q%JdT+g&V(mziN=$H4|Gy{mTiT zIN`J0HbAsErxOSP5K32b(5h}RAg)?g<(uGqR&mS&;%Qw$a3jCRKpyLK-E&=9Kp--t z`GnBCLYiJ80{#t80A2w6%box{c6<#tqM=Bc_#~2#!SleoO&8I_voE^(a|3Q>NW03{ z-7z9#!O|u~(;egh-tQb-m_XMBtxBD)$N~JF$Iih)dnO)7G|@>eXp{=Mz@DAY!+Y=l zpSJbt1mD5)rue_h&i-_@JR#*!*4h|GB4mhS%qf0vjNVnpIU{^c~C);6u0F zb@d}cbD*29cQiO#NSmNVLIF9~k_IuDE~Q2cG_&a}Jw!eoE`A3HT;ppUE`A3H?yjpJ zBBe~Dw;!@A=r#hFzUhh){N?W8O}vT-_Nk63P9(l^mViJGKOkvgOFz;Ck%L84a(L~$ z%QyzpokU?SFcE2jwa_TT^aPt*9K7DaV*uPqtkFb*0%kP0$aUezuYMtCEbV`s75pei ziOU9dVcNY1H1&mS3*syjz7E7#3&JvoZ-STFlxoZ|+Jdmm(E;Mo*R&wab3mIU6~v-} zj$i%UK}QIU?5ye@AWAI=^Qv@0wSfqHgc`S~xOf6w{S`Inu4%GjTcT^oDD*vgn^^n0V98og)qCr5pw%(*Y0d(XKN>;zA7 z{mPjij|)G{vGxOMW0>XP97K3`f?94%)p;EA%=(bVs$O^_Lka8zXS!w{Y>@f08ySit<=I4}G}Jq6hw2YAe{THZ zgAS1hLggUV&GLl9P%VP%W+=Se&3B51Y7tx)LqS2YSl77zKWVMX^()RdNV<-BRXm0= zR`tY&;s)O9`tc^(oeu@g5!b+Sv;*&D$dICQMaLVo8w#spUS|yD^hV*44+d-2E`9)F7k^Xw;=`WXm3AV_$NF(bnG&J;c!)CT7uv-9~7bF*5*(aes$@=e&G((Y5 z3a*7U2r?fYpMLsv^ud3Gjk()Z1)vF7Exnxk!`E9?$l0nmwy~U?0de6PZ-&qte@BLIsM?j!O)@e(6B>p1-mIv26vOj z!0}MGVb|@^DD?VQ5QmP}`43+t9@))J!6@hG`zDdVCFA6KzDXpq!|$7i_>&I5Zyw^F zv+ud)eqZJA`{sUM>Fj%h3BYFW1V087AP>P0y%cbXHut;h?0a7mpF0k}Z;lUh;tyXB zo<~i5ZaMtEIX<}&e&~K-RcVe-{#7U6H_vOs+4ly0l84yA_u zhtk8ovG)xuoXhk-)%~8nNBiz``qLAnALdt$AMO3$<-g8@411!E%>`&{jhaAYkK)YM zH6i-QFOse3Nf?U9Q0I)HzU+WSH&@kW0;ZuxjG>&^Ls~sH|sc7aQu;X zLm$+ib*}Z+v#trzX6)ypkG#8egdgn!@d&Ol834{7%iEl0fPJ#l3^49kOq~4S%NZyPjmP|lX11ml&#VddRV>T= zeiH!k{3bqJ*W+^0M;~UhH1f`)V6C8|f$BAtPJ8cU#Y*^u@x9##$*107e8#`&sfh8Z(#T-Tz%P=ICaVc1**WX0c=oLlT3in2u)yc_x~- zO%Mjzo6iP^(Ng&x-c>pb7<8<66+0)L!WLCH2|NYN6obq7n{e3aH^@05Kq$f{VnHG} z0p24GlsMr8Tm?Ac3=k{cajsB>&Bj2%`^dwv1$5dV&~6DX;)mXKohiVa+5`oSIlH$*E_c-O)WIV7CiFEEE*HfEoV!9!9JeJMm#*IJn0IWzIZXisZ zpdGVGN;vmW%O>5;p<7bpam!2$m(W4a?XCxcUTE^L039F3 zRc$C4|HC=;BizIyXSlIHWWL!P>WmBk!VL|p8)_1v1eo~>cYgoI2vdOGXI5Zw!5*O} zlf6)c#tB53Cl>%Q)P(4H#pYz5JEO1wg7gOy8$|eo>ym*GCtegy4?!pfuB7R>J!Clh z^CxF03hFRiYG;nAv&UOo6Yp%-q(Sl1LEYn1W9&WVn%ghDlRm^$e z{Q0r3j=gX67e;Ox?jO3-{Z;qVEvQzc9kz#e`+FzNmU?=7Sl>P06a&aTJeJ5fXrKQQ4Esl+`0Sm-EDPMI}p7r1W7)rVlHpy{ACUMNFxx3wGQN<#%Yu-1$j1@cyxnA)UlSvOo+FV<_?eq@q+uNGo?$Wm}``YJxt!2FI^f`ls z$QQXg;_!yiftP;wfpEW0bRfl;yI{q&$uU2q(dsJUX(MWKP3_DQBaROr6NWnbQY7IweaHQ z=~%wXaq-FCoIWf?Xi<4<8bw{v~x>uM|DVu|fw3G-l5h3+O6{)&ic8imdDm z6%`-%tWp2=GF1;VFA@%6pKsi=UI!iK=`>5|^p56Nxw2 z@+}a0G6kRm+58nXG43Ij=AEp8(2BV#D9V$s0S{^UQ1zsW1yE$sgSy^D4JDOg9+5LD z2sBX{_bj0oopwI74a{Fw(Fg-=FA!*bhJ=B0>;RN_31ryVH%`2w9U^`i38N^g58ote zNb+o(M!zP;G@$0o`av4><~fopjp>2uY8lOlRnLoG{1Qx&tfC@3-R4S7ed+w^vo+FQ z?MT|pUxEN{`rE}jzPC~?B2+x@!MthD=E{;Mmx(LodI`wDpUQH%-k)LS=%UPa9_@GC zkALc)r%u06>Tpp!ch)L#_W28^&(PMj-gzXju1|gMY5(@sQUTX$?Z^t5Ph-4qCoca9)4KSVJcnhCLR%wh)KsqQffD3OwxSLHTq)YZYQQwUP&)5_cKbNJ%NM zzA?2F-toj$^fSdRB}m-90+5V5QbdiR5*p1Eur$os;4#@u^)}Da)Kp~Mv$5=%obs$q ztuHTZPDO6J&9jU;Xgb}GhfXhQ^!4J-^z{K8ROG|Yz4gmy=|MkvT{?wMFZ{4E9-%Q# zKY93`PGhW`-hwe)1F!5zms9S?|Ifp}xa569RnLFv=~J~KJ4>rQ z3|St1%|xd=_>$9`w2k>YBj;D#kAL!WZ@YKtDR$SmzIgg$+5oZ61N;{Z@Y!T=<_(J~ zL{*(gBU#HKfgkrEbAtH8=0!$+X6bb2^t>h;@9sBUrRTUG|M)Ll`qD>V7NTq9siaAd z0D>wtaBYnrXuOK3dxD4(OfW&ePi7zopnla@U0!t_~phg#(#S76#gO7g5)-2 zeBjEvzV?RYf`{cHf4~4jwbVEkrXJKZkzP^2+_Y1toqJN{Oae*{@yjOvXq*aE&X zf60>>S3RsGHNQvF8PUDI0RyIS+M23{MKqNs(8Ad(52CD)yv2XpR)1Er9>3x`#bcT7 zWvq=9fA!!S@%Jp_Fv<|U5O5Rpj$yeobO}o?&tu}I)=HYT&WuQ#4aYQ{f4ud;DUg!b z`Ew|7#N2=nO=Hlh6LTsuriEp(dDb8YB5gC<(%6tr05}YdK^d2lE&!A|+#up(p&aU5 zL%qv4gvmI6I*fOVYarTqx3KQVAIZP#lYjaY&ga4Vu}1PAN+)Ey#!u z+IUpKu>SZXugC`e;#0bUs{Ip-W)r#wVfgs05WTm#?h&s$oF#Hr0K}^d zzm#=2ZIc!oK0#dKuRn*`<^u@k-(Wz!-X_f!HG+7wJJbW>zV1*Dh(vd&2L#s<^*TXV zcHXzb{JytoOk_T2B-os#A@lii0J#cl;&qT^@hl4Cpt=_tll-0CB)r+8%@GKB>vXf| z-x;YwXVzs0Lf+N}h=W;px(=|%>06n$g)mc7{9BoA!w7qwE zCjV>#WNV;J`p#I@=4a?%b#B@D$3@u^bD5P#|@u{R6^G`Ybo}=gd112HIHILv0JAx-J&yEkKg%Es%B+ zvjySTS|AQ)(b(&3lVDzF2f?3|-78}8e3NjWh zMv}tNTWq!h2=lRUBS%b<{9gLS|M&K-Aa~z#Dgfc1+X87nm39zX*Rz`_R_!LSglcFs z*<#@~0v~aFW}4*30?d6kH7BuQ6>w@=1O+V%MjD+}+-|oKi{q3(k02E=@CJn4MywEY zif$dkmbsj%|Dv-ajk$beuqzNB?F98B^mW;=u(nx94fzOOT+Sha1OZ9p9Kuf!z1=`) zcd@4%2$ANXundiWo$Oq~i9C2+c84IccBc9u*j?k6e5>u;DX76Lgo%J3OdB9JItbil zmfL&2he^r?hz*Z`a!?#_ls zAg0l>6*@=0eYD-`JZ*elYTpq4Ry8?t9BXcKD6%>A`;=jhy?} z-dlQ32ZH_I?f<3z=l1>6;A4ZY8%d9T`uuO5-|znCoR9gG_Jf^0S^xA%XJS1}0qUBo znT+J70#kIVeyV2%wmG1ra)zB_J^@6{5=DR}Am zZYN2(t&uD_6f}~tC`UQ=+E9o-K|Gh4k?_$^e3Kr_+M-seOWzi9~;;kI-5aCE|fwkQDC%&FFxa3YN*sDQ`RI$j66CMzF zb2a#?69~-l&AU26U{%)AbEp6XkQa3Y!VNrpV>g7d8!S5ndJzlX2o-$0Qv%X9Vj&

zq8^+t$h8S!hhIY@eGRG%~^8gYp62uq%#MfWj z+=z3w2*N@vtyu@afqb2)LC1+>X#}YTJ={DLH~f{BX2Lw79daYjIKxaF4}}f3kvlj2 ziEkjly=$&d)hf(NFz+|5%1NP}<|PD+Gd~T0_HUqOMz<^u8*H=P@K7=h)vL!zk&ou8 z+Deab7|PIcOsW^|8j`vjGRK~0n4cwrgqu#Lo-PRs^p0#N%L5NI+8WC7y#E<3FE6nn=<;OnOAy*Rzf=6E$2O@%Le1qPv zx(Mll^&&{zQlS}G{6_0t+s=AzAV&YGMOn@{79|O_C z`UENfn^`Z1p^O{y#LkvTvGsJd?gOOQR(_e@$Ny$`f-|4^=C1zt4%2NLDhoM~%{-j- zVUAY(zvG9Tc5N+V1;GIho6B|1m@rg(Jr4|3XbxqmK12aI9Ui?p`It2jZWKGbi}`g% zd(l68>^oy08++5(OGp2o(GQNkYV@h+9zFNkbMxmej(ln4?vd4zf#Hu0mxf<5d~WDZ zhu$(28M?{+IrlrXx`BT)_^!c~!DkKp_ko`ocya$f_Wx>stv}rVV|}0Pdv%|$_pf_D z(wpv;di#3*pyxmJ+~xWQ)CGLG>nY4PFmV_EjDPa8ty^v)5j0^0eOikfqW0t`KWi{* z=BsCwA_KzAT>0oHKl_R%YMHM((#Wnel%Y#Fyd3&aR8q_I!s4*121&!^>r4UYFcfVN z9;b#Na`sqj4rP@d7z(vM8bf{AIj)GaTZ9CLA{(489-q)qJkER*Lurce*|c^J{miKJ zeR~cJAX=umcDf>?h1t+Xa~SR+Gt<@QXoH{=Bn?^Hpu^kW9LkdZMnv868nqKORcW^@ z7n75i*JWK7L~TD5Y?6(Ga;6~b`+($XCu%&S8mn@qKQ@Q5IJth}WH2 zttIR(Vkn(_Y={BLQ?;6c2B6GSZm zvt@#anq+qOw-zaFX1+^9QAop+Fcjfxx;Yf%%w7Vz(jOCM{f3Tq3Pafwg9g!NVfo}| zBgW*8i5f$Z{4z0p+6Q7u8YpQikzp(4^?ks{VYzD92VQ+02o96Cmp;Yhq2}by<)H0Q zn4BJW9g&F1E&K`)FYO9~$j30GxExD0EVn)I1CzH5DId1z3_66FcIlwVps2Ig4?E>P zorWSqqt3{jyutGFwMqQdqP7I%Ru~QM7#v;5h z6xSTep)*AzACx<>)RLg1MZ{-gA7`oqX=)TEhnCUKWDxP$nHbQ?!E(>BTts}{05RAO z1#d=UsP8$ygQ!bkc^}hx7!Dif$~I8aHWYCN!!zRWov)uqTiG%i>V?e>c17)NL(v9b z@Z=1|Pk-{Wc#(8tPSp1Y%WJz9bte|piTO~=f_8c{qJi3!aK!b%HfVlj(A{hW16lPh zKoCoAlfid1QPqtYv>%GX<8;o~1%+ZLtDheSc>9wx6i@H}5ro+fsw3}a9vZv9XRPmc z-H#66IeP1WyEoazSFA`+zTBq%e4}6tG7<#!ZaV+M@kKUG?y=K9F=M^cNB_M zD#uH{H8s7e&TJ*CD^ro3WKhU1%g4#!QC*o{j-Ny}mlx5bH?9c0U**v#I*>%y-Jt6C zqPZy=!Y0sDQ{WOVU3r0XdNr0@SlxQe|p4&H3VNVy1pvs&TpGWYWJs zgFLt6NFbA6SYOK&Bl*JAaVkBX4=dSdIdT+|i%W8OZ(a=KqxE`5D9x>j$DA6Pn+eDL zi+d+)E79U%FjqSci0DcybDWBXv2rlLp`kQ7paYR;yU8X3TvALX(1}~|#W_BKlTF|# zfqPl;qH!7PO^ETNB61RkhO7hVQST43uj@fS>1SWK<>KuXGsRx)LC4tXaz;Tj>~c!3 zts^}PN&UzuPOKHvWx}cUTfLQZvlH)nMn#?e9!`MJ;rFYj^FzWF6(aq=j*t(7yPjm_S2w zEJXIo0vbXKY*6&ZB?)&MP3)6CKg*)eub&lp+!_{0Mssv(cn|gv_o3&xC?@5k6cG6U zu0A?P3$MSjbNZ|c&%F8eqM1T(0foBe)pWTcS5GXRcGs(Njq=nkd72+|xcpj|T_Ip_ z)gW(2pi&|j*sxmT+F*vS9XiR zjeI;aDKCjh@9}hQDL6Y>otp~I$y_L&6+`Q*V!1M1$R1QrxL7C=scl3;vxjl1ypQZz z*{jUV?{AALnOqM9Zfj=;?W)l<9&OCo0PZt5rs9qJ6RJ1p2S??7Y5-mCl>i^`OL0H- zEe2~9IchmCv0hbyNRS{NcwQU;d5QvaH(GJ;o!(3hqiYuAqG7aq8Lgt#JZe`cX&df} zRNYISGoM`Eo$F*k)uid|W??NA`C13*6qce@6B#v$4qf@=AI><1vBaao1g?X}&5S&@sZY%Of&B8RhQ6=cz$j|!t&G6cOadk>sSmoa&|C;NTJHb{^;BNv|CD$Hf2_3_uPH2rM69{mdJ# zR8F69@s3+>KYgm1hBXm3l}Gk&y!@GuqXbhspGCWKt?l{QuP!gdfbPj+t)8kOe|Ku# zGh5hz!a#bPnmI9vHkNIw4IT8cge-~)nbe%5Pf-+}3xdn}1Q}RY;-a4mqUAf9W#hsI zIgk>rWl|Pu%h9s3<*((Amro$Y_r;y$@j;*%nDZwVj^jt!quJG3Y_k%d!l6JIc~dLC zh;I=^r31MNo8HV-*LM!e%2X{m$sPNT=cI$|l#opFstq+Mr-bXtj3`?@S;x&FsD6Nj!&O<@!7ZCetMf3 z?Y9u?m{HMazFbSC)=?mfq?uYcL)<`nxe%4hR68gXy@XWy#@CnEqlEjL;_xymw|v*;9{ZGR4wb zc8m8Zk*MN3jIUIpvFXhG=FCAAJ?l%-iJ+|KmP;qACkKJGK#+$}gH-lnc4)fzBekFR zqdU5)fW?Uce}GkzkR?eq;SEB7La_*drC`Ng#UE$YfFhxZdSCz@?IrHjg!^Y+xC6Mq zXvRH}{A3v=K9qF2m;}x{U_W)qbM`YG?Q^o4N@c)dKJ)QH0?3~#sO1!jY@tO=A(J)H zz36YzJ!dB|p+~VY7Z($%k2b0Xf{Nr9IR%(c$U-tGsY)P@?)03hNWnMQmXOKyuX%E)7o0=va`EgSXf^a zpnR&pE3ljhfN4W7i9?)wRbHVd2NWe9%2N=ep|D*c4UNiDHBkvmN zAO5ey#i2hL3cLTs{TuFh-#6jof5D*SzGdjm!_OI6IXB;TZ{O^>&yBsW_Y1vJ&$oKs z(^KfVt7o|N!~9y~=Z0(rh$Cp2#vO)ruwI`;;ezOvX|^@7zCK^i-!}~?rpT^N-3L34 z6~s{Qe{zNjV5pXB-bt`Y$5n|KYOKpujX(Ur5kPbU-2JUUSWFT?SUWYIHTw%VK%}k* z0Y8*Eo`xV=zImHDknd`Cd~(r;A27U?%o`opbsNhitC?kT4Arvhb}j%c%a6WIMQ*}&~j5ZMH6+1K1T_Qoa$b}jZ>9MpST z0S?ZJFyonuq*$A%=!f5H1UU9Qp`oynRb~6;( zm|4T-Fq9Dq-_1}|iM;K8+|!DEcDg|X;84#;v%i`1K70=q41TKCV`X9^o^RIKh2ahW zHr~I7?`g$jO>Bf$8hrtA1??gD@rUm*;;~#4XIoBmfWQIX(+Z+;;t)MEx!IOaLm8nf zjNNaW#rNknzGLEL6U;96Wkw5n?NLs8eNHoqr^D&NRZ z@Qzy=Cty`qN18*q-sF^B0qt0onKAHKRlYftV`>M^(Tc!Y3InUUwfmuf^S1m7LVLD3 zl*9G`WX#l*IP-O;4HCQRk{B?QwLd&MR6cw!v8AquqB0O|O2$oK6}S#$C7Xj%_Iu6zs=QL zmGce4({0DE-un9HP_9=v;ZsyZ8)P2o^?Pe%s=UGBpZg^D)1+%CUeBU+KKVwxEZN7;SN+hy|(>(Aw3OCj7 zSxYy+4g{un`;BZIIknc%!`}3b;Sl1^628S_DC1-q2ho`N21z=#oow`h&rvM6c4eKP ztTvRTZWWG$AzO)l`yH{@mZ-U*4=~R#hO#tL9E$Y*p!vI=7dgEln1fycrqCw= zn^&Klp*RecXb$BZkDA58B2sy5@R`k_oS!a+0t+ykuXwB~-W;l%Rkgnd`GL(A&0TM( zfsZjCg^CoW-tdDV^zdFRCTcl#=BV}O5WKqj%UdH%yk1bShY!#PfW}M8^4BV2XzTpB+gpuc zXAKh%txBN2cx|}i{SQ1g(hXT-UpPI1$a>_jnQqDY4D{3kk3y%WJv(YZr&Be&39tf~ zSh9rs@jBy(p5g4Yc@$;AXlJ^ml!$@u~h9ZZkAV3!4Ex4SSL6J5G^+ zyFh}@BrdqIQ3i&K*4*O{e4cWd4tfi;qzlyhcDzY$$I0fybU_?Bk;*PR!d*PA%$MS%!`ej#7`T zQfvHy-#^!3ZUL$o9->xfV)TLE?=v?39EU^$F$Wu*RWZN;lG<)hB$Om>wHOeQEOZ4y zL_)6&=X2mVK2ON)2+^i1(W(r~M;qy4A8in{Dze8opMx9iUt}(!2f$!q@UFq(fv*lk z25##Av;JELeno%jk9~aXKaXvXJr@-Leg_tTSB+kR72v*eiAGI;0BQpK;qd#0w}#L4 zzpp@4FnGeN{qBYafdlLtV$a9UVHQ5 zSw^OJ0tX`il;$?EGJ@U`^SjrX2WEOpRtWa;=FzSoc+5eCOEhNVBt1!AE=-+}?Pf;J z_kM@Dxj8x0Y`WYRaDA}(mu;s-{_FOud+p88G&*1x{2lk*{Ggy+L!;;d0w?%plF{}j zXg3EJz4qqT`{!32@g^KA1v6Na#koEd{>9`v%75T=DDwMSjYS+Nk@5!Z_W^1rXO&r+ zV)Bd4$xYAHzHc!PbsWm>pm;!B=?I}sZqaNBqUC=5pwpeB76y=LR*kr!A7}dA1BZ;< z=|++F-dc!}2LRloEnVX56{G^UR?-^3_7-wI+vAsxqs>u<8Q>eSo#ER3FT!t}J>6NP zxzO-}_QsjGcK-xG9or1d(AWf&w+@>?nOevYGm+pzy#;9M0s^{lQSp!N-Z-;Qj@uU+kQu80XIt;oHB9JUtw}-%L zuX;PI)*b>lyxQqx2?8M&KC@+;R@Lcb?ICDYw_Rsd2r0CR>*%#sz=X>|oC=B3fbJHx z`V;)u?uUGG&MT;d0c0uJL%=H#Akh`CI0GHMcHc{}YyIsp?2JPPhyvj^GfQPi%==)N zX$59`(v_TE+E@w6a%7P@DfyL~|N3Xq=>JsTE=*+%?q2Ofz60O$pYxfx8Zau%} z>;(OIR+7!vJQQy1J!JFMIqUD8eTcFhAfngqq1TnZ4`=36Z74j6EPgOx_a4aP?heXN zvK<%0tm6{*ra&Ki2|=o!)zwZi<>2}d7U@geyVMl~tqR7Sj;o?5BlCICstR2}(5muX zLC~s5W$uJ4=p7cn9j$7=D+pRurYi_CaF8_BubN{;9zvx}U7(?GYi)HsNFmbv&0L9A zo4C$u5iDgXEJYYmx`LoNjQC26{Pk-u2rHu&Mtk4I3^9)~%%i;@>Ur7N)zQGV*#0uTE0f>qsx&gq$VL{qgF~HF~;*;Pq>KGCQ}x9D;EK`TlM_86?rd@J^ZEh>8CS-pAdE^3e z+xegZ2qfzB0@6n)k1-fTURltGq!J~_CjER8Ew$?#{^MYJ?&u(aBwkM0+4C*?mkL|H z)ew8g?e1eT^X7f_Cn)ZiEHDy0k&7@Y3cH`ODOvumg@1BUl<|JPa9u=2j zwNx#%mf0%r#HIW}{$RnsI~Ry1x0n3>^5LpFU6ST_IbUC8OKD{N#8C|Z?Iq%pADHEl zQ;2*lk#bOwhs`NGY5^dZm{kO1X~%gavm>>VMfx^cSRzjgIcfg592bNEBsn4%j=862 z;FZi%Zb3@+YNHs#mD$r5Qi^u-{~KxUxMoAHNx61}M8CphIg>hz>&Zz^^H-kBp6$wB zHG_VoND%T0myw;8Noo14C>jv7OE5!vs^a%?pa&!a3o^^f{$wzqQcAWIR8=`14+do9 z%(03R58?|cktk2)N_+E%wYl}_sXd9CkCyiqkQK?|*r#n9BjLOPW|uH|+uTbV8T zcGP7tKRsEOxN>FVaCtVw9&?+UVmuuWd#CFQTv{n9GfS(AfZQcT4SIQ;C)EQ0auo@5 z$tRPn%qt2fCgMpXUMWbv6#N2`&?MfE13+3llH>%DQss~?JP<@Vjv(_Eq-4vd?1ksw z+@3E?d6np-t(LQLsiY#M(vtPQhA#3N0h_D=$CgE`Tu?%_T)hI1DYRXqsL?2lV#Tcc3|| z|LT&b^_k9@)o`O{^__57Y59AcQCWoZ+Yz#WL~hOx40AxKgbe6l5UHqA5;#^lWc9~` z$YG2lOIiq`f`gKbONq7W(LrHHU7M9-vLr6Wqv74vkU#9>me@UIKa$Os7MG^E!sh%@ zaiee?D9;5qq;-}R3dM9}>tJ>(RGz8S*pwvgq=QjZY>C%WYw06Fka4_<41~!<$Re_T z6{Ji0We!>4DBz$dK7|ANP-VcIM8-I{1S*Rl<1mN>ZZ#1|Bt<0Ua|0q?u4ppT1N2_L z@XU+1ADH>ChTd69%ZAW{JT(`?SyMs8xlG}br}>Fq4rhK#rF7JKiwSGujc+hvZXEpB z4!uZVPO9L-eiX!!kZ#Hbk>(y`skR6k-~}!jNV0sA#0eJ+CXu8nBv&Tcq;z;Vx9(jz zh=}p<;^xVuxH%uo`l8F_!aNGTB)Lc}QrpT^rWaOg0Wm!}6Jw7yH)b~{kHv-c>D|>$ z>4=+=_sZVs+WuZ4t5!E=8jw=Y%)F&@CUg7^Y)%AKY8lA<=Hpi{`z+GuAyPGM!Qx9q2_Ca z1hP<@zt>qq1GBY))(RWF&JC?bqhMBOst~Mbi{qpWP8;V@gCZetimHGUs6lW=;5f;l zP=kv4BVfs#faKIt75l_@W_i@_?@&?;h4>B9r1? zi9eoJN=LEH?fKkxc`~;wCD<)_I$AEVlUtQd&YN7?*x!h5?8Xl^i#xtz(2wMFl^2n* zo)C~`jSTBJD&HX2nr@K_l_G(oMQ$u=4R{qbfkgNOs29tZP-y@RMe?Isi7XC?LD9!D z_x3PM&u`sgPr^;|{1FA;I0f&Xjsv^5zPg?NPG-v4q?${tSL@KsL$wOBU*#241MmXh z#oP(<*Bf744sAe7Bd%M(N5#CEcv+!Ue8@IYokhhIs6oh*76Lw5Rs&Fdp%H1c8%O<_ zcoOPaLc-mXz?o4%M-dLH*}a3qmE+wV?kH0cD@r!M9!ajN%O`w%VR2`Eb1%HU5b(1z z)$B=L+CACwCZjQaB{dg_E$tkvt}8P$8(V7WcxLYaWet3DQ=7Yi#iO8#x+4l|52*@E zb%m19BYco%D)=urMt~2>Y!dnFFt4Dd6IdGf0}8=F9~Qkb)VPEXY2L{59tfh|$T;|} z9a>#Yto;bD-QyM22t?*>(9aU5-iu(or@if**BwK>ghHZNPFh$m$hM$nP*&lR$M{6& zzLVt|h_~!{AtYYBm{85>|Ne%Kh8h<^TLShefdGm*A>&_Fz+Od;gU*%|h=5Vy4R%}^ z+z#~t=pE-nWEY!I#f5lfzPPtm-a6Uwtp+2zh~bpNGx6Dlz*3m6K|1aoZyn4ePPpRQ zUUsK&z$On0i-&~+?xePo%>)(;#heh>JxK=g^ZV0V^Fkzs`0e}S?Xpm|wkQ71*_2Be@b$T4s28D+l9 zTxLGTod4qapF5u#+aL3f2F|_v+~CL`j=XoIF!G`i_wXML4-NhC&@T^FhF<3WQ}?gB ztM1U?*9Jc@Fg@_&{eRJat^alX^Zgh4{<`nMzSs9H^!`onY439HGkX5-o{#pd_B_k= zE!QI${)zl_GCYi*UcJ|FfSTLXqR1pNBoV4-35o0ZDdzKB)1<w`M z!tjRunK3n}?gZk+!VFKNsa2~1VO|%Hb#X92>(->(&-QKX1VNiOTrJFZ+CdQOU^e@q z%jea54POiM5A7gro)fh7y?XB@17D^F&HBRH+uae!3k?vPS&$BGwySC=M&_7qEOfo7 zePPIUx10*07$H|W!dP1fvlB?$eXGEzsXev66~v}m4D+-VBZA7@0KN%g=_ZCwwO8+j zcS>K^YwXr#4QM9_c&8c=;qc_No_5`6S3of_W@6#`E;78~cXT~!H;I+*X(v=MR5Qmi zzi9_ziH_$6jv4+Z43M902SHeXWnnan;Wl%b+K=k^Le!VpudAJk;SqJ2TG?L@gmV3~ zy*QdhBV)rS%6!{yFP2OkZDEvXpkwTPb|7tzDs2B5Es%ER0*`{(CajSQLM8RX=N&+x zBkt9EjTi&o!LrbF`0Blg`e@AI074*$3*A6y`#_Mo^Er6;n9E1;yZR}<$ZqQvH!eV! z`;8bQJ2rvD8}p?nki?HS*Y)c5y(2Zua_0fTJ=K6{UsgK=QTed$9u2sEKX@wmuQRUi&9Owo@yO90eKxpXdYi`6fXTdO*1s9lE z2y^Eqn0NLzL74B_fmq}t50GR}3#5JX2rjgoBS3gp6U2@t5ff;0C`=QCd9U3pZNA;p zt8b?SYn|Ua0U?aNozgyZ7S^sA!t-j05+TZeJEeCtK-w_Y0mO&^Vt%G=FXZ2~uos%; z)y-L$pSJ_CVJ~k#X@S@+%nEYu4;a;myky>KJBwM`^8n!}v_;!~J3Gc!+LBVS6^gUa zkELC40f<$mj%Jx8LTwu$Z?apLB{`ED`vr!twLt84Zv`P7QvnhEB;VLR3vP^A&81ns zP-%kL=-)`i<#@wEJ-8gfO)WeFPNnrgg1f?mNwm_$dSA?d{tKh*=o% zdj0?VTw}jJ^60?xnEOVbH8jw>Jouko-yS~h`)H@9_y6C2e`W1%=EBW4TPyru>=|;q zmg>dArd&&$adSpkKTn%mt z<#|b1@&`g|Q`?n%qP)nb)&xOVC@ikTj#I(n>~g$P&2CKk!;|}Qud?TxFV|zsVL>Tp zgYw$J&iaxMmiR(0uopuGZ&Y(coM3?JOv7+W1?E{1HuPW;CLFl2;Q>gZ7P4PSdRep^ zKpAQjR1YXV9`+v8M}|R2Qs7WVC10P&y5cB9eRn_kJnd?HFCtJw&81Nx6Nt3>JfkR9 z3XkX|kNK;nX-%y)J)U|rM8g?}GU|e@H4T1n6mV80xC>BDGY;oH3TwuFRIfLQx}XvY z_qCsjCXPzoC5;Msa?zYv}D`{dZNk_}8Q9Mx4ma#RVWmKQ=NN|jCR&z=>RA^ z&E*ev7nf&Bh1fPfwKlgqS1&|j5q>o>TaVR(F+>I|aP>^F0@HjbJ+m5$C-kaDL9E_FT!`J$UhUn1|1s-5OflNwiW$CD@}3no?K{#L;rG zQbC+`R!NQ>-@vbtKCTgt|!d~3TQ-(nVw{l z$xJenjettvd&uHb{-6++FSrvx93&=^Nbm`wfQX<7yeFtE?&1Q%WB327d;6Z-r_Sk_ zdnfs5zxT1^S9PjRojP@@>YlS~UAHy&%=SfV&n-5cH8Oqq>NT5|m(H8K^4#e&myFnj zMKh+Odc1H}-?Y||jp*62dwcrm-g@fbL0<_9qNRLO8%lC;9xz?I!)j|s9|g*wNM)lG z(uX@_aX~mr{-#Em17MP|VUr8!wI>a{LF6-jbDlhhx%?1{+JO-MfuZ=Rnii z3flClZ~UHd-`CK6GSFX9xcK9f7SY}Ij_uQYpzo)&p6dUe*QP!d7^l#Do3>A-gSscs zn$XhIi^iqiZj0WM!F}J*yk&J4iskm!a=xdCk~I8g2fCc{9kcW8U31%Kw6@PE^`AFw zO6RJTGfHcxuC;rolxD6S>>ZdhZ`05jJ@Ca-mvxq!7B3r`GqTQJy{2cbT{?THXJG33 zIcG08W7E<#3(j4zrfuEw{M`OoQ#6l)r*LR?P!T~dO9%E+=o~!&7;87IyMSJscC!y|d+_4OAxC}i&@CCRdjuR^_w8D@ z4q-%jaQ4tfL>Y@pn}!C@t28op4cxb@XVpL%-bDN{w~KKJS}z8A-Des+gBLY_JUNXA z1u9poqp!l!s=VCSQNlY3R7AH6Ek$~9q|L^2Gf;Uu?lLdI#PJRW)Q+c8+I#v?ZR=gJ za@B@u{mYtqyL$4|XAVzWJLRmtrrw3K^8?yNGrp?964@20ids=&1=xqSHbs8Ou z@XfIOo>mxnFLku^mOFaU%#G?(lXC|3N1}|3#k|P-k0z=PDjE*wY9ay?2TMB z`{D#ecqQ3?Q{PHz3SPb7j(dH#^TZJSr%Kr2y&X{Hp>esjXT)}ku2H1}ca68Bj+aNv znB9%?Zx1@e>|W}%LWtLc`|9y#0~#Sw%EOejwioQ;aB>1wN-P5yh(@^j5>y7^}{wJklf>FmKJ zBXiDMHfR0pY4fI+n`WKenP1Z0lgHaoJygf*p-MA4DLN2MH02BMXt+2JZyllC(t-tB zxZ4}=At3<7!%pojh&=EJMIXf~cnT$-=xE0qIOdATMGG(b)cX!S^5~DM2ArC{x(r`D zIJdudV`%`j&+5pzA8+8CSos5ubC*tPoIHY??LE&xW{MElRjS=wqcz1Yb@z04qrs!t z(^8~e4-ZP98&Y#nG-!|Q}^80uMtpxOI#&2yU@od)MA1L%pxgBj(1L>qAC!zFqO zpz1*vx9@otZm6#uTiUG3BP5uOHt!LVg0@iz8&eBjsmPeE*e;9pS8JZ^VHI^mbnX7PVXbLPNCw7M;v+OlwXfi^n^8*MEuO+~yHfd`cGEj?vC#LUD^vxZ7oIgq@sxzZAEqo ze%d_E9U$cv3r_-dw*q%~3GVbXw=x zOZpIEluPtx2pR|w+0lz{9kcq#NN2!L7f4CriP-=5>Gj0I5A@^u*TW(dZJ$q9& zS^s$bm+J>JPh`Fpn;km@mHr*^nXwm=Gm-}-o=@D7_+;XY#KH0BQeECJ^ELSwy|CtQ zE;dciuuzU|OJzF5EvnsU^;PK&Q9)gCcj!MqM6e5=x)>&gC z+}_xo3ni+02lh0=8Z*TOD|XU zFpEa7WC)6eEjcSr2y4NZJlI8hD7#$s`YaD2^>KLf&cDAS#2EsiQx->%vixfopU^@0 zZA@VDmgs%>l!Bm7k7Q+8G$n7LEuoUFR=EJ9R_3pI(=UkJqO!p!gNzNhyy;grG+fl% zgh~9OH!$Pt3KzQFMY9@hPsghGdc<4w^}S<|OBEh;Wwkiq*`pQt2@BBPV~OWy#|g;!bgOx zf6XF@-}~~W;*Ir?KJnCB}#-gmLWBPznuIrM<-Z;?Hm}XT1!Da zYa(nZ^H42Vpx4&EjjF9z>^LG!-&$Y#8zX z68o2Nonl_N>z6qSJ2PZFIK|^47mi)&wUBF0_2xvQFI+OhtSftx(R+$O=!T_1SZyBS zP*q*ZtznLF<%J-slZ5QteHli~d85NE8%upGkR8`5fs5Q_VP{Xm+`oB_H?p!aGTcVN z-zULDzKM9M=5oZFG;CI^Y==>X!YbzSl*$D+Gsq*ea&g1z@W!RuB$#lUq;Z|#G0_+p zE|%io?-K;kPGwx0O;XpldDWZm5s)9LqTuc{IXI-{^(Hni*L`bLjLt=7_}QNueSVLL z)c54NVnEm$2E-O2l_|BL)`CF#H^vO9=*~mAxvU{#^!cqE8t)AV^WF%Js~P|_b5ECq z$XsY(V{WSGdXu@(a(M$zuQHRG-5wAo3#R3b)4gd?Ju7`PuTJC}r-ebl7aQ04A*f~| zaiIm11dzUhkVI-=b0<;@vBd@{x5?FjI01t1Uet(^LLIh4lD^OtUek;*E{4cPk2emB z+;67NkNj`s{`jG>KSuA0UXpk|`5b)_kn7L2glvLLsB zX?)w??StsV0>rS9hF5PPl<(Q24M$g0)~2;Y1#<8Y=dtS3m1fN=i{g{kR`#2Lne zVQd#HuE067V(WbG0Sh%A0*gLByTz90cIrT*4<}$($?}&hu1~>D-pp^2#@_2g6w8N_ zIfTT=MVXbU{Idd~tDxnb%pxvA7UR#VEDFRi7@rG23pw+`8uUqHm!-tO)On%nxrEh;~Ac{cruJX({2*LuwLT{^U_(2df^OyE{ zq8pc~bAq!b+q?);_95z=s1W2C&Jxbpd{E1UEn?z=V{^surH?&beIaWg56p)2wm8+u zAA8n<5EtL&|3f!0-Z@VY-y!`&Cq9S3A6<&@&Yc#1)P{Mnqc%8vcEl51{+Pp&gOcQI z8wQ8ZqBc}B1krUHU;SDCWUj7X+8@~-k$ueQ^Buk>pa6ueEI{lJdZOrJ5CuXO`Pugi zh`Mpp_0>#zg7~L-o@H>{SAjW6+9KLLg_V_gr1@ONOR3xqhK(a&#p+e(1ukk);p!{!gr*RNTND>4FoE_+z$+Sx&)%&i$8f6BKx{rB$ah0iA07h zJ;`GGPEup|fUtO-xbzBHG&`yu(k&oC_HB#$|4+hGeGNPDs^5{h7js|1i+=UlA7nRV zr`5k+|Ks`#>hqc3XKu(W$RyKur`M*Bb>9fAdr#_t)F)F`@(;-ylM9lG#P<@HC6*>W z7=JmwJ$_F7gxKq`AIH8JJ0tc!^a*??dQr43^4G|hBWFgAG5_2AoH^Ba4NSxS)pgHL zC|+`|Z#4cf{+*<_jV+IsdAjAAr#nH4;;8*V$_ASBJY`JSJMPfyK0@#u;t2iz%JhXu$%N6paM#qGF!=L4zS{vk!$ z&3dHFS3;-+;jX-%Es(1BNJRo%_bhaUk}eNZ?)gauq}+;ts$F!jFn?`hKGLBO77%sg zAmk0P2!x2uHFHj*k`XlL*bypo9%30F7Ge2S5)fNOZI$5a0eL^7;fiv#Znz49RN{Z` zs!=--@;Q=56&+_(s!FIL?k+_ZSyz~khs2>P5TXEt*z5x#um&HZz24RC)xnoDo%rPC4DCL2zDFvIXTaXV z(^()z)fZ<}VLSuwo8}V*QuKkXD`1H24%dwH&=aIK?H^L4tBrzG2%|>cnw8p#6rHm} z8#NmHcpVy~==|;KD)6WD11Z-bFA~?4yDr>8u;`8~kxpA7GBhZNs&K#D#Pb_L7@U1}huJP|>N=N^j8rnTX$0*mTLfAT89xv}V*wY?b4pPpVHJ+M1XZ~cb z4HyRiB+;><$_tI;paYr1+;}RuNoz=fxyWXjs>48V&g-;bPDeXe^1!<}J&&mL9fB0) z#auZ8ZxSvkImRG^qtoMlAVu1xY_LNr%qoX~Jbe#Rl#6zC6~g!6Si(FzS;@H|Rm)0% z&;$llZE#f*!b!aL3bCB=;yhb8q+QBVx+)1_KGY2_Z+2ETa+Yzl*%?V56uT|< ziCA+aXKunj{vvW|^sVUf_@4NsiH8$g;`I#!4M!#B<^D4_CHF4#zU=+cV)V}J=J=V3 zcy?0#+x0u@SJby={%Sll#_!XH`ZMqIAI>(mjK2!;AxYlGgC+C=uzUotK*|pXKOdYF z+NXHx1*Gy`s;cV6(+Y2T!bR31-d)^woG`3y!u@!o1%f~F(>1z{ie;`fYzr}3l~m{G zHuyew$7v5r2@XJMnzQlH?>6LGLz2RXP&{QjPV{i+g)c|Ge1JhgA5eLCePAzVxk(#B zv`jzk<9!~bldFWlbkla~`Vl_e(5!MerZG_mx}%Q3b42&W@rE5|ju32y zBn4lHJh{ASlGR!@#ek8kss-ZkF%a}@og7%@bDG-E7-PV7^$PhpnN-Tq>H|BElz2;+}PVc zQo^Uzm8ZX*9S)>0w=6cqppb@j2NlGhdz8qB$(bxrLKfDgRP9v98xwRT*I}&m{pJ)< za%SmNw&_9$d_cgaHPc{x(PMpTl|LVkwU!dfv6byAgl2VTfzfT0n{^|Bz;O$03`)W% zeSht^1+E#Wp?#)KvJrR`9eIb`(QC*9R z-8F=9Qs)a>F`2JTBp$_}6pui$6q3K8?HsS8Geue1+sCqVWO#WvTECLsad%l)*?H&a zO(;~k|2nY3(TV{EOySL=H;I~sW`CpGIOXUZyVXrpvj}N76rw7mAO;ppXfd$#c>WP$ zP*PoQ{*>C~A25&@lsgYChL+SeN;8Hgr3oIeC`C@j2pkG%166ngI`HaMf|dqs`E1F6 zxqq$=!CXTMO9toKkTXkt7D@%FVVA!G0&g<(S%~r>5yV>*ewwtQ4#Zm!T0F{CDsd+Y z=VE~e77rh!ptK{$=T^2ZV>BivM^is(cqIFL_K5mr^~Ysi&HONPRi>1glzu1uaQcRH zf4VIlulq&aw$yd0<*8ySntUvIQ*w3kinGYZo$)o-uSC3F6kNjnvQ7Mu~c8`Nl zB#(S%Yy@w%OWYq>G7dtKJVNJ%nsctUh9vGc|2Ymq-Yzg7=J&@z$ftEe{O8yR);~aq zkB)ah{L+Zm&xy!#k4$Z}jH$0Te@4q~I? z649I??-EzT5f8|xnnL{* zwA$R2;9tw{7&5Yvn9hQ1$aJF&>Se(J(wosiIFJ%3IaW(;c$%IY<+Zy807Cw|1_+Jc zD6uJ){L`bxK;Xp9QZFNaxg(s z_@NqKDrAKG<#bHO!>u(31qL+dvTA{-s#nQQ8$C^E+u(^2h;d{sG3aI+er_T$kmjo~ z8FZI|VpG}qwbvgKlDIxb4x$PGh}q-INe8e15OuvE0BH6nBV!0b2T!(?atGEH0`48# zsSGFpP*VsUzyhGA5IO(}fm3yjnE--H0c66<`72KX^Gnse<}Ga$S70lWwb}~A zEkHPVH1kX2XZ6v$RfAL!q(t&75OYGDxPO=zqNed|D9H&is%4J<;8!PtwVF68L4Jts zMs{RZ6{)?!wTn2DpTsjUqel!kSi6@uQLL(LffNe!mE397sG=|UqYc=c<_fN)H7$_x zi{oDv)g{k*ke6mfLo4>GaiIL64jntnZ1gh9&pR>RuK| zH40Ks1e`=7g-u$Hn21!}L`YFAC3|R)`ri&gDujTfGC5`fsaJh__*PH>sVPu7IfB$d z;YS5hYDZGyG(RJ0E@QroW=WZMctT-xfe=>n-hYV$qJludPbtw`oqN0XzDx%`*JB1X z2gF}=c4Rq?2PSUN;ls(e_s_oc!_hKs~GzZN6) z?3lx)qX0`u05R5ZRRpyAQusv(?NVnT({A0pV-FWAmz_JuT!i4EAg~DkahSIXjBl~M z0-rY_6l5yt+WU_~z4LDQI9srmnQua^X?_li@cnFOLN5>ZPK6LK6CKQ6sF=Oo#$a}JS74aC$WvB?U#N&k$ z1Dg+$3a}vg_=_F#Z%CrMyF_!)UBbyou@J`wB@D`?6reH14K6_mDR4Q$!J2(hbPEKI z29YL1Si(Q&MTA4SJ9qmJYHlzde<4yC`cQIHC%bRwntP>`bJoinOPur`_IJu2F|i658v zQ({}{w$vw52PPk?n_Tx~Lu2I8OlK1^<&F%YZ0W#hwTSa1&|Vl?Lhg5nxnEK ze>PtCQc#Qi^FjrHIEn2w769bD9WjD@K9R4G!qI~zr>tnJ@yUshLdeCxDTzK@<-DuD zhpI5Anj*8prj}?QwPd>~$12gAc0Gej)!l!6=*($z@HCEvS8|9F-SP-mDJSTyu3di= zOT!5AVSXN0L_h{a*{r!6q@JPVucO?E8DJl9Mui;(TP9oknd=PNmfd-Ju!>aIuHQwx z{}9OQIm3kmh1O*q+FiR|81hI3mmIDNN@T+Ysf80FrCwMMQqx0{!oxL`JmU2M%*S)@ z_DDrKtCU!yeb=!PC<@)$JiKV$^&DEP-7qQA>3`x&GpI*kqUL(c!)TYn3!eAb^*fk) z#TWvcC|oyobCs0X%EOEbOOOY;UAvwYIU*y-R$kE+Wn-B6bnbfg2ruec5PY79l5EqM z^52KG9;{|`&|($JCoUqD3a@pL!U~Z$50Lt8IV35V6&?I};RK}qC_RIH6&PJrJso^hlsb|} zWo6&x$IV6vQpgaiYw+=7#HgyntFa;jWKZbYL^i61oso}r?fR3SoD1y!=r%gu4gl}) zrvt>uE(xSBSUlDhDfHke5y&5fn=ylwQvLG;3p%aNUC&^z z59u3_-N66k?TfNw;>a0%>Ch=yvG=U`W24c$KN&qM_Px}5lg~zeke(7b(R@Afuh`M? zBa$-`7ew!=J0SJj)a|Lwb+^@RO#h1B1!!2&(Ap5oJw`7B<`UV*vqKa489xg23y>o~ z?|&b`OuE+_HpxAD4cC{4__bzIbb?e~^>h*mZ*)VomnW#I|# zwZHazXN7^-(PNFCwH`tqYr~7jpK`vm!awd|Ut(!3@kt#NR%n%Snt;>=e zXL~$arK|iquq&vd)2J-b#kUa!o~7RPGO!h$dU3h+wR_f!iT6K85fhIL3_CVO|6$ma z<8_nwZ!t+AyHabwvo+V=jb3V3Tk0fYe`B`|+OZ{uy-G0oCu0KP5h2MHG{;h~Qd}mh zRD_Z_v12b*FBA~NSEHBX>hscH&>8ZdL`&cZ@|$Q_r)yr`{DE=wgwjr-|p3Wtkk zVJQe3h^wh6rXLs7MeQCQ6UcoxMO6Af47o8Ivh~`D=L}nPA{gof0>WDKaF6b_ch?Ip zZ!4CCmBr+?ljj@PA#|w>jIR+445um<3;@zcF-lEY2;~VrIMiEiBrZ1P>RpI@%{;Al zx}1Vd2w4i{PhH5}sx0c+Kh;(JP?JVuh(_e-lr;9eVZlWszM6m|XNRfOuM(_xOgmdw z7ga;i8k^8JCBAT{DLQC*Qbk&d;TE+$2tN1SGu=e9CgqmMFZ?mS+q zh>z0`PyPU6pD7@!j!|=C7t+$cb+_2G)qRWNYPP(xUygKBme(DZy1eKLOWEyNxowe2 zRJ?Z~^2Od1ts(!*>k65t3>zj{fyfUg)PO*gJ;EmCr=>iEEDGA6W5#>+vxqStuGt^nWM;_ zY*-)ktXO_8($NXO*Y59D zAaqLyn-qfh+r7H2&~uq00&(?)qn{lSTr{g5c{5oQXJCeasO|`vbDj-`^mmJ}P~9Vd zU>{97uH`&WUuxW~BAiHlQy7G^KT<;9)$lJ=4P#!Ix}f2^{n+ytY(0`~DG=xW|H$b^ z!@~{#*)X@E0cZMcx#hXzvVYEgGdq}Vseh^dJM|mt+cR%u?#_HFb9$ye{nPa4((}^q zuKP9e0Rwf-slTVbof=LRlCLDco7|K}T9j`56s3)|=ChI{d)YG4nQ*hc^rjtSc=q zclHmgD-TaCtts{NuZunvp&e_g^M@w)OzW95)VqG5JY%E(_mc-o!>gSmn{y=}!ggeh z3O4-SI@4W&i-(404{hum8lJbNJX~7WKQyRk3MJtr6<$g1kfEd~&||NE ztPfky9B}L&E%n9#dnOCyn0x zDPY3*Ka>QJ4Q?YVK6&(JoLk2iQf4mTV17Y(=I8*bEa001`9E312rFGUnA5%;QgVvO zE0WV5KCW>o%w0H`(}o_Jx#dZY62-6r#|?ow+Nwe`_uycT3`lt91;=NDIpw3ropYvk1Pc|HfAgA&FtEsvU}&WJeogvl9QITR ze{M#pC!{e~qme}kk9N%oBk!FEI`56VXF_Oi9Z_5#&UZrY7SH)nJt8C;=VWIYLGDjX z2<`DkJuf_O+tV7AfJ2Ym_Oy1+M9^Z(_}E0yZnTe;`B9+9b)51t!QJXE+#bD|DsDwx zEHroV(EPF#z~M8MqN6YPuVsL#QEr}xtOA1RJuAGJ9z%$^bOK^l!I7jKUrVz85@QGV zB|+e_{}OQcuf>4t{Z|c^*~ll2la1dSPE~(-L!rUU_2*i1(d?tyRrNowzo~v8^X1G? z=9Elb`ibkL*nVgEr|_@sfl;RpNZcZ z-x!}3KOpwo*tc*;zzlpp@LY5>dO_rj$ie0d=AGuJ&DrK5V5|S_FsgsN{vUbXun+eV zBc_yh!($&vAyPqBPSrJU*?QAq9z=el)`PG+Fp$>Xdefl-BE9P>Aad%-fxKTpuB%SJ zxDce#!%#D`QTd1^tL0C^v#*~tq{(jr)nnwU_>v4b!lX5&I9In~uAg*oFo z$cHd4H6aIj5JRIdl(Sd{HM!mR_j^5v`7_1^GpSU-EI=L>WyU}d8<6Xe+|=c1T^-YR zagzAXOp5HLo(u171Q%QMlm~)1N^bB5Cch)<4UG47(p2UIt6OAOW}_i@Mdh``3}>r0UKMM`7qcX1QHt zYPa4*c@`I;2(Ka>9+X;f5z44E2vQd^D-}Uh%O{9tNg}gSf!wJZ7rO+{Q5RAv9z-`V z9R&Fk52DkT4iXU%sW|1Sn787R_{ft~xLl?knCxC0S^OmZ-?R|9KtqdV8&V?`E`QT% zOann?qyqW74x;h;+x#;A-*p4iL68EeaCuYZg7$NHeUbRvkoWK)Di;-kYkFZI2x49SZM zL@MfdTzJDHjf*lC4i|OLgYfJdP)Ef`Qq*RGe1a^zo&KuPhs=Zv(Rgs2KX}y;5L@(P z1cEpULkgn815RJx=NT@*ms)O)514w)%4?Kt}3!OgY zfe{1=g9=2d{kw*&eoR4zO!O=ntgFdvHxixM0=rh~a7ic~UpMWI5Kyu5Jk z>%(E(WukMgfH0$^egPc7LqMEa!J)e%iqz}p4NPrA+gkO?(M_s_QF%p{g{EbZ;374s z3oi29J33zIL$q8pkOcywu`u;wAgcej;ITH`?ssuRd+x>DS8_{p_1Pa}Kc77(dqDk< z>o2I!XMUf#Au~S{PyZtQ<@6A80GYb~uKQfw)YNPEDxf=caPr~gmSk%(me`#bOdK8m zXZ#ze`oAl7e{6GXQuOWUozdmd!y`YBd?s?L`I7lx=6dtP#&3)-@MC@TKSwTu6z=y* z!7hq}64CjIgFmzFu6rJs?vXNr-6}B#scHL%6y9%qV5&zd`0JPuP;KvQzUP4{Amywo z|5!l{4e`(vI!NBu9r}{;l9st|!&*kqZ9iI+nO{hY^`{n;;eVJyeI3M!T&ZsW3~E zTC14P$Eb=PDI?f@kgnR5hrLMc1wksrnpHakB)EUqR~F{X>e3`hy^)4-Am-S1z5!>(~z*BM^Q5^+V3C z4FuX?We-;b;^}%Qm}S8C?Zl+E^|l) zcQPnHAg#nwF(5@{G*?%Fm$OTXWsN}!<+X}{frAN4f;;)^Y*%4)WvR5$J31E89q&$XrRNa~ zY8BTaymNEBd1YKkM)81`^d-VOgXQnOl;Rje8%L70jG z>7zg{IE0e*Reec6lS?%fSr``*p8_-2T-241fw9$MC(!*w0hl{5)s6vS&cd-{3bb4< zEcxsXOlL0?P*os0CF>v*IJpp3d2qR~WQ${BB0w_!t{My){aN@)8uKG0R-h*?DkOP< z(MKVYJ22MLP=UzK!UDvmP^bb?#RnG#p@C7z<3hfzlZExBSV`QAkI=?lF6uI-gsWO` zy_O;vmkF!3yP~j&(yH5JTt|_L3t>%Z1VQmwUST#MeSSo8ohphJVpB-sa#8mqaM3hD zT0i`0Mrc+8< zr7e;m*L>QC=(y-0pYkC(6*CB)=rXQBPg2EAsM`w0#m)!WcBA(Kfza}h5f%{E`2wL8 zgds@w%|Z~?!bKC0o@iNJWGmO4=R?$S=^>j0M7naziCd`tBd-&O%SIof`TvH7e%$I8%{`j?zqysUwp`5324p+3iTYpEf2n?T{Ymx7%;WeTU@&uX zCWV&*znWf~J}sTC`&Hfcy7hHa>Kal{r*27YOifQ6ko-;Z_T>4=8OehZ&sXIO?u=g; zpA&z7><_W;#J0rd#tx1CF}kyoIrvj#SLEWz{K(jTh&g~d9|Ax zt~AGW%dA>WD`O|hxs@2@O<6k?i0rW(2-R)fu;xv9+G<0nKI=kQOzT3_i!rwD^y{!J zrmYR3LafV$9UNQ;i#TX)?4*LL3*r5J&=@i%8u6*HT7jtI>mgJ?bs;Pspn<7(=F-5Z zP+EbgT=Wo;{o#w&<-*rFaS_=c?oDb#MD`~T#8I-y{+R3xSeuK;{+RDl%o4RvcJqwG zrDpaAT&T>*oGFPfvOmffFb;${Q^)v4_Q&9T-8CU1`(s?H%A&gvXzNZt`@_z&t}L1e zeW#!OVMzmm(C4~Jq_$IJe+-s1s0|U>A08CA5Pmi%C5!Bjd9o@#8YP2!YC8EystEaRd!ZB!BoJ$d!Z_Z3*Hhe|S%zqhcLI)b82;Bz|0DF@K`$cr_q?=7&YLE*DmVbF2lKA6LgLVc;UT$ER6A;-`Yp z4NHeW-p57o53(HDSvS8k^GN$t5IO}jgd>N@`kbU4m1eW6nf0lN&Q?54iOBlstRA7W zX36_mAC_5jx$uGtaY5Fn;w4yStu_Q{p9+K}Zz~YyCWs62J|0A;F`e^9;-><6OPv;6 z;>Zq8#Kq72uu~8X3=qw{_?aJe3aSl3=BF|+b_%KuLF&ha$QNk43la?=nt_Sjk8bvr zJ7UQyzk}S5YsZ=`Lb>yk9P4*P>PNQ?tG8Yf1gW2jD6D2j(xa(@c~*iT_v1m-nbbp& z{Hf?zJ+jbsX>!=&$l_;z)FVp`h@bsosT@}p-rGR3RAqm3vgjaw_J<|=T`sJP$&p25 ze{^v!&L0}_{p^n>Xhk`VnHbp%vOg8ysuM+rK=P-8P*<_agY+eGKZbh3#jLQ)HLa}q zapMT{J+V}8e0nr#-h#g!O{`5E8~+u)2w2&0Br5w0qmLxpbC+dbj+_?jP5vyoEqhD$ zVmZ)D$7|A70;emwCvac`e@f1m#UmrwGc{wcaJ{3G&3ddeJ83v*x~g`mal zqNr{^>e{=V4)AVw#g;%FPA$X&?L2%7j$BSG+y?pT_dlEW-age^aOQtV4+giQEs&1l zY=6S@k=yBz9DY>l;_ce|&2m^$G%R>@{<(11-dia@8FEzUfkCG+TT}5Xod*b=09x+C zg?6bWnt$63mE5|_V;=NP)FL%F9coSCs{aT!sv3(EqoQMM=uyEQSeDL8+-;oUX( zKhmjsXS9OAZqF_p!IaPS#0cszoGC|7h2k)7Im;szTnsEV1Z_+ssY47L>MP2XzY}TN zd)w?Es@Ic_3V2 zc>^o=kr?GB98v*4CUEv~p-C-6zkEnZ1>=q9M%HL0;i>Rsoi{@_aRs@*T!Lk)jw%9DKqAA9R3Y=gMsC zEaStG*Ug4U8g6XpXh`OMnH$bEWS`02mOU?fQ2h(_ch+B6Kezs{%+XX3s7FaBI&llbA^ zn-BZH*g2KoiP1Ns4@S4*%YsAVzfVpv9v8n*83MyFf9h|?<^v*ef*b6uHhLlm-&C{3 z1q5x!?%7j=K>wa>7#0w{V$CLb-tuR`c~=p#a{U@*jyO{XFf`he+&mH6WJyh&eN-iEB6=v(h4N zC!bc~v3P24zjw{4)sBa^=sPxMi1Fs@Z}-a(Ka!Z#fHYrES6X{aWI+(FV$HJ&f#`IL zwTF;~)m9TBnzu}OR5cK>zxfklb}~6&i}>`7iQatusHoC19_Y+ ziA^So?JmOjwY);$vgwo{kIGIwZTu?~!UE!6f$$3!u3iT0rOc0uQFXFWA+JWMHQ9dx;mZ-kq6!E)-|%=SP5~Pq71R`Gbd&boNHR#~r ztR??b1kW47q}ZW_ScqmiQ^NuX#jL&}dg*isI7Ei1%ljLkU-%V+f^(BsD;%5eLb@cQ zYI7RTxT0tm=om{;SgdlKYNgMqnm)FhX*XHoA)4qka%0nEW=M$EF-ApYEP3ZA1XTxI zSE$Yg^=!zdP6**dbfZG2tZY<-@EhnfJk)w``oDamQUe&;ndJE+qkU^ipQK_EmRra_=Zn4L3-hwt1}-C|=>n&7Vg z$_Znr3Rx@B#!?jpZt84^o;jTu*qcR1h;kr>_ z%GJezhPj$ng~&oP9mkA?fLoBw%F0cytz5d=j%PB-4nI(ng@a(tBV;4~w#-!p1Z;#I zQh@NcWeoxydGeGK58s1o5I8-t1(^GqFF4;gFeqHsB+nlSE*j;O`2zwrA|tGZRb#Ti zW+ux`EGVO{_l95r$D85f558DKAzGHJ%r&e`4xDR09g(OqBiVz!${ zZxS|bY!kV51O+Yv-FD0xx<+pzn|AYE+s4nek3q`3&k*GYDe;0)iPdb}Anwi)q|^(Y zJ4bKAGH^4s?I8w58CH2mi(G1yywL4bUm;)sKj|_!IXDAcP{Dd?EC?sOVIbiOK=|Fm zLDXT#4l>T4z-Z~#N9HX+iDHPr>CF}lR_whR@zf`e$p*#VYuq4e{N8M<2vXsPy@eTw z2O%g+>-ZOqo#RBzJdzDNf3FZcgq>?hWll|e!kdl2#_1eYS(VK;jLerb#_6n9iXV7D zV8@620{E#x%~neZ3xL{R9Yd%trPrv1xU=U_V*98KN(~;Rz)J~~=mI5aty+nDaHu|CBP-Y$v7#m z719Z7NntinnF{GS@dYO~KY2D_oORTW8r)S>%$B}7Wyiv%(VI}Qa?j6IPS^v$O)=he z^Cx8ID0gs5&<9#~L)$qhu`?mrdCa2}!p_lr!VJWMbkv&RYBq#%V#DVlDM*cBoJbV0 z(=!>T3Eq0oiR1_6L>1#S#ApM1PAw_JNZcVvg;?Oo0KxsMcHz)=PHivD)-Wi) z!z9e0&|p#(VZuC+vvUU&*gP;A<-;G^+|I5!ML-}HR{e)x@(MgfT2c^Wu_s30%?+gx z#G=e@>R<5Ja0rD^@|y)MP{`~t6oO7Twk*h@&JuI+4ty@4<0+yG<{?u)1)DV zX+p*|^fXcJgdZ$NZxWeUB^sq#C;vc#rs?D{l&&IZnobIZpt8L%!@#SFQW#268@&A# zyLv`Mqc%@UV4D0xL*Uhf#ub$mrU?ngkkdp@a`1{VsZb;ym1&|+5P2v-(Q$bD4zGtR5|bF2B_yTw}=f$m~#X|f7bJX4y2Es&ygxf5&zYE^Vdb=~=I z1UoJ&VvZj_=N%MQ2Q)9Az^$$w7m79?^SOYeoR9qYU0rtMG2>NlRHoM@(zRoY-;4EM zLFrSR&x_c0^iHQ<`lO#+%#giPp2V%MhGcGsQn&~D}iu|cQR>4oGG7%XIqIB7&W0}6<$4g3rH62y+p zG{n~%Vbo6bZCO`#velrhr^XnXcWi0Fe{o{y$Y~gdHPLK9QdBOZy0~=8vtSJC1gZ0al0uNHmaf)K=6)T-T1vkkYG=x+vJFiu6GOiW2hX1#7>|_w4}}4w0fjf*k`vD&mdG2)N@o zq#&ablU#}vt}9?*Qdl)`So}tat{oRI4^IldPrbagYsW=`lo`+=7vc9ninrsz+E;m_ z3LJDfrFZ^;3i5!_GX<%jkqkA9A!#E!8LYv##Cb2MfHt+)z#e3WjPp>;-{^yUBLXKw zq-YY^Mqht{@2`U7ifNyBNMRYW-3tQJNzhq?#&?4)9ETLPRJJ>3&+$hU=*tyvR4^@7 z?Qpx5|hVV;GUY?H^K@!N^xVQlZoigO>%w=Jl31;{;bby}%=- z@F-Hls6^o)xZ06-hF!@fiiKlRucK=WJk8s+<8v#$|7Zqwu}H0BVKGYqsRe@6WxFzCJ&T`S35;$S_DNp zrO_vmlY6H1oV4R}sQ#K$9Vq>aIYYhc2g)-x`hPzL8or&*=I-VdSO&zRSc9@U5cORq zj!Qw0uCz@+5*GDY*~Djz55#_*NdF>veZ#KwsSN|UCvsP0j;MR7?&kV@e4YFDU-Iz! zA16+sm;I9SQn%NAEPZMH1-Z#}AI`lidw+Iwc2dJp@#B#}kbZdi4?pAU{?EL`_-Dvg z{z|UkG5^qN1bIy&-<0n_GamLbzAc)M`95dgNZIj!Mtw(-3t*J~sJK%FDc?~9`C6_* zN^O(1BP+Z!-3cl4OVy+5+I__eVSqvQ6OV~{^l#pM1#RPQ^GnqiT^@o?P;&6yu(STV z6Jd_^$6`|(qy{`vVWyC3OS1p6TB21SPwpEnyKDF5!(v#sR4aa1|IHdH3r8^o5z0wr z_vN3Q5GgfEYKbqay>`+=#)Y2Fi45K zQlPD_LQ2h*SY5ksq+UUHe+o7ymh*lDe5G7NBT|hMA%*++xq!{PuUZ09Zh`U-qGKmd za?ocE>L=n|yRZ3Jc;;vkfkE)o%I<4EIw4ZZHUyPiBhH&fVC`a5NSd?LO7eHU`G~aV zSn->qE0Dtf*yadQ!hH6Pl-0cZ3w}4`RAr**bu8xQpc0Y03ZoKyo28t(c3*jzH&KB$ zdB^!84Tict({Adus?Qp3o3V8I95=vm5I7qnktzql1t4fSyC$kf$m@d;y<;O-(w7jF zaH`1zCv91~1!$Legj~*02|9dbDctgM;#Gbe`rA;n_^6t8UpduNNma7T zS({FNgLM+x`Rse021++@xKQ*-=JU{%zp01tB^1)~6YB2Iio`&mL}q0fz%8-!4IIFg zC?-@)^g-qTP>X_w*-0A{C3+-26jZtJ`RZ5mG*QCo2b9CzKR}C_4@ijwhw+CH!_sX< zS1t0^U?j-Ru=dCd?=QW;f25VWVdHG)?ZWKTYpHVJ^ht*J?{T&%>6R;$rR$L zx+{}AlSd{li@%)sNaFG2%DNw99?4yvdbVL_e0%P+?91_U;s?ZjoL-ZDF?IpS;aC4` z{j<5phiV3K(TgHic#4$|sx{9`PNfzPSF&d^3Ltg*{vl;YFEU?oN%7yMb$}GM71s(wDN7;M4pPGJ>>H`p=tX{9X@03{H+O65XdGrbA%r+4PLz3U zyIBf7MF5=`UV+$2m6Kq5Y`cGI4laX^R2xW5Kpi?#MUe83JyPChEW_22D#ZTB_=4wM zl*ak4J(_z1y3U;G}R~p?Z*)(5=Br2@vqN;>)Ap0y<&4a%|u8YthLNh7>a3tZNmcdTL=<0Sk0D4g{2sI3V@k zXg#m&vq5^O5DXG2x~@VKPj>d#^u45bHQo4=Y2a?^PVRuYdkC}oG)Pv0CR7M7N4kadQvcXq1HnS2<~_frlDd21Jjm~4!bDMF83!-6 zN7>DL9;a?Ty&Sr56U*T7c|f?~WxReJa7PuSS<11ITBG{qrtqVpx~}4`aDgL| z3>sb4-ng9&6;*I~0+Dgr^R$R^g3ln_9!4e80;yk$?t?(JYsW;L8Y6e@&3k_7rv^XI z9D^1C=F~hMa?X)MMUWwMo=ShdT_9Numxpw?fK0?6QQLk0d(zo28o2QbB>NdT`chg zrR_qR59q-C$Quq^#uMVC9i(}!;;2E1ZCy63N7(efSr174T6CNRx=`D3WZKOx8$H%I zEOM`r$tKTByf^lLVhbbxirgD(jQ%Zpcl7e;()hEn=kcQ70qOrq-<)2To}A95oz1($~&A+Kx)fp3JyK=4`%@j%bmSO_`E?C_wZn&+g03oE@v9_B4p?|_1l|I=dM7;USaLA!HgCE5JEHTzeJ`Gf zh$=)7Gbj=woZ-ZF8Tn9#gK_SprdQ0+38^51LbDMdU7j+6K=1_3)jK=GAUX&!Jq)6a z5R|kGyvUqM{eNvZ@dJ&fz=lI2^m!tDO7#=?%uillR-(&z7=dEt&~UL9A|Epdavf#p z96gy@2#efpK>E({Ao7!pt^>m!B0DhRVpC1X;UYg(Qwu_th_reLOT>dXSMS6pY!xoI zsN$n1o~5>v-!v_XJYDgnw~ak#%s+Web{h5xK15tnSLIVAzywa;4XBp}r*PFioy#m)IIKE1$k$mJk;7^>06kA-%RH^d)ae z1bG-8rIm4gM->GMQz6&kcnNH{P%rg6>nn3$((A+p~?XLjs3 zst35^+Np)GaUsm^^Sd2(syfENRESMA+u&Rr9V4KqK%UYKj3;4pDKp>dLFAWsT^&>Z zgk<}6E@hO9K19bw1F_H&G{&^>R&tsau}_*0YMC%6Mi8;-8Pc1Pt|&%`sW6?Ml zK-lTKA!gWh0wO&_>R;($ES`~Cq+eMql=BBBlj5fOENEI zKA$-!b3*#{^fl?;w3RmM9;sVZ*O7W6d46(c^5BM*iH7(y@y+oW@q-du67y1%6TeIB zsQ+U_dqX1kc=Q92e?;yvUk&j4p~-&nTjIAwkBqz+`CjC*$kNCM&6mv|n4dS#F;6gF zH-3!Y_e5n!mgeoBNsWzAZq3;K8LBZlv!Um~5Egg{ zQ`8}pYou%-M2r&%K|CVI`9%@qX))_95WbztuJ|9bEKK?XLKHt-6$oV2*vSKkYdnO8 zho*N9h~6;}C>pS@)GQ$2fGhq%m4iO!;bFn{f36XT3&oD*%7HFpq=1+=ZQlM*Ka2{3 zC;;I{Q9%$^{F~;zVpJMAP)e0Y1%y8zigukVPPlIXqV{|Mfy}QQb`g)-^Fg(1r9%yf z+VcT~Do6A7=cp>;dibi#u^mgKi(PqOXG?MfLCA7&1in(kx8Ka#o45auIGR`A1MiGV zhrlwt7p}S@hdk$WkvO`w*|p$=@Ffp|fL-0YF%%CgQFX^~K{9sd5eD={u_ri!5=3d!3IL@4eaHEDA5_D2q{$&sqhyuuDOJVFI%*JLBn*Edrz3JratCl^UVO z9PRRIqgy$!?pZ*P`a0d99|B zP61tyhcNGx?HHOulL9|x0FkdfCc?;L!u0L%C*xUZN2KY4qF92wSXcG_!6XL2T^Yd0 zngxq*`^%TJz-@6#j;siT$PpROGP!|3T1ndkpSDJ3E}%+l?N6RJMj_XK+i;UJg7xVI`9=UKNw3@SR8D^ zF@LwCgrfI5^jw0PMANZ2XJSe7ALo3p&AF<1l69UeFEhFdrFGdvvVPzw&#-Zkr*>G>e#SPPOl7Ap~ zd2V(tmwmMU-o#fDXT>+iZj3FArK0yl-i&-ZvfTWu`DJq`^}h5e@qFy}>G~SKQ_@wx zx|i#2$;`YP16$1dQa2YMY^b}2R}QS!uT0@)`@7ATQB zb0`IAg{nO$Tp+rAs+b`8W=c;CdBx)b(d|Hd!3fA~iLGJYJ7SjQ@EmflWH5f1B5hGQ+q*|-&XJ6xbkDZuweLI|a^kj8{f z#HCaUF(y!wgD5NhLxVDV0qzuWhvS@ttpZ&e0w{?S>`oB{4G~WAL(#L{M5XM9Sz7!o2rIj9~09{<9=T;apeT*+t zvg6Z7w^IWvEcrvJNU%ZCO*FWNM@qSuTQR1BH>SX=5z--AmR*FE_-kmNS!0>vl0)G$ zl`lWkXO~G&be^J{l4X0M#YIOpXTb+vrl^%6D=056qC_#$1SqkSs-5blZ-87%0lv+3 zR~yEJ=u?gttW>vg1je<*qbBb!Cyw5Vn!D*VcYerg;U;SBl$*e5lFc8e39Sbnm$T=w z{6FmcRx}8NlCZ{@ARRR$Ia&|A_M9=X%$SwF#QYzRlB_4~wJ46(>25WsN_PEr-H0(8 zl$=zN|81%ZKw+Amc#xL8UH3KPP_cJjA}v0FaicZMSJ522Kqx8z8J1TiEtPOZj z4=7L!ucns3VQUHl-cK&9rU!%Fz7GSdVYl$AtW63-!kNmok$@hI?$e?$UyjwRY<&br zYnM_$zf(jx0Q(sC&)NSlU-FbI+lWosDAh(X&(^e&rqS&K9xZuhTOk9sK9;8?ghwf$LTtJW3f@Xqt)2Z3|7%4_AVoC?$0r0Q<+L5M z?SV-7A@vq%W!4@QvN(8IhAnbZ)%!hF1@u%lU4IK=va0C3^+Qk!7{)n7a7b^ZFb>em z01Y0-akQ_EpmRhr;PMOE$9J>d1B4a5(r5$}Z9$1{!&{383>8 zG?G{0(UyC=-spCGmplQqUEzJeM9_JM_sOH%-wpJ1y4mlTc^k^Z8-@nfm6n$~`v=yQ zho_d-lzRHt4Gqt>{MYGRwYhMp?OhXL-r@`$%#n~ApSgH$+?z8O4(3#V2{YqJ>caXv zNN?H5-;F~fdyR%&xxeMUnp=jGe^dSQ^^weXGXt5U(ofdCT6bXTq11(`V)D<)y2SDE z8IirQw_|t4md6f{{(RiurO{KtU{v~P&;0@aW#sP>2um&~;OF`H7@&iaG4PG@?v-ze z{M{+jI_@mccic5;b$}EV1NH-{c924lx<5#@LG#b8c1)!rAQ`DZBZe z9imESR$W8rO%!ruYzvEDZ9MO(B+z|-6;cRW*rgM8i(|51^r%IG+)L?Eqt7qpP_^@( z?}&Ib$d&LOCG3atsoCzj=Q~t%aBcBt<8Q6hZ|y7*)E3x=h(Ub_uEil0Vo*5Z@W=>* z5?{gxdhNp-6g6>3nzBF&J6uJ+AlGhsr0`yse3&Ov6>oBUDiY+nZI2WMv3yiJ5G%T) zikuii>q;wul^Cg7YeDYmbVh|x023(tI4ilhYOU=PDZBHY9sQwg0fWK>%7%)<`Jk$^JXM*2w^MA(l;oHF0!U$x55EHGMo(qu z+Hs~J6?hZGs1OIs?iick4&*VzFJ@GESgF>^Zkm`a;F?;#ZV+5e$QD#mWD6+nhPDOV zCBWpPWkW?@*Y5@1 zf(5PP8}0B~hk>e&9ckanvI(&QF(~fXabO@-xh>rMz<^bTiaJ{zu)_)YZ&XECah}pk z6PhQL6qz)AT^uejCoiH@SF*7$8mB~mY9xM`xGM39M05PD_(Son4UaV3h_C$HV?FV{ zcp)B%JsR6aUH-W*|!JXRpt$$hKx<^*^uwQvG24DfQ{hQ<-mM)@7z--j)7! z`kU#^=^5#R>Rzb3v+lyWxpjx7E=hHzQppFCmnY9izAu(f{W*14^xt6oB7WZ+_vf6o z*#9vvtZEFYYN$X`s{=<6JWtA3N_4<4TYuDV@^b*FVky^j*pcbf(c|X!3x2DV2T&8) zO105OMsg8Zs_|FhS;Lf7}JUO(WDnI}(wI~uk>-iodX+)kB z|8PgOW#NK-L=N!sY*L!H-ccS8(R|%!>cyXVLZWKZ*Av)@WHnjMTVFX|Aht0CDga80 zzumm`A9PM~6l*+DJrx$RqqORHg1&j{PuJ8y} zjow~nhZd;$kg*U@7t5pofqI|EgN+J2w1_GLW0GUVAOpdI6Y$84!9$C9c$1G%dBDaL zBYv2&uN9M2KvemMRiK9-BLEbQnMr%Dr8 zIC<-fICR!I_;KKv8*EpS7A(Ngwiz5QdndsE8k9TKiG57UUlKehcNZ?jcvypfg6`ZI zG!OMZ-)nDzvLUL{=?KJ2wJZ^Sh`xW~Z%6@A%MxoMo-M zC8bjJYY?`sLp;9RM=&|i|A8WvWZ{jN^T(^U9wtXE1i}t)R0l$R3cpAU zmiQQ&acW2o1gu?={ITva5cE)wia=(xCJ!K37dwrLGNAf3h|HE2G0#URk|WAcwfh)l z2x{`sA`rTJ2!#jrJ2A;m+4>k(ZIGQbPiU}|46}fU?%g#xQc$B*Z-A)U8`v0Y#F;-G z@_8^T(+0JOgwW|*Lk~bupA7fgKRsy-1Y!XG9Wi*Ii`V0!j7o#ZCgvCi#Xpx!9i5z9 zpUT{W6a0sh4at8dzn}ci)FtVj^dYzf;KtmA_0QB_oru;ijQ=41xgfvv7sc;4>E9%- z@qfl%c8;I;Kbn6wu7{yG#wa&vwV^=^2|Q+5HUOfC6|g}|Pssu$QPAYQP+g<9M4mN~ zHFgs;`_^z=vs`Hhv6B zHChza)>=CTgs9Q;i5gt4?`iI6LGDPs?WPm+>WLAsDX$IDEA=}{send1@xOHZuO)`s zY1sn6H?XjsgrD-lOV{YFw70nbF<|=`iHO>)9L6_V@xz@KIA=x4?UU_rwe$k4yxZCU zTn$NT0N~Wvp_2d@Y%Ktt)uhZ%BLPIdiw_Ahs4bwdw$OtYMg&Md% zGJ4wufXs3r?t8Xpy3K2ghlXYkZR{Kxp0}nvTw2#ZG^nT0IeMEY!3O(?1S3G22XT%( zRaSC?aWBT=7-GOic4|MTPv2w>5+x)7YAg`_pQnVl-Y<|*sq~ThP)FK4dfU6i26~5h z(S#Z$JCJs1pgS>{DF5sc zL~tve{vvg9xifh3_!Vqdhja>M-{CY`pmd!_N#`%xMsLGWDrj492Mn6xf2Xe$q!IJE zy_rc`tz*3y?GCXD4XyYYJ^5on#~5*7l2S;GZA{1De3N7+)1Oi;S?QqHYkx#Q-@_B zYHq>YWWJpeWjJlHY%nNwdg6tkL}@MN#z5)x(3G$)kwBCcMPCk)r8yLPs;}cuz7hqE3I1x%R??P%ut;DNG;z%sN2K`D#3&TC2U5D=dyASnajK}>3l?4 zDTIL%I>Rvk@|3|MO{CT|XO`LkK@42;Qz&%SLX%{eSZ#*_-QsRDXWvcbV%m^D?p2ZISs= zBeFAodh+??*1GN44cX}pJ7cfJZjGHAdvEl?=%=Ey5|<=SPR>b{>dvV!1s*9_q@29Tw_sSJ$4*EXiC6W2d@J}^(Rjx%oWjJ3&Xhn+ij}c~ z6zglUKx&p&gUxrn(TD%wobIX{>>W~|gL8zzqh#_TBUSR0NG z*a}$1*3LI|-Sy6g!*i$11iHPYRRG1mLxrS}f;gnOARt8*rtqYc(>{%gN>8Cl(Z`ic zy&!e$gh-(>r0R;wDd9(jiXW>a?jcog6noDAt(Xt?7JyM zuV`y;ps9l5;lc4agiH!jtnw&@k^&z`Gbuo7<%CEKiBcMZePrU4FTA2GgM|rvm?)zYg zC||JkoP~rLV}p_TQ}TvrIXf-UVr($~m3k-r>D;#16Znt+PyV`S^Op8Q4m|MaEp0~~ zeaO_QJv~d77}=~@cW}f^nN!NcgY^FvZR}sSxjZ~j8th$o->%jDBRwmcW|h{h7#g6z zEjM!N$p5 zjmMz`*3#61zY53aTbixrLNlHk9vK>G0`cBeO;&l+P;>v#^t0w!g*K~b7m;i#mwS7P zJ>^ol+}_u2;Xk#O3whgW>9JaSx=XEn9r<3nHQ&?LvT4TIYtFJ4En3rG9@#LZch1s9 z`JP$bP3_j|GtWL_a7H(TIdjGWyVTP@vw!~jRr9S?OXk_u*&~yOW_FD%nz_+hP;5JQ z?ZScn(z2ee$x~;q*pwg1FKg@VDYRPMc2lXhrMIcjUFc})w%U7|x?6hk<-TIRrIgQG z?JXUJ)|OIJdrzy~ROl_YH+AtWSnethuPzOqw{U31Ftk2c?(Z!RpV%n=)TC*o>zT6~ zN7fHQ(}ROU8&GQ8P;Q(K-7oJi3ytUP4p-yQdacweEnwYRms)X`IJX|?*SVzH3# zD;G-8c(K^l(_s~gsMEHUy34jzF16(g?d^rlix*7UuyN+n!Omr+l?zu4oxQZBvu)M6 zt;4-52Iu!LTHCu}V@J=N$!BkDFRWiV+_|!Q^}wc$=XR{=>nbliWBSOdwNp1Np0Z~C z;syB;yQ!(zo^PFBUf$Bt4fa%yY3=EQHcMs9A#~qUu|k9O&#qWZTOVF-72(p^jW30zC?RlM_aqGEdqrX4>{`4qqk&_l+67Qn0wvq(je{_ z8QIuBuz1D#;pL_ElHK2p4=nDxd&NNiiH-groV2(LO7ALn4>vb1?H?HEZ=60*UbSv` z$TRUgnYi8VDm>p@Eb8>#-CMRgTJkM+Z%cb`HwIlQ_Lj@}9?w*c(TX(@K=6g!5 zWxKVnucx;=f5zM)tIIlj{qp%OXPjMZ$!{7Mn$t6|YUPr%7YvQ`t)9PR!HVwkqTxmJ zW)_CmtRCo{GBP;aKeubKz1nUo7dCenXPrB9(}LFW^8DK3+-dXM*3VqhvZ%#s$4pzj zeN8>37FcgvM^96!)Ye81beGEQ9mVe6B9>TRp$~@K)YH=53Vrwf|LnbaoMdHnH-2lc zuI}nq5djfs#Ha|>RNZ@PW3~6`*}G?Nm9f@drk9ysW@$y88BjF&MGaw7L`0H^1{fzW zjA3R#M%uck|SrKl(M zLQYFplevn%sV6nKck71HHC@|Q<|Y?LlMCJ1-J{bZUHO64*;OOCl?y$6eO()q^Siee zvU=~>@Xk#mzp(^Ht>)K%DBm>DbB&SSPRRfIn(xTJ zm`~(e{db&suFTg{D*^sVS!Gq`SWa>v-3b*rX(vO_!PX7ygZQdP^EmdPa4 zY%!hCQUrg( ze*b~(`}MOgJm;c$(TJP2jFHorgTok}pBXESvOc3?2-^9Z%Z69LU-WM2<^6KYx|mFOL+Y~R?wr?_!pP#s)fo>9j} z^~uTYs}@p2EBjXVtSoHpUcGs|w=g#XN0BZUvLzko8X2-)DniDUd@@nVW|P%QsRR+{ zlGtw9d_^Pgkx%G)xtz!qb9zFnRv=fclG2hIj>1e%Q*QGgxNiTI=ln_jqWw**jL9)a zw-hE8DpR9{c^Gf!&YhL1h04T4d*}S@Y-MI0HspEVk>#hg7taAur#~;nkwyz(Z zo|`tNN{#JcO&pU(EfdE%?k4|KxvHh|=>kHROtw@lshS2>vSrwKDwE3;HT+vj%Yixg zlx!xWRdTtF+pD{`=QeFi?9O%Vg9yjAuU@}rMgNY@!OH51uCC#UZ9P+&;`r=9vN}IE zH!(gnomn@tH#@hhTid&}XV*Y-&+x>W{Jxbt)@)ly&*axH^zGWG7n3-}^El-SYDQ1M zF(A0f6sm9>$$Y+~rQyt~8a7#}QY<8JfFN9{WXlO0h1EnJ%g>ckIjvlQqt=q?Y+m`e z|3G#BRcBvt!9~}x-h|}u+b~y{nw_01l-G`x_Y@}FG!u-#)WG(D+wH$H-ASc1-MiKf?~;1$OhkB> zbPcGprCdQx74%9fkFXRcOg>djX3|9n7qLN7#U?Jni(@O7^Z81;oXO@!dv>fz?A^RR zxprb?e&^od%5*xtZ*O_NU*A()w`LF=?<&u97B=S!xzyN-ty}V=1C@NaIG5Tp+uf7f zwqtz0Z$%~7H<#KxzkVh)H8)nt?q0K|n1=sS;h%F*VnT3kspCz3=!oz22oCyT{OE}X%cnpAG3Xd`p>g=bzg#u~99+EqA?5#7yI zM);IwdT#X6cITgKamV!hzLELLtYx<3pi_D+S4nlGT%(OL{se(UwOS}o=s(|a2DlKv8b0ynNGa^n4L%rZQnheU%k3>Pol7TXw7hH&Cb4wNmXCD zup=?qJKwpXGcmMddTLTzJDjZarpMB1YJ7HQQQeEPJ-?~CVtS?8y{mU;YCbnVH#*rl zUCbi3$l>?{DVS}#l%_N!mq0%mu(oP z!><+~uY);H;drbUa8h+nz?|y|Sk@53X{7=Vcs-jY4~+O4Mg$3G@;N=Pm-1RFS5`Ax z8V5^7$1ymvJ-c@O-pQ>Sw^!Uck6;rF$?;YK{Zgi|TS1E1Y*F8Mdy>IWxOg6n`cp#bIGMmn)N*U~(M4_a? zE@6L(LJ^5x0e&}!J(xnsjKDvSbS0H2r{SRWDm+NORIDWO#T*=#ir}bN3BxYnfIs1n zhu*B56S~?T?`io%%a>Z-*`hXI5c_uQnx@}1-P?3+^vBU#qN^iEB8l*C!k-FX8@@F3 z{qudx`6+*H{1&Y!wAs}~`_6o((mrdxH!t8nG7rvab{Vx; z({n$z&nDl0{Ku+QBRM@(IiN}{52`Fs;i9WnU6iROHDoXYRJd*yP=z-HoKmPv-QS>K zywKy{69Lt0O$w5g!Wt^NlVt1Ssbq87e~-&*UqZ8Zu_WNi0~LC)1jd(uDhE{bYSFwW zl~#w_s#tE_r)RNmg)Q0YL0=I7;Dl?GG^6O~65(mZXZZcHllK29=AV+RCWP@%^P ztz}sPDyYz7g|;E8Y{&7R&^|Zr*nCyHnc8$RbgwF0LM4)s9m*C0gFO&nQ2VQCq1A-YY6L7Rmg`fV9i#5Pdcpt z7I6^*Y`~Ju%U=&{;AJ(}X0HJg-uQdRgrYagg_b@3lik21G3D7%JY9*RyUQGKeEcW# z0F`Uh6QHBMI!l!tz(-1@cWmrlRH0Po#`0l#rQ&9ZS8CH4&Z@i^EnQNv_bz0#xMuXM zBkU`_Z5#YeFU4qS`Utm^V6=40*vM#IAYvbIBqBQ;&(M>2&j&u7t8*`U!c51_Jd z0R57qxoA~1J&M10J^qtXOS)1WFSQMhYh3QxzlK%OBYyctqlT!|=5a^tvV-;v28D(N zGQ`pn3=zGhd?OY3!)vt~e+T3@8ag<*TS+zkLE{_0rl>q@fARoqLk2lw4C|;JRO}ct zk_gUR?%^vDx9>5%>~cE3xf??W7k#ascR5`~v%R8ZJZR7Nel*b=6V9X|kzq?Big+}+ zK!CU%MJgV)CZ2$Ctv2M1?W=3)BNmdyb4ra9ZrejXYCdxHR_+jr;zt90LkOH*d;>to z@u$#{RkNOLY?woD-0=E=wKuKpA?NedJ{brV5Y836w6W7UE40-D)e=nCK*f)^=s*5c z6r3AdP+C#gQ1neq)^@Q4pK|6>hz92Z0pf~H+=Ic<&|L1IMFwq)M0T1sIR?B%;s=Sw z{b8lUcXv4WXQ2xtebMRo4}9PD-R=Kl@QuOaku&}O;J-aE82)zn=J2NIWsy_SFSK;w z+W?O@AHbYHf9&ztfmm0}-}HFXf%u*AYvbp)J?7u$KPT|>z^B4zhQ1xTIkX}2KvP%S zWA(r0UpYVDD;EDLhiX5&X5i~_o)4GS4D^^EMW7y)jM*!}Wu7_!5Y(HEbFKhfW0~%I zvhMqrkJ+;z>PYZkRtLnTi<5BLUH#*ALkmA6Vu#(b%GMI6z5wrHGT_W0G?#<6Kk;*% zsvjWhZ4i!z8;BOTj3)looX8^v#FeLhwhlPb#&^yd&Z9DxL6(JvbcadYjc9;JyS4{- zb{tl^vV0@|8Z?~AmX>hw>Whnmw2o6>qK66%7ln3x zPJfZTb&GPOYtcx<*Rp4yibbJfx5%RS!xEPN3(DOkMUAQb>|7=7;wY4bzF}DmwD%aF zLCQwQ_mbgtz;8GWcu3&Kd3ku+156l1@M&-GJpVsN52q~u!XDHUr@oW}ylIG{TcC$e zOl=HCa@;-vTr3w4wYegM8of)&+NR4JqS0C`gt({vE&s&B#TN1Cn&WksJzaW(-%3vgZLT2Di-xrkNl!&^cj;|Yb^)pm43~Q z@VYSG*YK~#T7E`fA~YeOl6T8f7gR!xh z&}$H)7r~}tPoQ>q^e17}*qa_~oAxH7Tgdij9&B6K+mP+gJlM7X4|n@{s?`{ha>*UQ zHY-|s9Pn9NP=Cd_TT~KJKjz}2j#H00gIGo92?##r1dTP;qQ*rMsIPD@VE_Ow8fcHo zo5G?1@ur3lD5s-R%O1#T+a1mv_IGiM0ssPgE|Tmxbr01NOe5Uy2Ejj`OPsnV(1>q? zgvMl0?KH2UY?1JN(~X3hg@t(V-hzedao>L_7y52hd|&e2+I9gZ{J+2T>Xx6j+}^Ub z`OUFsW7}h|Z2C&myPCAfcLJ~X-|2sw|24tihtH3+M*pw>d%@2H-yS?O@KoTo&_9Ph z5#3P#3l5n-<>a#b?EK&S5B@IaDpKZ?7wCOe(IpRa=PPa+P}!9#c~metBo}P{q5_p& zmN`9C+NBTNM_I=kXsTDR2h(TP&s0jI1$5BbGrVXFI0oOVD*ZG59?bwUf1k?H-v@Rn zFq>K>?7a=@+E+br|M?gxO{2w{WG9QMl-gnHiSap6AUMxL&_6R)?nYr?2oDH0j?PTa zkBn{{o2>NiE#ZBIGZ_QJvFi}zAGrTDKtLC6O){fo7~uW~?spm_IveoFe!T$HalRu7 zWZXEW8a#0S%PevEUL%Q$S{HDmz!^zMQ=Av^UuuX76j6SuDd^FLe^&qL1vDkmSt)v| z2kv)9wmxcK+tQwB00H6@5Sw+<@5m8vFhd)tGTu=c0`2Vf$V_4pY3?yeiVLc=L|Ch%+#Lvg$58` zZ^=oK8v@n{6*e#`GG0AEovb2nRvxg|QZEQBa}KJ8pvDveGG#*0F=1@EfG>v?f>0f;*%st4)f(wi+uw`0)M{S+t} zK27d3;W!LXS%Z;q_6FfPu31*N?sN8mid?fNM@ydtz!}M3NC6d;Q}-r5MM?T(TEGG({Nk>;+Dz9Az0fb8s&+_Ay~U22zAHe5Udl^VLfHL7VG

gBW3nr~paPM;IC?kRaHiBmlHon7e5U&%4p!9b(7+n;ssqLB8h(!uJM+zN8eY z*0RoZg{X@ILEv+*un9aU{yFY6S#_u|!-vs6ZSq|aArO6w5T85Og4iNL!1J+2q7vU| zlQu==yGjIsC9)tIaYD(yDcxTPAk@>qZV#gJIj3*pUI7GEDSl!JEzE9NRO%}5mYq~Qn3ljc&zXjnUVI=UZWf?lL3*;^kSe2-gqg0YN#Pv3jb&T(3 z?L9-%qM*otaMKAU#Ixll4U8N`eL|i{Iy$T*w^~G$hs1TEMWjX_)0CA zBaVa`hztAlD1%|&*ji2@=4o+Z?jTf&G1-@)LPGv~DsnXhK|d~Y^t5AsAz;q8VEoUa zp|jQ$XYo&&8OsdqlyfWttGn)SAb3@hNum@aZ<1Qm`;;WoNE2d6v@mKKt6vq^_*}?h zLvazXV3MShqjoE+@*g4%S7Z5H*r6hVh*ZG(!<6G0I_VQ3#1UHrL3gUs5L)atN{Ui8 z144{AD92;fPWqsFh5;bshw=o0;+8x_Hg;Gk;ryu?{Jn2l{Ck|EtnF&e*D0E#beE$S8mxD9m3CUyQ8bDX>z71jgq1Q(3w3%A zAW0H1jzxI^t1W-4JWu(PDXrg&0!FIG?2&f0rB5kQo+J;V0VGN7SO$ozZLwhlNsH2p zh9r=aaHk>|(Hytsa{QnMBkJT~x*0I3{JR_P+^eT_{5#5jQ(xF3jM(N#OkfL|=zZT1 z(IXpTS7fN%v0WF#0tkC1s#sC=%@!5qLD76&K{TgfUxtbi4qR#R?c#utxw6hdZTpDt zFP!$WyG8DyLN2HS$aY5`t}5iUPHrw?txFS`M~f~iFRkq(%KuzyLx{@~Aku*N@+Dp% zz`Jq_F8@s{(IjZlM?%V&o!!W;P?zR}MPmWWHHUI>RNPVo!D@t3%A?fgW7w|Ci7S33 z6f~-EC$$Z7SYU*Ru&$9B1~eQB7Koq`7m#@T871kzM`?S!?LhqR;+`~s&vPL&t2w;cpAhzmWQ|oRMF&k2F#oMskuUFZhFS`3m0goHgraBL{+1z z{ESm&4A6hE*msZw=qn$5p0=lF>h!LZh+Y2R^R!uwXS?#$Eoe}uKwt^fwOoxlMFpOz zo6w+6Vcrs`t44hnyi?HUnYsxL>J;=ZfqF`>@lJWHXX++&_QB^V)i$m%0%ikB4~_n$ zHkeIQV{@Gog_%jCAI3Hr3KwgHsj1U5VG|l`U$7Lm5qVldM?&V6x&;mD=$i2^bb3%x z;~h;i-l?0=piVU>&nm|Shh^@sUJ7*+8q_H-T>^FUIs@i@_EM;u(4c|xn_%sX`p8hUS98g<>W`RG!p zo6w*hSsHcC3M|4)p>9HhdT43XQLMG4bAj26Yroy;~h!A=XYAsltlO=z^n zf7r|rBqu^yu{^Gh*!;^F|KGcmY=fS1GPrPfAer)NOt?5POcBOJWeCp##nS}Kn5Zb> z(UdJ{P^SXL5~y3j=5zB)fyX^*%?&(s1{7Os#ygxJ$d@6V-^25mAy8nFb zazEwROZ=?zfbjqOHYjDgn)HtP0!fNKP>n_zuKuI~Lba<&@2IbjG=d1ORm!L))#`}v z6^LLc2mf6YfTZkl5_6Mm5HZGh)L(qGckI9QMJfQ8rO=xM8pH@&aMk=rlq#~)+OqyZ z03jmG4r^DjEX}Sb`Tjv*-UWmfW|wt+-xNTwFz#9cMbukgq`F9r7dH@|7Xm?+S>t6u z0Kvkzu{^{}6^UgHFXz=H%+6Mbb9X){H za^lt(?dv<`m#$Q}t8oHJSybv@2B`_lj@|Tvtgy!ZK{qOV5t*ns*FQIkAoxU=U2mVl z(~fpE^eUxD*`J|(rXp;bKALlw`-}ugthE0AodN}VjKQgq7S+E9AM_P2cCQ#Z>9atT zBO(=mFslL|?^LuN8|0K52=|dJg9>V7H32^-8-64_4;)1IdSnwNMCB4yx$ds-C$r|(U7xPAg&AJKp^55kfzi?KI=+_^Lw#> zRc=FWQUm#w8x_vGYR#WiDo95x5H~6=AnH3T8M_2Xc+|+=8`741VZkQyM>iteMY+~| zjiT+dL7011bAO@th|?rd*=vEgcvqNmPzHSxaX=t zh@7}W+(sFKVUjN55?jlO5xZ5(cZJ)sxSnZRmeXYEyTWZ3W|{&2oc$75piK2XE%FB8n!ZR5n)?UOvU4>mEDgT)>WNyKtxttL9|I5 zqEfX$d}2sNlL}oHRG0Vx;UdWG+D4g#J~;Q^KKFuvi5cx#3iOce8e`r zXz{?gO2Yq5rR^b1^}hf!{U2%F+4?8(e~W)G{@@I`?C)BI5LIKB(;%h=tq zEwPrS&o}LEx+MCe@RiYb(aGb$sNaZ4VB!$S94W}so2w41*&ZpD#=;JCMsmuA}Z>NH>^SVr3YET z>9b*l)^XwsTY$<4!j$jYQxt6J!soNnC6R2liGSApaDfI^b<%Nh z9&}EFLs(}*s3=A8Y(63?Vvtf76V*55_XiEq;Nn`KqLju!<;C$DZGLP}4OEos7^q}M zAz5w|uX#lueiA9ra-hQgIO*g@q7N4af#SRCCr(moWb)x*f4HNfl*yE?2S-K~N;c$$ zb3bXPQZB~(G8Bl3`Cr(o4WuQvSn=XCQg56N0C(6jo zMR_>rfr|6Tgo-jX6V*)~R)y;jE&_m_oD5F1H~O9it63sW37kpXgT1+<+HRrpd2m;R zN;slUUb{S~h{3nns64nU6sm>$sS_vP3RK2v=Mu1pGy7=&zr_;-?VDkHxgL%WdTB2T z(GF|9xJ0_s5goM?)_OQp2M`^aUH|i3G8Xvgq<~*nh2)e#BJde~jB`j2k zZn&DQ|7l0MQgMWZN_+wj#nT>_cg8hT_$&f9(Nzon(C7F=nXOzyg+zi&$JCBTK1%z~ z^gQ*_4HleXS^jGz&JKeH`Ww(mz}gjP+(CJdLBoFyXAG_oAnsIAWJ(`3;xr3}b1>nU z@fjM^7~Uh#2hDY1t0+29QCc9%igqaYz@3FTK~c!^Iq7OZWgpp6pKqhhiB%DgoO=Z-y4*8;q6e|NYmkl!bE|n^5VB$$IFTtm za)%Qs$yy>YNG-uk@~HPe@^R`W@VF`z;Aom1g9@v!-aB1vaB=E4@-5rT!2|7m-iY>zWc0y%mUGfaViwU1M zBvf7A8AQM!GzSu@*DMJY;w#pd0M*CrT+j=HRK{SPKB00haiq5zO^)J+DiW$C><=mm z2shtA_l;D{fW&kKE;C zSsqX&fsH*mVWM|Y7qEFoeNfi#qHBOYSjsSnK=`f%P#K|`@-2;_JtQ*G<)Gi=X7_MN}Dz*@wl() zEWa-r?K*kS44(e(8JpNJJuy8uIzKbDVb9pyLS<&6FjZbrnOeBC-T9l#HmqxZXZwbY zokOeezlYYXY44vbu4sRwnoQ*r$z(E}x;T~WP&<+xseE>JdNxrSO_X;e)XLuJj>h_N>ol$8)7UYc_PQ+PZGr;QDE8XnUe_?Y_i@ z^~J=DwkfxIxT`X;FgCoqf7ABL#~&TgjUcp2|bl9C5owHF`?&^scbHv&Q+47u%6MA8Q;VH0}}^_&$;-# zbN5GBDWBtSYVxfsR%YfZW3!d1^7Kq~Lt$c}I6pJeUzwRKOzm4)*g>zaFKuW4>aw0* zl67fxerI*6GSmM0_U`G9n!G!^Fj*X<0BYjaI@EN^P28ERrXw5F^XY6!FBXbLRZHiS zITE+7<;$sD22+pAIq+L87n5l{tyfm8?a%L6S?Q|m9h&Q(>RL0jFkVVl_aw4vs%uH3qMMBS3wyL#oWO)J-HgPqVv zZ?C?lSjkt4nM^fNEtViaEmuwCk`QICP|f5twOGt2wQRAF&g<1mB9&9|H)^hs$R|s= zM5&rjr_$A2rIgNwwPY@Y9D9x3#!+OWQ~WnfTEYPnRgtR~XQas>ulswVQqN->e5 z<)k5W{2$nCSr|q#QK@E92|b-w6S-M>D3Dx3wt*X6!+~^R}?2U?CRUQ zy*D*6-kX|QHL-GbB-=gMH=LZ`zHax*k@Z`~suNpt$voUxsZdDdvXGyyrt^thQA;P1 z>0Gj$RW(RCQz=wa6)mqN@>wWNFBCF~LRK#%iUqxzFC^iH^mJIw=-G6}cjCZ~gN1X> zfe$&yMZ8^=nW@73mcm4Nc65Hu@*UHokniZpBQvuwc(`igk6_HbT^rhaCn`JUW~S%x zg_EhV9qk+DD%HxA?XeAG*7bCUYKdFRxQV-zNmjGPG6Y)09xi3lrBoqTD(d9T)smJ= zXR^s;uAoCLg;XI~%&M8>uIj(EG<9uhb|K%_y={8uK-a3(TROEq zHL+uJamV!Rd}*Jya-vin%q(oJY}>eRZfIhrXY-!X-P`x=7*2JMZAi=%2PV5_k||Zq z6mxLYnH=Ia9n=!}j9N%!U@?_+sh}3%&EPBYS`~i0oW|dz;7tlSHJ8Yy%hhTnmC5T` zHLRvpEZg__1KSR6Kl_3UE*f!>wsRV~9E&v{V*ibKEUxXI9&2AynJSHrO^vmiE;^~} z#(}7Jq+HKKY`sFVkcP)d>shU!rb`tFFkK=ColdDmU9G}?bJk zZC_v6m+M~`80$}NAM4(+W2e@+qARs&ATg3z+qq&xX7k=$-*E44eR^y~uD5sR)NFs( zcweHkZ&*vM?j72k9~bZ?8LgB|sKtz)(DjU(C{|(BSbi#(#9@NdF|6Tx2deIS^g#LGThBS~%!~Gi zME@M!P^r$1jZ~({T>e6=WpD*j`HC=PBZOrz+)w>KWmA727>h6+DSuLd% zvT(g=y_C$Bz+1Acl~Ry%vXU+4a%micRYV?{RJEASt9mNay?tPBYAU%YJJwyPbnX~V zZ0eccGd4Ri*p;7~Sl79$dw1__W^io%zJ0TO1M0dxJ?VXFdd0R`ZCo$qy4GzN*xjRz z&##~D8r?U)ad1o5-s(cn+zw64si{IKm8c^2A$OaE5$8%cR}lNCda;PJ7~U(J%Vu!~ zW;2L8iZ~7Pg;X(7%9IPKbPCE*i(v`?;F6CWC>`8-_QhvjblrKPNA91Qo}DdJtJ4#3 z4wkSN@SiER8<>R$zO{i#nZ<)k-m`tr#3pw zVdu8lskAzo=d8In;$Q4Nw3{EJ-K$v;LzS3`5n2jq0YSvnSty0aam13@3%9l%tY%yC+=(%z( zfvB^RNM}mvR3($kR}gQgx|YlWJAZz&pSy)GFA~;SW?boi3A;NM{Q)kalIb4|8Gu*Y1TiDt=uy!RPl2r>^x3BIRUAwM#U`?`b z{hma5KC!BIbnVE#%G{=M*Y36JVV7gWn+Nt~JIA;5tm&B>S+Q^Ru2Lnhr^}m z#tRcpAaFzIfPklrbFQrF83+#tM!uXVl*;5tia6^uO-(=LlI z-ex$7GhLj-P-VW}NmzEfvM@3NyS4t+6z|Z6EIoJfJw@5#4uaLZQBib z(|^`1pPX|IFbeqQQYKTZs%p8ck8>LTl@O=tlGIXzkpbJ<;wYuTh?suogCad zymI534HdP2wwNB@ml+?N99X-sb?wl;p@~fk&$y_x(T}h8@n&{iSerVsO zsq~id1wFr|vO-@-OmUYNAvn%uCsql zvAZ&{xuCC_8eW%8OlI@t{?+RmMRw$S~dx*g^m*iwUSDdidb6_{sYGvqBR`R zh$xVhBDTQ6p2+2Ngd=d^=|T#zo}LV=dDu$ccRU{cjB;LhZ!A6*4@N!}*&Y5tk2^&eY5+8U7g#qXeB z=x;-R8@OKh4F=BlZFl=APZ__%OsyfY|K_Jrhc{mxv7;BU#Zib7t`i8tes1Ot!4|?W ztnucj(b>8f4Yndbp4 zn=`;XSTpp8;=K3(>*ilvVAU(xhjcawD_jj!RCE)YqGBG>SrA+=g9-?ZI%LhF=x^#@ zd6^)n8L|~wHFTCjb4F?)zZO7HUFI&&@B-=Pr|oBi%CGC6Y#CHsKtSc@S&J2yy+)s7 zsw?k;!Y}MD2Ol$C!(yE)Qq!V-q1t@BPv8S8;qR%#uTpM*lMTYov8G)}w~*|f(g0F@ zxef9gfpu!JD68q=6hkESmHh_R{-2JlmfGUApXi;$iLBl`)^`pf8TW+|< zGL%_PSa=`6846}gs8KwDzRaScFw;nkg#m`6g2~A@zlgp9b7zTE@U1Am^M%%hHlaok z=qutctJEff!P5y7W*pcjTMpU+b73BLL)=9OE$kq5dzfY~@`CTk z@w=X=U?7Jn;!c5kKyX*LYSXus>P0pY-bKQ~urO}3kQu+$0pT{iD+sMCX01yV*M&Pt z)=eN%xaA;?yfc`Wfxt&fZaEnB0-=GCD!gz_z`Xau{X2N!G*7%!TY&qC;s!#R-;e%= zMrKd1X1LaIK-_4@HX`q7Jji5KqLHn<&rzdjE4XOmXYjOqOZghz`I@Y-!_Ucq;fpr> zc?v2wIJ-+U78ikmN|m}hOe%F>=Qct+I6S;eXWhLT&nOz*Ys-U>jIVEQEMxkt94j$Y zOCeC1p1Eu&KiUyBgTNg8j$2^MA0LHBg z4*b8di)-r=4H=i{d`oU?S{b31ad$(e4s+qdE*;2~G-@=f!Eo%m!ay(Y?`p)p0m1D` zwauqgofwQiCIABe!m_W?19*CTXKIp{m;u6dR+IAIZ%a&2K0w5;Gm*Ve7g|GmK`$@6 zFnXC^wM|SB_pumN7?1g#mIN6P%;CA^hW14k1}gk}0RlP00#WYgGzke~m=?SDsarvF zPJCW3MyeoKa^xc6Q7XO9%#GmqE`^Tj9_Wu#^`@RRR%{B?SetJC8 z#1=)P4JQtu`j9Qay5~13b4nWZz_O>H7Pw782I@b9#u6ys-B`4zi(4dI0POw{MdrOu zW7>%$Pg6IoD{YK5$LnqOIMIL#>%G4rhX4{zx@Sk*fi+Pfe__R_0u>_58mi+`txBdfh^avTk*6u0^SCPga_m8Sl!9`v z>=MX)*>oB~KTtX9l6k#m7$i^$L-4fzBd6^4RsVmEQ#(-5J;PPsZ1}Z*$=|A!-I`TZ4Ho_pW5ia~|#SR|oU#}V>p(l~zd$%LM zLdsMl{u5bC1S+&ka>spCSI)Lk)mb9=E7{ zkzdnt&E%{8StOmnrmVQbyzj^<7=!!(fZC~vav%33T8m#>wjA!B1p>}JZl zJX$EKT?h!-d_rx#rfyZzW<|4d#o-)BPNC4agjJ!=DTW31aq7kC!q~aj2kEwmV!y9a z>TO|B3k8EnMp+BhI*y!*G_)Q-&^-;KC_2*KVvEFsgTrfEz66H!(>0NTE#PL(l)9H_ zQ+#(tALnx-a}T0&dv|r@S6i%Ac{%DZsD-zMc;M^GnSld-W6Iwh&4bP1*dt9n(LY4r z8BIlg7WrsoeanyI*S3B#{JKzg@V|p4d<($CPx%X%pPlNv{|CHjcjUDHrO%pVK7pnW zdU468c3SI`F{O1W;1D6l`SiIRJaR-V`sgd7JOCR=tGGTj-^3*H^XjmLgl=g^MDFZ-T0R-!B^Fd z;PZfrPA*|pPQETLD+>1bDjyi^KlCUSc|94aPVevF#n@RX5%f$C*8s_pWq5T$XW54G^Lqd-OC*_HUzPE z96FWRR&@p7Y=I!YKD=c&)(M(Mim)3HfaE<9hLLs$&Rj$wX;8IZj}5)-73>2Z8j35&Atbr`A7;dHh)r>tu643QfD_>z6% z&~X%YO~-eY{r=yK3|wV}PaN7wgDh=w47hFLippx+Lrbv*pyI!9h|8EmkJ88~)Rr&-){ZW);GtWjh}2;-SX<@9nBZU zzSDHFX>W8*)F0j!`U1Z9_t{`Ic&`7Hzs>gr-vYo+@8@0sF#p^B6NjDXN2a(#eOCyi zAbD=~lIq{)MAfX7&Wufsv=?S7?d7rALU95QgOaMAz%W_^6}5+Q$5-G6#~w}(6^5T4 zM&4)c!l9Smh4!MLMplQIsd<=Me#{I~ZnCV&AB>AdrD9R2EO}oPrgO5A(gK$|LRWt6 zfj=7Q!IUP{dZC{lDiYO3OH`60z)ex%q+ms*g*xg|8HsbyRvnyQL4VSF#K$P{kDLj~ce3^{uCy8S;9My?;42v?4qsuT zk{N7En-)$QjW+xnrsj_s^J`u0jUW&(uzb*jsD?J}3ZVm{p-sC&P+Mz5n|6gDo6cAw zk#_keD(;x4hzNBeZ#GSsaLK|NA~_5y6PdzgKFMOLLmbG~a;tH>YCy2xoUtId`jHk- zIL0p3k80V1P>Q1ErtIa`-R3(GoK2I|leW}l<4}?nTqS4IZTY$sPBwZpQSs4#+dn$4 zL^^tOMWq3i_c)DEp;XL860m9SUda^|De4kSQOf;xf^5W_fS^&>+$2LN>P?oSq;BnN zI(J89=lRk>Vr^Ai85KM2jZ4^Rv?#6y2Z>NQuhCAUHh4}VfOx$p2o<(qD^NOABE~_S zTP_%X-BK9GWevM+7*FZqFzA^a8xZ09e{WST@=XRK_e6%n3xQ_>e-n6x|I7Z>e!uTw z-(+|o^kV3t;IZIL@QrQx)>HoLLXpsT>vgStt>?#o6+aRG^Z2##j_?;kxt5={{9VhK z`3tq&SrqpIhN`iB$|{kB@TZsTom*j{VlGn%(G;TL`rO75?^`sAN}pCEXnxK z^?(Y(;XDx*b*8l_i5>}RI5gN3D_n`Azr~%ZS*W|h@k5OP`i?$}ed%|%Ho z35yat9TP`?gKXGcNv;6FUn-~;_Z|IR)mnfD(?vO#k1>G>)hdsyAU1;1+1OJ}9Q_>? zs|+_U+M5eN*pSlOt&ry3&TR z|MuOM2t6nRrBS{x15D!@h2@>bODH$5ZJQuMxu2EXuT)+ zmk@{<|L`XhAds7|i&fjkL(T>0k7W4U^k^MNpXmdtMuv-zfN>Q| zbk&BOTQv_Rf-)+Xb85|Z)oH^6AJq5F#t@_pglC?u4fmgXkF%l#-);-n1AmB-c>b^` zdg5<5Tn{FKP?isoU?R9vZ)74a0E!amJNkS3DqNa6TD9N~IUk)k`g;^C-Ko0*fb=Uo zGwynbUwZV}Az*sLh3B0ajrNp!O6zAZw6=g*erE00*q?~GkSwI>pYivDl7FA7{XMQ+ zWbh}mwZF%`iqzk0wZEq@@+H@g)}1{4{p*fCyBdFgmccIu_ho7|Zi`Q9@T0%ejy{V> z*O#uzW%bz9j?Eb6Ss1BooSt4WHZsbJ#{#?P=(BX#V!K0}1I5Ce`=7OqI~&te9F23C zJDd=Nc~5rea#MIbiiojcvf~O+tCSksj}1N-JIsIz9+%~U`6_`tDvfd!K8cM7zNDNV zSO`Qv9S%328@{9Us`zi>e-nBnv@>*d@VCKF1>Y7}2oFZLM_(EFN#szZ5_xs(^6>v@ zI@NSf)3%l$w)|zwK+9SDukC#EhkqMTW`$quLjN(#rTOlXI4_J31*7E$-jO{(^FXz0 zc~IqmiYh>cdQNXu>DYyJBMeT9K^>?*v^=ZQfQs&`z##vL?FRN|i5-a-Yk#R^>_X)a zOIntI3o0~T-guY0fC?&9O3SmVEKoU3Zgnbbdb8t-q#`y;h(a+4H$W$A`nWhMdBufi zbjI5a{%OP9O!Qf&GVNtuD82L7x0Eu$SxxY$ z4s$skt;!A=B}>-Es!+?|8aL=e%qSa}@hV$ywISH8L&TlBr_8_*iw_VNQQ5bVk~i$u zs`z8E|HR|Yt7Dnhla^VFZ)3n9h4AKnmb1< zDC%V~5(`05=9B{N208)ihBxXp4 zLJSDLXT97tw}FZZ zDr|bD#%`$VJC;e|Epr#VxZ1p?LEkZiXy0APyLV_1J@Z_`160U5ylyEsRHRxYBql0( zpJAZlGgF|ld%EPU1gNN5#_kUY(Y{xeKXQNyx7KV|9_ho`YSOB8Lq%JSp3Doy2+J6R zdq*|?CgrQ9bcGNL(xS^E&tVP?(_y8RX}!_8(Do9kim1{+Wec7`1>R9wZ|E=SO)@KZ zvaHP(gI>(R9n~fam3-I$9YQ1Q8A(UTMhlfxG1Bs*a2lKwhpet^C=z<;!WSwuKsdJO z<*XM`fsfaC=fhkT>qkjZ=US-b9TQNYS}q>YuU;NhNNIh0O;p0xY1HFqcz3LdyLL+@ z>-+y1t8O%upthq$T#!}PX0R>|XgGkw!bA>*^>Il5Z(S0Df&(B19mDd(pnxkM4_v3b zDc}nR`+~0we5LI`+xoWiTmLiurj{Qz{krKy)1NgBH@z`@XLz#p6Rn#=Zw@{i{B&z` z_{wl|^xva@fqKBZBC8{>4*$IQh4_55zj?Izyuj*!FK}z@7qQR9-e>*d|7!l)9`qma z?@)eM`+*DT|7oM=i>4=Lni^pP$Q6XF<5Nuc}J}J%5vI~CLx{v0q zwBy7Hy7_8k@wk5#gGA?vuNRTv(A3!Q7=h2RVT(B1P-bp7q@rv{0wEs5Tb7zWWNs-8 zKZ%_yq6+;f1=Qv(1@kPX|HN_oHKcq#X7u6kM>$ZPXDwI$2sB%IxE=(cvJd9dL#2hk zp}fZyd)>IwnyjdIjE!zI%vA!=5@HOx)fBOvIG$^4z5w96&0z019UIxZ2tXSoxCj9D zCudgxpew5eI|`pL);M)Uo~uj8>fKexiQ{$_>=Ta=ynE)7#55o%3vRdt1qdAwl-khqTbQTPEMUUW_h(wKDQD-{RsS;3OiU}9oB(ba+dq+u^YJdxa zuDDhNpmI9nJ3TmLbjGu&;FgX%o$;rI3Yt1b6|zRUrN_;z?ZSSJ?ehcy`#DB2usjX& z)D$zwL*V2*wi^&e9_q=9BKqetzUIHHvmfd720Dl9;S`m`dDpTCBjR}n@t$b*1Of4$ zh}=P#ktcCVXXmjKR$2C{q#_2xKwjo{%P%7TGdKxRbGMya+fTFTKq95x>G!? z3a`+(<5>l&B{3+XqQGRrV$h4&fr<+hY3J-%9#nX+cO11rml$WUn>fRVa~BX=y6r(n zR!pc5YsXEu=^BKxuj?j+F?3iA%9mY?P(rNL9>?W)EvWWz9AIphSY|wahK0&Y)&Nxe zfd_Ai9^uB`60bDa0E@gndVv>(U~>TS`g8}`&?5^kLCEVDJwdS7|I)WLhR%8WNybC3 zR9+ce?Tbt_PevYYdVAArp`x}<4pqm)@1-jM!;Si{v8VP}#9bizAHKon z!`~-M98M8!QCu_{sqf#B7Ku?F;PO#?L*aL}_fWnfw<>%5S6uzN|$O=OuxFKAG3Pq$^mQz0< z2X=+mFEzV5SFkHw-*Z_Gp|b5to!#7ZpWBQUl zPUo%;AlB*V+$ZS(k_b3mUOV+4`GbAeApKzwLWLBPb4&e4p3^On$fGi5QE~f2i}xLQ zPO~zQL0R)LQ1RuO=A+JCgS`1*_v4C;Wl(KCT6c_{me{rUWsU~rSB1Mo;h86P?H}y> zQh8KptU(INp7}uatZmft4gf8BXkz0Eoh?6gcCEaLqW>43iABZ8>hw^NtVS#om6sJ( z1$QDi%je!pFZr>k{v$7-qHYqF z);FDupv_iT5nEl4yQLZ`nevJeTS3`qSz;xNnB)cft(UxHjr5UQRT@DT+=#g<*_U@I zT-UUDRBl3RL(goDXSz+J{3B}AgkwJVXw*qDjbenP6|}d zQAlf8p}hOXtqUa2I!dMhAiHA?u_KURWu?abKUXgB-5n0^Z2gm#>q6Tiq1fv}ZNV=D z7lN0C|330i=+lvdk@Zdg*7TvKzUcGO6VZdQCu1ML*8+at{4xK>{Dc1UeNX!C_WE

TK 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 z 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%0A!6TVc-`Mq^)> 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 z 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 -CuoGhIMF~O7pp#ER_7kC5rT#V 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

*`W=8)yYi>|1^mgwV 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�qqG+N1x2+;D2{-eL04NC=_=GyJ2O&*hNwwer$GORMXRv5-QX<-Amb_oFR2{U z50Y2}@xum-%xxX9)Hn~&hqu%?$Opn0AU9bTf@o-0nptQahJECJWJN@&f=)mjT#*6V zp}t?cx6NjSHxURAi1f`01Y9XIav;(-s|!JrQ*%D7Y;X&L*s!3)A<|m>3s_J1ui0_n zA-aWy@&u=Tc0z`AEX@W8aR=T5!pN|W6}6-wz*TxE6HIC_XW%u~ZOauM&n(OUq8(Qb zL~HTS{WiLSJ72P$e*tU;W~bP-_jnXj~9Q?lWQz# z6w9ZVSJki1ZsGF-e6O-Y zb%g7$vW))fOLO;r$lnFI{c@XS|C8NZJu3gkPq8w4JoUf#=X%FadGn|^DmZd<_MptS zkm7_vf_>L|TWlvRA9INPKy2M=k4QLN+}H#{y@T=9b~Nn8AjE>L+av4+C&Uzl?d@pT zZh;VEzStJQ+#4Z0SZ*5{$)koOS1L34^Llq!zjHb`QZJjq!w$?Gf!pcrh%jYgjmIEg zZiisXqFugadjwNfYy6bAJ{=2^+0`6_xIP^TB3vRMG!+^8t6j}G*dAi;-~G2!Dx1Vq z)PFmnf^F+>q#=o7jA4u)QxJcx9+SvCCK$tX5Q}8I7B<>iT}wSyLJ&CE`veVyDQ^wc zjLj1eY)0O2%l}=qI@cHoyl=W-iC?aaBuB8sCw&TkQ{!}Gsa6a9x*@*lf^|ZLB!723 zEqUUMju@jmL{eEFv-r;{IweQaZSW(odjl2 zeAyAKS2|ny8*~LB=|8Ax$ODowSQite2+Z52Y~-*N#J%<&CeFs0>dAYO3|5~hnS|L; zbM};2eJMW)^L8eNIJOE#b>&6PDQ|tV9Rz1Dlcn-8HJEA@fpf7MXQ4YnP+(;*WMHNT zCe=j+5gv2^f`&lkzZ`oW*JEsTp@%T#gAp-Ta?8_G4)!|w=p9Y@0F8<$ev*t4hEW0J z9TN^o2(^G&@K55m(=be*N1K4GEo;W){sI;LPGYs9wuUcG+h0_d)XPY6|3H6U3W0VZ z9}Xvo9uaX^7L5wqM`NH})A)7lEOd@6J3+P%A8ER{(iPD!v)WtUub!a%J+&#Q$h zzxqLp0m6(cpn}jVG+}l-If8H}3C7+#E{536;$Z(G!!o84%2F?>ab`AZg>XfHu$ymw z9bN3BHI)@oV**0rzh^4`(&~drZo6sZXDQJ zNd*wOk>57rTVpceK`fKT=2MATB;}wY-39#j+eqU>2ey;s3ka42_6$)U=oXcdR!MI_ z+QGLE$YK+ONvo6)50L2x>BXNUY#$KrlX{*|<8VMmRyoNfiv!}Ll^;Sf7YYd8{^W%c zQWzXes>jC>Y5PhlFf1Az6H%|Yi13pLqWES{z9OWjUoo;BA8q5ek#R=SOJ4~HGfKLR zVUjyXL?Iu0Y7|DQzWmww>Nl#NudGS*`JX|@{(H?GgMR-_jom6o6!$J}Qh2d&UwxC> zi?#b|6KV(6Hm^QZ{b^y{{B!x+@@E$&6b`HmF27%1T>g3asPfQqzON z&m>xFt{;!v)< zM+$&093-ADG0NpdWJrOsOynUFZH5Gb`TG0|>Yc6-J`lPvs{SqHrcnud1wA09#5B~u zT}I+S1clMUUdFl-R|W!ckU#Pc=O7;dT~Squhs0t;FhWoYf4C|vd?ea8^p6l})2%YL za;-IYYI{nyZ&DGhH7}p4MZVn70_@*=xbiq zCtF7dzj#e?yz0@C+;Tu`&40BfTx=pwvwaW=cAEac?Uucys^Z_Kyni!8APGj4E0p&y zbC^01P`AB%!PUP$6LTe0L1h-l0{zQW*cM8z1j4WUOzA3~y?y)Whno<0B3fy!F~cIs zJ|9f04{-yH$=C|@fzSz1M+gY}x>k<^K|jbK4E}X9k8E!d;z}Yw%o7f|0&V)k_ z7vdF^kYmZ2Dd8BP86i7~X{~w1#Qld)wQokLD%Ca145C=_C;OxPtZH zo9mS9tRWJpE;BFETJ!spv}XBH>_R|{-=Am@%%su~-!}-hV_gWC)bC9BQ_4ZlJ&RNJ zcRE@XI~-@fKtPV)>7+xLZ5je5lHz$>2*~m1_u3%nNm_d|fvZPP=n4TEzuhH9DBFXQ zS)ugB{b6g(BRc$YAW*#KCAmiaT=l8k-Pz&>`8)G_(^#9SVQ@u)osj@-Mfy&>cQymHf$F9Piy?dXLX4->XPFBdjZajFc-Hw|McTGc%z9u9Ys5D3QmkR z2o{?YV$62!5w?pWgtu*bgl*(NWES+th?C4lLLV@agOy)V9h&&8F1}~BH@h_fu@eB) zxFtW)vI=xnQ`#Tne?+nMn4vt>%Pk|6$dhX#ICtvoO z1p3lb46Kb15n(-n0HTZHY+fLSFi~=MD}Rf4&t~j-ffPt_cjcQ+o2aUog=9tXU?Fwp zpx#86@*shFQ!v-v0N2#CyW^L^`W3RV^~OZ z1ek@9^xui4KSmOfX%P_5qZ{Vd7xhA9Y&m}7pLMjMW-%ggt9aC$g`>q=Ri6$8Skom^ zv29+^)^pgwQATkCqY>C6kIPECsc|NWl-i=4+xA~x`Pt-{OeYXp#^=_H8OuEGVvNV) zpfc`bF+><~APa|(u^go#*5fmy`E-gphGGv)YLPz^xU(8 zF+gm4@d4>OT|=&wR1jxd?g(r>Z~TPaq@i_0w$A41$iSXALkUuNsv%f3=;tCPt~xf} z!Uwy!vM&e>@@f?|7S1T#^gN(|=;Ey&LX6X;QgxM!h^Qz+64RV@nwOk^n7C>WtzZdp zjEB+6@2(-glZ+t_X5O11BQ?aaRb=Sg7?zo8Dm(LBR9I_1FiBmo5Izq|7SBrt5FNF# zU&slzJq+JIy!^&6^}Y#Qo^&zBC;jT%DPPylGEXL-$q1bbevpLuZ?dorVtcX2$^yQS zhqGPZcq-}iu91Ad-C}?}F#M+0O#j(9mhhPTQxKjCM=`U~*;bjPt#FSa(xq@_s8(8xfYP!jIq;nyN zy^cO0M$CXx; zE-l{Hb4<^m=F83NnqO-?(rDGE)pNCbi(e}|lAo5(<&Mw(F}o`O8xQ19EmS{*T*?1r z4~AO8M`t_vHCWs%85|st{IL^%)a+Z~zy|OsRIhD4(x=vkUZ@`%ayGt$=NjooBBC}b zK-yO6;Zu8d|0$F%P-(O|^G42o0C7|J9OdUaWr}LxVs~XP9T-z|$BH?Sk+bJw({;@h zJ!Ef(UtVtWfiXq%jP}6+P0d9yvumc1L$FiJ%iTLLrl|KIHHB6}mrT*y6T+tQqX)ti zJ_Ucy%yZ=I`{^o7VCfy(6b1{BG&AeW|8-zYVMFuKa^&p$P+#quDT-^EAru?tw>4D9 z8yTqqF8Z-J0iPOxPe95b`yTkz0DJjuUYZaDIKz{uJ6 zQq7@TrqJ)<1rNXYma0Xc8aewOs;hSQRfMjXRbV@@{F#9)B|aq^)%er^mJ%vMmyY>A z$d@00e7K#@x8lgzchgi-P`8MrZ zK75H9F?I-DADy9OJJ3|;PMO{y5lTleNs|d(e~NA=u=5L_q8!*>zfrUArHsAH@8fzd z?1O#3KA=OJuK9`^9^i^v69HG*`#OyT>189{nDpVQF~`rO9y{oyv^V&JKo zHV{)oEe1ExSWp7_sMH(CmpQCc`S2-G|Mu}40|VFq7?Z+V5G?b9s!$s4QdRg;^3qWF zyB5s>o&Sg<9GC>>kcu2jM7{*A>` zi@O!qFaN$gr98IWU(PlD(6}DI4zN!BFZHwQ8`u6>yP$SJ_0__`g)Q^1;!eP&)kCXW zSJqY*R;E{u;(z70=}+C<)gL6z&Ipdga3FaHQ*rC-#XK@}L>|{VWPBjTK;r>I%{Eog z1cC+ltz|b*IU=O7yQG1vfO&-6@68}jq8k^Jz;VR@*59(UL&koOK=4r zjMBHg8Xh!-shm&@sVTTfHbv*PmfdE`f6v-Xfdo-u=PMAq8m0uo!4!VtaHU3cqACxF zTQoun?zmCfS~l~W8j-m4mcHVkF)Bu6{$R^NrjB%mIW{23-G-(fKTw#zM4bzb5Bc;a zpDP#ApF#@^3HszKFm%MS+iM>I-=BXq-Eb+562*S_A}^N09tIrjA)KO!iluQ$g!-$k zDJm0+&EfSfpNJcnp&9OP0el=7P%ZZ&Ug1BjN6smj*y>hj(Rrm!GQ# zitH65)1z00>=efDUG~8z-4qA_m&pcK0eC-!B?8dXl5B;0m%VpvIt4_6+>N)E-BHyh zalU1z`tw05n_8#wZC zLSiV!HbSqm260P%CV_gFPy1FHgYaxLMs5c$z00Rk{o1)I0EjvUR4^5XUkLcFwe~)I zf!tH@gj3Fr0el&$BEg%UpfIJF4#4Tkf&>75c19Y2ya>M`?YEXsLeYMfj%G4bVo6Exstj*62RF^* zovJ!Pz~MfR+DWvx|6nbi2O3ljw=K%Uo%z&okV+0>`oSBq?8$8)_z;SCvmX-iVps9^ za)tm;C)+^r{lL?-^g!`G@R*(M25&hlYgKpvjkJ$WXQtyuVWQfqa9Fl*ShZ3;p>}n> zh&TK2qF<$2US7Vw{QdHm%JtG8OEXI+mv%1o6rU~5DxOx{wfM2Zs=}>!^AE29){d(! z?RmWC7d=Py4DHD^pK4y&JhoZDD}q-wj*I{5SH*vgW3y*ke;a1wzprGYKXoVj!zpV0 zr)M$m1{lyFPyHYXT91bpF{*rWuH@1 zFyfLb4BCgB&U0!EhArD6Y&yAh)RA9^rOz}E+W9!V0Uk~L)1o-)lYk61)0r#f%Ci@< za!;uFCLmrS{ynJhW;h@}L244YsYS+3MQcJQfW3^EY`XNH+CPtwM6l^>Q}ICLvuK1x zL`DfB*s2IyieJe57TzfOSM%kE5jQhd0J-AR8sg9?xMww!g0DWC-mtMZ{jVZq51iPFO7U-`KHytF_(_Rnk7mFv_ebX;zk6AW!F z{6)CMtpCg4VRTb~qI_G2Aa7n-%Uojd8bDy1_CBV?eP=Jtv8@n-;Hc)4Y6QWt>on8= zf}@?O9iqIA#Z40hI%N3}@%1)bcsdb4m^l#SGciQj$`ANLJ4Gt&?F}{LI%{V}5Pq)@ zqP%rr8&MF8+m4SM#+y1mlj}$mWO7m7+*z~bSQM(bilu+kq^nYRjHlosik~5)c7v%u~?1 zyr&QGWKbJfB_-gt_+*vzP-dEUp=m+3lJ#wqkJ;He4j4nWU>A2t$M1haOK(F+dO2!B zkoVS&Aue|;3;Ph|HJr6BQDVNB*9#ciHm1TBKVS?8CsP>N%TNt*EItN|Z1KJ3@Jv6h z6Gn?~&!!V+G+tr5Bx3AE>f{D7wIkw##`uNi#xK?4-C~G(*RuUUemEE=KT$CUg$x2f zh1GsNP#I^1O+3_)L!p59o5qaUzh4>nN|alf=Y#mY<1af8(zq6r76#QSxhpR_PkR{l z#AW~y514|?W#^fI&JG(Rh&)~{8?U1?hqpu#gD*ewvBdk+()v+9Wm?A1*HLMNaDHLm!lwEE;03^6M0xzNjdFd5dbPH^c75%{+Lx*)Rli(qRQ^;srTi>j1K6c> zYw66=sM7ky-HRI({+hqA+rQj|#NUCr&9kp&AIx5oS(Ev8{HN}Y{;cF*;U@E>1-drQ zuaY1}k%PO0KsXStmv03S!zro(!j8CLtdka;pb?heaU<{}os$+EFA&);q$bkQci7q8 z4@6ob9V6^DB!s8y>~>KgM%bR1o*TI0^pIDc!o&!Bll0M({@*$+7SBz@w#MKUgj3ri z>_`W{TKfOb!uIxIQ$@;R#)F+ZX@Rb6`yCjMpWk1N8>e?JzZpkyx0vz(#Mk33;z5HD zVjHzr8l^ta`LVKo4>%Ns+K^Tn;RCW5RjtUSOqa4aA=6QDiXe7bD^M69_QJz!PgMeIJRk zAZqh=2pLR#A-fB`lU+~<^d+cx#k17bJ9UU4-L4=0TNgu6EgPc=WLSiRix_f3(6hAz z$iBfu#oUAbx3CjD)5DG)zqCqC*MU8IMVI6zi0x9m%8km$CBn$G>{oPCAjDW%Ltb?< zW>Y}~HEB^chGcedL0AkykcHUs5o7$;d>{+2&0y6R>eP9pAVR-HW_xXND+_gVsuP4? zK2?p?yVtQvK!oQ`fOrSQrq$2g1O{4c8F+k?LSCVh+dN@jlt)FawbqlMq@+J<{iJM6zC1 zovHk-G!cH;8omo7Gt6_7!e~T1h*6c?ku>UL@8V!3w=fVHC%GY;8;DDKMkUxQa7Ynj z{BnLE3(rsMC#dNraZU_7#b+=QXL}QSfS5NqGCy+3;(++NG?nRu3d! zjE<-QknhJE>>Q~uK$uYyk+E7~{J{t~7ZkHZx-sdoBirm2x=3an^uca<>yUy32(<~ZzF%)QYDd(6`i`xmGJSui%s_GI&yihM=L zn0QetpyGf`)h|YfcPRo0FR_wQVjG7mnfP_`cz>ZNYb(qLU*2alLh4H*NchcSNyMu{ z0b8tM%Bn`{hWoFzc+^q)ZUQ?B~n(NhHtW2)o*Epy6gW{fr z|0`}>IkM7MexiJAdE0WS^oP<;=>M;*PpBVQ-@Nu}?ZMh5wL@xOsJ>bKS@nqO;Ko-Q z&o^&qp478l&l80op_Z^&>AL(&`MLRv^9Sd*%)J)=)qhwYE&nn*r~RoF(I2Y-bn?IU z(5!24_$9K{zTUoJbg>uJIoqE5dsknFdR`jGX>Rk!yOyiLgz_2V!CyVL&1&eQWjg#`WE8yk*Q0^kv699=@;LnEir$D6~NM zxkoZzj5$g~JP8uE2p)bE;_X=IOrj{4K-gQ~hZxABA~jv%RFmyn{oLzna?F(V%MU3_ zM*y92Cx0jzWWjZKK zI^l>0xZ-jHVSMmqf(DgsZ8^ZzvUOuQ)Md#FL0IrWa*0@K$}&<88l_{qyR~}BIfjPd zihj#maJA$I1|hg|Ac`0@iV;FrICzmd3a%bRm>TU3E(Z{}r^KwPwfbRG#NoQ4+dX_d z7}|XhX<$TyuLo$rP=w?Un&ytA;Xss5QhFptUBtAD1-BPPn1QplY|)ed%&VJBf^FLhrychcM; z2EjZ6b)$Gz=~cgIf)FVN+>~fWuD%=5OUx7_LD8!iL#X~v70ar%`ib2&j*A~$FBkpT z)sGi6f*T4}5w6D$mElMp&l?2e&53Aik`P~PDJeckEY4~YQVfKM>>vkX(RX8nFfA}8 z*8~Uz{IQCq`J&s+Y8F7OV-Qks7veEfH|NSFPa+$ns~`JpDvdOR+38$Y0YaXE3()w9 zB)8tf$2sfryZ!K@|Bt!%0Jp0u+Q-*Ez1}NLX-W_*DEE-;eN%vd)C3R|5yVdg1(Im! zy`u!NkdGn)DT;IyKR~HM@B*4pA|-_+5RwoTB|+%{2?+uI@9eVHUNdVS&Pn_|&!5Bh zJbrrLJu_=&&6>8?){_CM6Tb_6{LxG-NXZ?0q_yIn{WVuo4to2KrFqTU6q@f*WW|G4 z+8``h$KF6SBoSLG9Nx$F>^M9IKp;j)mM{j#CiVTEJyVu0NWil*5^#yLv`Z8#3%eCe z;S9VRnNWt^I$cB0Gju9P>%_ee)(M*_ZRp_0%qDT`aB&3dn1xDt7Ypn69&O&T7P}QJ z!BeGK8av4Ey^0n#rXeE>m@SJxTPx<8nGt@-Qh`Yv%g9;}Pe?eJg0{IQ1R^t3z|lm9 zrWL6p_|(U^pa7m|s@ekh&BC|U=X0}FY1_uu$lO<#2UUA}o~i$-II|cOy~6C$tEGX; z-sL;X6KXSSV{1XptIn?es(Ms?Mf0}i_mTB)+IX??hsOCmC-v;wdsLw>|8D*-`N{dQ z`5^D*W_R}M;3fbpgx55de^lD?{eGIA!FZw_!3Mcu>YZe{)8!_7TEva;fp{db<5L6) z9PO+`(^~b=9-2bx9!NuhXE~stBX^a$^*I{>8Y4B08(mECf@$u3%A6fuD-v5w4Ee29 z51VA|M}mY5lYNkwq?vlxgjckyHC z6V&ggH(h^D4-iIAMmTo(Hl$ExEKTRgyK3hx}!hluS2EGQkS zbWPo^u)un0YLzFdLFp1@m};$BIVj=Kdn6qRhHx76u?fQXSL&j)_sD^}j~Sn&V{H)n zeDogKZ|^*~xog51q$lfsVX;;7e@&O7FQRIra;4onfF597h z06<^Dlu$pI!l7p@45~AK%(fK_1&ZJeD00DF{$km!E57vAVhCvOhViTRAJMY#G@&Dl_cttftflcd)~20+>U`A%$ajc-31vFLY=l9MZJ|sM=(u z3)@Eu4+nrgrCO_2Yfq#23SkrhTh!h@a09Egr%~L%T?lAlwMpxlPp5Cy2^xgZ?o)V7 zAh1X6RV9R;^bz)#fmo%-iyf;YZ`Pu5*x}59ry}-w?aWCc{JvH1K!I-mhanHR0=Dl!0$E5V0JB=Qi9qiEn0`7pDpaSD zBG?BWjOyJ{T5f3~IQH2*7-+nv!xyo(q&prL`_1P~LTDw<@HbQjwi~LgRUhcHOUbYT z`J?!@9?TqX)v+NZNd4Xk2Eq2J3jwL$L+FxmR%9Vefm3c*xN;V>fyTS0 zn#Q$9b5mRwq`lFGD-x`gHUsiCj8 zs$3?p#VJ7UOl3Rewn*^si7s*AFHFEXUOysL2#X&%;lH@*nQl%6(TnhDm zr>lxbiMbcQc}wN(4*93I|07kyQ&MBg-f*LD`wIouT{4A7i6#y)g%V^(i<)MN-qzl} zaHzUXv+?5&*9PY>^`q^h*vF&BuFa!RTjZG*9z`!BMvL>?G*^YU=%&WVv2C~4!K3yK z^V@Kp!4-NVYW)9_K=uRG-mZ&itkfsaSgInB8mecR(mFQWfC*TDs?;S%D00JPiL z68d-)HP1r|oj;0%7OzH(zU?vU1xAnR)GMJ6PT8+rRTzp#QO5sYcocl)W5IvtQGVsq z9^7uU7x(T|uLx_QR~FG%j;A@PE}w*zl5eWwNoW37p5)_6RKX9|ypxj-3riylk&ae& zu^i~**l`@x{Unt~x>END%5afo*l9_Bt)-SGQmm7Xg4ztVNy3y$dxXB*p2U`k+|=HC z9eBW=+P4r-@ZnYuY3v|+l8zxdVt5fwMxP%+A)fbGq z?Xi5a=B-Yj1nt3~*^~CXZ61oEWP`XBtFtGKpke{aBbFTutNqv3JiuX20eZOR-sYV# zH5^eg{cACWPaPg>Ztd4w3?6vvJ(r&HX^(d^!Tpet5y0~txu=i$BCLh_sE1lT^eNUF0 z6m$PDDXOGK+xW1~9yJ{4tRt(yqYn7*JPHCnwZDE;hvzrF3IHXtaRe;;Q&jkk1YD;_ z`8^kzz^v0~Y6Q)=pekkx@W+io;~Z;6m6b??9ek-FitrILQ3Jq^@R3rZmeBcO8K#94 zec4?dtP?68-LDhwD`5p1Y?`Og!1!-GinMpgf9FwTQ(sw|M@gF++RXnz4ON$xanJt) zm9s1Rls~B5S3AD(vF4)Y&zhqeYkL3CdsKc%>EzNj#lIG>DDG4Epm0}VeBl%MdHD;< zca_K2K3!d0y|g;I@?QPP`g!%?joT|v;_HD6dcK}pmiuL6T+hVZSL%ga*&Faq@II{; zt4nj|Q5peNJOAk&HSo;7i4C0c;hUJ=!uF95g)Ii#nnn*ivv;ye-UVGeN><(QD4h@I zUhnWx)YcVk?O^o4(>gWqI!LWU0r4ov$Rh+i>g!s-b$XOPYT)TlC#&8;FcmR{nmT%& zEZD%4aPW2J_?VT^IiR@ zdpb1*x($UzQ~0X$V86Vhs$r;dVD_L<19K6rN9)$9-BX$;>$jr^=5Ca5*okkCghdi0 zV^BP5!~f2sux@j8bxn1=ZWs^{ug}t>>YA&6cB%pz4d;f@k4Its_>f)1$B(=O8%l(iRXCA&+4FbUX=jmEAu{+_wPn=IB7JbN$hC_@a||=&W?j z6b(w-p*fhEt&1Za?`ukJaLbw<9{bpXR2+%kmc9g&BfCa(Ahb)}h{~hXCy5lUK2+f_ z4_ylLKJ>5q!|O%p%MVneV=fktLgw48rMVu3tu$K)x*hupEC)G8#uXNjf|76nyXsKih)DZkCiGrW=#VtqD{97oC;Z z!mc%wFn-^V!Bjs(zHB=+T&OVRf6ZuSClK84GUb0M$cv(yAG@gVk>}it>OJbaM7!k; zCxk`mxsNL!Q>M`gw3!RRf~`;#j0MC*QWN+_dJX|!V?SpgW{RdQ#K(xZn=cH-AP(YD zG}enwvq<d zJ%mX2oj?LW0_qjS5Hpw-u5rW|qe2!&elLPN!DPY6vtTSVN;*zs2$Llfq6gzuYTDZ{ z#&fIUIqI=3+9)4>-#&5t!tKh}keE+1Yx2OgjyUiM9Kmx4hXe2JEs!hJ%01;1vSS-gezxII1CqvZy;;j5#0y)rw+>G<^(;I-JD@8uE&ZF`lJY zcJsbNDO*S-b!A6lFHokfd|I$E>uH3fArL+g{zo)I$}SOPExm~#-i|H^i~5PJfa+n9 zwe0BPi$nTAg@W=BV%^acSux@lRvsZqFsdCRTr@a>B%#_`q(z7SMr32hzJ9f#CZmQH z5jo36ghk7Q@KGv@5w6wZ2x6WD8) zZQ07lP1I8+qInS`Tr?O0H&IWSNadP{Mh6I7ygX&%Y26@j_1~0k#Q~wFcf?pHRLE0I zMAbWibU-D99H${~OIc9%W5uMN@2TL}1mZbd7$Eim8B#e$LmUwWRRl#qHSuTzk+Mig z@003@qY{YXSrNRREbt-k3n=%F7TMujMX@QAWxR&mC07g(wqjr`_@04CStNv1Nj<=b zF^AU!#LnQy~Pdy>N7&{6fW4nUT`vT@laQjB($h*+6qpiwjV-xl1{5h)mbaPU3 z|7NZ6P~-dcdG*Wc`_;>}KiAHx4XysC`upnm>Q(Uj9+}3#C=1X{D1& zeZ}R)Ym473ZdO=OxTLUmA)miLe-8gOHlbhs7g;~`@A!AG%KC{KKn~XwCyV2y!Y6!{ zbqH0}rRN3WA?>h?niBv{DqCj(0GDZiF{MnvPykTi5iT(k-~%wE8vwDSrB=yj-q9;c zNZ|CaJ(Zu|*+XR^GFAH;y=0wu{i3ztcP5STq}hRFfhw#6b@5wByyy${Z0@t5q35M@t{ULB_&6- zpY1ouvA#x(T<|zXf}+oT=G%U*bO^Np@%Diww|FbqvvCgz% zcnY#Z&Bfp0sno zIzNT9^A$X$bM4q%(B47wxoaD-pF-NfNai{|g|zdfb$$wIXTP<1ishk5JNvHlQ%F0Q zcIZYs78j(Qeb$)^($3!N{1np8UhDi6($46vpMu-ftaTynj9TZXkaqUOQ##!{oD0&< z9_!2nX@}ac-Fa!w3u$M!b$$wI2Lqnn^I~<=NISc%^HWGW=x}$V9g7Rn4rUY9QI`Im z&FS65uAgF0Y2d3-ih2lHItHsdwfUdj0SrvQ5|~V2pkvt;i|gYZ&!^2Z3|YOJ;5=Pozb5xNj~kHzMS5Rd3w zG4(l`gey2gI}`Uyqf%U@zIl_4=$rQhIp~dOWb$m2z#0Jic2fYRbj`v6Kpo4pe7c!DI+i|+D{_Hs=|FKhDh=6d z%}>)ou%7A2p|cSvN3wkf1Tx)r2yyw;{OJhGvJseSv#keQJ%FGx13{&E*^-_AfYyhw z03a~)Y1f8fWq&^RwiTXgrY9G&(_G ztsdJW6M^#uWpvAQiN;?})d+{=IL2&!0C7JmgPHoE*KgS|21K^bAvyG6+ZE)vKWIk- z!+`dgL0p+5-?3H#0U858XhQ=dxYAb+=)SeXt|TI;|InMEX)I+Y5nj;}leT{2@3~hE zg82y-A^>7QBmN=~@Tt7a4aCGu1P)h>mD;OIG!U-GI_ETiK*!6rD?)s_9YRbJ1dZ1G zS5QERiKJ#T$&F%YmRgE75iFL843$LS1uA}Q17XZWBEqxY?x^+6UkX!<;+>=I)x|rU z^u8WvD*ZK=)Mc;XX@E@*$?cE|wmSz&X2y=fa5Y*RVh_$iLfHiZ);{}`HV7O+a-YvO z&3eA05atO4d7tbP2i^ywFv)us7zMH*ni@xVAC-^W0HGBq&f4(044w?M=HH2aNXA;h zEyxilAhJE23jxXRG=7(RQ6ONwwughx@7%H-S9B$UZHPdakx#A<&=3gX>JyrVgDaf1 zg2o-$=Q$jS7+r@Pcc4n0xw;You5QkbIK#VWc|OoPi>|ziX|PR;><`yR*cGHfRHs5# z6Cu2b_O8XHsdN>JZHcY z;{LxMs4a?jdgZ0%o6Dy+u4x=ozqWpCy;8fbc3f>_?~~>AOMk8IRISyjcspQL&o6tv zmwrc}v~OvX;Tdo}mR+y%LVv9 z3>6N6@lB$ZbQ?*SaRD)gYL#se!nl-=o!$;%+g5+^Toq`i=*={NVoDGj;upW9{M`~F zjs>RJ#6CcZo2hXold{IsqXnj;Ed?o`tpXD>ydrdnJc@@`<>zzn>9EgxKtS+nA}?|P z@|c+go+}_2r4rH4go~${0@2k10xCS229+_*#OBr2Vu2kH7}qqz*!3<5pEw5O-g7jS z)Bs7WM&x*0{MH13mVQBlZe`LSJwi=|RT2StPWw&8=>USjmq&~fE?xo`86Tn!DssjT zR2H9@K!h@*yp842aX{E09zn((n}%>I;(#Yephq-G3JGENchFib*g;eI5!=4xR9L|b0UAt2kIpK- z<4F*nO8d11YO3*(Pm0ZpYABl>4FDPUy@WCQ-7UCb1gA)>(r%dUMqHqRk0ubIM96~h zl951a%zUzgir9}K70e4|I#tR{*nT0# zbi(AN$^)^7bR;vh#dgtD9E@SV*s=t)#dIyjWiXCf3dA3gP;o=pE9qn~vrMU-?-$5U zRRY@`5oCjeiZII%V%$-vN}paE*zU9hBRGTbbjPV70}_k3)_=}jF?I@)Gkdv6kVS?o zX_L70hQGN+5ED?y{Y4OY1V5{l;&3mhAM(mjucrcI#!~gjg;-6DY;vLQ&p1wPRHp6e zg3#|R{7kZ9j&K4HR+Og|d*+M;;xJ?CG)dJzb5a5ks)t8%G}%B!`*0UyNU|A~-tVd) z+gLya$Gz<##mqJf|N&f%xr{_oIH_SbsyDj(q-dVj@ z;_m+uy``S{J=gUd-?MX1qj^)~Z;jtI&Tj0}*tq(+PJZQO=BMU%@WWDc{7>!?4~b_S z9i~R)2lox3&sw2+Cwd3de`vz0)VqZV0w*#{j9SxwsPp0U*O4+20T7ximDDYeK^p{* z^K*~Tx9Q`PBK1~|L9mVN7q&_je>y<~ebayVjU*#XeNr(+f(3`ATMP+LE-t(av*KX7 zD($Z}uk=lyh)gm{aQmiTMcq?Mk6SYyH3i3inL`&G45hnYP~_s7%#24&Cg(t)IBUm3 zerv`N{vU4;f0gkMKjTf8_Mn z4(JpQP4Vtxe{1^lI?h*YRp{O*x~kk?5UA(4wMz&Q=n*1QyAguL--Ot)4GlDb z_~va*|C@;=r5s2;xaV$7Uz*JobcMu#`FbEQ+MOXe5HKRP-+|B}o>*P#`teV$`OWo< zGuzO>N8VYx1#7j`#DrXO(7=vn;r+yHu&lrkPry`<@&}+_USqK|u3CDukwerBwM3 z8u6Iz%i%I%^W39V{$@^-^ylr!`#TYk{25a%wE7zn0$GZX+*PH9B)$I^)nnH4={hxy?Gcy*-N`GvXWF2Txt-36EE%n zq5Fak8Z^bg^KFVJhWTFBk~a z4?u%Oe?Szv|u3fGwAtr-j3Mf`NBr9eDmYIzPCj>u@nJdar^VH@Z&Gk*LUtddAkw!J8AQ6;Ordh&ZS`^@!_I;!jJNWb6o5Y_fUP7?2(6)q)(h8dtT+Eu z@mRQ4*0&6b-!Q9_t}uq2qaZ74WqxVPl&q=VYl6VRWm|+_EPmFQ#4yHHn5MD`{=fn- zVO;>2n{}tfxbA`{)pJoB)NTL`n^ZyG*{^{-%xTi$VG+|RHvu7 zvOX$}eNN#Uuh9jqWw#gy%Xbt_9&>#F@tf>ji$PSeR@k+_$=>ON8J~2TkE(Zc|09+yu)DN}NkRuDk&UB3LmQEd>Eo7=nGZ!N!1 zXDbdlFs31L+U56rF_Q+eMw2I*oG@e z&O^r5@|#X?gP@TfUR_y!D#Ed-fYAwIYYlEQgVAy#IG&uE~ zHVF6y$<-w7--OOlB64{4<(HeLHq!@6s8r$PXWH^hFc%!31rmX5UYs7wFVqzS&J}1t zau#wz@}HUkGf9I+zXVr5)-`ws4eWD1gNe*^QX4raf@AssqFuxQE8#I85ZR|W90}q| zc5XIHd#SC8zE>GuDVA<7Usrpu=lbT&jb)9y8lR}YT)(fjO?74U;p%18!>Zd=-m5%b znOfhn{?q1Y+z-&~-M(i*@2pa#IJ5W4;-uo3qW@vP=7!Nv&Fkt1vAX!j8*dgt-EEGA z!F_{=qo4q1#|y)`Ax1Un+5WZ&t(uMy0cdE|WN>9~`M~?YAkrh=hAZyua)(j69&eS@ zs91ua9-r+VfiP}mzFaGQ_~ibq@Pa~oNG}k7Pj9!eV*v=%V`83CgX%F)7_PD$SN>p= zEv8cA_^&Y_#v2EP37&Qj>Q{^-_-e-}(!dJb3Kh%XK!652L<$qk)eR~&aUOC-=K;^G z{rt;q#c=rdfj7)V6=w=54gyjZoAeE=Xe23YzmyxNx(x_?h@p!!d~L(8xbUN}__5T! z;7o;U%L^5)ffd@lD{dc=Hdq1z8fIUlKC+OkEg~Qmnv`}k7fMLMX`*xpmYgZoH{~toQmEy?wMn@huR3rHa`{07PnIvTX(gssOg!gfML%2Ms5p z)P^gZHY~sbjWs$s5St%H4x6%e5=PMn)|i&1ouz)tRh#{Oz(LV^1PP(a?rLL>kRAY;1c zYA1v>?ndguj(cCyw>0woyua-Zw35X6$n4LuK zO4N4;R_idAZz8`Mxa7(+OW_H zIk1l2TvDJaYRe5N-q%AoTzT%5Y7MOVhL&6Iahx?gUPt(}nMSacqJRr)%R;o?-lL2W zZYL#od{k=SgQE-$+mX1}3Mp)sokM-7D=|mnLyXi?38tuHz+4XyW`37@5vSlyTp71% z@mAG4tfy4kp!m1qt&Jla!*K(^j<^G00d4`PR(Gj3D~l?-S3XjHuKa)H)5?34*DEb8 z-Q3)%(_isc{oALwkM~#cyTv=h8>N;-KW{nx=s-y>o5;@nd-p)L5p7cITPlNx;j~XZ zA-}t~EyjeSzf5(F=^ZNiG%zZS_Dc5WcUP;&wMV49IR4s{&eTgrRWSjSgLtW?HQ}P? zkJbicePS!&iN7pO5My(92r3YRL4y28((kCSKttcbmmO?YQHw3aE*HRV_J;+T}<(EF(5NPq9IqiAY5`lu0VJYF~#2Yr?tWf z!^9{arH;UBrfxAJgysCn8g#9dFHD^fwc*T?Um@_DEmJ@Kd2A zI-l+8TY%ST{-W#W{B<>G2~nRFje_V0U($B)JH{u@DB)&^&ks--h&K&;BeKv0mfg9oDWzq&o@VhlThIVOS_kIB~< zRM359n};CzgfVrVU<`#PUcUomqMjOcFcvxjR%8K0>m?o0h5L=l!Lp4v;o=KSJkCuF z`7Me8Y{OMgQe*TM9U?`6CRy+cgpc-cw5dBm(0i>vHJkcQNd#J9E|4JEmJdk~LPibs8$z_DEfjgG|kvy*Nu?p+8U2p>hN&JiU0gl{H-2+tA{VGf_XIAV#x^2TZKh9QBc=T(oX?pUo>o~hhWIia$1rCwfGzOj5_`3vPn>Dkh+@x8xYN=>{U@SEbv z#a)X%g~h#3_Wq*xyS@FrUU)a)_@3cC#pb-`HO*t1J2cDoPfc6PpF91}ZSHMnV&_*Z z``aF|5WVQnBB5`Ykrv;^JR^Yk_dzkg#RUtu=0SAD~TwamFv^>4BMDO1R^_Tuzs#^mbc2}UiQX_ zL98C==W%76skElPq=3B?L#&Jj!|;FvrrvOu6b6pOUa(LrCVGBNt{6Ja?Bva#tHvIx zb^n@+iUZ;!8jKYwiC{l5B4jQ9qlrA@g79~;3umb-zNR7XN(iDs<`;;{9vb4HB5wi! zmF;#7`>LPsbHO!B4vpEI{RZvt&srOHji^~@=~0f5yVT~ znM>;gNSK(~=O7@@A==8MLTS7mIFk83m$|$|1rW*Db0}bDQ!&-jSR)}7?D#GqB>r<> z)R6aVy;HPBO(IMD5HdSTA|yF82>ojvmLbH9_H+WF&Ail{;sdrkpn@hoPjldxmZCNj z`6U)t5kl@VLg+}h6U0zLAkyue2KiUIuc&iGxLRhv$ioGVf1WbaYMB5=E-)an4?B73 zK8fbJgQev{_1X?#LYT4bv6l))YYp?1Jc8Ip;pfg&fr-$m zQ+aUoLHHD3wnq#Kx8`yiCVZtX28NSny;S-A}EOQrgr{j^}fmbZ zGi@pqaXpMAK3ZW1Uuc@ynh!u^s!mI}Ux%^K?v?@S!{&_whbS~hWBYYb2~2D54Jir^ z9oxQWt3G^+UN9a%gpBdXxp1pG+Ef=DjG-0IbWc=Fb-}K=Z%^XmjI!4lx>uzyRZ2Ih zBXs|0e<={kMfPzx6o?_4CA#SZ0cAd_%bV=b0c-rlkgLI0q*{X7db#U9k&TeD1b+R7+;Oc$ z7RAy=$WPPVjIYME#mjZp?A3m1Bgpkj4CH^pC%p?N#G?QEW5TYA_9Wgc>cME<4rNTI>zgBE9 zEHbaf*6J$Qsw+q+{wE^{YKgGb5FBP8^l(}yG$@9ixt^vW z3|i8l6O$&#I_D~=-=Kn%^}5M}2`y@V{J{nu)rYK-K9joIc03$_uSbtd_>w0%)p40; zA|hrCK)OsoIA25rxl@*7LiWh+h7H+5$D?xusr}J0-5^Mbj~>wt!f#+`LeE*SRx9l> zGw>emph)m2Wm%EkX}tfuP4hOC1NNLV|MQbf#z-M!%&@Y6$VLP(5rQc zuoc|d#=^r8Vv7FKM-W8r_(!(aROF6FO~z4paJ`5J&eFYSeH^Ha_~Xa{Kd*t z@$YfbV8aSN5N5yJBjf;AHX{EmbM2LSlTm>CLJDf1^ga+XwKgPAXhw*_z{O^zl;p{Q zXf67e&JFC#IKq{3+#1kYv|Pu=D)qW@tUpKZxwWWxmfV%X5 zcFsHQpit8kqzqEo08}-=+8LqH0uYoInA;W7EtFUhRNl7FD!;Y(?{R*zO@&(^78VzA zbB|E|Wwy-{LSC5Mw|MD+S_~#P_9~dNR~FVmHxs&5;Q~N+G%(?|4pcGlFKe3spr=#0 z?p%NXQo|2sQjpOJ0BFf)$v~^bHeGA+;_b9oOU=`Sx`Wg>o_Wb<@w0_C2;pf5`IRf$ z=ng|spdswzX%wL2lTUI*uUFdjQCQS`C@%wnGB1L7cJj3r&ogJtRm?!b5kppo34kz- z;;Y!sa3O|PR=1HH)2NPVkHt@zi5f0BifK5Sm_GdakGw}SMMqm19Y1D=KwQxVL4_{c zOo#?jy^Q6h!61>l0AYqhq#$Veu*BGJ?5Cb=LxYsgL6{0I=mN^9{;%>>4MBHq40WX&(C>s!1GjR)sm5A9vJL;z5Fb?$X1 z0RC!OmSYD1;UsT{;0Q+vIg2IK+<7^;{;#(7j!UapZiIb1%k)mTnczBDjCj~FuHW29 z9j#Y(hP`jmG9xjVZvbKkgAn_cjt{m$nxj>P5F?jd@I5TR&@DgynMyJH11;n%u^JQv zS-Exp$R$6aGpG|hb^CC%TDCL{csi2S7T@2z*+lo^oQ21NLtz^o2ov3>Zr%#d1G+Mr z#nJc-(c-z;=Rrin5^9j&d$D(Wq7TJ&POUF6X2p^iAIX_?P$HVt@ITVKa1>*{tt)aopDD2ho z@|cgU2G87)sk^q?ux8=wsxSYRs*I{^Sbn~ITlxFteaoAcUM&5gbbe`%;+Kk>7e1YT ztF(UcZ_aQ3+1~~DVq=r~^7`HNAJ)H8-=g+P?T@t!Y6qu(`M2b+XBY1=?>g5{-K2k% z@~=*;NKG>C3->0`t=#1B*y;l@(;&?1XCm;?dSgW$(Li6qSW!oap+IO2cZAqJH^R{H z_7HO5RE%anOJ}B@{738W`e{BE_Q}G<+|SLE)dvg_p6Wcn1j2AH5lEZaXq{h~RT`OS z!K)dE0xk68l|pjgY%c?W#4C;*Bn|4=vz^(RcE_O!!bOApuk9Esvx>h?5JK{>_sr#J zP5VQ5wBe(L6@dufj_1X=(ns5@E{;6-c*YeF*{e&h#L6k(X*Z$0Eu*Y(b#bW$ycpAY zWme&q*1$3|;P6*V@5AXePZY@5UTO`zVCL3-B@lGu4)fu~bJau1v2cI@&}FAKV*vn{ zWdR^K@=jap1kgzyr-1w)^)%bL5&)rf6qa!S?icC#nQ)}Rv zdK(0}a27IEPFD!z+)P0P$rJ#{Jly~&j@MRN1Ix`B#ASfp!h0|)1i}=zIRe&!0uGaU zOaS{LkRVQ#((sHg5q)@v%o%K z7S_7&t?ad;e2SODLE|kmV9|o6Ybi3? zfj3P{k-HsO9M)1esuf>P7;w;lE95yaZl^V^WJv=EF&*6XUBRHC10KZ>R|tW(+PKkm zef4i^;PvljN)Eq-0;GNR;nua+O_P&z1q3?vf~(hz6X0tF`w{P`fyQgv=!E1zpvKN< zAQ;X(kwbuJqYk`k7FRMwC3Eim242yzp)eB6O<=>Z$fY&#N;@&=)-`*7Lhx5=ZPWo@ zCQhS)m(AHC<)Aj2pz#v=NU>+)3dH`DlijU>mj-DBr-AyW=r}`;e{a+Vftnrf+q4G$ zb#^-hjc3@AHxOtI#d1ilsK6%??YKgKAXoQAbi^`g!1=IP5|Y1&X{5~6h4bN!6(Ed0 zq#Upk8CSh%CIB1=#D-$izPM>Su28;V8wy8MUiuO2O!F07k(xAZw@eL9>!zCXCTvL-UNtm=y&_=djvxSG6GwN{V0ze z`sIX%8)5q<vk`_6U220HIc6Q>7%+1O5qDwl^WfOx> zecB_0J%UNznsC|dy|lrs6fo! zEkPX25MflvbBDqKYBH+r5e=Uq!bTjgF90zX<58U>0w4n2iDS0_#0JkR$h5$^(cszF zv?UOh1rx6^~yV@*)u%nTrNA4V%ODD?5H0)(_KHCjqXl)NQ&h*pm%Ti*t z>~Xb0J|F>#Q}KG)cm8BRh%eMwI+w%`YJ@?8)j4K+LLkrR9D#R0E}NxmSnPJEL=;;o zm?6DvmTtbO#nM_t^Ey;LLW6k0UXl>x4Qxl&7OECb`WRxrlo&FG5ZxFUc$(X<|C$rP z;Yk0A%{Vu9kxqw)fZleIL;U73>IqY@w=ZrAc>>1XjkH*EOPVpqZUn@LaU9)FOAy_~ zO*dzfU;+?ZC4SG*sdojvJ!JeLA)qqnB+b}wrAm;Vu&|yWMR*x)!p zCL2Ft55Z?c#vt^LT;5hLQCRtni1?#4!ex^jL5f7=9r+?xz)I1#?Ol+lj2)g386t_G zJjM`2#JDi~ecw=a6tC>4I6Ulh-)5|f2#eXmIHwh{<#c)?nhK-5IelG01~*H0sQ$vq zo7Z1%?p2*q9a=fIvQwpjTmDCtZ>l_1xw`t7`UUl`*FRHxyEdcwF?<*B?#9P^PG~ME zZ-kowpDbQkJgU|zJYC$O^v}|MJ-g610Sh-4%cXP6i>mqBx9j&c&To9Bd2{p3-r2oZ z^&VL`+5V|#I{HCFUH;=uRX@{K@Pt`z%(3*N9!H}Ww#N*BK%p?Q&D2XU1VGsY1=3W; z)>?R#_WCLnQzUL zF4CVR)gj(n@%tA3>X>9FIW#_GhrWe()ieG8eOSk(Q^-@@PPN}!~GE&;1<`F;sB5cEb4gG1;xK9TM9E&MH#7dHScZlu&~CjgMo z2GGk~%;ZKcya~JWLmTm=YkCn1|60q?4?L~Hhc)t3c+1W8_bt3dAEa_gaBT>$)cei8 zg}3dVC1d!G8y`0CtK-bxRjKz>L#}8hUIfF?6n2Sw;c3=cu+_KlH^`dY0GcZi{e!-R z*JrAh3_(;R06@6urT_ql@aTNu^~bgWAe^@ymXB?Cd#3e-BTn4h0x+dZyj*=?3bUUq z@dIGbY^HFo@t6hxT^5xTs68RJzzx-G3e=cp>*QDa7T$ovIdf@o;IP903x$%M8xT$& z@qiIad%bpv4lz)%V~JeZQViO>4punq=52ZE&E$&Xg2{ z?F53LmlIRDGNj_YsmACu#BQ30gynToK=`^v>qgj~4NY_Joe_z~?Gjl+!**>bES-Oy z4!XCJvVkjx0FBFsB{bYz*$8Uo`}&A=BG@1bF48*xy3Zx+m(IzPC8v$cd^8|iC2XB7 z1%X~|{}zh=NsX|+ZJ1bsjX+K9{Oe33(Ee~h0&y76|9g8YyriabdmHTc_YFzbOCC{x zjQd!!#A=0HFt}3Nx_m%_j~a;FI}%dhVU?s=3_-;kgQ^1ZQZr9u$y%L^Eu;N}H*vM`(zB0WDbzAl!%n8HdO+7XEs+ z!Wc@D!3=EjUNa0RAv9^pV*Sz?>QZBqcKtcPKpd#>zA+$&A_E~glUgXXcuIG=`~$0s34AGsU10?1%neR>6a|Sy-vkSae`HL zR>9c`M5qK1ym-ZI1XSi}OZ5IM8AAy?r4p(QLM>0}$uq7NL~>9ITd)c)i^IW?p?5%J z+6lg%LN7Oh2)+Q3(pQgH0n*MGV&DHCP_l-?5)%bf=HiTt8RKdJ1Y4Kwc0lHsQ767& zfM9e-QkjjIE}|kd2?)LIVxMx=r&Ta6fe1~85Qi+Y)=wbp8cz}*v8L@%2L-j`)Hw69 z1m7+pgl89k1ju0G6_XHL&BomjR_rlkNtxo~CECQNBp)TI%~!$R3B(~jT`kOP3|2W4 zn=(q?q*YQ?ks<2GsBvh6MSQX86BK@H#W3e+bSvOL`!9kp_G{sM`oi@aJSFG`oh*$67n z8aw72j0&D&jhpy18@ztJVD>B_sfAvWw|7ebNT9_63olp_}B}z$| z_>g5ue*#fb77V5HXaZ_kvQd^=sH!E(9L?D((9JesVSqSZ+L&iIZtOX!XV=ER z8b5AqRez&?as6BM&(+?kJyN^8c6e=Y_5JD-)nD}VHlIU3|BUA7-e2~P?;YM-tol_| znN_*6a%5#hrBt3@z7AgtTvWQLbZTi2x;LQsyW-inLvUmI72ZsKYJL|#ll^z}pS)SA z`cG;~a7dp&gr-ArR{)C@fiU$StD)Z!VuEo@hDJKzrRYkj9$m*$KXM{$@8`Ex-lmUN zb+fVmm>>?q~#%0~LyRQ>GG}ga*!h+bXeE zO^l+&h}6tijG#MT?GlAwywlwF;O!{Zimq(2X#|j5>%-eo>cfdJr}tDB4OR~)8fLAg zx@d3&*2+Zf54aG#n*oH*Ce*7g1RGQi`c~eiN0Cy6mP8#0jagF-fOryVn@T4D(zpr0 zE^_h2?GPlkP0rI}B>;gDQ#eSVK^B|H8%~71$%(13Bvt&kxoN<2z=aT+MZi2dE)TDeLi zyghAw(93qB=QEQMw>uXlht+5KoNr-xI?RxQr^>=MF?ro+l;o(eISfS zSSsX@2$=0V=8Y05Ifa^b>JQ1^`Dh}Cde-t&BsnrBh9DYCGS8shKK?ttG#Ft0^KILGSCA!$fxrz|1-2lX*gAy8wX_3ll z=n>k-2e?Xo*V%!<=`Rt(+R+e$B}Bs{Rt_2%U9-IdAvSMEL*(H>;~+Dg#}6}_x8h+B zmg-qk24~IzO9ccgL4c`ewZS_U*MVr<+mH+o?{_+^ii50GPsw z#3-}0wrhagC~vVWH|Tjr>5xP&Epn+;)vdMi4efFrP60eP~ z4=-(EB(S$$7UEy08HAvL)Ru)|pz*I$4MNaxA{Mk$9h&W_Wr|*!S-Bvk37ZBqK^LId z2{*V}fSG~Bfw~ZEL<_BRr6X3ZJFF~n`t+IETKT4NgZzl4c#u12Xm5o{v?YSRV3a0+ zk5>Wl=|l#Hg;3aOn>Y|}e5nnBMzri>1BiKhB?z&N!h?n%v3|3-vD&O~PN{HP;hgHz z)txFQRd%T~d-FZRn{%6270)jGqjr65r&_g9Y957*eo18^rUH(q?tkUijqQ8pcJw>4 z$NJ^&OaHt-c^A8W>OTFmvi`ma7ruaf5LHC&X7n(eKsX@SX^Lj_g)eNZ*Cmy#qv4W3 zY;B%w9_&Y^x4w=o(@qNd7C{wrK1{4;kVj%c}~+sGiyB z1QF!FqGsZdX|sOJNcw@8gixd%!Zuw(jDdG+hp`T8@k9OxEN_(ch8z=>V zyJRi}V>K7Pj7DgdASh(8sfPeu4cR+E93bVuNo6lEB!5*mft8e;0zNx^^vk^}I8HBC z>J_S3@d%h$cbeAs)$tnQpn_A{c0+!(uHHW^kwmVRl%2fzYucwc5QwL38i8LsUQIng z^Cd+=v63eSwWrm%T@#4+xL9JU%GgfAua8uLj+(s3#fjvAV8NCT*Hq+w1cc985@eW$ zqzaaaS`cH(ExcS;2OY|nfekJ4ik%X*oFb%0pPf$?gRj*6Wm5N)blZ9%wfHztGVNYy zl03_@Z))Kk>xCkPU3DhN>n4hq{)=Yl?Ydt&+CUH|F{>mhFP+&2 zf;tnYGJ!CMw#Tq4kPkx+5U<3-NZTj*?Ioja{L&B&k*cJb0p^Pv$9RLy!6LT{wF5Y0 zu9{p=s5rKZ8!|>|i2Ye8yd%%trqr-)z zA%MK7weNt?#dK`N2%=}$95EFjTo^2wugA>g5r!cy=Jf+wvKLLIRqjc;SCPrmJ4{VI zMX$1bBL^u4WSA2VdV7D7zPiS~S;UQ@qv9OZOdxpqly+v@7(EvfGTT;Fp- z&lie+E?!bR#PzEkT06A4H~lJ4^Pi_a{HNwZu+IPK-7Z<@RBAM&Z^&>eZz68D7A<#| zcV6`8)+GzcpTk=0;WFHdwc@o65(0-97oLgm0nn*eCxGn%(3w{!fZ+h>#H$lPkh@D= zn8@H*BuE{_My(aE=@i?0%$Q(GSZg&01-WIWzts`K&!4Fd?@9xN7@Ta3^fh(~SJ)Vq z?;)3Nfs(8_gd?4k2~jPAmissM<^G`-Q?u zrs&-XBxtR8Lq`HCby-+8kA1*g!Sqg+!qc=WUO{34LR0q zVGwMKW*}C;A4Oc**Gz;ilA2{U4VcjiIHWERetB=D>*LD0{34=({tS!1E4?b5&ImuS z;V@Nt-6ARlwO0J+tC`%;S9sCQk7gFHFGv-fU;$G;C~d zBfmNai+f;Ki#xn}G%apqfG*MHfG!a6sj^Mww0-y6|KQ|;muMg1l?moSs#h7wrT#EB z$N*#_`iv0Uh?)?*Oy<`PRTpPU0k=mgp!I5Kg^}p4vjtX zdg+Q)`GhI=%CdtJCbcTp6#|C7N>6)sM1!1RJ0qk@j_pRk)jK*1anoQH5;RMjApc)h zDvv5Iuh(lQ)po7+R+dzLTRF8cx4dELccrsRdsp@-FD;)@U0l1dzEk7s#xac@8{%B%Er2ef5SKMk& zq7}wW(R83MilSi0n_2`hy|!y51SK2WC{W|N;ubT3w?;z5yEMM{yxMNlB&bUz)(Ky1 z2DlGQp@1CaIVVX1u2)a4xJ74l>G$e$E7c_3A#qSf4a*jL+Sh*>WD9B zNiLNTgiChV5CAf`8pLCUL(YL9e;mDS;2jw!3S{8v=qdwC>VF=-bhxjl-DK zha|&=rFNKj$**{qdQuM*@w_%oiLvTXk35p^MznY2#Q0Vb@hycN_xCMo2 z*o2YfyE3LwOhI&M?+?`7ub8Gs;uN>{5W>zkg4}DOUIzpolWmdm&FRlkuv@*Ow@z6R z1_KaR+>7pEB+8jm6nXg?__`Bg8F6YP`J&1*lO9C=I5r_7H9|KgFc(x=PX&5wDZ9E) zUs9$5fE~co5q6)RfM72Kk_FR?RLoSWyQSZRw%ZOFR3OTIdMHJ%7t%ZyJ&_*o(V}>A zy&w$_R0yJv67PPowK5?3DCr0?jHu|Nq$9?LRc}&(nPuSyhBd|;F!s?)1~x-iC-`20 zBGCr6w>&QETlgVnET%z8`2)Jd>DXVm&x_SGNG}iTj<$e+Gswa?gDii5_*t6;g$IX^ zyc?4|5kgu%$_RWm0W=11GG@_$ARH0Yah-v2E>bI$=G);7Y2~idv#HRVGi*l^U#Mh7 zd~rSEIE9;Ji24E*?4})sgDn`oowgHO506TS@ZE(!$B-CvEq-%&>cR~59`j(K8rifE z8OsB@oFz0*MSNXH@>JgLQ_D-R5>;7tjkhX$p5mqG) zT?@k6H~{IyPxOPxgPAK#X*fTDeZM(h9c7kF>XELPus2H3Ggpn+5X(GW&vCgl1CwDs z9NbMu+>*6uba4+`v>sgNpi@mHnFEBUM_U(( z2=Ha^FtV6GAu#S7L5BP%y4%PXM;mz62D@)H57nPdTYpcgrcdS+_3o6%Dj;odHPt~ukA6?(R zUaHNjT~j-zIjos)%xV0pab)Sl@=oQa!!HAVx3|C7!@YmFQLtxdPcHfu7Zn#Z<`n)A z{qh5;-v#(y;8wZUbNA;as+s&ZW^5||Z%w#hxlY5~vzJ#0G3M)SX|ThT5I&N+Hj=Yk76{MZKe6|8X#*)8sgQCMTXgvP3zlQ!#=buF z4!?o0a0TaFh5;D}3yMMrN-J@2Z@bfwF>!NC2+?7rnq}?X7{X3Eyrgo0nY~rBtoSwq zQaDJB8>SiSgo+PH>cXy0sQBeC<_^KoUM#*{Ig1(NtxZ5ahc-Z@{Jfh``64s%a6or;Zp)gxLOk?{%8-)%$w}55T7`j zxf3S-_~-=UO=J+%N3aX+=)^DGsC>*$M(cW-8RiJL6Cyw~>}-j_{lv>Z+lB~*TechZ z%QfZei>Mt$koz#UK;(ydMo3BF>7`Z17cS@W11*VZ8HbXfu7G|n3+6*nevpVFs1R2? zav#oGu6-Q-K0b}BgMq=!J?M#I3K?S;JY9UCw zMW*Y9gvXvZQJ>$A6{FdIsmh7Qm)iH44aMK%Umj^f{E2$-LC8X760vmwxc~uh?ByI( zT$#qi3-(DM!a;zFQ~aOm9;`!r)QMR7N2>gZsS0yT#-4=u%#r~)7eRA;Eb?s(*|Eb| z)J!XeYE&$~q=KZJTR%}TsSI~^)D!1916=CFOHE=TsQ|+L3m`w+w+&8Q3hxS9fDd(}{I9z0QNd+->p6+C;c`WqGg8b41AbiDe@L}sq@qdXrPKLLj z8a$tNBgTGVy7&$%I9}{jh#*t-3-H2_sYWXM_<&^lS2|in{Ss8BWFM7)@R5f>#Ml($ zEu<{y3yDd*2@@xqNiObSKm~OlwkbhnQai^_H5s`pC+RUF#}-4#$3v^8cfJ~_?p4vv z|6$fXqNmiH*Sw~AY_rl>(73K~Tw`RTT7SBJef{|Q&h`_?{GXgi4_bjhp`fKTy(iz2Di)R)`7dI^Yz3}_OIfZ@lo9341?#fNbeJQt@ z_b=}r?kp<6ve z4H27m%C+W@Vb$`l}i*BbcR-pxFZsND<=(Gl8`MO zcGzwINGHfpMUpb*nq!moQmKm`{k{akmN=xM<1{r@GA2%u5Te5lWi|fWQ88zg!|*}H z7T+(QuBIND$l_8YAk2dSGH!fVkN}VXZxF^|sx^+GWnolk6Px(i`s8o|VJ(Mn#l|I6 z)Mc(kc0o*D2Ww{6-XmhA{(;(ai~g^(qo9jk`X}L2Uxhs zsHMj?W=$4FRFI`GNcChjMie{#4uf+~tCE$KtVmo-A}6@ds9 zX_A_^UF#(ifhpJQr-i>uLa0S)@fA|p*FfZYxgn^r#&&F7G!R*ss{}IT8eIUhuS{qM z(H$G*FiOWOanQXPLQGxloERkyqgmpI-UZFpSQe`o@+^_+8`d#y*XW>&vSDsm`cg zTK#slukx45X|NnGX4Ls z|0bu@%EWR~{XyJoORv%5twdJQ>j&VGZU8<2S9Aji0C0wt2~X&J*k^0dTJu{I?xqYN zK~N9Rc6|9myw4|wsTP<$mLM>V$WGS$A!?OIr0milxLxLEnm7E@nNBtWas--2swfa5 zP?AC~j-Ov^e(M_qlf#7wAjgnI9VvGdGle!JJ5__?7T$`4g!d;#0w#jI$SwwvI&?k2 z`;l=+iQqsmF+k(ugho1?G6){%6h76Zk@!HErFvO%CCti)9NI{{R2-eCL%w5P+`_zm zt6pPk1$6*nNe&9Sq?67$6S;9ggPq&Z+Uhf2rJ~3Lf%q;RdQ~qs+TNe>10RR^HqB3K z%}iYp=31j$YS7nXMXYk_qYdeH0P#Y@sYp%ijfxe0Sik7urRFd~1YIo5-}8sO4{NQt z5RO~0);wHIY{`K@Uqc*IYaT9Z1hZFc2)d$3$nlWQ7F{$DI0(Hx)T3!g$?4KV=Av3_ zX6Oo`g9d${MIy|;+uOEq$brFc(FIvE!&tcF3U{ts)--ky^f6=WHgdolu!=q*R67KX z|Ju&EwPw00sd28bP2mQGQi@~-h8>3RRq5}^zk%m865@i?}+K;S(L z+e#q$pEu8xJVY?BMu-hGf?FaGh+*}9J(k}1!;X4Tm!2Jx)A$XO9EfbLa8e?KwP^&k z|7jyR&F}KTYRK_`F2D$`&|DJ}L4+{H0j_f(Ktr4|58xn+Qx^w_v?a!^9QkEUr%oB_=50$~EARO>Rd z-7JK*T}}gB!6&i+33he+0a|kAO9(;k#9CcKWcpniNyHH%GJdb+0Kib4LOMhCyr^gwR!H!BvRh@oj6(J=$5R z>CABHRv|%vfk51)D=k9j zG>FLE0*uQ0nWn*yf)HUD6^>1sh)xjPaIwkhi#fLIA;Vp55JGYw_=|Et%rpq554!kO z1!J^nU`O4lLkwYwaES0F z!dcycu5j!YxFtFf&HR&Uqx|rEW3%R)&6`T!C?8$_QSE=Kea%CPdo&*Hxu9@Fet2Qy z{CUOakn`_bd#!v=?%M8t-qz-)F2=9TKi+-n@8EwlT>|A@;}1IS#6ia#cjDMVC!Kua z_+!62=rH`pG2>4Id6m6r}>t2Pb{;tM3 z(Wo&H%njhfc%|Mj+KntI?FmLtdyyg*`9HMtfw&8Xt{7r6wx+#k%E6N{oDXN|_xBA! z(BNZLpmsj`fN}n{S``G&d{stIdxlQ0?(7=7b|@StlcVCPN0Uc&v~fpI`*&YgfN(`{ z>xZ0+Z;V@;6`|=fo^bl3r#(x}iEu@{%{$#w2)t0ewCgVZsA;dD!sdmKYIXP|T#Q5a zM>12aJij*bp~6NXi|t=WPkU*!mhb%zxq{_V<-^`m@EI>rH!fPLb$XOvJ$-Ei1Xl>c znH`RvwuCBC-I+A9CGxMffPU=;6X|qh(qy5~AjK5yQLxbNPe_<26*5`;xOT>leA9J8 zF2}t_>y5=f8h2uayQNAiS>J&U5>_<_dKk6r6Zq(p=vZIJ~d!b>IPe(m^zO+H2HC z4YyP0djL@?l)+47^t8Xycy*UM69ER!E#}2~c3vC3hG{-akKyo_Vmc(|>Z(rnfHPtk zJ#Ahwd6d_wL!@zcOhws|IDG3o6OXOaqx_!vYqwVT5G(g$qo+Nu!yeUf7!38Hn9nvj zy>*?eRp)j^Z3JNq$W?Vh+RdYIu@1K@JgR#)O}E-m%xNFAcvSaM8XkqdH+P6l?`vwf zx0Oo0w?Dh*SNQthQ{fu`BO5n1PHcRkzNmgvefRo$wZGQRsEw*^P#s;}u=4lH?NepZ268}gSO$OudMwQ2ld3KVO^DoJ;(I=V6GC`( z$a_r%wDUI#3mJUEFNAOxNmR^W*wrpsc)^??W-#n(Q-m_&b4cz$6_~-WIZi5ectMjs zH^ADWxt#+#K=`?TD<5-V5n?kJTYR>YXrNdbA%?Lzx^TIe-G*GDHx?sYTyaGHE;R<> zX@uazpb-sQavumEQD}^C$-zqhp{eMRFvW+OK?Db_eR9#5&kcJdrXq%#osi-W)HpK} z=1?M12HPbDfCOeH%n4zQkC3rl6UNeW0*Q4YonU^6WTEgXGJ8Hl7|Oz$iQ$T2DlAT( zuat|7*vszQg%FH|#gJDS1a2Ie7ZaZtGjn0DGIPm<=(#Y*O8^;ED4+?&PmjjLb72lh zX=4?bxiGGmh%q}@4E3Vt!t77Mg+qjtP1)jyD`pA-)~DdIAm!hyV0a>n7$plC<6l&u zO*|~wF5FRs2p;#6TJ+$AV;U5qxONytrO_I5XACNoPTHp>QPI6D`w~(}A6X^a`2;cL zeLilT2{Db^A4?NM*l!17p;`uOSuSuw*bb|nsRGmZbJz>&KsJ@oURs)pd~EWVtR}5h;Jk*Pe%I7sij@;7QicEZBjN<%=iuDbt$dK`NuU%dZ#oxw2 zxuIpndt)kJJ3OsVrC{QLg%v>f8)}4$21n2eV^kp0$^K4+?Y}}TuHOw} zDA8E28wBpAn{vZPx5JQ{@hXvO(TMi4xT?Y1v8k(b?2~rnG#UuG=UWFWFMN@HjJ6SIv zNZCM~RBZDK87pZ>YK%5HxNu#JUHzSfZiD>?@+Fko-W-` zI#K?LXW_SZ>bH;jO_x9KxYW2sDu5l_H)MONk)Zr$hsl2KJu`dl{lr*;LGY>y5Z}^^ zcd1!#gJ4z100+l-y%r#x5qLtwfw;`j@J31+FcW^RJa(_1 zgG_%}B%vW+-zz-mnOVyx1r1D2^0|lBW7ABSbBhbXrhbPP9#rpYJA7N%Ar257>|H-~{h!5G_s^NuqBEL66Mas;?Sx7~InLYN@<7s(Z>Woy|r7d&k?&qR-Ca3dH@Z)4yT-ga+D@wC}Ht>B-I zcaM6JfJI3(R!3jsSOdipo zOZnJ31;Rvg3lWJ>m@sH5H>QE3C1&&Hf=BdTDQLiP(Gn3hf8_gGa!a|9&1vGz z&Rt-R`81Ic_k%cBpdmWpL3NL|zKb_9xRU^pu3d`KvMOFM-_%o54h)1b8j#~*Ge|Av zz*Lq3=W~~Wt!W0w+6Z90MV>}*;{idV zHWmUhJdwWq@Yj(>+65|gnM`GfNO@+IZ*<-T%H=}CMm;3w5{s(aPe ztG-fOQoE^kYJGA2kG-YdQuQ|aRsL=Nyr(++rB493{uh5(V)6d3NzCxk+!6Fril`jJ z%vc}C9dRa}xL_m#V6}_26=cSG|51AO6OCv^!g00Ez+4l2|JTGhg%C^;jVaB62T-QP zKI138Wzph{UhQLE2Gqd@!Gxy)e?ATrWafM35GwJlm=$?LF>P*~)keb2={Z=VO2?VS`ufW*$ zYYxmEuMk4Dkr-UHpfOn?Tr`j`GGk!uugP1QqX-fq z><$2OxPd25)`%HQOY|<681MwbB>FR0{B$B315Y3$bBh50+WO3C8v~2c8gc`0*RBKv zje&k_w`mAWUrJ5&Z>;5hgh_$pZtMbfTnn26{Wt+>WepAlmIjM!U`qGU_+|zY)B>;< zQe)t6Xw$i+po&YjGzb2sSB1mg@NwRzYYsf~Q!T~A%-+%KIjp+^4|!%nI|L1W+F}5q zcRtTSgHmdN7}JIZ4QkugfWa5-o2Dw9r_vCxO(Ljo>*>QdvPNUzMcvP5)EJM0e|1OK~Q zItjW9KuEnLRngdPkdX4*m)+s}KCXbdb(;|t-2`Y|lyX$-u+X^J3F6o!kqAkBfN_4$os`=FBvwtb-X zL~ifa6~q95#V7zSQeG(XHf&GWY=smH_EsbkW6_arscPb>A$>GZpD88Aozeld{DI!) zxp{tN!~DDXiMbDQ^UAYI=a#-x+N3zA_+9;0Kqmh{VMTuP!hMC`mCq@Bt-M$9x8;pX zOYx>a4sQxftsPMtS<6?Ss$Nytzxa0fwd#@8t*S+QGvGS)s~wa6^S7~n+xhzE-4*>@ zRX+Z#cSoFC$NIOwVmBPYmHH{R!7v#!k-qZM2EnqB2%*EDi-v!l7x?Lq1Rtyj>B|iG zdwI$Wyu@KGKDI)9<6qY54FTD>M-fR}Zf6jze#Ust#0wBoTWRAT%x;x{u)QSn1MdrZ z_er>pLJWcSE^I0;#>q!Q->mx040z-9(O~i(IQ2|y%q)2YBsBeC>-CISI}(yRFLRLI zagK8F#ScG#*aCZhOFI|4AUpz*@On5baae04VUr#~?mT~icAdmob^^f`d-iQ_yy-$N z6>K@K0RqHa)9>9NAV^`wR(R&biMprcUG9SLgM;j^y-+t-JZnZjHi~N;c;ZBJ_+x)G zF!FL#B6f5PbLU~oUR!0EWDI8@Y(oTOyxG?immex6J0YP-`W+fWy~^A;zqxmy z$#gde3&0$${Us2xU<+c!NFNYe4~oRc;=LHza?3rf4+BK%Mtvo&PXt6y>wAgYEL)18 z`#4zE4=NWK-7S$ULJ_vQF^f3yGF`k#Mc}$Ec9&96{E`>0t3>hZ*5?7q4d~hco&=vc zani9W%t#`XnA?tnske!jnW|a}Pc1Mh{G|OgUt>%{sPu(8%wC z_iRdv_?l`4%H}Z*BTq$!U=zXk;>62Kiii}RUQlFVn{0AoI)bi+WC&81ZXbEl@K6`i z@X*p-Uic-gE~gpUu^tIO4xy{`Hk(xa|qvH&q0gw$F_#2immH+{lFs7F^nlo1A*Ad`^>|OEvWGVWvbVy-1I)dU zcyPCe9G9CEca{K96~q#6g6MVPh%1!c+d+b~bvYUqEw-fLu~5Xx7$9F!kmMn7Yc;~{ z`LPugJo!6q)P-ppwzR<4Rfys(z8r?fY%B}>fK1W{qJAe)BB&4d_Qm!RM~OtnuHp*# zvNIlvE0cEA2w@cLE|i5{jhUYKq1-nRN93JCgn*a3gH?p!n;faCuL;{hadUsqyBEi^qhY1A4i}`RkS#vRa;1*%9YJW@xl$j1at8xn zvJqN;+#A2S;>&)~HOf&WBm^Yf%s_;vJ0Rfe3P|sEWAKG4kF9c4g&_iO%PKM`(!~Sz zDyIc_>3)ic6dnj(*FeLU8aKATd>UmnD9!DtNJg2W$EO@dp=qfP1j`I zGQvAH-CECn-bVguUhVSQL8W&~H{!JaXT`q4YlR~VU(EOC_s{(^cX95J+eV_KnnQ4jh$b-$bR+yX_j1D@aWTR*! zfY9FRcY+w6nU*+@>;y3k2z|=k5sjf^WT%*u1c@$EGKb<>C2VyFFf+$}!#kIaF*3{i;fK%iYyw7o9OK|OUl zpaspDk5uufc+g0i!+`*Cv?^MH-`|Dcq8-Z(8Q^bWByOt$l*YMI8DxW z?F)Dm@73Z_G~dpgjhwZ83^>E?aYdli1Ur^iPP*2 zQ{s*@=WmbAEs~>?i{e^L(H*(=)*9xoPj_j|LCDM&QlMYhy%h8)mIf8>Os9>tge1ro zn>4sl_q6dS`PMNWg_68mF^~cvn-j6>VQTPo=~Q&MAv982x1C1hxG6O9Fr@}v)5cL3 z_bEJTr|us`o0bp*kNV=8JPL<`?EY~??}sTL?@~aVc*@9A-qu{z)Oip?m5RmBIuv-+ zuHAD5>Eu!#Gjkr*;*o%vS)E2{B$iknVz-$`h3)^tqk`JAJ-Tx8zh@<52ya-JJhX)=t7!Ijgr zsR(_p!A(mD`E7^#e(ApJL~fBOhZf3W+}V^26@+)gK&|89f!ybSfb zx-$}yNAR&rQTi~zb8R&1M%;AtqM{pvdYOiZu zVV~t=#VA^5D9L#-1ns&JrZvDKC~f2zx?rgobhTIax}rCmglTL3iQanNWUqGw-srDZ zcddGr+bf5c21+;JhQBk4yA=lIf1TeZH<0^N_Kco8dd~4T_f~oH0r+IUw9>xy=gm1Y z^Z{+seb7c7iS!U1Ja(!P0-w!v-1DF4;!!k&V-LqWV9< zizWX(udbnh;!z|Zy_gqSF!N#;0@BErt#*s6$GdnGy4iJO52TT<)g?Rrnc&0MbWvjy*R`CGbWMfiYqxgRyceO z1r(1W0rSe?yf-@c5{wJ78aUi>&WxO@9)==dyg_8(h(}R@X6~X7lXoKP*17W*&-1@l)*b zHf!dg@=;Lxbjm&=0sSuG7+tPzZ)(_4r|Sa?Z@OthE1M&)Wl;&lO+#dQ7oI2|RXWh9 zq?^!A@A%tX1v}1}j<-|do>>&&(W)NN3C5f*DG;nm`<#ebCNRen(UTJ;s&C2&r4pXm1r{=eu~Ux$8~ZQK96ne3PB z7nqM!dXvpu;gH7QkS2TRrE06ZvOiKe+031!B8FNGq)uoI1AnXFq;bos69m~%j|+I6 za78r8fjXx#90={C9q9^^oBn1;h><;o1R^m@Z?wyjqM+w+Z=RMTG3Kria-0o_i?Fjq zk|*xIRREkqGm~fEH>YEX7bemH&HmqFY_Fx;ccqVDV_~UXc3wj6#2mSy!MmsyBJoa! zLf{;jmH80kU?ulSf+++BUabT`3|5Ha1Oi9RtoM+;C?Uo33;?0UBvX+6z}R9R3BdAW z$x5^TcY0VVc{yPuHb@}nVu=z+3{gVt$4Ep$jEB~s(SI#6+SoxjQ>as9Vjkoh{a5@f z4T6$D914aYay!~IZX!4?NAYh*d_r7Dg+%1Hk}V{5EXfZW{a50w$qfKgXwI`#zR`dE z326W{~%5t8FAzsyy6xV+_od$+q_|j`ftvr0bo0q5Wlaa0Wh+H?T@iEs{b-l z)6g$$^p#>}$e?}VFNaPzPJBEWDHHgEs;y4WP~b6tw8r>8;4vVw#(0={I+|{78=x5` zF3ka8c4{!k5gh<*>B03bOLYvW1ZPallbZc^9iTIWv)QhMU?A5+v(bMS&0aaz91!AV z`>^u1*^TXwyu(nG9`NlOVqCgK8VT&(GMd+RPF&E(H+&#)>SeoY(CnY0$MD4d9U<7d zZuI|UR2olcMni07j7I<6C#3@*1aBJxuzorKD~P@H7{YkwWu#7w2gTmjX0ykZ#3KzZ z`q0_AP!nRmwbArJAh3fIT_!?w5_Fcy>Hvoo=} zm74!qT5etMtJ#^w{I%JavNQ9&m5uYq6nb2T)wHxq70QRfS zihgHS@$)*p_fP#jh}FeE{$+IGZX9+;B?EOZjIRH~4sM6`003PkC$G%MCwC(RU9)4E zGRRCy=sEFuzZL=!h~*W5AKl|0d!%ngpoj)#(e@@z2%UdA#6W_`)_UfkgcuJ9!SSvh z%O?XMw7Yn}5D0o%hSBKR-}E_>@1#V6V~scwrq3}`(2$2FL3UrW+`WG#J3Nu9(Ba`N zLeB#Rm2#|J?_Yw7#DqZTO8GSNxvG{0Q4g^8eRdPmukpt)3Qoy^FgpTAU=jx#Ix~55 zb$?MwA+(!@z@czUZmC^L?d+fuWM_KkYsAY^4mnN*gvora751P*Qzb`p_1`DxhbO+J z(sB>%{k)Hw8)LkDxZuVyS=L;=WCKOQ{{`cQPR$)!eO|x(V_*IQe~RaS?Ubi4_rGRc z_d1iiDtp=5EAAA!L=2wh`3FnDbbM*%_dl>V?O@W@W zYo&hh4UI^=5>8Se)uYRsY*Rpr59pPrn1%y^_K|IFAYRdHTgZ)_Tr?Dd%En%CY`W-J zeWE?rT>Un3@0cyIIFPLiB7H!h*VYnbXSM*T8N`dNpnR^`khwWxfUPSy`rGI@wMZPz zNMMW+%iP|VLXglqna>e$DcMVDu3nxVN5B;dG{M#KwG>zOwTFl!w14w9736qLXZU{N zlPQs}!>MrCWyg`Q42X#ee0cyuvBb(n;3lsguhR}l^2Rj;9$m+B)9MD^cZ0f^@6Rp>~xfHKa}+O?}%Ft_SU?GPjp zcllN5w5HQQ$jtLjb1A+jDWa6A?#WkrpFF~EYyzILGKlwZZZf2 z3<;3E+6jToBwkjDE4NzVfwn>;MsxLQlmjU;!?DmOx8oJ`y1LO0fdyjkn}jfNm)j0B z;3l>NgxItl4Xi2QimTE6OqTpZV$eb#pJ~X5>!G zeKvb$cEg@Mdp63vo|%<7C$m>(V}F_Yd3S%}Us~zkbGAPOZR*&SytmCRLti^YyA+ds zVwC)B?;~`k6~tr~Z6SX(N5hx8AUt+LrBim)R4#Qf=75abK|zu|2*VgVprKD)o;O-W zj}0UdEN?reM+n`J4xI?@;I0a*rg?8>hkkB+{u5mHOA!L@#+L#4IY#m48=<8aPM2Ady3tD$3 z$%>jLg&V!`UsI6e2T>ISDT?jHAt2#b4MZwTLP!)8hjH@f@GxxEEITV+?>&O_EJip2 zK6*yXC_r3-)H+6->f$PqU`Ddn4)?|(p=%+eNkD^X3y5$NEqbCCZnVYw?Iija6%i>q z73<83rG9VR7ZgH@E)kIn4^nI;d)qCx0Ac6y5#;j<;*S>U0)*Ax5oBWn5&BAjY-AuE zP>Fn4A7}Z$bV6)j3Cc%%<8^z(TkeD~9aFT&scI{gZ(7Ss;+ z1KkDm{w&2u$IT8cfOzBA)>QuNqT+yrpE3}0xS@PsQX%7;=GL1oD(oGkkQRQgrt+ps z77igQbq#U2nCrgIDd*uJKDLX0u3!w!4z?(xS#wSN@)LC3IA-5yTEjkt{u$N+*!8cc>R+lvx}*1qL-8d|?W$wel0Q zze-`^DkQ4QFU5dTOUI8(vjD=jNkGP9M5zl1-Q^#iVIXoDODb^6b5B>&htiOu1%>+m zX>aqMYchpj6>lx=SpH`DnaY)wBdVF|h1GX!b85e>eZT&6{Tg%!F3(NQjqSN6=jAug zpI`V+rI?$aKcKK_entMi;+e%giW?P{7G{_7Wv_f~^+(kQYhNuN8_ff3gP8#JtJSR^ zRj)nY@K?Hi-lNt}^#B@6ClV@h?!P{ievYRe_0O*p}31DtY093qfD6mqr zueo%hE?$$_qTz`razN#paG;qJnU|TmqE=Y`ZI1pk^j1cp+a;#Iphz1R>@nF8R|45CHH0ZpW6^Ni=4B$XO za)~fCxI{$bKdh0obd^EaUql*;V=4?F@J32*RllP|l^G?q=;FP#LvoxsxL=CTKM^z~-gOhvDQinap~I{JE? zDQeO<5cio3oYP1VV+vX>ajcP=qS-*MsiiYesJF6%MYb65C@gYm@E1&K#F>gFnAwpz+2%y0dD3M{g)TSA)>T4m!f-vR98%B>WwOP&C42@ib^?bLpS8PYDk}48fR@ z9X>-Wj;nQ7M#K^7dhu7Ug31$Zbd9YEQ_1!sM^1Jt(ykOY1Y4+n?dS%?pY?L;NRYtx z08;@_wt!7Qa)tcDjG?<|2(E(K+jMN5A_ogr%{R_GTK`?XFCnTSe2U%jcGK>W9)%s5 zHS2@s8|Uf6TM^Nt*Mh|NXP3@uYOZ()p<{Qx>xZDRuR;j_NTKnUgEWH6LGSU4(ah%3 z*_tblBS1suZOx^#u+OAe!X-!0oA>reMKs@h9~*q@aduKS4E$oWi@9{rd~=$11@A>` zZ4N^W!VaJ$tWWcuVrgnSf+Y8VmyN^Xf)xvjEid0F|~@^{LcmR6MRql&-xu-*~9`Fb^fTxH|hwAxQ=qibtd z|5=@0J*~P6x&q(G_vV(AepkG+cv5jh;r+s$g_8;+^6%&GtY4J;S_ja$VcFnX>nQGA^6DXd!qS3dBT( zusXrL70VGqVT#2^F>H$wL-?Dsz+RXG;_hc~RNNO*~Uyz+At@wVV$ z@%Pyy6e9V3MuXrbIS^*AlPg>ft}O9zGHcM0#`FtfA;cwE5w}swVM27GeZVdZPo+nh?zo z|B5r})-GyKlM@0uV%cW^8s_xa+IIs&AmyQbH~)vkQm~p$!AR8K82@K&gs}P1ul1<5 zy*mdZ(F?)0!#6@8^u&h?fmq4vH=8TVvE5uj+K) zkA6pu?*Cr5KvF0Md$?t#KHyPXb%VFo4&hJf4sYp=@F#SKxBQau$9927v=H(i-4)*c z;tbJ8H?L#;VQC5dA@p>Cw|#=>quYlDH*bJdUNLg8v2hBZRCHNOhvZnU z>jJ?Q#6~CG-u3X+gM{yLT~Xhb_oqPPP2DVHJL^blanq|PR?>{k=2v>#^X?ZL0WOc^ zdod7ZH0yqAYbD7gA^<{9W_3h^5N1ZhDo~?M6T7SM#E*V?vi1^gL2xDSD{6l9%R?2y z!4=9{w#`CUztsIgPf9KkkmHx*yP^@)e`5T~mo|6w_nRNSXV!PCQ9PWH2p8M}!k|g%nE;Q#3@pLfmz9sXkn3_75iwTZ|}P{iq!cY$4npAFe#$ zzaUt=s`)FuP5k?_`1iH!tnAsDW%$b9Mm?_={#^K3VfVu4iaTfS%AA||PG*yySv}|E zU&-H^|9Spf`3-Wf<~A&Tw(xTAqrKVsqWaYO5%rPvJpcIzf0Eys7ru#^B!69X_)q`0 zapr|@!%4+4F0LgVfdrmTZ|u4jUr)X8?Ooa;ShS1~IQM8ngS`wAA$C%T{Y)eyuAtx_ zeM|js_P2l)$E?r?qPe?5B+lm(GA0_{O~|KH0QL>|76HC>_H67mKd1b}yUpg8w1{-s z_z4KCK(5{DrzN_jiXQ|;=7-Sv3RE7k2G5YsN14cWC_+#|935Kk=tM9r5#so65E$9I zaQPU8aBzi=tnE8NZja;`<$qIDR4*1!^TPGDwr(@~pwgD5+qlF$^TKz~6Kz#Qe-pyf zu{Bc{Z1PS`LA>V#1YwTdnTBDi3zwgyAiks$MR;pVk09oBCvnN4k_CNH$=Gt80C|6q zjER>^F-3ae@?K>Yhv}&-xA_WlgsFFf!BpUd%l&rZqg`N?2!n{Rfv+eca^+$N<%N6z z>tCuzbsZ~yEdDrQ7MkzjsXP$F6=SYNiJ?dbV_PVQm$*Mw ziBIP~wvx$_(bh@h3+}=b2|^&#juA3c0^x{AEA+9vH%|&L4t9gy;kjR%w96W}$7W8| zv3P;6Jk5U?eTSACk7m&|4RR4u=U5bLB2*FKHC$yIZyZEvAzU;Z2>R?aAvP->z+{iO zvfCGfh75*(z4b#Si8s-SvExx#p5~3+U-5OS3&Ap(0FngA4Pr@7bxFbz#Fj4hy~QpF z+q#LZP#+uGGyO`#3__9ht?d+Fe4#*JqGH0xZSK3dzrUTzm<}l`)v!kRJSjZ*M=DgyFxesmGP!oezr?| z34xkd8qb$|ioD&DcHxyxWf{lLMVD^ct{*|PG5xLClBCZ-@HP~s>~u>~?8lCT0+lx3 zgt2oW1xZhIaB*6qdZJsBAj*K*>Sck0V`UyDX|*72iTMhoBtY20_W?0h7j>N=XblIu zbweXc^7PS)qZEW7JQCNk-}Szf-On$6RJ^QsXfa!OvT#*?arwT=zSZ5UGi!f}=K$(Y z=daHnpWiOOR_-R;{;2k=VBMqug5%t+ zMI({r8m{;X%kD>`A+c8_Udd4aWYUSctGVQ6(>zGL60QC=U65vZR8W|fu(mbs5L<#y zDQrac4YQQ&1BV!aAYsR@00`qz)1{h_rzd1UNDXtiLQlW3(p>V0cHv~bhMB~{Xf>hR z&4c);C6A!*5O;ucZRc^L2cSr@*4Z%NDIJeaht~k#2afmBR<=$JVvf-aXJ!Dx_?`oS z4Z&g&yUvnF^eK+_d{U_~4fKiZ{2z$Sp&H?k0|*gr=9^{VKp=OplPz%d;4!H*sMRB0O>Qn(fZaA#yGVi9 zTT!5~pr{d2a+)G#Ton_c*pqs118XN$&YA?>{z|+}};?OQ#K_OP{{m9}{ zY!0WQ0cAUQHkT|ka!8xwl@>PX4=-7GXetf5#h0Ip2IUoPS1nzN$^tZKn39KE5H#S4 zLc0ss)m%B`z$vFd{54%y(Z!vjfw<(aDDqp{l{9D#3g7)JD#{dlfCf%?L@arzq!FA3 z);TQ5VoBv!iA%M(t}tLBR&8_1qrM{H|4IaE`mC*RtB3Gvc#0TKrm8=qZz9D>!U>E7 zghua-X{x$`d7H5lK-gR|NAKZcagbhxi&S4SZkTN7McX!{KxQEp$3x~40j^pg;Ofj6 z77dO7S9tS68vHw2x6gWG1`wDou`{IRl6iW?3Uh!dm_rJVQ}I-%!pS)wUBs-v8NHOsrLu`RE)a0Tn1KBdfaP z=A-RTj3j~vI{hh{0)oc#`Ofihk3!f}36UGpG?<9$^G?+Wha8yNkqC1%z%33_$h@_d zdEDC~^Ju1L@A3!bi_3?Uhm<}p{k}AzG`#n|-kBW&fS_jGq*=}Y4%syeS4Po+*^LQ zwtn?h*RQsl_s5QZ{?Vpp@ur))d2nM$h%A<3k-c0(AauO*5;aR3#C4w8s1skZOCWgS zH1~G%D(O`wY#RhSB?-Ui$aZVBfpwD8qlK{xh7C>f#c{hGLr?Mnq zh+?S|3So2Z?OSTsO!Ny|lGEqQnQQh8F&6ZFmlUiNAsV_X=RhECvxFneF7G+V`@9k) z(KCqIYR+xWeODVSIkkiTy^mgSf+w*J3W$xhpjTLIM+ksy#|xTsUpEKf9D%I>O->dW z@S%V>mNe&n^j%FX(T9xKL#B_!PY_GoXUT~HK||gw49)$}9M(t#c3ftMAUiv;k|bA{ zXXhJFbMAkR)pAH0^zmn&Im}&sNE-x=GcbS3ZPb=4vZm10YLoIxu4wLst?zvDdIv6f zG%(6d*_^v-bgCRcpv)2WSe0pqz>X*oA8745oEW$IixOn+2WY3XHmk(wSAnnEDWR?!xUq*k94`o)rrPg^@!Joyj@mpi)X$@Pl;U1y}fb5HDKhelS>Z<)VR| zn%Nw3^eTkMy#&<+JW2f}`#RpbXkc#_E9(7h8ya-k z6x#$!xwbZ^(Pic(&AIQHR8H!O-oTLvT@pIvz=$ck(HMU9o@voa8g%`8zFXO>jT})@Dz$4q z<{-EN0wGJR!MDexaz)F@p{utyZ-c<49@2N;HgzPoIb0nI7WVk)2u*`WAMAs!b^ccR zjsx={Ua=jgzN3GSrondun(Gqf6pEv_+91&T=A{b|X*5DCC%m7=qbLx+NufaqWX3#- z0$~yqTaE~UoPqf+5T>~;5k!VX9~4w8+i-=(8eg?QJdlQ<58q;Bl@Qn{jrvv9)Z z+?D#B2@ybJ1XELU?ttE&99%(i?u0-LZNn9oA3y!*t+xq0@N$ZXJPm#4s5UgvDiR&b zx$mHCYV|+31<@M>4H2qV=z&*<m;V-g*HUrrl9wqfOr>~ zPE5m^)Qg&@^ra-*C_&Fg-gq6Ngt}0cIbJpc5uJMaPYb@V!HA>+5OaWWhYP|3NOpHG z&@Y=f)CJ449H9v!c-bV5QpwhF%O-R~1=BD=c2E%SVaXT52HRap#V9jVRSaKY2qLn* zCc-b0MI#Zp1#>Tg^eKovdlnlKhGB*zj|>&Wdsm7=_j$2>08~uNGSS&n3d5STA(#of zhJr7b^6P=UJGQV9Xs!c^L;U6AAq9WiyProcaAK;L8FH<|>6_a1zC^C4_d&TxL33?yRPaLj^{6|Pn5N3DJE6g3Hh*-n*(OM(~ORI4(8X&ujHN1fo zL?R&jN*#zC>Y{htSxg06U)O<1+?bD$0tn-asF>W(ngNbQL1D{sKY|R=`m)~KNrQM^ zexhkeZ6#GK+OHVuykw=0kbd2~;;$CGtk(!)S_eE1)0L(onZSJg`wbiie9IL0J64;B0Pl9GJ99h1;2uV+eD7 zFgE_H2EyDj4HBBFxDzUoDKYxrYQ#EZkw-ar!Qe+2{cl0|{r8B)XdT(%C9GZPjo;Kj znD{P807&8^9_MxdiDc2U8e)k-V;GCD84GGTFU0tN%P#!m4-rHR$(?!0duCP2kc6fr z-yq>I?`cnVBq1pK_#0)m_%fTMx{o;wQPJajj<8S78W}F$(`WvkLlzq6va_S!N0Tp; z%9H|BxbqWZd97r*-&2d#P7cYG@0r9!ZZ6nbnJf{+(^TYs?}og4nua9qj%vj*#|93@ z-qj1)--WG8crs*RK1Lfj)=Rv-bdnt6-R(=>#d7H!5pBlpY>zTZbWK472a_$=m%kUO|!H8{6>Xe<(B4tk=r}>`Rp6ny9)aj zHp#!8pOgPh{(Ge}O1qWTZ{70$di|>UQT46r#o9BqYW45c>#N6AzgewSo~=x)oKV@` z{p&gRzyG|)Qhs;1s{h8B7c9ddUTih}j=cXLZ$9#A_NR>@cwJ^VN*rnn+Wyi9#N^Z4 zBkVOvh_UeFb~Nm4gb)Ez*LDcoDt(y;y#=VcTT%bp!0ST0|NI zRK}t~){ZaRCyB2>YCWl6mgV>L-0gq$r;3LC&SJ|V3=#C)?Y(<~MkLp~lEZ;`@OXvL zzF=|1Y>0;TfjZ51BbW_=*j#rt+z8ts^uo_76b5ayn@mBozw*Wxl*QSrJESOzj|NfaUHTOuMkkDay_yQArhpfRw%GKu{{Kj|2!L^A)l;2l%ljS=36K^F!gzTWwX;>+&@LTmS( z!xY4Gh=Q$-M1&5> z?A}38nC+FKd==E*MRPWGe@P9u74m*2sJ&~B7Nr&d;pYxSM3wuNG#Ye@#}r+}cg7FVf>=pg zWE&jt+hbvn{5>h_^=5f5W{2P`-E#r1jUMX zjS(Hf(}{##64bWwFWf^5FBd*sg)QT-{-pmyEc{kBAtMr1M0R5`tgPkzNRJF9uRvCr z6ivb?#vsM=Z>Z;ci-h1fnqz4fS$#Q_+scP$NeE2HT1^DWXo%DmMvWc5^|o>OSt5GV z`vfem_CDHkKkT>yR*CJnr$n(3fxo^=pAvANM|lqES$u#ft9DKmC5G4r!Ho$QtU|f% zURXfj2;MfCGw6PeCU*E3@!wZ3URFh>{vW+vcY>gI%NLB(G}t=9Qe+Wg+#o_s8QTql>WA_A z(8{4+%oTEF0TS-5jA(yiG0xYp{o3&^td(~6zMehKuiaWZt`=6`!TbJK^d8W=QGH4M zruwP%o$KqB*D1YNnpyf;X~W{{#o5JQ756P}Qdm*AukgFV0fo)-tMc>nlk?;9VcyR@ zk-IW?L~hGmDchg@L-x4#KktSverSWUb^JXM<3fs(?}d{8w5K-hdFY3*Ro$*iJg!(VU>5a?lyb$u^kN!m#!EB z@vdri`NWYziz}pqY||pY)sp*( z90)V><`CR*FYThaCV%Y&5jGah)w!q?18E|E<*&KuJ~M&9N#L*JU+!>=?lZdW1OcY* z)5R@kia3%!z34tu;7JnnYJeSC1BjuMU9S@an7UUtCLK)SAlBY0LE>K1!sk8}ZTjrp z4*1j@-7}OV=*3ezQi8;sA8MbHQlOCHjWZw)>GWm)pqTX;UJp>Vck5qHf-6nWTrZD-&2ByH&-EHK?j1f+(G5iuwEd4Ld^wE*sfhRM z05AzGr+`){G;42q1keer4H!lT*q|WPY7$rpK;6SDK2XpJtOJ1FDT}fIV5Y`p>0x+p z5UZ3Y2aQFyk8}fuqs4*Ch4^sLs3-oH0$_AGP}`C1U>MyC3(H$94h4RbPk`?Oo;o>e zN~u6WeJ@#)Y|0j8NEX8j`{wmVXoo7NjfA7&lHF z@Yv(-(A^Sy@sNhlz2sRC)`C8sl>jVhzBynf=ilDfvU}xox8*j>zE=8Fc2?>6>XDUe zDx+|-Ki&t({vx{<-st~U@ub2(3O5x_&QH&umft!5+0wM~G39M4M_0G(?W_O3xI=O6 z(h24M^0n1seP}&XySz5R_3OFQ^~?Mw^WDss{JGu-j^CZ$op9LrpXQm9Cc2JRM`#NL0$oBvJaP4}j74KS zUPW$%y(S0|Y~2>Yk`%0F|GiNPVNGB{C6OEqK@GBpwo(WuS8PnVkCeEj(!02F8f^~D zmDr-AIXGz|!g4DfSi^yuFMBhJOf|wljHz(uphRI1xW%gB?L}cm1cI(BYhw~N=1Adk zGIG;)2xdee#$sT#4T7bCL?ghwYCD9TO!Q@EdE>iW3V?)zm45BlEYemFfEEtwzDLYdUmDo%8jlqi^^wEZhu zTU{>4{6D?H>uM_3$hC!3FR3sHa*;j)>QK z;0Xv`!x3T^rQc2vVev-qQbdSW9J0o`qo6`bF*7?L<4yT$jdizygrRBtK&H-3%UvnQX1`zH^s6w)gJE;SY1gU#t{G@Av#YjC3gae zcA+CQ#6HY!t$J&vfJ(X78}cosvBamH)e43vwvI_(+i4oy_9z5#M-0n-0lC;Th9z5$ zkAp{X!u0l}j%h;5-X4QW$s4S592vk+;MtKF&T_F{!ZLEBsAa8Wa<7XADP>6tkb{Ri za!4Fa#tz9BJ(LCY+8at3R0z{1bkjj2m;9OJ+myeM4vFf3c^7PQ;do`nkq@eb=_sG|^DE2I2v>f4KEcL`R|2P!rEgf608N_iy zz5oE}FT_Yf>|&b;QK)#e4M|qHKnGTzf4c;KAAJYQDga#aZOs+8JZvIn{D{USNbOsK z@bwD_;=O&u5Y!J%zJbZTID&}69aJ{cRCvM`L3mS#7(+X*#TXApfS|K&2|p;PKjww& zX-Fq7895l%eT&KxxmM8QwXH&@?BmUJU*aZn<&!e70ut&)>?N);PlrJKi@&EC z>h%0cXeG2{kr13{IP7vEx(5m(oze|40lyO}VJ-iR_vL)8UhJ!^U4F8BRr#p$sLHFA zJF2@?U##s&_x~5JEF4iNm8O+`S{hwiyZF!I^y2B2UsU$4u3w#5J)`#N+DWyS>OaNQ zz!CYY^FPUNldq-yYR^}1sos)*y5~ysi@ycnJ;#20Ho)_GRwjDuPZ(#w&FCSu>BO~a zq5l)pNj%jB;NxP}m4VA80@2CdG{Q{QyI6&deIx*5HulC(fU(-9k_5fBZbvgh=%ZIJ zG49ur8wfu5mH%EAfhLY+k|~-cXCweH@lrAc)v}&znERH$OpCEh3XYA>rV%vz=b3ER zK|>q~g_#c%g8y35z<5upiXE6aCis+c49$Npmp0? zk`5_E#S+48b(7OU0$oSO6G$LEYLUp_W8B5(PLCQF$&&4n0T9|O(z=Wy;eIYMKqAi z*v$_hF8hv>+>>0sW;98;kf*h;%<5Lw^!hfIx6m5(~ zWARkoL19cGw9^SK3k>klv-FU@ph0(WiNk)-n2;hk(SQRnT755pek=#v$PR4QWyXz*9H?^l67&f^g;mJ2Cn}b6)Rx zaON>z*yw9T|Egfn(Z>!t^5|p74La`lV<#N-<3R`EKgUiu?x2H@7&kT;9P~A?`v!y2 zR>DmjEZz?tGy8($KjEW#{^aed9^p;zlp7lG<-2Z}3A{`6qh@vSC@d^y%)xk;Ve5^q zp2d0sC`0`R6kGn!JAV|~n2fDHJc_zrEf3_ z?HAOuye^bQ4HUK}#>}2XM=dd1_0E+=@1WRe8zfv46C!ko$|=l!(WktkYrWHZ-E3>H^`A1nEWPQ`(}P)9J+=iW}3zSDI=qtVE$SVA&p_6<}6#}3({ zW(G%JS>V1Ml(sVs6z|5J_S<216JJrXQb)<&-22ANzMgW;hy4*?*vvGM4kKgOI*>RF57zWD6?uhTn5pjV0PiV*9~7IuH;ui z!PQ1<^e8kWSb)Hz*4B@Dv2(w2ykuUNkh7L6y2}QikLC8ua3hqrG1?SG9(TNOKg*dw_lCyyA>Hawjjcr zIGYG-EBq7HqdLxLz!kkR!b&bYs{2ivni!}@SSPQxVojWZGJIh{JZcS`fsSNENrFeM zfivJyDCdPUTuE)jF5?xtMDo;Q% z=eVA2a);$cE3PNTTzPc@sXp52v0i+vbBcrF`XEakOJ=t4b433g~K#tF&k}(Ak61!KJ8w#SYzS& zR4Ne25o`+vJ%31!fvuMMf}60_03vgA&)dGuWdz;>qn@|jc8J&-quA=iCd0!liGoeJ32H>-F1_Ek_~CAivPMpS4dZxdI>^ND1z7*;9|-y zvLQbp08{2h6aQ?N*&UFOwwTVT(A3<$*x*RLn-x1T$qRiZFb_Pv}Lz!uj63 zLk&b)(FvJ^R4-Q6CUPZGPG_7EL_!cbh|;jw?uoIdmL#Yxl1mY~y)Ul_9484lz9s~O zA0wP57iAFckcF;JQ$+Y2a-=HWw;{x--5|o^z21jZi$rpJe0DV=!c#*)f@2jCK7Ae| z*wO`Ca}XR_=8y)I<^YZGXvLO&*>}9yagfSd2=J^qhbu^Oa83ClAU0pLa_1Olw63mJ zRQOvbrNFD#H5GCLBw4Xw4htbyWIHfO-nW;=Uo1TbC7zv21m)em@!!-C>#Gtmmzd1f}wSJ%(1=M80GZ9Yzlr{s|sH`OJOhP?Nu;fGG$pK~|+y zPV>f_*To#$2pV&C{E1Za1+7g!unhM_f69&xv<~mX6hUld{suvW;4^iEK)WYKIFbhl z!)TE3Xt@%?86LzC2woz_Vy`M96 zm-Sq6z4@ejTHE2*iiu0ABFBjmZT`YR?O1OfFKBtuHT`r>>4i4C zcFdNwE^%01@DAQyDa$E{)qo>8bkp3sT{4B9vK^tKIErc~eG>tM`_NRP8BrZ1GEA$E2Jk=`XC6ojy~$BV>~qo8fa_#y=M!_=@PXFds` z3kCNEXg7DmT48%{)BM`G>M{AX3)2c~<(E{yQLR+AE1y_8x%fiywCdk#N9J$LpPV0E zIH9;RrU70m?O0l;ymslImBqEKY9-tf@OykO@bUT;_$uItdd~gp+5Nx%*3bMqb6e)j z%(pTd_^9hq~mpSGOW!Z#CFwCr(8?Xc2kLT1jmnbkq}z@|fj) zZ6I`{(}HwBC6eAGI-O97AZAGE2`6KAI7G0TIMuWd5;N}Dpp+~Q2vVDtEc0Blu;xs} zn4XOB?9@_G5m9vF)KF8g^Sl;>Q_0Qn7JOYn{HT}c+^M|+3RbZfMX?M);iLQ|GZVWYhvU3q@v%!$_=qDUMjn8NiZOn9FixuAm3C-Fr7-bYJ<}%< zs9^Z9DamrJZa8^T7CMZyYsjI6XT1O}8Qa8e(?rr^_|vut#k^^FVZ60eUKZ{p6-J_5 zbBrS55Ct#3*hGTj46pQMB0|*AeMt?Mc&$U;G%#@*ouS0Lgv1uZUT+bfXs_Vsx%+QrsV)>lh&wM_(3UiUV6Wppc6t5g+iNiv_u^ z$)Gn>x`IS}mD2gbxfW~H1-M->9HoeOlca{R25h5*m0pN{LmR)LtNB^hNwS!_-(g6M zI@z^AQ2vt_Am{GfDwOnGhfYnZPhuK~J6PoeZ_3_^$cek{zUO}N@K7s?+@EY%g^TQLZ)BgY;rV8UF2>>UG{BM=DWd!~lW~{P)$a@`m7q zJ59q90j_S`P%Bt+MenEE&Ju;bA1jE%?}>=LRLJkIHEmjc(L5T#0zy=-HZM<0#_);~ z5Bv~5Ks1VlcUT^EkQC+mkxCR#23U$Lb|FOT@kS(KF_9BozQW>ug!pPV2vXPex)12d zrR89&cc?cmtBA;LlKS&(F@nfd?ZQ3I3ArSIOh@(KT8;cW8EA!Lbj`Lr2|rzTyJT3U zw}n{d1|m0qR}+zj$6yW@1w?L!zG9n5;W75ar-F!xPD1^i#m)){n;$2Kyy;}kmn;qN zE+*?I(gy>^BSmWIOGXL0OUh0X2ofR{Q4rx@4hW>bN%!F#Dn=Y;yCX!o5y8GiL?$nE z?WrB@ht>)sy-ji_=Zj%!V!c*dv(Lg>y{Zyo-q>hJ2G%n;Am zCsFF-rpJKZ;S-lWg+L5Zo_4aajshU;GhO#=;XkMVhYJ8EJ^8yC08G-hc~c-L3$tw# z_8eedUG@^)bj1{Cu(c1wW}3!o&o5Yf{_vnZ# z?e4=RK!2Pqx2ySdgMYN`Q1m_@1lBcu?m3@k)S?2wf5dudNHaOurkT3}v3VN=K4HfD z)Vb#p{74!oHu**c#QZiiXg6dV6%do#A+R4Xe+6P}JA|xba?dpvzN5EXe=S>EvG0kE zYT-LL`f2HREz1^R8e#={kqTkcpr*Dwsc$Y^fudX?Y#MGvW8n(4BI7Ok2qy`9sbZNf zH*UfN2MKJ1Jo5+QfHq7y5RHY)b!H}+!YkZ-SO_HaDI~WBZ5VWtWA{}Gj~knNe`12; zuOrc5egy~t=EB!;Vh|&|*CYbVlx4BSacyXT044x=BDZkqzG?PD zDvmY`vmXrjlCQY(nIFbSUi^Kd;%cKSUrLV1z%v;j(sdPSm%m!xSh!55irnOo1KzF! zRs7wQp!CBwG;r#Jp=D-|#=bE7eGwo;rQ^ExY2iy5qg`h6=s=Nc zxAJ-KB8`yRrOSEQE(V0oMTI@+XxoJ_J%JY)SI`wIX^Td4;Ty+lp7OTDV-Fb~$J`wtug&@a^N%MW+gr?KhA^cNQHh)*%N1gKhP_crxE?`Q7FobAuTf1Km*mDw}1aqo|Dum5B9-`5X~?(=^fH~J5&^;Dmz zUQs=)I=q^#HWe5 zVM<0bamrcf?6;Eqt(*`$B!=1Byb!JZ7G%B)A~t_e(X+M5djXXxk<2(Wc9^DOO=c)1 zbBO0vUY?*J$^KJB1?QmhMMILsaW$z`v5~+-jyhg0B(pf0& zW4;pYM}@#<%?w#Q#UJtmjo5zs?RHeBfU$-JA}F5XeT}r?z3=*v`q>e3!H7up6P9Hqa|XjqCCva(+ZfyKcXnp5_&ij-`YRiaNFE%zA0 zHb-JiuaV?stOnx94bC=e#34RjwRbRlldnu4`69tLu2|##p7`}g0LMml4WB>C3)J`T4L52PdtT4O5VsogvL@J zpVbf<_z^MqRklP0^M0*8#bJH88OtXK@@Wl`aV$E9vOT%?GB2zvh$D^x;&OgH?d8ch zM(2k1dWn1tt+AFYiNi^yWVE4}^-=bYN8>6r!pOIg>1v12?5;AxpeE)HQ_HXI_2q6U z)VHs%U3;Ondu_w&?CQDI{i$~?v{K|_+H_w`Sk`&->&{}f4KKd$3J%mApK8qMva_0&KOQL-Z`W(WCV5fk-ag$0YEo~9RQT< zEX-scHm#XtX{1QVvm7Aw^7j&zQ5(d?iIdAGr5Naav2I1?VsmooCBC_*Xi!Ve^8V1` z>QW~ShG-64Wx5DXuGn%3i}{=>?-Nl>afQHVua*FaZM5e*XkZ$HAqwBfu452pJ5n?x zqB$_t)We<72!Sx=a3bF`G`JjSAY9wV4;_af15XX21u#JxFZ4diQfK023tyibije$QSYjXo|UMO7w zfDJW3$lwIbLa`cC;4*+E9K6`x2|LXER2l#WJD3{c;|c?}poU75fo^ePLv)RSTTnr@ z073>QVAknr0LUOtJ;|A7Xy4#cBN4#fWAj7+B(`oL0DvKE0Gw%tp0DT5lmfUDeOR~D zSa5XVyA>ZnVfwKe!2BB&;C*(bK>+OPZVD-YJF$Jbg?6$8HQkIRzZ-$b=(6?AXz{1< z;Rc-l0b1g!~sT@z1wU2_tcI>S5zODh3bs|^Jw0B`8UQggk60zwVb zYja?BsP?twz*e-cMPjox0jY09k0Z_hsA9EAK(T8gIZVn-^ zBwCqLV(Lr@fiQ0K1R?%}l+rB(%|1GI-#?+P>2{|yK3*0ssMrB@wmCv)<;pTeG#ND$`0Yl&0ry zEuL1mrLb#Zz5FZr-Sg|`Ucp=cpT%4Mr6T*Yw_Vs^m%>grHG({_A73Pbc2)$n5V0pI7WUiL(s54~Wq8{H`^7 zfYJ%H$P%yY#{Pjidvs{giP*e5OJz6qR&CH$5Ek9~fSA92dxY)qgqZxf_6R#QBE;DB z+9T{5n-Bq-ow5Ho4Z==SA{sg++);W1+?3VKL__Ce_9Tiv*v~hgUD{(iQWc^FGGjulfbjd$H@-yI`2x-3#%$nu18iB!n0% zD~LbG31RUajE&dFHTJ+r9BL>8TX{Dv>NiYd;?IH#9X{C63BBa=-x#eJ^X`@q?6}NX z0C`)VPJ42_W0Z^^JQfIp6Uo+N*<$~|JI&LdWVt$5$WQY=fBlRC*r6kNcf?eh&0Pk z@Fn&2ra9n|`ob6??^T0JV!Cl_;V&Utcy`DO%TU`j%{*ZX=?mBLfE%dU$l?!AL_BGr(1sfUM35P3)M!_toE zQ7}o!j_<&WQzfCch7^8PK|w^+kKYQh<1vZy{yrKa-I&JF>_CZ`mh)GPN;e8B0e-Rx z#InQE5p+4borDC{YrP?RE5tbAT^P=`9kK~IR_R#_5%M59{$-+rt5vCSHBuH&twCf! zpPf2_H@$6b@7+N?=MB;R=v$|nQ81#HR4x62#_C>W5RWfku!R-Rltr@Z6))HV1SO+{ z44kZ~u$TEkf=WyWm0XPUQiUDv1Dt_BVsbDU zRpDJM@un5OOsAix3GbroOPCo6f%G%pgF8XcDp{tp&(qA|mMT&t4YK^JBo5MA8iRjvNG-Fqw`pdpTw$Ba+m+u|zF)p5e^Tzn+%35?a=Yc$&)$*U zJ3FZ7&7QyXd?m9o^FU@|`QY;4(nqDsO2bOo;!(v>#d2YB;TZZB0B!~t(VOq|=iS`Z zFKz+&{pMVMOS5|LV)S5)Hc)?!DFguBa7m24wgpU9W=hV&C=bMv!np3T8v^K zO;xm`FxLZ9dMov$s%X^34)jn}zn<9?js!6rmtigF-^~av#lZV;JcC-$k8WGbfQgYs zrCf=~zG@bPP!;l1Ier5<(DiB2;3kg{yj_BU0kh~5<7W|9K+sr_6-==p{$^@3?j$&c zfdPf&e`~hkiawmn8U~=TiAFeRIP&HNfBT|AFh>MeP6RrWsk)*zHQV3ve@X-osVlle zhlQK`^G3T43nHmwz6WBiKyF62N?XXg*Y3)g!WD>;&L2`vjEm*Pn0$#jhT;eipjSCK+p;>>FUXL~TVxO$p8tkMI2gkQ%QgTYw$cdhy`bTWCeLqa5X^g> zh|-~Ld=ZP5Zn3cB2!PPK5>^KS|1y7XE_lvlzfuk~ZrG*|?|se`uQJ9t5T%8ND~AO! z)FQchR?Fdt)i}fFZ_||L85$1B>2+LtKY$$1_85DJ=uY3{v{xY^G6o?m=tTV8)I8F! zfDpylf@cyjj&Vh|1&OX$WsVtY<5@-oU~4LDELegUG1B&0x;ns?n-==%T5cH=(GlV! zi9npD5!|c56k7UX%|3mqK``Aq5!ElYwK#%_=({X<8u?gCTmTJ7Zu`h^+?)L`g-G70 z){47?VEZ5te^vj>;(1RtlhJ*OyhB<^`@k)RQ5w#aMKy@xc3dBR1I`mmNJva3Z{ zB-Oich_->_{5KYv2|hln9SAirRFQvG`4gUK(3MT&|M%y^(N ztexCqhyil@(3IPF5edHag9Hk{l%yv{Bn59SSYp}+GDcB$$h-px(>36>!*~@CcB+8= zb;(YeB?m&x7Z5_fWa9A%5~T{_g_#9QjArG&MDc+6V9lTAebGDJ>m5`ZsQsz-!`i2- zFII1ASc>X(0A-ljBAx}kJpX@}zH3Xc^o&wnZRZ0`Kr0lBrar}bRkvsX_(b9d%E z|3H5oZ$2K<&5tVjF>`LAUTgdz!$}={g%^E{k*EN1F2bU1h)3nsqcWX*4%R%1Z|-e}RZ6l=Gvh+}lT#B!zbGi$bY(WC4@7Sw;eW;U0PB3)63 zq-&d_VC69phB_3FiubPXeP_EPam#Sf*T5$uqjUwAk}=;U)0*SPP7ndu9k1B+x`+%Q z&MtN#$x-}vA9v|dc2Y}R(K$n`#Ctk-IC^))UO2=Rb?g2g9u?HLF+s+AyDP4Ep_z2J zPxdGhkS4vlcQ{c?KtQt$x(PDTx7V#binuyZan+SyQ6XWi4_#^mV3@WitBFcaFlaYTBv%dV9|JZiGys+-J!j=Ahd(eVEoRXFldA+$~% zmq=G#RB+UQVg(ME((-i^N$@D%)k(_t$sQHfawlW{e@r$vCVzGQ=<>4adihHJsq%M9 z_mzH7oL70JvT^TY^=InWMqPnja?|o#7jngmiU$`57v3&?z4(6Vccm5Ob1P?8_N;Hy zdwF3_;kSkFmp3inRj=V&05_nIfFEW9=yw?Xs=HKo@t*DQcY~*XxFU6q>13U1I$1*+ z;b7_rhy*6^6IX0{iAzlq2$nHthMP{7?>lMODQH;Uv}jHa5{JBshUn3UjgK!uDjj#S z5}z`O02p^f8`)+mXnuT&P6Cs687UG7!_51Epd>I3!-=bm+9LE}kxOtKt=U{b@WPig z4d1k?TQtyUV%Lm>;L3zysayx5ylH-}Qq=~+8WKRNG6Pv}2n2d^yi?sXFLAoGOdvpm zhz6L#5hZVkHb1`p6hnhK5%h#n55d*-RQI$r%WUD)Z1ZD! z3$wKttal`_Rp9JU_Ou`emH#n~#8)ni94v(jE4O=QaAOve1KPzYe)Ho;2I+?;TmnTQ zZqG9ju$(76T6xIdn6VvB=@M2!0Qexye6XXOh+2JLhFu@jE^@t_IE z4H`S)xPuNpV%%7D;Yeh`q0p7J<@Gf`o;%9LV@p+H7IzS&nyaS-_~rs9aU;wKc0#Ha z4cyRiDWW;s0m&ec$hm zJY8K&S65Y6_c2Ctp=~56lOX$Nfh&CMpPaI8(!hdc#{!`7C#S4iA?`M_VrCUgiI@LC zk2mEi^08pf)pMGY_K;S6W%XM*@u}P5*Vw_e6F{>z3Q) z3`%vK3yPK?{<5koI3J-AvF~<8vl4eypuwl~d0O1AnzN#wW!w2fy0_spCY)9LV+?_; z0td$qB|u~LE)gP5BbXIJPU&?UeUH%Lkyyh`KJXR^pOpecPfHMi3zd*+?Dd;7jFmJw z$9*0dMBclZo)woaeIJ5XW5D@sC5>QfFmW@$?Wc%yGpm4e=MGgnvEKJI>^+PS9E>0c zv5nWmyyohynQu~1IlbJ%Hd-L`QLqrN6Hz}6efZCGUb+wba|D4+^w_)~g*;(21vj=21&AgrY zUFO@-uWMcNQ_m&-AnXqR)GBFnm1(lE05qlSK#!*4FS9Zrwu(fj+CdDdRZ{=#2r(Fl zKXrugf%v6C7~4#D`f z4ACr!C^NQX8;d^GL6aJ1jX#7A0dRBLjxaqSOs{J@2*0uD6KXICmy#2~;w(bw^wvEq z7X4vXpO~7JlLkW&4PC5r&_J5bLI*@?9*$hE`jC99NJrM{jT6}B^1pK<#a~CZxCLneI0rWrei&Kq73+dR~H7i2U zLSu`$cofxHLPRQ7dkdC7>=vZ}+tM40miI;g#Tf?)Fm5L^s0%e>c|cJ3%T(T26uYCwr3=qP0=8v^26b&D zjK&TKt7W|3SoGEgT2!0_{3kLtp};qi)j`K?@}OYRi#o3tq5{{*LxiZ_)|-kzpa6^# zp5gm`%Unk81El%EP7ejKm_LqBw)Q_(f(C8g*XuO@F_#oc2nC%vJ$=rX)0vZ3?v$h zR&E#lOEEScbU>=j#s=am8o@aZo|@%G-dMDvq7mF?5k0sZ+sD*v=XN1=pV zfiO10X}A!evE29^TN|{&l0Ohz@+aoT07u}Ti_6nqHFJ~NCbOH$?VPep}VvsLiUKSKF`pX7!%x`S?1(CY66w?yHQe98}q?{C0Uxd3^cc@|R2R zlzvybuyjbNU-9?F3B|*Tn-@NC|1h@oOOK0wscl?8H9Ppp^5O`3(OU?e#^uX6DiO(y?_N zsQh&dL{7;8nW>)0MG*CWW;>3kz|ieL1TS!myG7@J@lUSCAS~(bnyG$l+B-gUO^hXg zUgnExdqiQOthSH{xSsenn>k9|w?_*;CO4-^Jcyeg%0bAId9n|PPO^mgB|$DYAeyrgTW5>WCi!OWE4cF8T;8$oR&<(tw|tY0y3B!D1tvJDn*aE<$1hfR_QyeJE_$Xk7;3zWjW zQ=TcRBY^zNlwhP*5bTQn4M0qKD&^&dtklPXVq);^sDnxew{piwks@dSM4WFD`zsD< z1wn=?sjS#Lf(UZ~6__~N(us=6gE{+2kdHOQ!3&NPdAA&>e6(IPF^9zH$;Eg$gG*Ti zQ4z#N1xY8fNf;sOLyuyEDUdC z@wQduTz*eP#s0`L5(U@_6eB$4xLDDWFJnN!i!_(FOo3P0u^aN5F3}641PM%xQ5iaR z+;Y?q!mhV1le^xU@f6J39$^OzuxyL=2cW|>%fIgc1^jhbBu%j_aGZjKm4$GCykv3% zE=_9p;B8lAOfQ)(QEnLlgnyEtn%!G{t?Qjs`GMLl#r}n-3rCkHl(#HBRQd(Z^!KY( zsxNjA$zPivnlF`(DE_N>dGW`kk188i?yg;rll@b(uV&BAFUo!~^G4>L%-GCr9*7XB;VuLZpfX#TS*3=% zX2lVhmCmZv9fAg(A~Wei9h*k#80rM@oqg%JO(Hf_EZUFE5G6Uj>X(k&I6}mq7L6fn z;rd|1)JLUosi+#xs|&?&g?3kTg(q z<|oHM7=0`hv!bSDp}}i)2}|fa2*i23n?J!k<)`?pkeq{aTOVHe-PnmMMa~WEYb{SOIsy)X`WvRWt5F;P}JNro2KXCMrHD*e%MI!h=jP7fZMTaTbN6e=)1; zb-Scv38FKGr-g;zv{X5jmzZ#YFq~Wc#DTFRnqhk%4DlD+L`zV}iVD0U_bRM5G=$12 z?~>gfOMkIWD;o4a>499mnrJfUutU?H0bcr5sX~#pJ}-AACC2pP(^a2lhf2@CsDgw%2%dL<<^0AA{%`Tl(ugTk(Mam(i%5 zMDI^F0}Reb;N7^syN@;J=IRv|uEL;TA=Zj*EWJV(frU53?u1Z`$rcE$Z6PTnCsYMm+DL@3 zf~p-~;y|=ou!wr3uqNx~DZx5S7yT8C5mZ!u5@ioOUj%@T=Pk=cfOyS85#xf5u#n2^ zu(9-NU9%CBf~e$!I#qmudfV*2sqC`so!N8pr{#y|*DIV<*riY@f3x&qZdvZm+&Q^@ za$m~7Sh}=$fAP%XUd1mK-Yjp9R{{P~yRkN=wnuHf>hkK{=ndGk@=oP}%EZdID_fUW zmM_oloAk>Z6#d%E{?$#Xr_?XBBw}Zt1M1!Yl)K>Nd5azpX1&CYJX<16nSX5DJ8BwD zg<@=DEU^!NL}SCLSZlYRm;Oo2AQ!|}dpI^(G1L93alM-3Sf$?3;E1kysfP?g&_FjI zi+=pBOB6sqHz2{Z1JqbG9!(L=;-ht`F<=D<+i~^tL1XL4?yXzhAprf7w%vQ_RTR31 zRSzdXeh4G4%_+Hh>UaYQ7Jj^|-b{E-J_g^+2YL#wuVYMHt1&1Q?bN`nf&Tj|_rYl><>< zH3flXD60NURM>P7=i3{C-&l3YjuC;>Q;a|$E4IcxAck~=AR6XGf{V(f4?lm4LTgQ9 z)i1J!65|Fz7BW2BV_|NWebXQWH*~yY=eC&JW&5^5;4GHqYe4MN5rSywqcw*;;#&r+ zoZ;73{TzHW)hO6N+R2=|Pg*(3%u2`#aT9x@g|srNBZODDF1F`z^QAkJyi*o5egQo; z9ktZF)F2R-o?sAybt~UJtmk2dcb&N#{AYmdg9wh~N>||2)y!n! zbA_++tC^HqziabMWqH@}U7Hu)EKKj3li45d{I6dq;3`MbJ`0(a`HPoQ4CsKOLP|sV> zFcWc9dU)Xmhz%p+>iPEha1N#BM@Eyn)_Pjl&H12u{~dbgU5rem$$Xn13!u@kC-cZD z^HNNX|J6`_*Bmtm)*Ps0K>I?$cFDFc8p-sWj}k%wqIcc|Y8nmI-{ynfJJ2DN@FjQ+ zb^>K-;ZSWpejW@Zo8v~zn?UUxok<|=Ez-wiEJub0^Za5)Rb?8+78z6y7^;VmY$H zcHitJiO|JPzDdlRa8{zmfdFwEfv1NjoEfpv_R57`RtQ`7^|NF4|Sj)@%v`GrFi zx+gjoEs}Bebb;Sf?60VB(^}!M3jaU;qu2|2P1~kJFI$>4a}+T;o;iArc>xJVL5H{< zx+a(^Y1yhbL&X!n9!+XsyUsZXjMxniAJSYC_Rvzw_Hc4?-;U|MagzE{G*aAvp^5`LS4D8p&dTy$=@;tG#Pt~*wDW7bK)_ozOFh!ZVfFB< zPC#_7q@d}7ooe}&RBFV$ODH*Py?(fKVa+0+_sg5F(X{BgCrkD)C#v{#JSUX**alhM zE_G@&Qe5NV%b5wATG-cN_Ypu;Ys4Mp?`$N*B*>t`h2Q>e5VjH6Wm~_xU2rrN`Vi|o z9}wYbYrr@i!HYfkk|PuC6IMlc(YZUi7{)5fY04FcY)CIzWl6e=?nSH46wnJki z2cousNAOY)>!B>$30{>=SR27mEGVI&&M1tS_w(&KmKXL7B*M(%x{otyOZy81Lm_}< z+chS&>6%Omv9oOsR5Dl-r;GcItV0Dm<0ZJ>*r8EldB~phYW67gL%sa=oP{P(OZuiRDnS!LhKM&-YkXP3W%{{Opj!X>LF7B3M2)S z6fgAn=~y=ddqZXbC4dsqnExQfI>Fl)@rOktZJ-m7t)aqBnZHH|6|2)51nUg*fw)a0 z+7Xr4^*wVw5xXN|7`G2l`Vl~%A~^uk6F?a_2?+JQ3sVLJ1%Mqoc!iz1-iQEaG61X= z+n(*4JxCTwMzcg1yCD)Wfn-7=w4JMm8I534tVj(nRMBS*sa_|--uS%C+opRZ)hlgE zBxi&$v%1hpgXJHPZ6gxZj*7*z0qKgj{_T=`BiEtmAKkDtobXf!hgcf1^Hhw??bzG6hdPC>GLV;>< zqS)eT_vQcy)9iDr9^g;t3~z;!J-OvActj^Bzg35?HZE_$BVB)RnEPLKlYzRM$uW59 zi?t>A`J2ftG}X=|Pp>nGXw?IvzqTx!1OX7A+1{-&|7q02nv3>DW>_HwVOaA~Pf12V zSlpAG7?V`2!8C9TpdmIuxRUwsZizHtKdg^|5D0XV5!5qkN9m3EPmO7XfI=7_#UARZ z30E!O&(KT6cMgbFD=*$h9k7k87XO|t8z8Vy6Pcj5yCoBcv_K%ZWG3a6eqe%;?QMP2 z;>WqO9rzJIuVn`t)WOKyVPpORtmOnY;BV2)XB#23x4_WgRtQl+-vaTpc_YJtaI|X8 zfAW74XNBMyd5fKfd!>)frY!Z11Sz~j&}TwS6#n_7YtskWW^~$Xw3;vPpyl*7z|xMZ#)j4 z6_kK$5^T2wVk6CSJBS`2Q0Qt(sT~AnweSZT!R3nJ2t`MGR)i?EK%lFV*Tx$2pEb=u zk_I)Lid$AiniYHk^E%yEwVoBE%X}daEoFtWAVXkQJGPpY z@*WOPh1kX3U*WC})sy0j))gN0RMk6bNA)`uy!dx?_n_`fZBZ>>T~hsR^@Qq9)k5XE z%88YoE2Z*t!iVUNN(`IqyzE~5Zf4)EH@fcWI=^fGu8q@wPv4uqAbn7Jv(%i__|(B5+TM>f355S=W9-x$ zvYOTV%r5NJ2lU7Gh%k-c0#3cHMrAZ4_9S`)f%C987d*8w^#(KEZ z{p-)wkXRlUu@6GF0eW>neilV|=g4^hVaH#1VQA|0IK2pC!gKc6W7vr3{2!(e(@CLAFHM1So9J?0zO7V9IgcrRyrk!34rc( zPRs#82TRlE#WLDRDF|a75Zz}Vuh1F@FY(dDbfdkR?V6Yiq7SRuq7p1G9RAxw!=3xz}{7^&Qb4`rLvNSOh z_{((2BPtH>0tkO=k`~zaqU9316&A@Du_+T6h39F13Q>o2{1e$!gT$ z5yT~8zvo*xTwXrvD41|>h zf{7iXC+0AH6oMT4*TEX{flJ8j22&uhgA7D!pBg+YReF`B%GakSF6|>tc4+?qO=Xsx zm~7`EA@6S>a$;_X?gUh`#1@99F?rJvtx4*uNr*&%V2ulb!1mGelA8-4e7O)Sdq)ua zMd@%+qTa@wSZ#>%_lh8H8MDG3I=TWVc_JWgq#tUh3SPM-8!6FN!VbgZk^OBJTZqhKXAINyO2;y={fH?L^ z^cFS41cyr!@81M*6?%U|quf!NF$xSekpQ7jS$A}aiy?v#e5j`3(uoVPQ-p{WjU)3y zQv}P`$h>rgAte(@WdAI~4Fo(yOY3RI30(sckSg@Jzq+6D|0}zX?jG2ku02zmUi)cn zP_3)_Z1t+@vDG2fd}T@Hx0MqrJ5`E79pL16C7@I(zJO}LnBuVFI)#@DGYV%GMikc1 zFU#MNKP%sx|3Yp#`UK9&?TxPhzMj21`?KsmcrWm8L3Loi%*I`R@4B~ZY}bKZo2B1Q z&qYdc@QWvHUNqt4Vi>bN)Ks+-La5rNcZhxrJq4UMw-$*<&5OFsl)}!X| zBmu;c)66g-ckFxbf!-1!I^<4qlMNs&h@dq-Lx}WM$entInRy}=9daw~dlMlh zr-)mwsJA2mvRol_XdzCg7gvqQYw#M8yQ$6J5-^AUfbq?Ia;+ z543mPz=}=4y_1}n8=?bl#UoCzj~j!`B#9RjaDU*MmR^Kw}t z#01hXWjj ztOIWQ+aKY|7m$E`6L34WNeLlMBH&K+tvIb<0wV8x z2_}Yky9wb%sSsjsUjal1+)6qt$ zFae^^O&zO+&irl98Z7(%5%)Z4gdRn$Fp%)}8X*?3L+&hR}e@b_U{_m&<e%iX^*M~*(TUl5S70zhNz zrEixaF5^$Vo4Y@-Me`PK;AwFQWr z1CjoddZOF$zsLAvw1JphYmH#Eff!kBjj&y04-j6ZHNp-gd$I?nw<#M%#l1w5qOu33 zR&=OaK>pO3ZgJP>m!0Vri0^l%TOhvS(yh@UyM|0pkbIhLDPNXx65@$WO9b<%gfNfh zIM)F?2`9wJbZZ*6+X}3D!w6xOKq95{gSzZy%0Dr(6J>P)Xb9UHa{Hzly3S(dfdK-! z6AwK+G}M3g6;0(1mo>72p_iSdeu64f7}^h&2(+kMCJ)c_-X@yF{|NxSzhW~2M4ySD zua9pF{RiP`a7qG2G6LVf*69I%SL$S!V@Uq%o$97i25lRb{iTGm2q&_ojj1?5< zn~oOW^x3CNKU+t0E++*D3kU)TEUOuzKklN!4)qA~DKfw$0P9@!Ck071~zgh&CS zqnMp+1Q4^kJ9xpFgYAD2+Fkmo_7A5@RuDl-Eq-#Uo|l6NJuqq4KEVAa`?P|fk`Y%U zdcFu^LUaceS6SlHPrlrW3YL~s{wH755QkcjW;2V##QtSUEE0lkoJA_c%fCz#D0!is zpGmBAiW=E3TEEQhX{8|IW@;(jq&zr@aK#@YmZJkf)6zRu{8e@G^dS*GErPVNd{E&l z7?4$`wGc5~Okp-j5EF6A^@Ybl9P4YPso^<945PHYJ!xg7DKj_}DSMwQH>fElqqA!F zp~PUvHWj)#J5ncG4n@jtM<6_%Y&jGu5#VIS&svEXR?O^+ASbnk$Wy&bSLo9rm$~4U zlw4jbbX_7fPk0wNe23Rtf#{>@^_U`qwdFFGf1a%&%u$9ARxcvmuQm`yg*Go-Ua+@2 zKnSEyA{+t$h32G#YtKp(#n?1;&k)0oB1L2{z+CBm)-KDEr?Rn^Z=Sc-1|3(aw zxEtZNHIH;^JE)QR+}Obh&Q#bc2EyB^1t$VQocw#;R?|Z9ixngR`Mi}P9bdSh6^T-G zqJ&W*XN!eaB(|^i5yZ*oru-r83mx;aS>)2s5fUfs#PM|xgf1s*i1d?q@z-JapS9FH zY*>o;GjrA@|MY#T zdv^CR-CwCKsZFfyT>YqebM=Vox|PQ&XIJ`{-zeWx9$Ow%dZ%=4>9A6%_v^H5fzfHSft2!qK)XwE0kEU=P?TSZFbzKZZMgO=c#?B6%IR zc7`G*DNN{CUUF808uOk!215l+diE2N2{NHI^3%0LoYu(EYiB50BS)>Bp?rvBR7WDg z`)E%d311xOqrF$4Lg6Bmw|8_Owu_nqX|_Y#MZMP^DzIH@Y3bZb#8_mzKVCaS(ORe7 zaV^Y>mH{=#tc9Uy8JMOS>m}7lQ%t0y11U$S3S73WXq4MhJ)cu!Escj$-jChN7@}Eeu7oLhH~P zFo-nPcDyvyfzeQ@_TEqnW##B?nD?YEggF$2!YO-A&x2}_4JWQzs?OSnJ!I|3hC|Lf z374p9Yv(bvYLWJ>jiG3ppmJu%Yf#RLwu!yh&QK()z1Gf9w48g_&QN4tL)z#IftG}rpT^&@-R2EgP zMgRX$yaVuj`KI!i^04wcrB_O~m(D8fRobxlx8gm;3yKF9zfyRw@cY8V!nX@s=U3(* z$^Sb4!+az6dG4v))ZD1tz+5J~IQ!e|iJ1eVpIX}1uhZH=`ic~VNMT%KeG7iT5R@{h zSZ-&!USq}8F@!0x4yY#}{PY#-Ur}*p6LU~t0Blnv5~goC_FzE_VY_V)B(BhGSlWB0xi@XYqFun{3dhpN0N%%VIBhOcx4qU<$`(tC0r#i)jJCN(DXj71vRHz~Z1&D=w2+qAiomSUVkBNzT5;#r{~6I(F?+kje?{E^{MBK& zjoI58gsm=AI3>cbubADHV5Uug9nHe7XQw*>z^-SfIsrhO_nHO|E>19kzbu6Sf+~EW zl`@+nE(8LCy7zd4U@A*OP`R#s8pMY-Jtg@-FDfg^6M{nTBpMPyd{BhlLtn3fZ1B6Qi2 zC6hpOcSM7fQ8Ng!`XmjA_8yev5+#KdvLSZ6s<9w?C;_GHsLVXfJd?Y)5dJ&P+ zAVkdZw?PAZ%rdP%(u?3&Q+knEV_NYc5SZ1hQw&1N%83|l5RwmpAU-G!Nzysx>9(yC zVi$uDG$exfFqcK7tlWs99nqj!t#1%QRtRZXKtYK03_|iD5X46-_aM||XdyQCQ2s_8{fWXN}xQh>y09^dG0e*eSgIIeZAoi)oCIx)_nz<0KvE)Is^c-_S z^kRqUn3MTNrMlOcQ^bW6fdWD}DTkowd3e@hy5vEf8>WU!zJajgbefb&-(sbfXi^f9 z`L+6$Rz~chl^DX7tp|jOUt+0!OGG_l{JT<8_K5|Crvur*L8TT+re%8>5QgbRa(oBk z%yrUWNq6SslnF#)*90S`#pX&DrEj^XE|WAIRj(xv>T@&ou?xX(m1aIxzt*yf zb;L)rk}v*XVeAyC;(L+=I!bMA`yhc<&!!KYC56in`MuI~{1$F6vA(M2jC|R948)cZ zBDGXZ2@Qzi)!`)%Qa?m!A+fSdM5F(X@S+b#|3bxHvl~$FAACduPkOP{41`$*9DxFt zeBm2D&@2Oq!29~Va03LEK~pv{1kD>I3_KDVyEoccddV5lKaPu~$pSqv%uFFq56(ATR_a#d{*SDq|oa2^)Xggo> z+3tz6g5f&uzAgDw2StJg9@@aZDQ5M_b}eX7TR&S-)fZcMxL{VXO*42|8wec^3ZIBs zp$VCJ>c*0P=?ha1KA>~%OBzd7eWe8-xH80VnAJ{d$%n&>)~;*G2R-I5tbJv&U7>9T zcEvak?%qZr$!jL~3U(a2FCzRd-Mx)CcSsk0m+$A@xHHiLL0_C^kxXOBKZiw#6yKxJ z{}1W1{R5%Z6A?npD&RxJK1)8|FQhPm5ZyJbRXBfQ?XWhvUW@D^y<%=@A~x?Hq5_~zc+tD{^0yq zN`CJBQo6XXcx~~-^7ku;RkkR9RC&AdyXtNcfx$ow-rC<5M z@`LJ@HTtR4GipVYM))Qvz$Lo@_>LO3Yqrh#06d}r#?BG}0|A)S3BUtD7w-KwDA1G! zL=Q+lrJ3j4Drq2+WuZXk5;Z+S z#0wpU4OTGpKm(^PO&V878VG`za|DeYBF62zUV&^8`dYf^=ViyLJV+F$kzF+@y(1{W zaq}P$2)N;}&f^IH{5Ff1Gw)MlN%-%jO6Uz<=7|6>o=6Iq9ztZyH~Rik)J)vyoD=iG z*+Z1JlhgOx|DeO8&p-re0wphOEAeuGXm^*|Sr9=|#TfVV!&4t7bB+j*i?-4CypA7~ zwV9EIhxclk_((VG2w!QIS6}9A`mz+)5@J=T+g{K0OtaH zudDSJa8d930JUki(cn}}rq%Vn_jgPN&|5TY_X42M0zmnwU9K$dX1L-eLtz2$;PL8x zf8RWb0(>3JnE8oD-<#(}Vu-ib1b%{=S$LA+*ZbZ?qVE>0KQmo4 z`d%>wcE_ZU;o9Z_XYh~Rk|qURBduUA5Pa+7?s)%PAX`id8OfS@2&>f7)h%|ayC9_{@6qzc-5Tld*Gyru(D?^_0ayC;RibU^~jds`pS zaki0fV>ja70|-h~12Z~zi1gi;dPTdt3M zxd~!Rm9@co-*Uu~?kQ2dS$u}7-uE7gaBcvK7*uAk10n#h@R9(CZaa|#3US0d}r=T6S;nyW^?>^I!M zF7_w=yYxlrol+mB=A}+a?XDidFX2x&Htg_XgL>Xv97_#V5VhmNL*xF{2NW>W&z%2t z%;=w4*GlXrVJk%HPZ}`= zw(r?A#Fp;&-oKho{=>UGV-1t1{HN(Uo~pWkwK*wq5@!s0AWj`vA@NH(BF>LcFcj@o z;ZW^d7>tC7?bu#QKGdkI=IVJQf4kd46lX*vM8v>N;xSA4k3y6~bEF{|*P`2TNxWQVCwBax&JYo8CCL-CCX(*2qq>Kh#m#SIR#qS8TVC38C%3N>(h zBlEJ)D+(inp;Gao$_Hg{!+&TYb{1Bz*&2kaTprO^bJ}Eu&YR`4D;R3>8Vx1Zj)$SN zZ|rDR2#MMD(Rg5@iR_vAf)9L-fXlJ*zyy;Yw}bF{AGnzEzCelT+u9c*0vn!)1{c$p{9jR!8$HNw;$w$}$A4n*$*7wY&R)i&|)SjpaU zyv73;qQuek8JxHi0pcfi&N+rcY$u7Evug)&i2(7V)`U2WLDW$mxX`q_Na79zi0>K^ zS8ZD&-E|igmh#_?4^7?FruhWt(>zx5F_iY9|J_g?hSEMX^_LE2MK=QM5FE1FAd*$O z?X8pQM7(+c2XJ978Y*=``?I1g$M#AdS_amLK}5;C95CX6@l@ap99*N_Nuh{|eAzB6 z_`MH|r~6moR?xPn;N4(Wj6V$Z(`cx+Efg6!QUHF?Q@zEAO0^xH(+M%JVnKo9=@E{O z8Km5inN@9xSvQ@`3KeR87J#Ajy6I#nszkGh3`1$N>S!qJD^i1l)>Ih;YqjcMt0Sr#R9>&l ztejW=M|n>9!t$a2`G*$)^-ta2(J!bLq@OiarV*x&)xYiyrfRK7$Gr4T1`w;z!~jf3 zshgBJNWNW?Kt;}0#b6+GIF5ZvG8Gi^E7_u6TnbgL~(~5;MEsC zj5I2&?3~FahG+r39jqjmJ~4J=`=CHjyCRG1fY7xM6+3s2CWXC@t=Y!H$H>2hz1Lh^ z!BRZ&0=t4;p5wCgp>|_K#s{1h_82q z@H4+Nj63WCIf6LIUHCX+pd@3Z?b~LyaaHP~UZ;9}bAMv<;;UhY3zd(dEseSjg&+t@Hr|qX9nt*lK-9gkKw-%jj8MA^DIMyvD*ux73K( zb2H5?21g)l4brU48hldFkjHkIRn~CMX#_{|eANPBs?QDtb~3T?J#?<-gL?+hz+d6v z9-=dfP=oCt@aBC^ACVo(7^m_1;hc|}WVGYhpBf7v(w()!)J)@=bq;_x-TRg1|N<<2vAdnsi_2l+N1SV{AB=Nb>TX+|RB1c`6xN%6f5lY*JsD`{|Tx0b>s1hYZV zplVR)L3oS{8gxC#P7|?T8lU5s6*6ZVK|8G8{TzlUcUZ4GALQD>tb`8!WQ@mND6xPJx$YsyxjS6}#;ZYSXi3?{|hbN5wd+gFZBA-!ZIko(m1q_|aq z2C^lI(3hfwa9s%c>Ux!BT@Q9$lDRK4K6_Gjm;9pqwfPhBL-VEF^SPUHV{*fC>%`s(xVQOI zz`J-WU_$U(z(>J*0Y?Nc20T`{yl{E>&FXro&+x^-UUl;t{kpbJA=3;cVZFBJ4WOzG zB0t+rcmQk>0gf`e2#%ne0G==BW@PDLJT&B(=$Z<QGh4jg@a779rFhoHWGVR?}Au zViy3+qZ(0s@;eOXZ=575jID@Ia&GtguX23e{M-@{~jx zNXxOav4kkQF@+3GHz#F9*QsqpW7YYl&5kopU2syOWa<2vBcSgKPBaK110dM)BZSWB zgxv--7y_EP;46lPun-)J#JL_x-^yEc!IwKi(5yBy2*C%@u$MR?bb-&oheTjjV@>lW zU*mMyp5Ms?jj?oC>t3-ggjXG|eiD+a;@`W%7fN`9Kz{mKu}U76?( zQA;z?Yh%?VJ<-1vQbJ%X4_zCpCdRbQI6y&6oLoUl6Jy$L0|8A?i%5c8slY6wu~pOx z5+Rrkx)4Mo=B31}Bn==g{6Q-kSW9+{NC>SvvBEJcfq<+oJiyRkvqBON&iSsf>cZqL z*@d84ZD(jOS%rlH7U2P*OW%SI7lQaeJw8DnK%nl%>>LO>vumy;IV*u68tWQ_lobRl zWtF_|2eV=b$ZC8mSy4e=@G-uXtRw<_j8ES8ai)yFf{*d~9YnEeT?p`Tf!;kG8pJ-p zE7?Hk-LowO_WghB7)k8V!9%`6=PUnh5<9*_I}u8yA57FaPUdjX!)3MdpGapSyJA-2 zLZI@N{&s{=easSro8A1N5ohxz&yGFr)C{DlEN$;j9uPV#jz0$#AyDRG*<)knKl??q za>Pik7aUgpQ}3B#uR)F_i%Qo0|5pU(5`nZiWvVd_&dC`0?)0(QGi92BcW_vy4SksV z{|?US4GxwH0ihEchX(0D*0vI&(Mlimg-yGDgV_6{y;|r4uU+swxrzstcFg=R+r0z6 z{dZmU#p*5jTIF|@UsirlX_Wt6e!6^R`Iz#Ma-sBG>BiES(jKMtipz_470)g1U);3t zPT>Ll+W({Z%kw{}o*wiC{H<2$&UHW2eRcOSxtDXd=g!XUliMi!R(4MIqU>SWEi)fy z{*?Ju*bAT@Z{r6+{D(j3!;Pro7uivB^}|4%3%4*bhWN8FD}!LUte<`__7KGzX3-i1 zZ;t^&8)8b*AO+e+;x`tYZ%WhF<9GodK!`wh!TILM@jA%|7A-T9%$H(@c%9_Ki7>9@ zBSC|LQ07WXTN&x9I|U8u?z9n*ZVd5;pn=ebOBZ}-S*1TSw~iuxpsve8A0QCIxeg=9 zNKn`1qRPH#E_bNEiAhnuYTi;9Cqm~>Z6Q3+(D_qavm&!PF7gX%wu=we z3hrlLH2zJ!FA(SpWM2j%8V6=(8Ub$;3^p=$`aQ4f`|NMfa8*HeZe2F#F8k$sj}_et1p;`!g~^cUUagTJpoW_ zNCJ@UGfS>7co0PvHvr)ua&AH4_va)7&|tx;YM9dR5jZ7LKy1d!R{%VKw?mTv^q?9G zO6v>m$7YoTpjw~M^!=4&02&`8)Aylj=ca&#h(wi{#+D0y`C|aS_|?reC}aop?~nIn z`+Gh00f9@QHyn}C5C6&VpH!BahZR%nSZ3`9RnT}#Ont%KLz8Afr4Glm@6IFxQ19k< zTk8w%La^@U6aD9+hXlI1GjWjxHC8G5J5Yd0qCoEiGD+4K+<|N$34ntL=5R2j+mSLR z0jP~tEP)yDf=K|{lf)93p$~<)XCYG%4RQ4ax9#kv;A1{`s*0Zp)fe1~^u#r#0DxPq zLQ1!y3Xue$OY1BoY%I8iIzNMiR9SDldPIWcDi+NxdnA*f>YTk1LlHM4D@&Ra)-fw; z5dfFPk^r!8ev(;VaMLcy0J@mTcxWuRadaZrD2>Y}^6Cq29F#(j{swN6h1V8+% zFZgYOe7`d$)5!?aTc5eK%)fT zjvEVpzC*MG#Eyf14vS_?05RAgSS0F1Ku!rJ-GhF1YO!V{C_^=gLF`*n&_V#g=EEEq z5GJSP2q;5d?Px5RcwWQ@cX{ygl$$dT2E?H)5U9uS{+{}Rdv&jsy*7yrI#%JFg9dz< z+Yw_{P&w;f#M-$}H^oXCI1l7(AkMEZn0z=NkcF*oUru!?X6imeT0zSqU z1HOk|0eUlFK>C}>zZ{AI*+;TxW_#7k(T_eD`5$t6{h#-m^Bcr{bdART%%oD?!^8jm z>+Y|>XYL5{@8JGTTi-p!N5=+0NZ23PLkT-%?lAXn{=1k|PPg8%g-J!yVdYGrgP*jHw z8R=jsdO3q-a~O(_d_wWIX+QJ`hkSj27~FVGhN60!%^-#f8uL1w6&)~g|4l=gS*6+) zJBE_wW(@U3&EWm*4@EcdY_VfjPaUC$YFq3eKNqKOhO`h=RDlp53%o!Y?nB~ZP{&ApYzc6QGhXQufzA; zKSmpV4^bsc#d_!5N43X})ZtMwj#VH+!LIxCP;GA$I3_{B&Qhh`IkTwh+TpAq5m_k1 zP}+~FHeDh*Z?H#*lXeWX#hT2DZu1G#ow@s(3`IBaZI6MNJxAx8p{&{#JHk^eb5>F5 zopT2gh7QF}^(*)vmO+(goA|2TE!D$N=m+E*eP!|*gda2%y$EHW3u36w!w(t?rX^%` z_nDEbQWM);v_TP+*9ZMxr81pQD;$gGmA!NBJ|>!0Tjt(7XDQN{Q0HwvN-)5O1E9xv znRGFfcI_PvC6iqYh4M`}tMr!bNtb5jIH&EMvxIJj2J0jBTDwD0S&YYt*d>;rj?mfq zp!zY~J})<6sM4AYew-ipx-iSocOBgI<w)?{F$d1E^M6Bx*RBA0%$zvK8UR{CCh5Z#=e$@&l%#%|miiKx)cF^Hy6#ikcc3V6 zF;W+4kCg-{b+*>B4<+5C>%gZt5iBSH;@0j+9cKvyvS1z&d0_n3e8jklwGuUjOPRB+ zLLZl6{yj`XE)-;NmB2AxtrXaokHgjGytqkXUVzx_lZfxq1#!L{Lj+5LfVdMz9BQ5` z1qezF?IjNzo@Q=~a)S(ru$AJG+5eB`Cu) zgrdoCaXD0v?a%fsUhxz)t)L;XcCyI8VEAnBD~(p8%vy9p#9X6t_v7#^X5D-uXQcxjk`3hUfS8s;AX;`vI+ppnzgqF+pylTCiIy zpdxem(ynS64r!W@XPJcs5VmFeq!n{)_AFcWE{F$+Kfq9F140&d8-=JLFWe}x3!#yO z?Wxs;UG;S}gs=Mm!q;SVVfs_uyTttwZFRECcS>8@2&7YeD!D1_eNv6b&tk5!+at04{{xo^`*e#q3F2>MAWZiz2(7Ps^kNYf zMpblv>_|Rr7WG2}6O)b-2Lil9s5_;mQPnYIMS5c#vhkn->D4H+vq+!shWPqsjB1Ap z`TSY%E{Uul4q?UudCfdqv%>umJF7fm1`=;Rfbe@<;CS|%O{j~Di?~o=Kq?%HGdj<`Df(z%&nJwHG4Zw z^G9UY&n(Mq*tJpW@9G~I;{U53WGDXA$4Rw3%&c`-C50Gi=8%W%}h4XSkMy;nIRy3d?wlUGfeC|nP)V9B_{Zt>4-w=|r3MUan?o?ARF?)#R6(R_)AcD%YYD7g@zNZCb z6rF#CyiAmO!A`~W(siElb@ZqvO1(%3NsKD4A(i)>RM=X|?5&?qvX9O{No6D=^w9KUuSi6iM5h+hB#3wj(3=R?v^av8&uUKYlgvxslRHCA$wUyB zxu8#rc{o~5EXHvu5m%+PBk^w zq;`#q6&FMYPpJt4f{F|`7EElS4xUo6H%gkSmk?|sQzz09U0}s+K@g=(ooII5l`i&K zz!gwAE25&TB4lXAsD?9}%&((-Iu8q%msNyJg1}rRo)Ia3fSea~y4x;{SUFu2v9gnp z2u?NaJd-SJlrCJV4_s7ucQPP8YDG;}J`kEjzbJ>$#E=6u)iT^g#U*2;%n`&z#RWk% zIfAr7#V?Ld^*>odq|-;Y4nHCxUQ9XJN`e9*1HxPwsHiE_MGz`qdObi`2J8VcQWyR= z5v_F6@VqjHL^MjAd0~>O@nxpX4IKTx;OKzaPy@O>(i~f|$a++$GU6&95_)jH&Z1 zG~lCq8+L#?0>g?pr< zly7Rj4tER)lNeFiUsG|IK1!H&Ns99SX{H|euH*$Ba!km8jM_J%qTZDfb3*)mG(;vK z^3&mdHS>|$ylX|Ocy{4ug?%#*WiHG7PuGg<{rQb@Z|3gFY*Tox`^xTtwQFj}*LJKG zs!OZaRsK@BzOqZDg1h{OX8Ywf$(^5{Rott%L3wzK-yY@WFMEIdms*hcJ1B);XviY_ z@2-!XG<|4f<@R~>4sb!0n;?7OP5eS~nXxOfB#QC(wd<5E<3Z;yxG1o?{Q zBKE#CPAo`P^chwb7ZSu&DQ*;O;MT3o2_{W9!IXr+xR~ega{H_8w~Z#2vi7ZDVsM-B z<^hQI8YnPH<@A~}Q+a+r<(rzBRWS_-P-m=_qLY)o#?;c^mYjo%y+#7RY;p(*0q3j= z6xgE4A>NMfrQyWf5R*f+L&eX(p+>C}$yZsGlaLA&Z}Z|6mn*-!BS;`I`2S{dBY7dc zFe-(+RIFm!j$S-KVii*>#7j_Ru$Ad@-Uy*doYt_8tN@|QdF>$l;+@LJa&I#45V0&a zz{0L-XozE>0K)8;EFbZ0X!*woP9R}^t(7e78f*=bR$Lga6+o`k)v46Z0z!?Swx96J zr==$Ax{2~GmTFW7FvCyk37J|6H61A2l_g0n~ zS_>d{0!3zgr75;pS!xmlp9c6QmSm_F`y@EngK%`ts(IyG)JSCYO@xbghVX#!kkmI3 zF5Wq!(SW&JTZ=GqZ^Q#Jyj`ktl9~(`7ElVLN#qGP31EIp{rPodqDiJ8Hg|z2ZSc}B@MAE(t*_j!rs`Ug>p5HI-6_D z5rF{0f;EDejYzsYP+{G8fhMsLg_?A@Jh}xh*8Ei`=y}Ot4Q&<_De#P$> z*DowDOfKJ79*=kb@}&n$qq`68&NXlR|FL>nb-T(Zl{@qI<;UlTN9tNU1J`^B1Y#PDlWi(r*-7u9-nlQq3Y%9=u5IInPr^`{kJ8t# z$vC*O!n{uphWhr}8Op~{)ioLly)kwmFeLL)>Q8HDs2wmA#X8~jo(^PA?cDaP24kpi zbT(9Gq`ELdsO#HRIOPP~S$K`PFY9DmU2ncw9his{0pfJR-(8A}0#6$`wzs*j zkO7Cs8+;N@MDN^JP!(>9zqefp&_i`rN*KJ8KKB(}E>86_2{;k?W710^;%ZX6#BmIU z$lTr!{M=UR(`cyFGaU>iyCR@TeR7xj4)Yt(BtA4@yH_G^j^EosctFrT5n6o*)1~L5 z*mm1H_hl-%heNfkLGXdJ%Z`f4hIJ`kXwZqsACp=S#KW_mIOmPIuN@Tq2eBNmK|zD| z>h*f(zJ~3&$wxc)V1t!~p)fJqkNX7`=pztG`*sx!#WGPE3Z;%FgNK?+_=Y$S;lT%$ z+B?(-?b+O@p^w-0*2MXWaw0~|eQh_yI05lf+g%0Fg|G#`_)BA7z3Yg% z%PGMQrq#|vIKdJ`dk1*5T_PAoy&m$aqZvK>kc!?Nx)=@Ucxqyc0g?M8S43w3$p|r^x;4t=`~@cj6HB-!~!4cCeUGJC!02+d0vLCrsk*~ zT(igf|IrD5x$=DF#>(i*Zk1~J#qyZ)?xkBw>l9xuo?aYYc(rhQ;mpE_!ut7T`8)C( z=Jw5fDLX5BUUt9iMwvG=_hin`?4Q}VYj)QKT?ck;n*K-nzVx{CLFvs>7p4wP^;7TZ z8~xGE{&xQVgrWetFs5%BNm@;eS5yYz;bzL49Br4=H_?#)b3vG!K=p0vbiI)&)*2L2 z;WtRpI8yxI`?w(}~I#B1mc{DPlkv_XJr#g1AJC9Mq2dao#X>x=u)x zLy@jB>eT7$YAUP&i6kca(*xa`GHUD*eCi}ihM4obY4MV91Yx^>K&7T9Hcd(lZ(7(f zZ2+MfPZ-oX*cYW&Kl_IADv^nu?IOZ<^FYRBO=M=f5Oe?pag18J> z#Nq)J9J4l;zGH;}!X%bESNS++Z9*L00?*|+R+#BXxKHpxA7y06AtW&sQE_<-`Y@bT zdiU~stEuN1h!8SSk&q+LO)_NY1XtW_|3Zd*rQTreLsP8D0KyCD1UW~~i!ZPM!Yfn7 zb=AnTTh5E0h7@m8-dP&Kcn@fB1WoHqJ+0VxJOYOlKpd<1$}%tGR8n8FA{>C^~zHs8SlufI3U97Y|x57 zS`+!u1!1ZW49py{vukf5D=x@MnhLx2=7yApDgVR>!Y^2b5VlVQ6QhjGy-x(}vr|0^ zMd&0y3`HCQLsgb7$kIz{)Nv7!)J{?>DBLlB1c+~HuiS-UUJ^pOKPI9g9AyAuXDWXA zW;M#(ns8_m$&|gZdVu&xYbqbQc;OJ57_Ln;Wz24iky_B?=P>;fZA%nd=yKy#m9?b9KIdrGnwcZWr|@X=CcD?czw6o8VA5)fN0 zfqS7!PiV)V$u%h;0Tolx`Ao{#4Z&G+lM1`b6LQZkk9)Oi)s*i=tHnBOj<{$0st?4G zM`(nL69>ZoZZs{|x|jJOss4W=h-3(tV7Y`mG4!;vRKRnYCO=)#K1w9BTzP`fVy6sCcLnhhC3I$KYNf zNM46V2#36IXlJi_dNpA3ArZn!gB5To%^!(_n&zye3F8%2wzgo+I~K34 zU0FN2HmKHBU0A&uF9r;$=J4L%wUy&5J67`LCFS4Z&48ih622Gs99{=V{B>;-{?c!m zUus_LckhqJj5%`jnf>tMAuj;b$6ova(w~q^yMwm}tu6G{lpW2YXa3?3boMhKzUul% z2xbw4K=#v$hK;}tgNr{fY00mgL~KjN61w;U9ha-IE{HVli{CfFEWQf5jn1}}OqCOsgYK(5^iVS6m1F&U|LD@07( z*}Ijmo3d>`60yzhe|TN@s!^t3V(kYJgq=tb#HZeb(DhjF41^Fz`~JCVD%BoC$mcE_ z;5&QfTy_XII5coXhQfH-nj&58Y7OR&li)!91qv#+bC>l$L! z@RH;OR^B(+$vt9XR4$ECfqR>e^%AmScR>!MkN?24+v%bYMC{Qt`wB(?AwOzug&rWI zOh{wxIQBQY{XO;G@Xo{aI1-b zCGY65l@}x?+-ICChoGMkdbFL8SIQ}WaKyfn6T|TfKRB$9op2wbv(Uc6PhJLJ48(yO z2@J0Xu`Uu1t(FsRMiw7JPPGh}xW^7AFPl!d@3?4QsSAaSL515Fh}`(KhzOq-l?QnQ zNQ#`3tQD|=t~IHZ8%*_zix|Z_SR@lM=5;+ndAGcPKs!LpYd2N@`(z?i8+O^`bqIr+ zX78AnI4mcnT!*8q#CbuFBEOn2*95cNSfE6#Eyg@Ve67iQ`SOB2f)zVzB(2QbJz~YN zBC+WCz6HqD)M69vD4csxLAB3bkshwvE;O}X?v3z%g=}FjU8DScH5Cb=iAjl#`?`kM z6YHUGO^8-aubfrBKHjuzci13s!Xvy3N$lsR;Qx7f%LGyb=}V#b%VYox`0I8_7C_xD z!ovXZqRxH!8VjB$bNHkebb>7$3?Q`3?7an?ykJ5+TWG`yZN$=Mo*$x_?_(YY5bS$W zHA}VQSDXr^Ki00=T$j)8mPiGvL8FtL*fYm#h@^ryIe6g%>_4L?mfD-SKDv?MX#Srt zUnk5CUP$+Len2+!xY@wv#AvTzyg>PnW68K32E2u=MS{p9CUW5p0}!Z1`o2d@PQmAe z(_BztJ_hspBjS7ayl}(^m&~FU%nKcRHo>iQut*2 zd#B}39@b)F^wBvMSYcwLwC87LOs)^lf^*$NVi)UrFN?(j2trYtieJsGtG3S0P}QNq zz5bIbJC{dSO6BLOMSADI`>5KVk?jwxrK``BE2S4oHg%FxDMV2ye&68`$~3(`==gUqaRQI_5YoEUrqa}7V0d^&kdoTG;CZ2p*vnoVqL)0jSFrE<7W>@eTt*4(A8OmJ}oiZqoArYWTpo5&LFiU}A`Jt?h?MnDa>~E_AQ)3@VG#1kNX$s<&P#3mK6RqN4qrvTt=Zr^Uj1 zNJ~9!3Lul1>dBSzj35vf;;!bzoZ^z3$&^>N{SOdZ^)xZx#Gck^NN8Yiz_uBCrz{4oZtmQ=4Ts#Y^fU{91wc1m+jZNpQ)di28fx03PHl!0o1YF^p;ph@?ZhE6C!Bl z?g)Y)r77D9Y;ZuZ@iMM+r^k8)*d_LW3MI8XM4htSlmKeDN@4c)00P-s=G)K9@1gwj z^u(@_6O;QPcv*&n|B#oIlZwoQrYsv1LD=2rU}A80c1lauxJ-LU7Zn+97ssekrY<9w z30e|Z1D_9wIm@-5=nAaS0ilTD)}Xs@h5mHTQ4H-13uN@1AOOj)*+J~Qmv&SBo*H6xON82YJ%K-ESt}<=twkcInX;^vlXP|?O<885BM19fFLoW% zFYl^+q#I2SBYB~G!`4e6G1I&!snEw&Z0!fCOlc|(2}Q9f@eF?h^>KLZiDngc>Y9-$!)i6N|z*7d5{ zCE9@mLLRQEIM$;q7FTn7sg1K+DxC1wavNrE$d1fznLDQYq3-juf2*Eb-KAQoyjVHC zvS(%e^1kJbN`EiSE{!W4T>M($tFZ#(;I$x zs?ipr4}@nBX1TRQ=$h{70)Q}spZS7>PTfv7UnFc&Z~)SMDP$s|b{0(u?w@(Hbf5ZH z#Dw~{m=oCMt#9dLRR4&?CN6-TPWEdop0mBC5bLOp=7hq$y}x)sm`yD9IAt;dTo_gS zQBDe9?_zv+{X+e3#Km9%po`7652s1#tT-h}&~<*cvx0=)SmR&oGi(^qc73F-NS+Qp zBFBX40btBE)=k$O90=aO(^!1J_7d@ZK0wertfG9G*-x1o>E%L52=bUG_JG(%>$*=O zqGT<5TS|As#S8Dvx!|aRMQI)o5T@I(am5b>2Ij84%xlIb;>RHo4QvX`CK`($&;@a! zVl@7MUuLP<+k($Qho@n&>UJbkG>qHPrdMD5dvG4|L3THE@smiSQUkxb+17>pfPROL z8U51}j_UW*Q~Hhk=_x<@@o`6v3_nN|42T52c z{)&gEOztaZMO7t6L#e_M5$Ew|8w33zkjJ*iv{4vh_9X5(0{{nKbW#s91XVYL>#xpJPeikF zAi#&c9{PDeOm2n1{>c0-5PAu@XyDjRCm-RLrh(8)$bmqE2P+78jU|`r2s|~yiiZZE z+&D1WUYfm~NA@Gc9uXfxAIMjrLCc>8h@B&Zg9f!*F@1o>pa`LEXZi?eFo!l62ve5j zItN0!o5qq$%*M*?D(F+;huf7~jRw_iY*t8B@R#WW2(3YZ2+lls?Ena^K?efeGjfYv zwWXGo%}0OK@2MAr&8o3@*~wWZVwKFIypCr))0)!brtI0}&V7cY!dws6-$=<_3iH?$Z{ta+Jh?NOG6N zId)NQKtLq9OG3~q4b0?#(2I>ZzW_mx%ZbW>UTiJ|b;Z~SL`5e?7SL8~Y42I? zgQ&_*Uwf*V^Hjgg{;A@x%X6wP7wd&7g;eS1mGf%5=AO&lm^&rcoq0VoGqZnogWT@L zAC|vbzA$@cY3t&O@;|CGs=c-Av%UFaD>JJbwDmi)c5?0H%qHPaJ=gXRisKUcO zG8Ow|>Hw+~xUL9zKxqFGOPM18HdE&G05H0aoh~#H^gN?&Pkx+4tfM+cf|*m-3VaG2mvp}vq%IQ(ItsF->NQrs0*Bc=Z;~`n z2IObWK$v)jBPh_|SKB}%c5=oM2>ejVVD{8l{f?hFE0iU$tqML~-!BnCFKmmooi7@j zb;t@=8F=ZVvHD%px)a-o1M8sHf3f8?R=;e{a$}9=0Rpl@Fc({>!IA0e<@#QYlCnak z!%kWt-IsTZI8U!K(PEPZqIagjK|tt>C2b*KAdh66y8UidCN z*?Lx3Ai_po*EdC7mMd+&vHC^RTkn_^d?(v0i;uLN6)I3%e?VyeCT4|R8gvxc8#pZY zMdNMdtmwgh#yJdexz0j_(oxQ(S5EB>xv~0r)4j}zz~@r=%|?{IL!nE8OT=!8Wo}Qa zvHEYi3od@0Bv^r90^2c@E)aVsk^lnrA;v~&ZVTxK*3NHHHCDf5sw|vwBy5OwY&N{| zp)GZeBmMzADO~-AuKfs|gAeh@AawqkIfdi1!jxo5u(C;vbLn-d7Rurm(9nBYylpqo z2L*Y&k^{4PLB|%ttk6nMuG%(|#_Bhc%?fS-+X0hR<@FZQ1%j;CrcpgJ#yR&sK)`yL z1{`>SC-MRJ zhI${X#ntdB;|LM|_(w#8#AQhrI)C#!5khbdGsMKis(sH2_*PyxPfTPZKnP zN{;PHu+QoUL;U-24`g$yEp5R!eQS?bn!)!!TKOLAY24OPfY>hL+p)?KDRIAm^zsvp zkb5~Sm&I0eo!`{IW8Vu6^cTpMZ2w0zJY5EIs2zU5j&lM5>&-$rrNtm{ z9hFPBZ#gYi*6GQOOnn0dlopII_XLFcwB8!Q>=%e9P_}JFg9!_W$?&r+5Ul-;W;JqK zfyi#Ej@&5vU-|cwV50Q8wPn>F5WaS%tXVIxH+*Q$wjRH5cKVYqM+?FJEO2Pm@(YH5 zJZ9P(?dHxV7531GpM6suX#z9*{zEdvL+lVrk$*EZ;GTDh;KMKvq$9+UW?#Ua^Ck^` z7E(An^|`j6Ed&B-z1?y^{d$w`H?8w82?%0Rt`vfdjwG!3N0;cEX`*a`d5zSynYQ%k z6_%$4n8T)VrbuSEXQ~H8tv)K6So{Dzf*`)Oy%SiOr%xCKEA)tmhKvoc%5PA&2cITv)dHOc6i;Ck^3)Z580`<1kBw9}GwSvahNe`Hel7C_l zHYp*czp8A180Ld0yM(6vJwXWuz+xi$?7$!@CV-QUm>|rrRIX8@bWM+4;`x8feRrT;MYZ=n=bqj!RX_xS zfQWJq$=){!p-2maE&@{2hXP6Hy-PDdK%%sS5+HO?I-v>D^hpavijdH9lY40orH7J8 zAbh{I_nDbJYt7!A6aC}!zCYgc<+oRzHEXR|Gbf~irW2C|kl* zWrYnwhLs17ju1aAIa~{I)kX~S>-dR1y$!iV;Z}#j9@t)q;)r)tFWMO|Mb!r|fqQ=O?mm2Wn0z`>?s@*D?asL5HB=)Kgt_!nB1yX4Z6B{m@AO$UnqqHHJ&ugU=le%2Kg3abyH zTMz{n{u6`HF)|$%CCDsh8O!|<3X`MxQ||wX=1cC636LEO#HBDsg*ptrE+~gd1iJss zDkO?IhI-5e5hG!_kG=2bJ}49i3V$w~QP`!hM!uE%s`{7wr}>AAD^$;}{;={z<%vok z-Ui&D_u1Z36*`j{f(|Gp2Lm#a@0L)*MCyduVX;oEiv|Bv}XNNr>!Jnpue)?MS0)LxT0t z10M*?tVDkc&+Am*K?M_gZ25zVE_odQ>@SS1p1tux zT6+`o&X9s2T(F?jn)7_GLS&wBAvjZ@F&vU?p~V*<%(@1CoTCu#}KiUt!-`^JG5Or z$iGv_|I(wJur=qE=A7o-8+13~INSK)SsokY9})ntmQr*l0Kf2VED+6MByh?vPgj93 zfoP8HUpR7+2r%{Jeu}A086eCmMCLa4$$d3|@st2CZ?tvGN8Umt5KZHGbaUteKPaq{|{p<$Vkw^f`q5ATsUnGoT{zObPE79Wm%hUs1BTB4$Gwd$VGSsH20m86iR}FoQSezH_1m zFrRV*22O9+C2N(W5Hy=%vlPG!Cz|7GDFvRUVv6!B7sYH5yE02YMVdmZi-q>)+&8fq zI5Qu-R)UEi)>D9L&p0S$Y0zzKTMobaQ7ThFu!lSR=G@nG%chU%7J7nug)v^!9h*LT zxnlG~0ua<@VSXnPTT;NGuxQu}OhSPir3#+31rU6)51!%&E_f#T)6dI4@u^&2Pl60mrX}w|(4kF|;)>X^#}HaAL^o$mZNHc1;kRhAI)A zZ3l$llM&Jq+=H%uh`O`U9GHx4(z){J0U$WJeL5Ay1s59zxN^DRd|h)e`-P!EkboHb zr-(sA2CN!r&Yh=Mo+LpJ9&w+V`_a}3VuL67`fboVDmi>a2+7lj=&L(53jj3BYP0Y; ze=RoOCV`Nd9V*w@HpwE63lVkzG!5qH#1+;ns|1>J-|tBg1LkI`t>=#SnmsFdm0c@q zl>fKr2&ct({QYy0(0Ehw93e_bT@_e$=S-KGQp` z_;vB`#Y>ALi}}I}g$)bU{44oC=9kRP&25!iuIH_uJ9{SJR{&R{zwDno`}1CO{&iII zn}3u&-;8p4u`bB4=1`x06%c`uc_a|}3^y}6ZW@iS7H{$D0y;D8r5pQUI7I=wplz6- zHS09fWU{6|A_^Enwrdq12-7gSU-E=DhQ$;5c(YF1R&kY?DG})5GP#Ra=MPs1FLv)= z$w7OLeew!TnanMA?>`vH#3udcyRJ!GRRPpNEY~{qqOEIEE8h&e5)0gaDfp4gX zDHI69`j_#o4~#ewtyz~N?zGJuyRjMy3k1d(nL>fU)JQTybdq7T%f_T2=zboP0|=b{ zCepxNT~_vj#xzqaNjbv%bGDgVvo1}OoC;BUrvZ&i5qT21LWh7)1?M+QwICtvoZbf_ z&4La@Yt|)4D6YhkK&>lp)dFFbw$v43F25#LI3!gLhKcARq2AbJ%k*XLgn7xnstsTgShWvZWXCCD^kjzq<9I1 zP;uoHh~yRJM6_m|y=9`VFsb5brOY}TwN`>XfIu6J>8dsB+@GZ&=-D>02G89w4dK%6 zStq0*kbd($s&ZyrSImNt1HCFcNrYdWg?3(|@LooXHC`I3k7t;Oyu9K+zB(5eS5Kwy6P;#uY|v*?1XfoO_g_ z;gFne$cruNoHbGq^yEC#)i>B2Wi}gw09O}O6KP<5P=lGLiRUMWD`eP>H;N3Y>HGlBCa$_x7uAX z<-IIPphmD$n!qxK-Bt>n1Pxv$c>WG^H_AIj(b!<-Up=rIK4X_nek_Mrr~U%cP>Ye_ z8_fI*s++~e_Z7ZHcf6uS9vi0$=}}Wa41A+rYIn^5FH^P_ANO@Lx>F; zVr;>0&AizRn=((Qa}2!kAy(7P`zO-CaTgTD)&^+k!AZdt5D0Ao@rP9u4euNHtnB|6meQ2LjR1T3YB9&HO_tjRr!Mko*=?Oxg7s<|(KeW?LZH!)#~{?KxiYuY3&`YEo*Bz!1+)GGTNJx3|KJz-$$zgIh5s>4$Lo^MCc0oh?d3(Ti<}G^a zn{(yV73^`{&YFgUD+n)WTxXKSP7nc}4bbb=J6-x!{NS}U^Hxk#xYHL%fKE6cUB=z~ zn%T02$v-whwUHW>JM5D?t|nX_#d`j ztCx7%YrWgrdTq^|u9qbL480B`udUbiq$jN0+Z6yRy_}Whsxxxqpgcs54R(;Dwa7FV< z@^EeDt-4ThAn1n(S-h)%Q&yn`6- zc;SJ+-MSb7Jl!G-wYnJizTRoZRwmzpu1`{5U5tb^0RHIi@RqHIqho*w&~CfRY!Y`F zcyiI4`8W=*A}3wPj_5SdO0Qnp=_h{wuh&~K-|v<7DlY0RG+u06-S|=c)%xh#t<{wa zo8s!?kknpWex|9|nCNEhh>8Tyf_m2RaAp=M+?t(N0Q&$e zdx?4HvZIHrd?02hspD5y+s{lmwjaDRp%XK^PSs+w4GTi(n2@ph1}O*~69iW{??fM# zh3MReSrgPB62?HH%m!?HAXZbVbyyGQ`*y&kcg1uz(2;V3o+&ZGHxx|a+>e!OgwTR} z*5C(J6$;L>0lZ$)?Q3VbpT~+wYg8mMhrCD(gf^h}7Lx;9AwgrAQ|_#o9B;+jIFTF@ z0Xa6)j_5ETRk!x?%YA6Za554B?eZKJh@r~l*5F4ZI0{JHtMd28G{r+gC^x@k0EE_* zizl4=*(AuTbmOkG7jE+J#KN{UxD)AC=3&L9fzfe44#{0lDJRW9& z1APVL&TLVae_&_`Q_$coU!%~~2L~!$2`9vQLm1$#o<(1pliiybSEw)?jhjVZn&ak9 z5O`AZOWna2PvAkdNNiakD4(4wIhF=H--P4~k?SWc4XPVO$gI3)c6*0*aazeH_(0=} zpD7x`=9nFmlZdtDO$c<*kV7IwBS@oxJ{&8{--0%5|e1A&17v&5rY z%Zt9qE3SlJL2ML#EYHD+fnMj1HHf-IoaQh3#LTAiHAu^e+Z@})SH`dS({bUDFQ350 z`TrM64#5==GL`^gazdWAz^`bDSX(jdG0(&+t7R32b-G)}bOjoEqZD3(5)2I}yZtb{ zesoN`oGZiy6tSl8Z}UShe$dm9B)%LmG@LKb0%&m_ob6m1!Y%!WC@( zQQ8)WF$3=Hz3axb`*#-MC>7>~8n~hn_;v$MYM1V{+vzYNMr(wO?KoNB=~wIPQ%qA{ zN=|XtrU83=WM+FEG|+&vJ<$h^WfWIlCp1XAIE9HMr?lRjkid755{h(~xYC`Mju51) zW#cr|4_LGl3`v821JKMdSf?i1FZId4IqDhpz7vf=X1NJ_S#2|KX#0e}rFs>+=Jwu=$~J3|`4-h2o!EFEC`JppuS z<7UYYzpGFOf88YfybCeiY(CxvnnvrB$vZ2-?41%H zqB@*cj3a^AsVl??Aa?8u;cxKCIcQr%-Tai_#0mYB>Si{$(FZ(giEi*#D%;om z`s55;(RO8W5kg!8hqs+k>k0vHJ44T~Iy{nid9VUJNk2t8uak)lX!-HYo8 zf%SB%?#l>-ONyYrtk+b*O`01o`o~A9!O-!EN`kx;pjq?dli&TiD}>*uo7`&z%UVJb zta7GGO`CdzT&sxCVjcbNmuWnqi(`inGQ=KTA;`z|q?s@Tc?R1zhu8%t59#>lnAKpd zT5OdlINMvL5L|AR@Q%}xBOyrOxWLZM36UJ1T?hz%>M@C`3K4AN1j;=XC-n(ClM6v! zu6w&exh@28g*`u&hV8i6{Z36@d!T{-vC!42$$`*?@asLNddv5mk||FuZ(r^y9h{q! z+cURZ@s;8^#nFX-7j7-=U05N1YUO{cKkEHc?*YB5HfA+`-`KQ1Kl!ivLiL4OVE!^| z#Q(gb@rVEPPExwaj6njlNmMlAvDFdi>Cmi#?P$T62k+Suh%u|Kv{orI#vgLX;X@8O zc#qDvJ0k99|L#GpnUMI7oztd~1h($+B{FIFC2vZn zpF*pSE}__AEju#ysR^BaDm-vuySm@AuJ=!Ej-9sLdB@FT=0IE3I$sN$??BwswMNi= z!luUz>yLTx&p%Qs$uv5Z11iBm9!oI6)vEeavmBr5dBzxWnB)KNbRw`VE;0v;^(CCz zVWf`P(a+uNov*nz3TQp}fR1|^W)x&*j&Z&*58h8>aM2nuANqzhf~WMvKxBjDAuNWSbgU3^M(9}p|@vb7tqCqR|D(6>Y~|Yn?vD77Mtd z^PlcMMWCyFIw&x>y zQe7S`zQ;Qc2`GQ~sciMPu?7m?U!ta&y)-CDB9KS+?j}gmW@T@ao|ipDiP5=gX}Uu+ z1@NiW7wc2#;Pbj#_*>?{2Ss z@;|aS*Lc2hdEe<&SU+N9JdzE-@xcvNxIVsBw~;l{!-h0%p2^KQ4*Vfx6$SBPO*cb@UqvFuXdjLkbIQWAL4xQvG2#>ZZ7P(F+7UZs zj22NuC3Y^U7^6#`)+QE0uviqt96_W*^p5XIS-=<%6C{hiNNWGAPiTEWSobJoOkYWg zpLHAY#XWgY!5VAJa<`C$sMxzeNJXDTcSHq0S2Fc>97abC)Yy$3#TPbGmhX`C%P77w zFA5iP%mot>obyCPR+ExYYGWBPWNRsnaM9ohVoRS4#UI@;lCZ;zaDC}B$IP=XDlAJ1 zHLM2!JA#CwP>vS5acmgG@WtP*B6Z<#sEu%`iz7&QeK_P;_OJ=--i4A-)gP^{zqo|w zI}uUQ9U<>LC&c#1P{n0M#icKt1GBA#sFb>bgj9+KVh&7{j@?wyUTBLiV=M9&anu0D zaIh4a<#;JQ&QKkq=mRw`b|R|yLLz4ey-<`M%~$N$H64;wkjxS;#@MJ%NF}2oa+{!c z#cakxf5Gb+ZH0a4qT+C|=_ebAbY#@8b~Zp%rk|uCx4Wo_Lw!J~y%RaI_0z9WG)5xC zs9=FjKOx1E;(QlBuQzo%PW{@pmy);M)< zR2R-Mq#dX0!zpi}OB5GGpH5|-77%(_jm2+bOdn5Wo)(NHK&ZEt7?2!~M}mqz(sG48 zB(8Q&6*}1An##pO7WBv2{4%hJ4T|6)M0Z@nbjpl*70gJ6J;;F-$g* z$u0+J$eB)A*bzTL4m1#_EDp#43gSxk|V}*|@3G z_25waqHQ_^4dJ#dvO1u7CVTCNOKeXCaqanl$c=KkzUR^rB(#g3V8}cxHRh(Whi1&N z>*4I*5tIK%LE;aTD~$o-u*)wDL|Wes`MHKzzw;bzVK|7ex3ExrwAb5qv3}<{2||0= z?rKL`&!sT7=TquBeK(Det`D}@nk2-o8sU!%jUA#>#{$~9GCp(-M-j=vbsj#RP72x07UZIba6%6MHFqTq{Bgq(BaUmW!n)x zwTt>x_Vv!Si_uM7`QP)%BgY+nT>EEwu?l{Q*d7|Hi&a2Bhr~=?c+jJgt!wY02Qh4> z0(>e>xpcr`6Q{tpqavPNy96EuDp-B z5D@3(%zH|K;p#v8Q~>Y6a8UQ&gEZDwRRC3)g8yafgo+jcJ$G%3K?uF8crSOM5&0=7 zSC12Ay4Y3l1{mK}D!Zlb1(;=G{q5oPhf|}KMDziX7Of;A03vNcNd!f!&9%REu@}&% z?4*R8Wb|S<37-FBPrwG%(-to$q2~u!P6CZ+@9Ach%TLkL+(fA=)5TtgPcdI0t<%-# zFot#$*lCu<-UR*Hwy6t>E;!jq2|0;YNjD41@hQl$p^~H1!2??6_!Lhb>&+NfT{t3r zibV`?wZ7u2n@xhAMYKOfhFVX3s+)*`3-Wxvv@tV71#Gl$b`ja}DVA3Hz59p3=fCi& z08i>CS41!rR+N2CM-R&-S41uZT`oL|s^Y%D zAB#&C<`!-#9ADTf|5pCa{Dl0E`CrfEl)rVdUuB=lj?CsWFL-n8zveIq+~I#(^PVzY z>?gDPCEx4Do`tbHdu8+i@CeKuHYoWG`v_ofP6U{e4zRaa0#GfROo1iq1kiVjoGh^@ zg|(Xb3!+riWQ`q4gx66+AsAvflx9voIziwH#r;OhFE~Yple|qfAq1ezxj0Ve5fH0fPsZv$+quqA73RQLKRHYYVa>S0t3|Gu? z$sAN&N3I?_fl&zD+pvolzwmnI9OZ`mUNp`_Wv$!?1hrZs8ed7tamHsHu{G~w)adPh z%-_$T>RH_E2IBi^2%MqW1vG^Icuj*~ehwNg#7AaaieFd;0-YSDref@u7UL&Kp<+XX zcztu;M|xT)!(A#u2su794ssK7TWosB3hlHPZ=!r?qK@@=5H66r5YW|!=CrjF1Y+Tb zM{DhNf*4V{$}CuiuF%P0$Fn{VdcnF7; zg>d++&w!#l#;r+n=V9Ij|Mc8*Kl%^|1U1n31hvApM)!xByd<5o0VZmX((ocYZH{^UUj5JNZf-loC% zFs?b|riTgbJpj7xUr8ezOrcB6m}<>?+w3z^aC$w~Y~az;lJj2G$Kk@_;SE~HV%4YN z9*=8IMB_*F;%_^G#18h`sS8@|*1TkE-aFa}9gdC`3ct+)#Acd+Tz)j_ZkNqa?K_(q zgm7C2q7lp39Ok2`Vi6Sni6Op(z=@6vX88qIgL-7fAvtC%xfdekPTOAT4ujxoFl~FK zSLRqgj4+~SS3Mb>Dbcg#Ky)7L)soBTED^BBASPGay6OahD?lZxAv21~b;>=?Ufr^c&l(n;pD=0VO{^7+&@cOm6j{M zS)5)TUB01mbY-*361~HFvyJD%y91*d;a}|t`YSG9T)t-}`@6cQ{g=7X`ddE3{$Bl2 zNml;7+ij$FEo+>4=qL*K$l>ikhCzx8={wOrx0*@e@kT%rqWDSX`v{k!UTs6*LuP9X zf8?jH_=)#9MncjMwhs~Fk=@e~F(1lZ;a%95@~@Hh+sRfR5M!yM7Dm@t>p;l>gdHjg z;bZBfA?#4u*K>7dsBzM(gl_49Rle9JT=<&t(oP^j&(+?OW}mmlazhJ(3crd8$VFx- z*&6;$fsFl$lHQsyju7G&s!#gbK_g5FqcrS59OylXIo?Ra)?8{t13v?XP3<)yug%_eHy%n4-$ zUtAPG#^aYqjKo6aErK5XUk{wP%;BB>kIN z#h7=7kOf2-gmgS${8*aBaXS`#&4s^2d>tW(0KuzJLL8zHQWE+Ba9hPebrWyc$_gQk zLLCP?P>`~a{kxe8O(Oc1kX$E&nXScggdD8iBW1mLlG3ls@TlLU4-X(CiF{ZH=*t}e(TU&3jDv$ymHB~}+O@M1eNA@_O<&f?ynLIgiAt&+1~sk9fQ^e=kr zj>!)y1DH^EQ-SzE*cn;qk$Y$&4v&P!*y`%NB)h=O8^?OkYSjZ`FBQM`iubiSq>BA~ zv`QOLJTQd;^0Ya4xI#D#O<+jK#rk?e=C=YOyS_nvrWYKf#LvWvQnlfUMlmh>*?Vco zQ({G;cgB*;P|2nVc(s5~!&KU3wrO6-O%haiF9~)zo5tnB0B((2NBMxfGz00!?yM1l zEzn?fg%5-b*r%niB%)V3keSX4)U$Ledry;h`7^`O6A~ zz@&nE%{vib>n(G@!<7Yym@f#!m##p0o&y99!`PAsk$&B;6EPAg9!>e$y)=})<8>Fx zzUUiyuoDu%gWKK}`vE%@SdingVys@c#9J%(ibv=9^`q;f>r2%JYPZ%-sBK+azIs>n zlzW`WSz5Lhm+2!w)W|wX(9b4L>v`q2!;&gNjwk>|Uuy0{xA)kLCe^vgF z{D%2z?v?aEZ)O*NvICI*-}L;_%(r;43qbh&$aT?^LT`XE6i|;Xqudxr#+Sg+MjI5UtnV&^`CeGbV-^1g}_ti1pl^2s@kh zd;aZBQ(VP238I0Q7v$C500>+zYrXd7Y8v;vphP7I+gpLtI?i;0AWFuLZ@Fmj7#^qL zS-*rA`U=%}O#a;N-ls|q^XvBE?{SlN0l{1EK>SU`Bw|-q5Y2J}HF& z1kkPS!elZMfk0`K2*6WIOYxpWpg9yPymFI_CA@#ge+{wiEZWaKVCEi}2yhbmO*LDs zL4HRvT@<(_0FQ~WxzK#+iv3vr@qv)b0dd560n0@Q!DF_s&yqs;#zU9Oe1kH5E zmMwM0fY>YzA+9_DakDWLk&MUB7Xnbv0Mrb zJdes-v#r_J>LD73907*hETXYsHhdG7ZA-9uITy}(^YHsRmq71XyB+xaCK#} zC(_B3BbHsR#|4DV!xWm0v_taCb&t)3z!DJ_yiAY7x)314yd5LDI2+jvSy zdkYXqY@O*0A+TzB=MRW;QxMeuU=a=o-I8-~MeCfUoddTYe49X*oAPkurfovmAp$lyzM^( zzv%bN`ZBek`cCz-%3+o7mA5F3D?VF1tvIUiLE+j$BmZ#zxcrv6uX;}JSwH)6c8Sbm z-dlin`v)dF`Olb#?!-Z3`x0)aceRih;$d{|Lip4c>Qf!x)uK;f*J05i8~r$Ycegm` zQ!#oQ+*GTo)7!cD6bfIy-S#{mI(&Cmoaj@? z4%phkr)cN?FMNtrMXkH=Q=MMuiI`%K3X-aRq?zjQw;V>%r^LV+eTuT-$g4W`b);S> zv{=|L>~8KvcYI}-5_EiuX}vVv8&q8VXP*l2DGGj(fSumdCaz>t2%plv(DCIb=ch>R zR9lB!bsiVM6*|>y&uKn%Co+?$AYRwL6HT<`nKb-xg!036JG>I@{t~3XiCtT_oxWBO zeTq*};8T6-Q`s%L;7a_+K~Va(F_YKn9X#SnT*{&)i(ReDC5ta%o!OZh8JxzpLxXqv z^DCo>De)VO^r@lhQyt$>jXuRIbbM+Z^{I|;s79aSDI7jUUA@SoGo2fd&fHi&A75wP z7?4ht?U+QmGVe5W;h|{M^D3i!?&1X!nk8TYRvs`O+D#ylpCS*Xsh?2o9d9Z~+55PB z0hrQ(vYVKTQ4!wNi_7<)eToc7#|oi*9bXcMhtgXRtPzM$QLz+#s*9}-12=4}$FH4a z_NT54D1Yw;pIWRFT>mz^>K}GDN#6LZ4byeX5(lfG!|QR&WdcPO7z|z|iSC zG_W9jilqhk)GGQ@9jA!+l&sF{pBiuP#)9-ImYCyHi)BIiDN;Lig(Da3^ol zFrYEobzq>P)-HpIDQd!nOm(w$VN#h@?LqI|CPnN<>zJ(OCv+&}7E9~$QzRgD&LROj zeOv)rN864^zBpIiL_YZ`;%ZsNRX353nu+!>wZ26?}@};**ca%;p zZC8A!cz1D?!cK)%^B*|=9>}Ns<+gYJt=RKU&)u1p{EObd65WF4g!AX%q$SF>?ZNhS z>G^+@?Y8dwfau>vAyzbJ?-+~-5pW}x9S~wyjc6ZnWxwzFE35y~NtlJDK0>Ud5P>8t z7kchDS^DvcNVve9ttnOoVmJ_!D9VHluTBs?5W69obdCss_}&T%;g;N1Af6$}ey=+t zp>OvoLO_~X?PP+UI{4eS(h+u#lMv@(L8sBM7aJk=pmiH+*C{#6Q3357bsH{>1Z-QScpE zY{9OGlE?OCj9#9<;AoAHO%#Q}C4w*>5eFAw{4jE6t_SKs%ZUXb^eJZiSE&^dd9DLV zF4m1}?=Gf0P(kt^UjR6I03@JVK62>0r1TO3>F48GOdDd)^wYATqa8blVF2;`&ksnJ z9@#N_uG}xJ=#4#IA-ETyn}zMk-hv6?|5_u2APxis`7Emik!D2t$S(l^@~J*@au|g! zMY45P-p2Ex;mGpRy>N`eM~SFsxP?`$9j}s&C}az zCkV{YoXO-WmTSEztUT{hbAJ7NWZad%T6l`pvUwS z9=8g{O?kA3O+G{^(vA_52>w0Wf;fS8v{WhpAulE4^HKv3gMN ze!U}ldt$!_Sg5^NyQ+9y@$lkC#aiK&!XFApboy8QNA#C@B>bD4`NluolaBuW4BhGf zv?iSMf{xFb(Xohwe==jF(y(2pjihlU^yh31Q`L3hh;)Q~%14N?IBSbmqnm~uya?g< zr6cTgurGT~EbUq`CSY@DTMj-V-19x}skN2az1Y+{)=3+}YC9j0sk*yi-(U$5IPVgh z!#OWdUpuNf*SCDWO@z-9j@C><^M{l>jd)ziIPOd`rLBfZb<4Qlk6|m zg(8SWVIPn+_EeA)BqStKx;DR?j@6lm#J_TE(txb-KkB=Z6(m}GkA^qDe3(+IcZ(!K z&(qr*Lh0JvUr{r*?J&y)VaIRScFuWuoPxv$<=a}Nca>~M_d(@nsD9f)@go-%o;@@{ z1>@I|A*5E3%<}?+5ZiTwKni%y%NPoZXlx+4LJeoHaip2&yu67*IJx4Y6Jq0T5Fu9^ zX@qcENX}`LuFWn?Ga?$bytaZ7U;UZ3h@H#QVuE+EN{RS-X>Y}sLtD5s$+QK&_TF6+ zahP4!BgMKG>}DV$F3>oZ9TOqR>uFAppNZflGC}s$ME)TRkK=2Wp^($Ru5SZ)_X~*p zF^UkfxuTLeOF%${*H%PDZ_?}{H(3RT;XM2RGI)}vA_I%#b{auUz9D6ypLno$5iDTu zV%(f;FW@hwEGQUQW=>Q#RS^3Zt-@`DrnZH@cmY;dI~YABjPHPe%4v;jr z{S`zgnahAB~-BtsDRZ1MeS(Hn>SyuC??P)RqYn2Uk0IYxTvVrY-?o3jMjEQK#Xcw@AB zl{fwf4Y9A}C%9PcGB42Un03?%f=NFX_$VOH)pfrN$dI0oeFt@rx#(c6F=0uE#(?lq zHYIJu5`k*&oH;uy=^ZQIp<{^hs%{QSQE1Fs8uC@0xqH`$SOEyX4pSfH<-psZxzZ|K z86k#km852RoGoeXqh;-g$pfY@?$}>2{mvpx?=7jW%F-`s?1zPMqN2mNC!?hULR8jQjAbSY(*VL33_(!WwAa2vW3GnDIRiLCObi!j z^1JL}HVf%9bS}U)K3ZcxPBuO|_U7q>=z%SWG8buRq9_DmVT>Ti5hIABIG}R@8ItFw zg=9b+{xWum66FNpE_gG5hgYgLSLp^3)O+gQ53{d%c&TrbTBAC<@sI3lc&qQ4p2Mm) zR*$W2UR|m(7c&6Mln2YVl}{*5FP&K08ZZC7Rk*XTUE$mL|I6Q%KP8X%02@~{4r;8| zDAi}xuc;qa->6=%y;i%SlfRzB=r1#n8OZi~_c{L{mg_&gTVQ%OTIK9WpYEX3|JbEd zbHbE|6FLOzwh^|`(AJ*va6*SbA?!6CA`&_T3Sm2Jh)C!Vv=QtqCqx8Fa=Qzm5L)uw zC~t3l^ugW$qJNC2%M&3$hT`ZWQmp(u#c3-R;@^+gIk5Mk<)>{Dd@lebfbH5#?n5i! zBt!fkDz5B~MH|6S2w}WOf20uq<6?^)6OX`Km}6;S8nc><2IC5w z)09VbLD~sdBMG4k(oPT|4PB6Sf*6ip0C^o*RwTJ@&bB5@nL(3q(fP^8LOkTR?Cup( zi77Ko+vHRUp}U;+vIK2&o}W2YI0I5*2gID`XF8!mj6H6Oi0fR8@iPH}nEdu#2|)m6 zvJ`&f1!ljt%Pw*uI>oAWW+6;0vM84l*GG=W}gK zJ|;xLJRTc0Ajo6-I5V@M3&M^bNXL&ItEu$6AWX-@3vYXYNxa{8LRbfksOaX2_nL$t zjb_6Fr8m5<_fw2nU1NF?hKdexAsLWBw;VE~g;zQt#2EU2?W{n0rQ^&PRL0|2KtWto z_@O2-rjK46zAvdzJa`QGedJ=}Tne)zdgx-0wVQcAEIA?wigbIc95$4sNB4w?I3cLh z>`Zl7=whRl^e#&RBOUoM1ogJU?3eRGOUi@L$`;Bp2-!cBZtXgpkJc-t65V?SgBkZ0VCFo63?WIT5y9LLD!s`Esm$-2G;v(1wF* zDA8Ty$#LaoFVLRv$*_m!B+oJ+{G-~9`9KOSNlB%4ofmASMR8EUg GUZXa`WfwD z4iy8!Vg)gl=Ep$T`U?H{QTTD9>r2Q`(lIuQNXL!^CLri!PkB^#v^qhIB7`2wa4dV& zjyg|NrO=c|m(l8aOZt~+XoYO)VtWf0f^T2MR<9Dh6GYIP^KwAVNXeUMe#y2yi9aJH zZ;}Ygv}UB_O%g$obw)~#DG|d7v7wS)no%M~z#(Vo{5t*uJ{^NoP65$blq4d$ZjmYm zf_pt7bluVkBFyy6sblPQF2feT{7*!5el4RH*y0!SNp=*p?e)tJ!AW*>S?paUbja0| zf+Z1@FRad{v-vMqO(B9YA)ZhG@`NtU9W|0T!hqr$s;Rj$jfpu;>`!9t$KbpZ{^&lUit6kbxSh~tK{F$Pb%D1oL#)Jcx>sK-f6w- z_7)m1Hm(kT@h^HGaGUD?RadFJUpcd~Yh{i6_i~?h^!K-%_2*sR)t{IB+PrMwePni5 z{9MLR`pp*k?osYz^KOLqrbLMMqXHm|L%(UXr)UVo@Z87d-3YG}L>~|{w1qn1iVznX zLwC1 zF~xJR+*#(w-C{A!kYG)@0DwKT+?_CGYbrK%Y-lhse2B4OY$rqiM_(B z5Kxu9)e#M|?jMt?0u7eoT0Rns6p984BHr`tf5~)juXE90d68dO$$MP+NGIkXfN}NL zB?)v@?bM3|&p#0J-3J(me$S7eiv#q3x_r*WUXl)Frzf3ci@5*)mR2@&A>;;Oam6h{ z&*O=Lv(?{!Od<`c=!HcJKQT`%@--MH(0qM>gia*bZ(j|?W=i9SJQ?oqH-|4=RX`vl zGK-*~-&={{alu0bpDZdaZ^Sr?*)J^3+1UdE!<>>P!2<&{<-BMySs~&XRA_N9McT5P zQl*XQdCVw1w|~hh)D!@5xm*2nbs^{YJ|z%5)9#q>`iL4vnb%3r5zN|eX}5L#1`DO~U2 zQh+IBzKNQ`!!vwys@(5keMfG7tXO-PnGE~8t^T+7RNocChQW;8xPZ;xHVFl{8ND-Rmc%A>g_qUwi$h3gL+5I1A=mH-0WK+2p8$W&P9Ye;vn)ksK}>07_DK0$2t>0XgT5&>h1l4=CT-~)j#+vC5MYE*^&anG$VQN z0asYG!gU8%S2SF@axJLAr4+)!72R87;i~r;BRTu6L`o@eJB;@wu<`AcMg!rT1vs=N zw00fqgN|;QcI!Q7cq{hooULwL9#dYn^m=i*{Dj;+J@5D2*RykB`O*oct@3YImMGuU zxU{ivV|d}D;)$i(%KepBD}SsU)#&N=FTaxgm)%4D37?@Edi|f~gvp=l<{|H+Ks>RY zaaun4^M=~v+z4BX=)6q+ysj0`&v7Cm+<^eW6nZ;q@H5OrNb*Uk3xaOr(hIM7&+>YKa z^-}a=KO5hs0hi#t2td~E)WBFDf$0%^?h=8Y=#u~7Fum;z_K5zv^vtwu!{t`-f_*fE zpEd%5c{-M|5*0n?6@Ok@$&C=ibW8q&Em~AH2En|+&;84ry076&N-y~WWSl;t;)5D+ zYs@+E&H~snjkkvd5rWv8G&-G=KQ}eJR56UsTekT-y^GdR!t>#daJjJ>EhyjuG`59E zU8_m9L_aWO3vJ=HzfW{Q_`}y^6CAljM0mS8WQ%(**a~zv!dvJh!uB2znGX#|MEFS% zybE(2cHqFV;pETFoN}yfrB*KP!7@kz_n-4hcyZ1ODvmMj36mFOHAI@xac)@L+8cke zf_Smcm14~Cg9wo2APwO&2H|=XmBNI{pB)Ub(#J@A87Dvcc`_9s_!T_x^%-vG zB=IE?L1k0V$NX@FkYSP@3$W7?9BfUVzn((GdQ!^qk=8P8L3Db%qaBVMi&#FRMnrV< zjx`+&5#E=o;sVg}ng|~f!|Fog(q1Z*$Ix%)C20$?vvWZ5t_7ywB8`ZpA};_V?Gr z45n{G_{3KjTIDEkZq4=)upGw;`C|LZFr0&CnkaqAEFD6IA}{{}Rc2&Kewyu~LWiw0 zf^HC_fVdDw_2tPc(=>F>=K(+BgPyf*&Vx(qxp#-0Yuv!`vnPP zt1J`^hq~sQo~-m>dK<=;odWm#)HGV0nUe?mTWZGmC^EQ`gAcHLFvdX4IkAa&;!p&P z#lnOW!uD;FWg|@`cG765uu~3NDC13Ji5)ejLIM+6I-wHO^UHf{=XS`{UZ_ne^ptil ztx$X=_jc~C+$p&oiboYUD=t}>Tezigd||8FUbUgsMb)RPmsIzyj;Q7;|EOG9IT$Yn zRLU=x|4=@%ylHuf(wx%Gz0Y83V1GR~a5ZKJ^k2_=^w-5N|3$wN2vv0TpUkDEEtQ?W z%ck449~BCJ=?9q`I+6C?IuZ!oIB_G`Vjh`&JfpX;P0b20BzR5*09JCe%G?0k|AXw~ zX1E}MC)>+L05L;3Spvc?3?PN+R(FITu5=5wBZLpcH|Um~2nM-b4Gk|A!HjYl!Usar z@TR%U!CJ6EeupfoK^ejf4Tc!rn*E$c#P9sX5WKLR{hVnl#_mWN1j~&4{0=n1&<^*p znJR-wlbroVBK@c;of0Xo@&hro-e$rUeH=%7*h}~%0uV;6x7li?i``gAc4~)y`)Rsv z%51<8ls@sD0fH#klD1A#A#r+l8>^r`X}g6>Yzch-1buP3!8cG zrqGbL+6nPzjo3^biowp1B;l)3C1^l{a|L=CwtZ}2@{0_+=uTJ_W>D3{O zg5w{UQ6hAS=|aGac6@`YoC)3%Tm}DJ{Q5f(zeS5R5rIPxc7*|mGxX(r2Uj@K5YK+} zPeh9|kp|7PF_$l0Y!)InJdQ@`g(lWpfK|a&H&(SgXE^YYr-zLFQuUsp3AQH2+0#ZMUKc;hM6z$aID!4Ju|;I33cSneM-EgA^M0B|}!s z!eK5rFa?3x0U1><(4{PQG3qAEBjQ&7`8wa^2=r6&Y~9xgMNXJ zEv{DoxycKdy48*o-*fa%Dri6maK)Bjf(C%5A zq|iX|C`f%U;H*zEuP#s~!A4U9gP5MbZ}tI$?%fXIQ~V>gk*`T#|qasL56 zKr#Vjc32t$5x}+|A&Myon${GV@ui8;l9DQ!yS4f+ zHrXDR1N{=LPQlg1xkRpLli-pb!-^u-}P`I&hT(MF6O>Miv?CR;&?^ga&`9*m_ z`SJ3FWv_Hu>A+ICzIkt{dQW}n`t14*`8V@-s+U+s{BY1>Iy?mjbW-U%Q8;6lApUX&!TEwRIa*5DO7`}A&Q z(t;@v)=>@-^jjmc zz!|(^#jX%R@ulp23gP{UNseWROr6!+klfRV*ulAyLuPF_&)1D8FLvyt5d7e!HTZ-+ z2J|K|o-hrK`kZI>gHPy&j|+hYh#edJ*5Hg2wG<8-w6oi%#)V~#{k#VxSB~OwaE8wE zTwGzml?fyal8qx){)u5aUm% zCX&oYEhOer&A~_YSSOb|6oW0Lz^~mNbKBTxL%3ar5LTi>@ViZ-z+*b37WZxtKJWZl zic^JG%xp)mH3#n;oh&&zp*)DxkMZ`>G~^Pe*X@|DfPjy*H;#MQ-bC$Oc3Yw~_~;V) z-}9vbP08zJt--%!5)p{#xS-Dr-e{z{2=+_9!@}YyQQa;Arr;thhWH)?IXIE65W`n& z?Z|2;x;#iJp%CYgWs9vE|7X>#givV8yulX*)7 z?uqd1zB%~6dIjOwE(8S2&iDE!ia;l7q*z=VM`JM~}vIQmvvMQ7Ea4|vz zyIe;@11Z}+Jut}}v7SHL`)+=;S3bAAcIAQEK=p0w^#0KD9+gRz-O8Vq|5iPvxXyHfs>+_@8-%|O+zfAU<|Gek*A8D@B|KJ6AtpTgV z^zonY&Lh)6c5MTQO}`9lMgVvu+ob?7+1SPLc%l$|iU$beju*$Xu@r=s;$SC$F_j&S1QVNvpZiYCrDCs5Daj?GwcvW)O|O*N?pnJ?c9SF^p3xS=PH40h_=5D6sU@?T`ptd&4N`R=PAds=M z_P<{&7_J<;LK@0<|JH&z<_uTrik>;J{njr|Gc@eu_0S%4gd^nW$J}e8&FTI(qtRN> zzhoK$O-)vtmM%2oTn>AnMspza`g0+0xMHtyA2iZzE|(KLaklY9Yt99_qTN#V4;ReV z^{?=f2oc|Da8bL0pMg=j5;h0Iafy1tYi7cS+Z+iTdIhXHZ7q0J_v##6Q5%Nsv8@G9 z?xMI72po@#{Rz5yVT(ir%0Pq@wrW8`_aj_194~P%nAJ+50egtFa>1+>(h%@OZjTRA z>=E|fxL>svyl7rC;r0MRbjwLsdVdmfMper@>_Yf!I1Txe-6_&XYD3DJs5 zN3lBUOPSasR$z!={Xi-`E>tue2%Ne)iWMELTnMVo?REiZB*z6b*AW+(=e8C+ZO($Z zAL8g(M)vykDKyYX!^{x#s@8&6l0BC?7@`LZgzn)x{0dQ*@8%mYp$+X~A^y?D5By7;~XcfQHF1QNg8*ksV7X0JLL>lyHiX*#vJ~^`E+>IWx zvAv|V;5jpp$0ZMs580>$V$XBQ>zo3pm}&t6hpP#?0s@_8;U&-Rmxe$WgRS${f@jiv z7xPtYfP>ax+WMdgIhK{wvv+vk%dX({{=K)aHxu6S&(@!%6_bImT`vIS zsjU!*gNPS%kv-fe9g1^Wg+t;&t@#_J0{4*#NOM|gSxQS^MO7du%u zRCs5IOuxReqxV}OKB(}5HaFk}>uE^rG+t4`z@nXh<4)t$$r$d5La6tiq=I0@iWP#G zXSv@KmPC%hA$eSW9;v8gte>q69Sjgwa0Z2Ay}(pB>$@1^5Ms;>Zk+Cd@XZ!f#_LSc zi}ier#&|A6jOjwki#2_cA;g&85$uQWmH3zyvX*Ady4x7pML5J$KG6`rO*7MxbMmAud;3$MLF zB`~8k)|)L#77igLudb-r&nqa1$Tb03O+n&gNNT+xH)rK{<;aY$>u)dC+>b$Q>j#x1 zy{}i*RASxzRLIkqgKKN-4yiG8Jq2Ul#j6;IG^GE?iOV$LqQHV(U1lJ?D-6wnn)0#SlIaKAId+TD6`_T^vCU zX5KNl%SD7=8~~9(R{@@NMK|(E6g0dZ1(k1UbzSA6BATp#Ec*=*dr9Jfg{hO5QPKxe zdKB?jgV{!1Rk=VI(eyX5O^qR>SVM)Bb&sgG?hOJ8a^R#7T-A{sPE^E?^Vij z?f2plnxHY<3mOLElAT4CFn7@{X76?<#10casEpU0Z~ONGBVQ5k)`W~z6=U89E-LJL zM#xx2L#zk4lt;43kZ_YI8;EokgbB8-HlFbU9MrYrmt&KFEDS=c3kU3Nh{Nxxe<~wO zp({wxyHETHB1cvMD)v$d#m{LfS4$;h0+aU_Ad5cW^RAW}lMvLf<8{Z!vmW!0>;i}# zCBt8f%xK1B0fr-84k0C*DOyKXf$pO%3-15l?5&aC!c%p9`KquFFdRLAY4s81gUjoe zOQo5mt4oKJ%IF9bs#jGHuC8A#Rj#g7(KEOt>;oK2oq*nb&yK9whGTGwj_d3y zq7Mjv?{tK%BtlHxOPRv1g%gOtttOqfr-8(MBnd)t{Yvo_JK2m$V%K&-_Fvu?zto8M zMyhGp2p@IB>Is(52=?E{s`<8PZPh%0%T6l>*NBfSI;YC*7@&)P(S8wj);C z2^R&3yG$34>kAN^W!PcJFZO$ZsR3e-8HWxQw)DBvgUX%zDxY*PMt5|X_<-DoT)Vwf zOU7v5VV+MAlXW;DG7p|~i;j;D#vFqHpmMXRGbI%~F~H|)0l7(cvf|Ivw>3t00PHRU zx&CGUlPEsUG$6iheKO@`CLQ980fKpL37K|+rg9^5eLx(i&l4tHdVq#VDs+K`Mf=hQ z-rBpSLv$k#LR|ZE{cmIUn?h9~bfLS#GL-U*@vbuWM?lakuw9t6do2o+$hk81&-c-C z#5ujJ%O+i`GkWhHp(;Qe+Pzk1^j>V_SIOdpT(gg2O!y-h!|AYGDA(xLq6>ntUupKM z$E8t`hrQ6)<+@K8pG|4YLX-NolKskt-blc1(2DlBZGgd?w4HCG1e|m|R1jrSBUm;8 zgc!38Dl@%t<28a=#)a^K2sY6QaIocEkk{*;w@@>vptEjE;#c9Art`t6pq|0WnH|E& zF|Rjm4C!Tnu)`i&_J2G{%ObrD^B`KG%_+`%Bqbw>Ak@!~{ zt2o4$K8YIcV%_g|Q9-a|;sX+xtiqu&ly-LHBgSqpA(=xED_k}6q$^Cn-?0R{WTt;ZvRxoP$_bVt)H9R4R_451 z{-^nW72YV^UaI#VkY6qLaqcgr2-LYq!--q`&-X^jANj zenM%g_e7U}tO4NsKQj-Tao2dS4CAgN=rsoD*w$76ggzSct}ubZAo##i=JOaLR;|Sl zOud;$Vu;uwpF+?}Ja!eC%l3F^Ek?n6oz|D99H+ux=C3x7$V6#~*WUXAAh0F36D$XU zUhuLg2Kh4#kMSItc%*EXywgU2#;6n;$jEq524dAT1Po-a7?MNxJ{^){l!YZ%Kuj=) z!?A_jmIE^(j4K}qQ|L)u(b=$&{5Lv(b8toDOH8}1FMp#?AYBM3nA2GJ^^qyMqOnF6 zDO(G_Hcgs|reJMLj%CkFNg#BfaBzh<$;!e22vgom?b4W{Z9yLh6Y=ln1Tr044nk--90+)Oym2&k+z=qX#HmHX8l-od zgkRy84^5YXdm<3ft{uHvU!MAd1QH|ZLa``0iK)>Eh!J!%N(^-bt>UtDMJNhIBU$hP z0_Lz>xAo;|NsF9#Lh5P190)~yd8*kJZG*R^;7vC8$X9yrbyx%C5G&6~@L#70j*H7| z>kaVZfADp;+$hX(rNb@-A^1@V6i5urGB7b9_-Q+*A>fEM2|{eI5%wAnX<%rZuZ=HH z)1?;EREU5@Ec21yes!XzA-#}dE<==iFUz4gbE}GO!t-6%FTH4PY;m8$SQY%%c61p0 zvlTQ`w%{YsCUM+?=zX?uQ4&vB8dS_%`x(Y23%ZPDJYiYjMk+i1BY+4DM44 z=WVKt;oW4%bjX3o#!6oNcvJogjgT~`Yh~}4e)apQayXt|1tLuj90T#8`{u%rw@5Yz z?iBH~%=2;6^e{Y&7Z!lf8;xhj&k=-xt25=c z7JhWBq9F{3x&@AC2cAA4j#h|x|EcYWvMuB{7k+d^vT_N~7QFRk?9Es^-i)Mc_M!!j zDEPZx%?wB25meNwwvPibNpCSC3R2oBi^wl085*`3MuyUI8ptEh#DSu7zYh^8yX+DY zT>bV?h49X@))65bzk373MhfAO1CfxGsYF9}TbSX9238)^73BCWW`PXAdVSJ;llqXdM|m9wBhi7LOA2*gC)&v78=Axxfg ze|g%;DO}Nvti6$8cU`nx0)i4S9Qg1G6@{+xE9(UgRAxXx6gz~_&;asC=QaZX-56l; zpq`)THS;^wYNu4stejg}yM9COw8k~X(S;L=OBV);N0q-Q&nRD19$)S&Jy*J-_)6uo z>V4JS>dVw#Z){Y5t+&woOn#@rHiZ=mx0b5qY-Nwi->ToMtz190zImgLZorH9B>?L$ zzf<;aX@8l^%%AtP{&SZ6?f|3P&Rn_ekxD4vU|>q{bu!3E>*Ks+6My5Dzaur zTI$|m^0#F^)h-qrDpHmZ!(KiRf76KA5UoM5;>ibBdXg|>U7c4x#!jpPAoL(%=1G^T z7=mb+YO50(gfM$ZCp3sFG`yl+Cw>n=NiJ$3qG3kqV%GqY5&7FpPH8{l5b6q5Ka)Ht z6;1kEioUVV+6-nUHO2H5FCt2OYs?sPe%pst_@lAoc|6;a?%=tSF_-5iDCU))6r zAxJ<7NN%T1h{Fru@<}A<@y!rPFqY;NM z0mb4vzpbXAH8|1aBb)@aK*hO5qd9omPm^d+#Uh6%2A(tHS)2xJE$U6U;D_rakw8lm zlGwHjg681FLlok;cvAv;r2xX$1s=y7_(1oVh4G?81)GQu8t8mPOQ{nYw3MDdQ6YHn z#InHpV-17m;2FCn0dU*~-P$}+mS8$>4l!^L$Y|I%?O$Sh0JMw9#-r!p8HXqOA(Xa`$jfoHv?f2Z|sh#Hnb0DhY-U2>a^2OSwfcoju(tlK`8UAFgne8*sCWX z$d45yemZ81&LDnah0L!|ZAQ*$PvEteC>vnFl;6Zp$7+ON3t@mEaF=l6r@HN9&jlvX zD6D{2549k%=^Z5qDm!acwiUA+loZ9JQ@35aErF z!W^%4q!uOC$x#|c!`cwR_ZPq(Z7&fVQTfkY5jQ5D*7=FhE>3Ah$AGl^VP>INm-(ZepWm1u2isgbm^A_4wj*~iLSU+YFz+AAJZSY=Ea`)p{U#y|xP5hgxFS%j$SHVbr&Lq@wZh4=9{@PY#r72)`xf_?~- z1ymO5jwjzyK!r+Ct2z$+-Ylf~;vhvw*dK-gZ`P(Vgm$h)y8YmwBcwrHHeuqww@jmg zqg=LHK;_@q>D@X5UpTU0TCQCke<+8C$`HabmXNPCHD5A_;V_qXo$3dA;|dDmFbvJW z+G_Rz@iEvLi4tpehdzc4QVjG^ZoOz3h2RN@(_zRfb%WKhz^E>@eavs{?@bMqB%TzW zW_oPXgUFYC8u1p(pTQS4BPKgR)>aUqt`NeAkWs!YDTpJXK$Bd|0YP7g740pLha{*N zqpM;;ZsvehO* zzgx&09VGNJ_w2g}ZMk_G(X*xbjXa0k*xz_!H~&069v{yhmE3feY42|!VWL9p%8EkZ zaEp04#L#08-q%u7SQl)$<~Git)6rf@m%9)w@(c%!SP*p~*x(J>&jjjN*i~{+PuG&% z&u#2IrtIfXE@B9Ck>>pK)=dFmrAmY2fS?^d?Xk4b;2>dd9>kLgh4wEO48!m?&1>2g z530W{nyle+v)vfEnQjU3EhWZK3Bb{$Eq4I9^+wwXps)Jd!d;qzG@hj3c~za2#a@?E zG5}x)=b*5qImTSiNx=sA0O(`P*xOQx6nqHXt7OnWQ-R2<7fbxP2>J}h`RJU11tK7{ zLHS~#0YJ3$ZEeGmui8dA4I2;*X^5FKzi^bH!MTFRAV0UqZ}79z^RG0sjImm-EeC=y z-`a{B8OgaEi8RpIZacp{2{#M~jIG9xe8M{z^RF~bCpZ06z3PYK*g%i6hvLKtmbzUXAun4*^Nab0m0FC1{4Ynv< zH2Pq}OY@3`CuK*$#MAQ9Wriz<S+ji5NLz>(@+^lzc0S}upv7gdH8+@?=xh-BZiFK?}$D3I&j?B=(cpYnvu-$q1Sa= z^DkLS)8M+IYiVK?R+{E%bcY4y{SY4rZF8Yrm=Ft*X}2~1V(qc{~E7ukKK~Vcw%&-2=LIa!~sjQvY1g-g(ub(1^{ADyBG!pkU#8L7@7O&!5 z2@9f+fJ#TCjhCa-+>Q)4iZF`71n%wibibn3JhMl0{zbZpz#}!7!kIhEetUo5HPrGL zx-+)Lx@Pee!6N!ej76yW3TzE+p;%y{gaEOgDQ<)LS8UXIC_{h2CW%mX1zJ9dYNT7~ zwmV=!Utucp$wDd|F|#LM`hYOGv@{hEJT(TwXig&NU2I$P;OcVIRAic?ghIUFK!~GK zB$roz{odGb1UW)7f;ewOVWZi*bL-GXW5x7!QR?bVKr9Oc9dSJdQe6oTY}@k{w!EP> z>2vkMAHB5-qpQVg^|Zzdz5CZrs_s->wen%*!OHI{yH~zno?m{fJhb$6>C)1=r9$z= z;x)y?iyPLqt$n-t&+4BVhvL3}qdvQSQ~kL5nEJPBZ`P*cEr3Gd=)&m2Qt~f1kf9*lLEWzMgYB`x&fBk4e9H7K4W^c zcer%Hx8R=Vz0b7Y-4XXYr9F_~(ggI)7nUqByAkI^YGWtfJCn6z#dID67COZ0})EAzEyFrkrXLF)kGV@jZiJiq(kn*w~H9JDD=WWzV|mL2K@N z=4k9r@m&N8jsOk4tH)o-4Ye83u+<;re`3Oh5%PbDrwowGSzG}rfwsAAds22 z!`FF|2DV(=RS7Y^D+K9EXD8m19n$!zq7k2fP`bj-%rb}a*q(lk7|m!PUSUUK8#z2f zhx$zH&3)zF5&=0(1{8Z6*dSQ_6*T9*r{lmd#uUt<&QGx+XjYinXu6WF-|}Q^;0esS zw#_!l`f`Xs7Qy!G=D-s=Q#w)t#34{n+Rx;aE~eyIDG;e*IQkd^=O36L#xQ!q59u+p zb8Fys)4a3=ABOo#9GS^s3IdD%Qi3kt~3-)4yr{ATgJ%w^ zGl4)j#04U;{4Uupi7B+E#rOzD)CV5UB_Zgnh(FB|_>Ed?;BOcpckWMgLzvnNYy~z4 z{;D%UZbCSf7|w#S{$k1p?j=A#dM0{n;K6JPQvnccn{5s}kmx3mTU3K!>OM%3C^tms zb#!y!zM9f54+~VM^9CQxabL9?02ar+=mxkK2klED;96z3eW8SQWfEIx_9D|Y=C&X$ zu`b9EADVhh&-^jZr3}U~jpsE79>tdF5+p>3kqOYaBsm~L5cDYQAWe4+OsZ;&9_Cfp z2khO+zLg*mH21_1b#$6nF0JmBUoTHDk1Ge|Z0Y&Zm8C?6 zEB&yPxzZnU$l*f{I^^(iLym|#^n2oewOjPrK95ef09dOt0FvY32wZeYz}}^U?8)IT zu!o=WKI(vW>{Bdn8FTNc8!E2;vrh&1)CT%fQ@Y?v43R-Vqbu+IPCrFO0l)P_FX_Ld zxjMb`PtjXHc3R=%Qa~XIAJ)Ye#ko}Oyv#X@x6B_p{8IQJo7iRXsnP$P zPx<)=y?^UZjp>{#8X;sF!%qNGP>6i~Kl)UVKO7%h&Y||!y=P!Hp}le3wB@dwZ>J7= zuzcu9lh4%jA+^A8g0x?ynKL=v6L^Yv6Z0h;%+Ok7X-B2mGe^nioztPJh$)=Vve=eC zJm&JH22L? zX?zMc9CPn)P3Y>Fw{YT(pJtU-$QB(=8`4)Ku1_$kU+6Sg+s4epNPM0)9 zq=9AIBZA^-#v?k84$e>c;L1~6b>pYtiaiYEmsarTzNrX)t$WX24^)>^%)K{_Q(w&tbhac%;E0+YSKvA9z31wl>^fWS zy2ZA!Z~(<%jKc;5&3n&96%wUc9DoHO4t5BDu51zjsXH6{Ab_5{lN9KAL3`B&Fw5rJ zEHb81LC<2^n0wFGJBjy1X9^rn=hos=K8SDD6>&J~*;MjIq3b^)9#l8-R!sQRn0qgx zR#>!1Pw7-doS7kswb#4fy!V2`lm-7EZC?U!*L3}V?mXXTtfEL!rQA!-c^S+EdB&Pc zs}mx`EW}VljYV5UH3Tu#Tz+CEZ6bzhiV{;yHNNL%5JL^Awh`_ByUw|1@3Yt1=Qua< z&-MBI{50Ra_8RuuYp=ETKCAAq?JjP_MxYJqurLefqo@9k8rOZ=yQC#eM`UqyfGwOB zlIFGmZ$f2zgS6LJ$-()@XS+4^T2xH}!`or|z4q8nPuo8@@$Ml6cUMzSQ?OV^r<^yA zJY*HjueGOMy(@ zQ6Q2t!#w&6IFnG^5=wWE zJMP#657~eG!3XVq=XDjVK6_11AAcbSwL8;-*x zB}>e}$QwQNW^(AhpoXQK6G{yzjO-lq!ty%ftxaif+N0m{cx!4t?3vX7PtxNQaDs%K2 zrP0pN!pT|s+FxyU{ki&8J>zpJpG){wVvM%!bYv`iCnZuSXID_}8A@j>Y|px0J7qly?35Jvg!o2T6B4 z-l7HUdq`E=&7fYO?s2I9>VGJum+E1ns)Psjvir55#2_X+Lzk{JX_iMtPA0qV27|x=ySU{B8b~}dH%H=Cm1%JU%ZG@DFF+T&wZk>P zc4xgtMi4qa2ZBmm^Ywr2R0Mn1n#O?AAO%KGiz>9g{9{ zKr-7x5P08sDzaM}kPqoB6WII?Z0!d3W>~;cX*wHGwCO|m_0a%f_y;1Pdt)T;)NUXx z>%*hetoSW^s%h|S2Z`&0Q$vWjK8b0`PFz6#fwWDB_vZ!gwuh5=;z@6XprWhwP*wVq!6nq{TutPeUt1+Na3t^AH%=4UAeTM4u55pJIo!BQPm+CNXzUyv!XEPE4$OvSAzhAFCbGw(hATQtXg( zk(BSS&)p=bAoyaNDyrp$0vP&OWm)AK!zq_j0;0>8dmw?2lMDb&`uxoR5PA3DcsZjM zBpM6PIA=ccaj{m01|QA|<~9G&5R$Q&45A9Tv(Bf?gKx_=$A{Cr1+s>MSg6pq_JlI$ zQ}Q%!#UK&NYSL8AA6f|o#^3#b`q43L&Wn_yJd%YIXr8aiM(%lM`P^pNo+0>Z-^GQm z71t}=R$8<8O7W)3Pb*(5KZQ>JZ1csQ`+5$|otxWi$$pup`7_V+(f=>3|EDbH<1ppI z2jFfDyR|gDZ~AK##stZvG_3@|Q2Ez&eJEAwzB2>)Nhl8`Uy4_P#8H}hdpHzgSaa7f zhRQsXB5@QBg;0Wd)ZF6C^5Lv9FLgB(%hkHM#dH}kU@)5|Gp1+7Jwto?>!|*B7T}&b zeceGIQOx(=zUi-1E+UX_n#Kq{6sr<@xv{$2GGh|=s5*g@3tP(hymK{8w{N;1Fa<`I zQpFz1xHzWpcnw4C9rBZ^FbRG<1abHT2#Ybi!v22SLf~g!(It06ppl8LW1E`>5dLRI z0%5+A&M4xCqF^N$>UBL-d-^;T@H>1`5C;jx@Ru|x6^#mnU%X*fLrS|msI;(OH zvuTt7U=QYe-OP)@`alFiC$ z43*pbE9L&Ix*5u{(lFE#ts9G#Ku^PBjT(A|F|cJ`Su*NYGl9-=JM6yoCqrK|&$0p3FIECuKG1`ej*lsI@Fwcnt2ws^6!Zf718F z+8bs|hu|))%BtAL3c61%y@66Uy`h1mSaHcR1 z_)sFg1Z&nh6l@($WL-LTj6{9##-zwoem7J{ z`dt%4$pcn%9cPhMI z5Jyj+iz9EB>cFHBshWpDsADc!RhJtVO8hvwv)vSDv^zpJGJR}y_{2q%)bs^k3lU;H zq45JTi5V8qr|Yyyr(RFiq57u3OBJYq^ECB;-+yE4$JxuYX%Ff^DtOgm7i2vJ*A$>g%b)Z)_2RlQy5*`GXL}9i}_u;{0-)V-i5DfTg1dfbBF1V45_#1)A5Z zMR1=kS4Bve2)Et;49edf*OLZ;Wz*a;c~WL<)0>_5Wo(-v3<17`Z6?@O|1)${@CAE< z;2OIbFYW+9fm;CBWruCmyF$Ju>;R-+I{>(&eN-10sm=m$oCbAW#p{}t+j?^+e+knp zC)^9oA!O`mE|L+{x@HJyu6|DPoS5eF%`cl1(;VcAYD2(vq)jF=B~x?AIMzN10oEnK zoLX<87@bmk;QCQY22Yrpr`T8&fxY&?bt@$xP(tA`ZQ&34^cd|fAf`Zro?$UvxZ57M zc3ct-9Cl5o=(Pr}f~yYXwuN8=eS-X8*BZDMTWuTwDM}VRVoq1mX5ibSBPB%+%jCi< zMeeg(_@-32iEvx}9~>7>%Dl|yQgb%lzA)oAc%KjURI@T~&bd_n6W6BP*1+$79MTvi zB!&Hy2PNSAEEJmTocqt3$$smBGwIZ9l@%fQ18qZ~zw1@Ej?^Er;4HyFqC&bj&|ex+ z;U4P1SzCmNUXyW}6C!qIQ>Eve5#{y(z1I}5lIb&HFkX6MfWcY==c`fCJIUD{R4)(GKA=Dmnn8`PZ3zZBrV}zwl?FMwp}kz|B(rylv%EJ*VNiM(jHhDvyg640x;GxCxR1ggpTT zGx_yaF_WSaJQl6#vcdPS&;({Tb|C286f>m{zCQ)R>U)T9_#V@w-1?50PeVYYsua(6 zyZ(&cSt&E*AAbc6gu1LQ2s1o$>rlA8rm53n0)Q<)uMUW^T#JJf5U+kF-5|qe ztIvIG-O~0<1r>uEukm_D7k{KPL8mwm0UED6e+jvfT9IEx$D;bJqeN^x4~LimGlK4! zQrZI-pP~?QQiL!i1~wd&_v1{SE-07)2ugWf%T|EoD%+m1(7!;hQQSfY+q@Ru93QbP z#x~TB8v^b-(YK3RaN+PI!!)&V6 zzepX5#K;bgDvP_C{DB3ef{ZTw-&dO~RZg;*>_*t%JGT!p5H@0moS3k9OfAyp4jOwo| zpH+TaezNp@Y4hUE#RN=G3du(-HQ@zvVd^_}V~*Wdo~U*$32@hhyPf4Pg; zuburO`&9PIY$@|%W_)I=Oi%cur~G4%{PI7y=G}z`h(KiK0mh@pB9LA-eQ7TMhlK!d zuU#`YXoqjbGuxyK0lGi>Sz}M>P-F4*jfz2aWe0RbF@#&3?h0#;;4{> z`BddlpM>1#fH*QlWd3Gl!(3uGDrQiPNRTwE$o1xa@+G4E64h*@5BWY5D7To&6A!vX z>rXJHNCQ1W2s>aH05}<@2e<$n(hYzXq>6j3s^j-E3TyaPh2XGrolOy}6yO3uiSG`= zW=|G`@?Fj+k_LhfwjF|o@+;0Kl7Alj8B2`c#;VE`?Q|L-;n8rv&TMXmsZ z7NP^E%3~3RjhDw^OGuGp2jPzNc&%y9Fvi8sX)aQ?J^xZ&(>4#=z3}apM#Xk1@{|}0 z{Cbf9z)6?~S3oGmWiBxE;1faa!(2p|)+MT9k+Dn*rxw$N0&(+6p;QF|v%;n$Sf^Xy zovl#Ppa@RTxM24L1djBqsRgsTwHAxO?kqLfo`1P&w6*X-ITn9qZ$goW~I+9=i}^(6o~T#OB8|ebK#?6CxviE9E97>@9b-}7Y#%7E-|wax3;Fv zA)CfdlcJlVY;^#j{GbIuD~h>;`Pb;yS8gJdfa6gj_&$5}1iq2)l16pIkXQuPtjzPl zEx>cyyqYg5EOMrA%<8tWiUwbR5H5_0LE7`rK$mQc{-8X#2J7&Z;&)-qw+_lPMekVr`vnYKXH$d;S!pK4SRxJNDSw z5wiVcmskX7z;aF5y7fB}Cj~Cp8gI|PM>RwUL1Ci-f|+4^{#_fyPKq8k=dFrhHOS<0=~zw<#|w zKY_FV*mACRR_Xc5MYY{)Yg9jI93S@!@&b+J8_V^S8h@u>+*nQOVH<)u2oIAQ86up;Rs>t_xwWaqq9fQ3 zB!W&Yrg;IOJiKG{GX#795nYOyk~(}i_eRf|!C#k&+T5Qa=Vimog$N#sf`)FRjNCO3 zbpgM~Vjs}Z(b6+EwnYrL_)MMCPJ{6B_e4HpDbo{u(341}z6(1>)M30z@2dmJT^5*-6(R@Iv8ihW4f@Ou3&=o2 zsl&NO7>NY|8s7|QWTbHM0crMVhZp?{9{ai`xex^5ykb&pFTQB47$PI6Iu9b|;_wRP zUVZQ~6*7V{05Yr6UVMS_BhCwkun0l7XPNC*_t9}5CxJ=9k1*+igz5ocvhqpbY-j4+ zYc0MQm5jhuNfM}ObEg2n3JCyAi!sq&d~qc~v~;9p4jszS0kWxaUm3_rFl7LtM4K@` z>gXfH_6*CtNM(~U=654w5N><%uXR#_PYVZUab*BR^m}g>b>K|It*W*7k`v>lOOKv0 z=>mYfN1XmpxnjGSi#=RNmM<6!kQldIZ)z|8En4k@MJ~ATyCqqC1*7`ywh5D>sM_>A z0O0r^#|7eJeuWHkQmsdpIZ;Gy3JSWo7*Rqj7f9YPrvSu-XgiBRP*I6rMg`x$Lrx-& z4fs!Jq+tfG~Q@q2))`Tt7^lc>E6B2|g`xv0W-|1uwU$EE*@Z^eVhlEJ-JYe03 zcn-qVgTeYA@_X@b374EzngFQ$LM>eLi^l%`2PYj34)Lk>#`5tbaJGR5WdI2GqGqgcDPHA)wAXIj zl3?xFWUc3m}hs}t;Oe6L(gD-baVveDzRxY>4Jvd{AV+j2U!VoR*+SM z56i6JO(a6^vqnoX7Aws+okr6 z>U-5cRnM>PTV1E}&&p$!ODYFchE|;NGsWq}Ul#W*t^*SP^nZ_4e^dR9^I})O#M8dz zf6N>n@sDOvek8q@BI+_;*9bS;rq9s@Yu;w3&9bN15Rv3%d*Pkx zwGhY9y+1tpEpt2cFuJxDIU#IS;;^<;_JfcG)>2F?pox{8Io-le*=Zrdc~G!G&oP^s z4>$Xno>lhqy|x)MPPOX$G~nY+Pv?U3f}&yJ1Mbn}oDgW<>9}9B>&2&mb;4#<*oj&o zJIb^0f&96-t%JrL2Ze}?+1KXNz>diHXf3=0K~oUPnO$lf0As@g36(3csRJIHO$uxv z;~tPWR%(L^AjU4@=J(Lruox{i1@5mgDYfrdCPhy(FdBuOoXbKn92N((7T$>( znVk&;KQj617C}TAd-O3KRPsk+M<9&pu)XrrxqCt)`$f+z0RRUIb5r*)D|M{hj|mqP zBmfk44;dH2^%3IaweZf7;hZccA_{jfkvqMRgw{rJUmX?kVc>?4crXRtUid8hP{;c3 zFj>PP2K5SdriArB`y-7or5B6XR3iipdRE<35YgB~BLoc#qP6hZOenrh1%SRKWUAC{ zEu6k~2r%1VN1{qf^&sZ5TMO?42B(a`IL$s-I|g<$eT@*nW<^BcjLiHAW;J8kcmQG# zzLB`)*1`wXkzLZDS16cpTMMWCJfvaa0?WnpklZZ4dih3eV*8%{#Kw{-207T*V z5Wp8C^>mziaT~*G zrBCe?PXQ(&r}Q`EH|_5__(@_ky(Z< zHRS8$F3?)|S9K$bE5c8PN(=q#dT~r3Qv%Tnu4f`)XBQJ>B-{U63;%LRJb=;#V$nP{ zAr64eShk0>7Cxp<5u9mk#?t4t7XJBL@f2{5ms5IlyLbSlfCUeaAa1cs34UJMMtkAI zbG2`mb9?Q-%g{}R zjM`<-A;%qb#L)+h-~YG?_%hfb;|@MVhnCPLUDGp6W;jNnyz|nHGHkPj4=;~VhWT?D zI%Ln_<7DHGW#1;FNW?aaVVK2oOFfHTj6$2n((&S9lx3EB6ztp&!IOsuAWVkRGQwmY z!paH}!elIn*20I7z>2eDx>;iAdI+52L$Kojz&0>a3(^_P#{r<+1KT340Bm3n;n-oF z5;;WKHiwOV>kz=E1OWCL-aQ5YTBtfam~yoO5FgH1MalKA0zs)=rili2)lHq>Iymj0 z)ibjBLG!xiKDY<)_r`^dA2rrT4S!;N$J+mD_twVMRi!Wzrzr zz8Qa|+<)*uM7p=@LgKvZ2}6A?94hl{s<#+|p-{Oo!*ZGxyjC$S~>)bvRwKsOXLE=N#JTZV-A(POV)kj^3M5duI6mkq-#ZV-x6T_jhUF;u7 zUvl$-qEJ94RA%{=<68H#2__uIO5$e0ydQ8W~_O87%%x^Ob|nvS_U z6N5Nbb!OFtZ>LT(GmN5H9Ucyq@;zwZw^Osb6g#!x2eNt~y~{vno<)Py#^4Xt%{s^3 zEw&H3SZXRWVmW5ebEqaCh#6+8%t$H(>4RD#0@bE_>N^mk?Cb_{R8?Z#5|YF$5ltFI zTBalRbkEZU#H~XihuImbi|~U|*DMo_S)q>B5lI)jGd-LkoeZ_11=3xrp-5I#tP6%} zrZ-Wv!N~K+Olnu}TIWb;vl=j&=ua?|e~-apaP*NJQzTv^yQecEb6lpmMQud&JpW|B zUin|;|0|td`fl+Tg&&mnFAbLNu70n6VEyZjPaC(?#ue7hpOkMGtA&S3x#DxxTCI@( zEdN;H*TqfCU#tG9Hn(;!-Vi|E0QrR7d)8>4-!m)sPHs|eY;M);yV(XQ&KxSj)pitH17l}qsdyi@bzU`#@5Tv^?rH-fv&q(om7zxYlD;UYmN8gja zKE=`?_JT>Vq=XAeeLs|9%CB$wL(x`lo?_hgwD*(>&5vmVLERMma#JseZxIqt^>nk( zhd&f+Cnw_ihF|3U@^}P@)8WxqY|1ZrgAW|uzz5%$r!7#&g7kc#tqPeob4fuT1IlvK z4~2~phc0tg5Xk^VX@RTaBC#TBS4N(JzFt2ewHKd`0ZhKqP=Ja8x<-fTazP@t$UI(ZzBg3w&fWB$-H&V3IJZ0o&kDZ@%8WZb~Z> zw2n~q*w|Mf-PgBN(oJn8*7eah?KO3BP3wI|QXr3sv4zu~_8OgBZB`P4*nZk;bTtiD zvVJ*pKsu4oP}quC!}rjQz{n4jOqOb_jWLwkA(w7iBm1V!)ycWknzAk_SR9=NV{H`e z8s;K|js9I7u7r)kzrwK0fQ4*SFWaTEQ7qfJs$jv0(?X~BNQ86$JH_la21nwdDQcuM zEe;I6MO&v0u`va9;_30;#*ZS8%17fU>=XOO4h35mml8mH{%#2fm?^v24e7r1O&|iN znA#Y?2R2)ibL{kQ4GD>7_)c#{K(&XJC+h%I5peDWE#g}yOus1gCFqFxxcCs zndv>UmGi!73sm|jGnke^oceH~hIs}EQ62o8H0dKhF!6_CGsmHZf|_cM(CQYIPb=$}-!4xqABejGXX+pR zOXml?<#*5!`N#w`uJ(l&&VG%M7Za%yo_&+?6_D=|)dD12F5sP_zcSH$?1T zEa1hn{!_l1p}fKdne8xC;C+nZP9PE_OIbRva)Mq3DJ#fvL$zmIL1}})myFdpua3b{ z!P~TwVTBF!4W~>5(VB7PHenmnUgkjL+~9bb2#Ym`+L(N8I7VFwdLoGg|I33Zmxu2` z#XSYgYTIsRMdr4ZqMc@2AxRN!I`XnZ(Tpo8ALO%l zvuZ_YgmX|hDYFlzZ^q>H!v7^@*&duDs6#g!{}z@!5E zWUiGML~vy?NUmpi$cEE}@lb_|S!n5Lz0OkaHkcK*f1dS$aMh_c{j6}XM0>g^61VcB z$gI*jMCb`=6xoY5nW{%!E;N5AUfONXn5?gYn4eZ7BcXqo7lTMPQN&Yz3Mzi65o)N^ zI>(f7f-~J4iYt@R`5$9&uus@K(?|9ENO+TW2L@%dmUAIuC>7qM-hpW-@L_J7SO$|- zn_+r`qvuP6!C@%sUhC3IFcjr?OqW={)aeh0N?Fu~kMX*mEK)pDBSEe z&q^+4wM1e^B8*j6N$e_G=|=39j(a#V-BOdSicdyBR~#{-_Uw zOEr|+IAO^a4vq%g7@GAZ(;y0pY{wy4sp5P$8l(Bk>9Iqwg%vTx4hS_Kq*p48_`W5Eb2{+R-y+7~Vl}J%M;lNhDqC zWk{T_Dd_3aa47SjIDXub2M^gF_rk`EJ9hsA4nJs2a5oI+D1TO1>8A5@qbgszp-8%_ zf!#^hR2R$&7bDDbhL``jW-#qJ!)Fk^L1s|xmWC{uO;ekZITX&E_Y{`I5OHEL{i|2p zN=JR>ne$5&NG}i@YnFyuGFw34XAWhEsw-O%Ly@Qu^>w{w(NDlm&SX_OMb(9;q@uGK zsUeWLTQ$6QS8CrQ2aUH%1@ST0m`9Z3wKjl!e=nOfl`~MIF>|bwRA(#tkhW|z2Ea^ z#U5Uuq4ZfIWhP@|b(v_q0`^AE9`Z5>tZ6`>wus~J`78AtH0Dv zDZT&3P)K00p`u68r5lQ*t2^XVyApp^dB`X~IOtT_c9jaVO z>R<&7il`ZT-QDAsz!vcQF3Xj8%`KM1>ta$=S~hIKJS(Mk;I^SiR5~a6QM%#-IVH+= zF$LmreszND#_P(VkO#k;TJ3E|Z6c1O7JujudOC0k^h9+G(;<2|9xp-6g-OArS^SOj z;1Wqh4n=zUX=u`EkH@~KWCsU^qK5k5c-qD0L5*~ z{4o>@1-(Y;3TO5Fzp|AdR+g<5>N{1ZRgb~B|Fg<%sQJ&Toz-)npBXs6xdrv~mrpLu zVR!vU<^Lsr*;nPydC>ob2mi0;|MsA;*b!;E4*#LUah^eKi1lG^+&A@sjlY_qMq(&x z6%G`=RI?g}p;YxEvs6R%VyNL?&8)obr#>(&7z(YB-OLKxtGVjY3OV(G-X)rr7;ED` z$7$%Ximy2825YJ{f(KiMQ_@$w|L8=^s6Xox(S=RT~~qFH@oNf<<6&f_`^rBZ*{OnR{+uHzNo@d)s&ey^%?kBGp8M;YI$h<)GU*y^hYqLC z4&jPnqSN(b5KA?bTieaa_f36hm+s|-lq9aCv7E^0sSm9m?r7<*4T49EgkplZqP^DC zhrWZ6{L{w{+wZl8&xQH1{hTkL3iV?5Zd$Of8W$cR4S;Op^$**m9FOO z484%$3zx@YSpAg!GZzP9?niXPKo>5YQub`c;wphUX=l>ic7dL-K~a;sY35j)dPwh_spCZ7`{)q($fL&47c~k~oHg?EoZ^JyHpS%%Z{xJT zar1`eR*g3rw>7?2zq`I`?fu%HYUkJXtuCxSTHT=1TgjF;Egf4LRa&O7Q{j}#=Y^H? z^Ooe7n;!Z7D))ojdYPj#n`i3$=X~bUg@>d+t^S7&3q6ndm30^PPuKrU0rmobq-U^e z>9>b7zt`_*TZdsE<-oME6e|QC;dA4;#SUQ}OSk(UQuhv>&y9yKV-TRRYB*KX?i+{sTy;Ev8o7Lc@j0=O0*}QDC)0;&Islt3SpaTmubIbf_R5b& z`8o83x{ifEU`3dFo(l`#Pa|xzVj-jp8kAn~`CiKgV9x^;m+`m4VAcIz&Iwnh%+1p) zF4OLRucT&We!jt_*B`J^GEBSw-QyI({P?Pmpk8icUv*pkbC4Db_&APD3pazroma2j zKX>f}5>(7EV@0=kla4Mk=2t;nyr4nbs!+$1xaH7MAZLR*1H=)w)&C^kEeP1yg0T?* z7~k#wC%=_M0*Ng)saF3JRO$CMXd!_ZnWZ2~H#+dw?fyYZ_XdhTk4+5{hT_e@-UUt> zykkMg`w8v-0jgmKG`PG#13F=IYxNJT6*42$PIo+oWxZWZAVCL7Ca?10+TzU*&cZcN znOd}R0-+gyS%`|BcxR^7?tfE1S7Cf1%%?%`>oDQA`rrI!Jmd7eFVjhTm4h@Jj%89( zf9?J^hA2@<{o#HIds@#04aK-cRCrmM&#K-3di)BZHXM$?LVq3o<#7w0vY%`#sQx&S zadJRR<3Nm2j7w3`&1I$yAQa;k;UfDf4R>BGo(&|oq~X3wkB!8w4Yc&|?x5N_$!wr7 z%A5%h@odniFvP`ycK=HV{$geY1kQwJbb&4Er8SZeC{8j&eYNCSAvI#!I&9=cN^|(K z;$8uhLI;FN0^!1J>`-w&5lz72t*`zU=)h#x26BMt^)*RgPR}DJ97_T>lTAp)5hYVXQ@tGhi^@wA@9_*`e!LeCAERA ziQSxco8uEEg&hD^$n@9lf0{apj!8+le&U#~6BnxU`jsVD6I;W6+sGCs=K&&t6IbA^GSBK$c{nRLUAAWyMmtY@UqLL4h=*F- z!duRPt0zH3yCOk0S}jzfl@ap-ATgpcZu*mX$lB25eE15H9CQhyBFaqU^Pw6dcz??o zOQk-4QDx3!;=xe_8; zPTUf9gt63h6zo)yEQ8NKj?Cgf?*ZcJgBlkZAhITn)%YULUBPPHnoW!f>mm#&jdDC? zEl%X?ww-z5h{M{8XaT>ta!4fdh0F+oSuqe#;l5Tdt)H=Jq2@)r7*4`1Z|!(UC3eKc zc}FP#*Bwo7hiQS#(?~A`Wcb9Wv?d}HAYR%r4ngTFaX@fugsFxY&I~Y!2uzPh{_AOV zZs7>b3wF$$QKjK{pwVHUYXuNoYBG(|gB?FLT0tV8U-i`jhy3Bh;1$)^2~{GL|`sBW3h$b*wpdV?k$`v zAV?>eM?Z3|vy|y`4-N#FH>X7w_Jle#ao+uxKv)FklJXxvMu~WeP^9Jc5Q1!?AX1Uo z^*Q&L*emczc2@zVfO+#k;kwO3nh)q_2J6KnLQ;Mb`*+-;#8)7A&lBlIEf$Mj|=ySIo-D32KWX@ut2qs2$X@(*&mRG+PLL9z-S>@Fz-0lo1 zoLp=iUw^xKO!cAauWJwVOfH;U`B&vHl>;h6%TJdlmk%p%QhKR$W9hikvcT300trDypfKvd14pYW%yZ`D{V%hc)a!yx$FK$i% z;Gk*lB5t`HVVmp1NAPS>tA8@J8~YnOmn=dD@wo~QfCRR2Ynjif-GAlY32Y<&=g0W+ z{}Q>N>&#~O5BsH_6s9yS4>{H}#*+=D)M7HVjEJL*VFWWz!ZKN((4hnL*^pFrB*`}6ybGz}X>n6_$7m8U9rrkd= ziEoPd1sA_l=@dCB9IALUTH7;Hi;`AOnN;RK+WnWHmJui;!y8J-oW!-(R{w9XSObeX zNqSH^gc|X#=hgvH`Mop{IE3r__ zCMqDb=j6ggkwNAJTKyM7x_ zE)dj>%A0eWLK+N$GCil)ST0#m*fLGgLVGu;%(N)8L$so3?zQ_b*gBRC@Qg+brtiir ziL;{HXlz!^>yp)H+m?PA@1K2zv$y$NJQ$!&L~gFK!N6^{`~OgjWgQU$c5u^3put;I zU!K$;xhm6eJ#em$&J$RW1mVIdFyXpAt^Nysnqaw@lnL>A4vjQVy<#K6ccym#?fMkV zmlKqMe@q%KXlUtL5ZG#j%e@WR_?WGR6wcj3a*F}fL2J-(Z?N`@^sM+2ga<|5k0B7X zY6K5LVOO~OXs*HDM*ekY&HSzT(hZGg8smBnZqBM-RX?e zu5wgmvr47>Qu&7Fux7TjMe)_*vBhTLmeNa&T+bDS356aE!hX3oQ~jnP8?bkFUFUP> zaocYQ9SI|UT4$X7g4(;(85F0XPsb{S+^2UBBuPEG2ZMiD0Mo`mI)8VcwyanP&MMgp zRLWD)_KS%j5z{yHX7_U*KQOd+JHm9Mgt*jp0*=he)H)%?sF=h~!wl64;i^?=N0_bw z?GR_b@RLx!tR2E<9pRhFI^_y}ij!TiNm+;p1S$IQA0;E0uzmxdEG-M0r|C&ulCRzpCQJL3kixE+{r6B*%$#CJC52JWQ>f2$ zg0R`fM0&CJS(*d^xm+!zOcT%bqyN|K^=&+anC#M7c`VXM9V!-xc=wMW-nvN;oU<4e ztou(?JIx5m3i_wa@X!S--nT;{&RsSLKm9=sAHzC2nlsA{#69{ES#i!QyykclLP$o+ zn9dNU4U)1y(v|GriHXr}E+HRatL;qe0mD9MVwU$%@gSn7_bACeA~F%eopJX2D#Iyd zOfej@Tii(S)(+=o;U1NLnWa8^!OfO11b>3vmw!tN)_haP|Uq+?1@~ zld-I5=$4LgJe_??zi`szS<1rSs`b*y0A zlOl0);V}&r^3R^1v-9s`tTUUZ^&sY1h4 zNf4Foj3)K5yZgMLmx1{`f@tshyjb~oeVeBo2%<8inMdTr#97RRjOVD9XK7>fa3q^o zZDYsN^D_M&X&(hWZpfII|EWzsLBm#l2$426M=wf~l@7$>DhJga9wuWS0++?1@f!L5&Q#-c>kS(FwT17b!i z1o3{J1i>aIjdEa@5W>6|O^h;vgpte-S7 z9Qj$$*%six`El0^25AI9CrWXD5t+^QEJgSL0Mfxn#% zAvPi7jLEFBd5GiX6~yGlcNTK1fW-7?CT&8NJ2)Wk?y0CqUr86BnC%lpN1oDGS|B|c zXY4kLisS{Kpy6=>AYMa3%>D{upEg%>V(1n*`)zfkv#~Gx#Co1~#+E}W8M*7zEeU30 zpz#cVe>yWgla6b%gUmU;UNt>!mmY)!C*ICo2>10q6~iRU7T7DA-f?U0s+ zn75#4QQ0Bt{OPc!)nFa+w?@et5$Y##Z}C9iNk&*!)q2SY%c??}GHF&8Eg~n9fUs@2 z>m(yAoPR4BVc{HEx};fIcAd475sY&R1J+b_GErKiyb3`|S0^va(nZ3}v|oQ&4N069 z%LDq01m&WR#eXEH1tR9ULiTLpxjH@jk!_K12ywDn^1Lhp{zfvwvaPS0jIcOU)lp%U zFUwB)(n3Q;M_TNzMX=Zz#E(kV(Z)H)CSaB__XWICNQGa@>rgSH2j2susGDHH?2zu8 z%8JPdrV`To3Tj%GKvvva^{2IbG7+XlBBE21m)nesC0l$6BX87E%H>uGo0_L)`*V?> zNfMWd@Ws`Wh+wG}-&WLV(=qF({yvHlHPa$7uaER*l{NvQQedg5_{`UmSuyA3Ghadfj^lL#TucVM?D%7d(YDP%Hu~ zgFW>Dt9=SvR6HM89Kz0@(#003bLzD-5#Zy=qZ4T0PP!L2nfRR^`A&y0$cS9Q1t4f8;#nH4R z0yJLMXExIm2>~-xN>nM6hkjCUPKD?3cNKxpx=}9#J*(6fO{tt9e-v*aU?meM`Asi?rwhj=2mW ztv676h_w@Xt3%LuBgwKP0yHM?9nuhP5i1I@HQS~dJ2*2#giTfy$(S2kYr#1x5i;Bq zE?p9V$6_lTBvgnvT<0Tcdkz4skPa?xQm)#fae6q`bk#syAGbaC!cXHyhTuDL|Bv&H zlm=xr7~ky$w>@UNzbgzg9);w=0r~8-FI6d!eL=3reyih0BGnigN1L1N)W*@ zJ49o9=G%$}3&8z2hOa^D4E|MkD2SYEeFY-$fvC)A+HJr4cNHNzPn({aNMLa=1@>GW zdARy%W>s+rbyBfR3UQz5NnDUnW@rImvo*Lte4kTdGF@&jZqp!*&Tc-y<=*8(Ct2mS!A+>wb#RPNlH40}r-!AOFLiOS51+}TQa~mtw=i-I`=gQaOuK(MG-OHQf zuK&A*sfBZkrTM5PIw4d{rq3|0kc5fwKmvhW(wt2Dr8yyDN&=X^odDyL0jA~&a7+S#&QgY{ z5CB1S?34g7nI^zd$pFSQwp*Rqen0DpjLkYfH zgs)R^oHK`sg*vdrt`3B9sLmWF7AvAPaO;Voaz{yk+(z8eO-{Zwa0lXzz$8YoiJ`w& zcEkgq>R_Bq4B&Q^ujUlMh|mib%Izv$%_+nH{;YD(9Du_x?wqr5#%&MWfu4mRf^{M< zM*5nhwq_22AN_MFPEJ-Dt$|xqqmg8rj;iKz2iv#opeP9aSpj#d1` zaHlF7Ss?OoQ2CEGL$Tq22qHNn*1)T|12ZAojzKXtD32_n8MlI2sQ^gMin57Zf3WqF z6cJ{%FcE3%n3Za4;Uw&{Y7N|sn^XZG>2dIpOp#ohJaNDS)H^0FzT|;CeLf+bQ70g@~FhB|LFCaJ`D%xYMyh z>bvUgCek6+aXCob@nW@CThJP~Pt~5e!u@CK*lP)JBKN7%GoMuq;0Bz`1J0$H<7~j= z_V&OH%f`A+FfMMZKz$FW_96=t*fp6p5L^L+2BSEulHWFQ8{1P^t&@}Bkuf+IX>AV( zWw;i7;29XE^Y*}vDkTx^9q=^>&SAJ_gy9Zc)f%{Qcg2TrR0LtJ4S?MgfSGPUg8_Of z&KDu$(I$v+R(Q*RA;5>OYqPuBaBcL0p2;~P(Hjt31=`@E!lV!+uv|=YD+hb*qg#a& z6XK#AHP3wz0vlS44g-W43c|Ez#I9R<)dD6dichO>I%y;AL?`uxVu)z7MrRh}$gUHoo&({i=+YU!5J38m4c z6^ri_@2cNlKfAt1V-?&FxURWHvw<4}SM?m;GqUhr+Fxz&+TNK1_0O4Q`(-{4e!J|j zt*YWf5UKuTCTjQNTxzNv`47Y}Y~LIP1l&(21Wkk37zm{lb{OlBV9PeUuk&X`;ziT@ zbP&vVfw(xdEISEv0k+?H6|sG1#YXO5lk*8E@G=o7z_EAOzSlML z7WiCK|66H_DtJ{%s2j$p5kfJOH{n%l1kz zje{aH@ZR=2udS(=zDv#sK|0$kTkpK44i1r9fT8&z^=%%pT#&#P6E9c9It)?Vh}Lzy zvT@!u5gv56UWlN_7$S{L{=&nyZ+aWI_&Y~u{O^x4-Wq&%XS>ur+*GF8rAgc^{#+js zqBj;H5|1jXi09ZEZVlduN_`NanC9=H{tDY<4?20qcj`>r^hqENVkFvwQ*_w$yC{E{ zlz(1hG~D*!&AW#(6l{P1&dZot%Hhym|*jlB_5l%B&rTBw3ML zXYR8#c&zj_=msG*mJyRxWqN6&re=U>Cm23&`Xfd4B!=vP;N4;pgpapT7wdGL_^@vmdX9lQSlhaWUXy-zk0t{yKb@Wiz-)CcK@ zqJA1vz+UDtJ*&(=yBdmJpK-H4aHulnGq^_=BMHajE#XM?3Us*gha7nneQVLpO>nA# z)Y~(zq<;&(KC$Qad+o7ZM9lOihDhp-o^b_LKD%QG8xDH(%pJt*n{frTiw3%XAgydL zlsv&>QpYUGq;T$LvcaT|3MZ9mb}=cqO%@d8&s_r5!!sg~FBxhwVHV3jVr# zGo--ToRwQxyhQw=+m7uCv^KO~>_X^>PYoWFMbS_3x{&LkQKFMn__pX$1i~b z$=&j=$3uaaQ;x99RfC}{dE6P7pNgUE8wU_LPqQ$mZ^o7Ahw4&K!6ho5xfwm2*UsFC4ya5@^|^SmS`yK9OkTGhgZ^3sXIN9sAQQBqC)zzJ5dEf zXQu#cLYJ?CNyTZLs@LYWg;+ShLDy_hU$9KAI8FiGcY#DQ&!pYY=owdWAEa-_r0<7A zrC*uUbj?FfV(<^$3K#q#7s-ko-sl;VU_61EhNfo^X%dzof<;fF%xQPFgGo_tgE^k| zj7j9fe2qI(cHU*Tts}u95OAO(q??pg#HVz@ha9Rs<1&=NW6g~YIcC)Ej-GMZ(V+|{ zbU_=(KGSgN0r2O-ky85?2n4>{T*=VJWt5ffS{vx~;@bd*QcIv4yM@|ypMoRqp)ml(=4TpUF7*__!L{1LUzn;`^5d*x6i+O)P7I~3Jl0xhMDwlEaE zVa!56%!;l_bf@snQ07sDb^(;Cf}yf$&&C*vVkC1VqyB%ZvrgfxZ1KcmU-4^&dkbgb zM*qiD*>B#`JfXRKqd4CoZoJ&#kIco2<@`WS0bh!Z9X=>`3RY;eT=NHR>|dHG-Xit$TFW+&@AijN(!Z z0yJ=93sOy%Sqc)ko^by#MdCW^q|6oLW}k=@Ca<$jN+MK+*gC0bRu~i7UQOseIU!U^ z&EdV=$IfR8kxH&WJf;y=7EBLJn&?tYpg{-TVB1qI@2#O!BM!99k_IjisxEF7lkpN? zeyZ~yHU2e{2PFJVIS~)KX+k#qSo-ZiW1^ywMi)eb99O{g`*K!@et3Rks&0|tHzKeo z(0t4Qg}WnFyK8I)!WjobSM4sBlS22LdCKrg$3&_tmrEJ~K@Y;~ohJT!cj+v3nTU6n#sFU0O;KR7qDN$S5(N~VR&6Yn zDalrF01_IUQI%lFD;U+&dhwYxJD2(du(7k9s=Sp$r^LVv=d=dqPw;w3Bd6Rz$n-NL;b)e3myYYHI5L=H|c{l&3Tt|XsucbjN<+hQYo9n*hX`)4F?Wu-ya-i)H={S2OPFYV60GF`=g^Sv*1&>| z!rApQQ-lBzTA5*wSAQUcu2*K4;aw;Z2-cYiKeYg*AiEv`fF~5TxS*l{jGY+3d}S#X zCeS2eD&A}K>+N4$h{BeJLXbpUsC z^2%o51JTYtSxJg%&j+xVZQwm;Bl*$Mg>6n8(A-X|TikgB3G`jDgKB#~f9Xry$^!zq z40G4;ny*G^u=Y$^xG+MK2CgzZzq(?B@r^n-oR3KYd_Rv|zMXF?pl6ou&Nm;4p!fn5 zSnAjV;DC^V`3!{}Kp*r&njx6daHa|y1@Q2!Ix|T}LSOk5Oh5bMkOKGVpdbO-Entg{ zd@;c{av#Chb|dq?v$6A_({pf7Z%?LqW%H0`7GDC)*RHD_Rokpqt-eydu{yrGWwl;; zwQ_T1LZzpCYk9l!aya+@tkhQ=D4tT>0eORW&?|6SVW+~^^KHGsE)BfTQ|E)77-GttdKn1QgBeyklBPf|# z-pmLJPbyBjX=FDDyzn{cCLGw))4+3`lWrQW9LM>#X>o^15FHNx!wO;h7(sd!m49ga z)6DaZwBj9(=YV(J*Qp)^T}AXe5^M2v^h!+EhrAD@-A zG(?&UsId5$sH~|W`e7n1FdIa-^L=LHg%whKe>5aC{K!6~i7=n%+vFN*UY6B`?b+0d z55fN2(aPtxdD&bTRoeqaer^+(4Wiygi*8pTFDRv&y7x*eI^L=w6`Ko_)mKsrQU&oA zCLyJ_9akj_R+ZdK1QDT>e89a$#^|+TtPo_S5Ry5|Muj))5d`PXBr2>@=ao-%Ty^ra zvceF)<*%TKTqoy+M481O;X#AWysneFmyq%sj=NlF#+G>jVcCk7RYWWzMxu;G*OgI@ zyG$Yx-ZDZGMpeASiN)n3ZZ!S3S9{U%RAS0zk~mqI^YYhlBb-;{epP7qKrkZYzEQjl zqL5RhYY_-vjWxx|hf*hin8A_1>Q&F5^P$wd9fG4?yhQ?H@hxQqG2V+0oG~C4)t3|` za+^yFj2#et5v$uNYuUJGcQpKnq7aIBEgSP3LB^6-)B3;)F-7caMOV%(4j+Aors{nN zmCidmq>UAx9B+)sY^XZXEsG1yAj~3(74*j^>5;wT>NQ3<^d3YKgax1kx$Lwg2uk4jQVc%HEO@Cty6uh z`rGP;mH#$xYEEcw8+kB{;=){&Ul@!9(9&eoCqYqB8CTqgk##0Jj8PQhH( z0Av;<0$5&=0DnvdnCp`O=OqJ7=R|;gk^$zbA%LoOS(#=%007X{_yj32TPDC`$pFEF z&JkLt#NM7E3Mxlv2MERK9H9gtLB-rrZ*HMZrAAk9=gu`DSe7FHEscnNqMpT zIc0wPY46nm&?6zHoV?QbtTMkN1psprPYw)Twqxjr9J8KJs}TscBye--vK=%+`$x?M zM_~Q-h1xdn>xU$`4<3v>iWoW9XcCc{LGfldMxFUG@6CCrdC2Y{w>9T%`1rtJ`E@ON zR9c*yN}DB@tNl~M(={#@~?v1VD08~{GQDAHEEu0wa6zDYyQ9p$RzM;<;oNdrR zUCdk-Zuu$a31zb{Fl7KiZ!(!-Kqa!e9V>!W>oBW99Ai3hgG5mEo0&-2B*K;w&KI(b z+8*rRR1uM^d#IwCu^II7_U;MdwIq@U|E|x~k_0Y`ax-iVzN>ODd^OQQR9tj*D{bv; zxko_V3YO08cJLKgy4^@nEkWNdW7`z1&^Uea-rN8nsFxwySQ3^(*WgR4=EK>>oN#(! z{=Yr=lFB%Xd;dVtm21-qtNZ(x{1A(_2LFSsRWQ4g7(2+oAoFYz^V);|-cwnM*|y`M z=!(k^e34ZD8Lt%Fx&VOLZ+mc|DpCl3fUrH+@yWI!7hGi2Jta)5wr|p$;2h+fKGw-# zZoMEOk4Uv?39cOooGO@YwFW;{=?4oJ@Vd;j>hDDA(|m*SN$|=p5b;|YO6F)S7c1mL zPxIP6h{hrQ(N&A57;X6UIM^8$;Is*5GIFD_CK%lG^@XaUX1Guwl4Ze72 z2;c?ByFh*EjVMxYW*2Y3@nrp}6bBP?YKoX0=p9(X1#191In?o|1E& zlVO4Wf8R7M-$6*g79>Vewz;Xko#k_91!U*x%Q{YKncIR3FTY)eN^EBYZua$=LAR>8SKtb7j`j}>_;dxBIeV@P`zl-VNpS9*ZmCAxy47G_GY9O68 z5`%Q5jRi^=YGXB27h*?yCO?Cg{-+H))wO@$31C(zfUw{Svw~0VUhLqJ&k93Pw^UdD zgq#_D#F|!OT_K=yV=6A9>w{5@AcDn@kr#pKHZp`z{Go(vJ;I4H} zFI_W-S)1(h5x0TSOV>h(e>qSQ?}Bs6PMJf&O8&C18Y=bTgfd`oEKz`=c2h&8_C6R2 zsUzX^|DtWTi&;_X+gt{4uYaMQrmhu*J0N^<)*oN8#Yq_t)4kH-JWS2%iS+K3Hb~RG zVyMS(tXu*HaR@etf~+1xuB-cXPPd{>yK)f)sMLmt%E*QC`k#w6sLQKQ7*TQ<8ko~1 zAyRcUQ0-C)k%%9Tp@MR78sa3YEfw)DtQ~#O+yP*y4b@OxSUWw=$Hb1J9`z0cB8i-3 zVqa+sqh#2X>6RefKT}(fKU6l8&P0b(BA;&Cn+Z+1`uhed;9b4O~)~LQ#{X_Nm z>NeG7DsNP7t(;KVwz6#b&GK#K6aD)EZwEI7N-Grmi&Kgx7q>62SQtQuz^R>E0(a+s zp5HmYa&B(!p4{oVU2>~r=V$NFo|WA#yISVG%+$;|nLRRVIPYU>_CILCn6f5>5NutJSA&3g`kLd)dZ)3_gLx>Zp0EQ3*%gmApf^OT+Lgk%}AYq5-`dQ@DlMyQBDxw~g zDXS|gyay$q!ZtsGsCL_Ep*TW?#d>I^nu4t%Gx2;W&0^*x7rC5T^gSTmd7o3qzYw;(xoPt;;W^LG-qVgQh z2apX+?S-0Dr&JX}t`&(Oqtum##Wo`R;7JhLSOZ77 zsf`N1T}lvD3%8j*PPpcd@*i0Sow5mS0Luw#pbAyl_OC=J^&eaQ=YODv|Z zJ8mtj#SWpvRzSt#_GH9C5~IXi0I}!=sYG_1B#3Ic6<38|Vf0>)VaFt~+fn-ps6;>J z6uKlpq|?70u|k~FN2-bSXZu7bR~oP)HzR_`#d14ZZes-o2v4&SE68?-5TVH!2xTmT ziSagF1o)_+m@+1-y!|8vksb*U9y=0*B0isr#gJnly6Ki*lJh6VmWwZB-E|3ZD6GEK(<-`y@ zTMQZXv(5%C?FC&e=AoXp{M(OG2pbKKAm;U%@Ln5)oez9Ps+L>lUfaBE5PkTQ8yL#) ztpC7g1?TsG`Bkm+GTk0+Ew|&C-a%NWWkHM!5pw&YPllQT_GzfTuahMWi68+Vtn|*W zKfqLw{DqYpkgr=w574Fm{kAMP?4L+?BeR2IzL)g4xA^U|8=R5|1>P2eIm+%i1gx^f?AuPw| zPwe{|VxwY%P~tPtW8{sG(BUH~Y3`~%6|`7~5E~T^A=Q5`REs>~fqQPnjlvnus)e5y z3imdzZWcRJ8OnD&s3#RT|~j%D0qz8XFhqlwPlH;lBlNW35_0 zD(w$rMSi*a+3&2}Zn@R63o`5SpL4(eV;O+<85a(0r3CX{R4^NjKtTw-fiiHsaDa+J z!LGhz)cSk~a`fzeCQSUo0US*N6F&$krAMK^;Qxzsa=WbnkJOl{KI(VB$krhrL72ND zA%3j1XQjd78$xV=YGuN#SiXlk*cYLxBne^0+=O_1&t!z)+_`j*WQ5?{8MAvLg1J(f zm5c0u0v{~vNrttyM*B6 zWIB1Ddjt_3FZaBFfO}q!BDE}mCcBhzVXkw~y5Yn!FUg6?MmRuRY}SFm4iX47@3IKp zbxXi_>Lif)8#5R!t-5IO4_~=a$-%A1_9%gq-cRHTl;v=tQ#zQc%_mF4l ztgsnkV)S+ylNhMDI0Xl)JOS0AebfurBrw~HZD(9K7l*9?!LyP+saiE+d8+%9SgLMS+S5FkOfo;4ThI0q}QC-A+xr* zGgfESrJ(@Ax7ONAj;Av}R){>8UihxEVBx*N3rZX2ra~L|yEw|mDFhF;vMrnR@vhbf z_eCH=#e6d*Lqu8$M1WwHMMRJ$>?ob@Lm-0XYi_7CulGiUkPKHkAc&orBI|@{hZvi{ z{4s+eDqAE;OkB_=RnA>YLFNdzO8sY&m-n^7NaIJopIh=7 zjl-QwQB?`n@hO4|CFB?{K#YOoOONn?aIxEU5YaPpus=!~V15DIeXNC9_U-0K=W?Af zh+K>8>|7SD05Vo(BOT)v4@}HI>ab+2*L=?Lw5K!@-f9CC(r4>RG>kFx5_;%z&_?pC#XhS&Uj$R&Q<^qVU*uw7(!jA3c z;v?8;9-m2Yo?NpV1Qq`$VVATUSR9S9YWH?7wlTtT*T@)LIM`IY&$L3A9vj6ioiz)8 z$m4GRzKyTf=Qg)(E?1gdA5#0U*eJYK_ycbIFRcE!x1pi`bzo?Je(JhEIY z&8|(a-&;SkadPkqK+njyU*Qk>mmds%&LZcD)ISLCOaEkkqkG;X*~_6Vw--Aqx&gR3 zW_}du7@DnRr4cMW?B;fIkiiO67)h=~0Bqv|0Q*(|m|&w2QDAPT%tfKVssh`)xrcbgLvpKy2>SB+5ktckP2ZrXAJGhi-QpqH_Y@+MdhF-}2U%X5ENl_^ zdPL;a$54ax*s2+B0x>b9;Y^l%(CrQb(Oz^;E(ByE5p75UagZdTM3s478lpsiMn=&{ zV^%QTb9Cu5jj{I@o_B5yX*hRF#t{Rt$Q(w3oHp$PgV-|DdWNgbj1ibOak-Xp}i`t1ls z;z>3s8^Q%*xJEG5TM?yM8RX6b562}108R{1r`29``AXsV+0WUU!r!GJ+h7_qnxv|0 z=G{%`j&k|De(RNH>6f7`G|;ijQ{bh8wQmpzKgJLRrbQFC4*77V3&|qH;5k0bN-Zi2 z4Rj0gS-F)TwijJ|s3OA^h%iRHDd<*Q2ML(=qHENt#Cejb5yeH@3ceZ@qmKP@<3bq^ z44G*=7}wRE)rE8cpPLN8+r5zYl45&=H0if}IYupp`zCG#QfAb`eX zovD>N$HOt==(=d~8cMnsidp&HyXJzg@1ZZXi-kg!OTJNKR#zyeWqyGIE&>SA+6Khs z8nF$V72+&771Q?;VpzyWW*ept8v+`!^usbu0H_$w0ze*Hgc|3gsM4`R?yEooJ)#j3 zP~N`kZ*!kcX?q^JL$25EqY;b+8v^V5+V5!u({>ypvI{W5+Dyu8lvi+8DV>%_*Z+w6 z=Cv)WJ(btX|5xrS4U~UYS+4w6^;LBIkN58aY}zQ-uk+9P!+Wx&J4>hWUvaMeR~m@> z}kg82W zn2XIvpo=ILffTB_5PSquf=P%_3c*)NdfR7Q^zYHiDk6tQN+Qy629{?sf;{a-|5n9M z$M{r093;1mv*A(Zys{TMF51>&r;7XgCf(l3tC{`u=5e1kd4H%} zd4=4+RnGEIsSK3qBK~a*yfhFq%bJLGK=DKhJ2?j;DHX`}G)aV>=`gp=(uvMcoiH+< zIfZfhMq*Z-V9kqE{VWyhBM4H}jM%2dq=i)KMT;sLl7e@yc#`ut_Jn|UR{bYN5M-DE z04kIh{RewOfNzhZb=EY}zTOowhB!Ud!i=9J6 zdxnPeRZo@=8m=8J8WfS(rg0)|DV;N+q&ejZYh{)l=qOlA5+ zba?ZyB!Upl+${<6-{r!2W%|T2rUJF;^~lQpyKGkwx4N}+8T?DEz>wE6<5`;5Vl>rt zqD^TlRI*?Y5OGzN%Ayry!%S!46Vb;Wi@fB49ZFdY8xAneGM0Bl z=2DG|Ve}o|jaFFS9;`luNX<(KIQd^sI4_IYqhXV+U$<7f(Q(y2 zZxJz$$ELCPBGyGZDPnXp$S$di{s))T;YBVL-1}ivyn4;?bT5a|YVJ!65N0i8#sAX@ zh$+JGmX;X<@jA z$r~4&c~{-26HBWe6l!U92?%IDco z^U_Zs@z15z1Kw3Lsl~cP1)g>`F#Ck;qv8-Xy2xKnX@vxKmVP zPe1pZd!;B!Gl+^Hxh8wxB!nVT0}6_uU{@fyNXGzDg+vKPFoFb<8$^&Gi11JqP(oUnteD2{p0n%pWpNReDXbOR+%-c&1_3Wm~31<-o&o= zr0!cTB(ecya~CB(iAv*!YmabVhh>RQCSjV zMMCPAoA`qnBxLxA1I4*Ryx`JHs{7|P72TB}$Oke=NGpiy0_^*GKASmAEDX2I`M$U8 z@19XnUk-!B!VsjT-FOk*U2FR9^AP2b5O3<7eEd8g32N;FBD{;`WmiWciw}y{;L9$muR8Yqd7S^trc$$OU zq1gvSWTqsssTm~yRh-Ny0TG*pAc&pQO&qW=jN9;%j1}@|1_@ahs!N=Gd*sEL^5x}h zn2WkFVG(HICI+@;hg~^beAe(!LJ|%FaO!OcK@=gcQ0VUl++`hdI1&Tk2)AceSP&i#=i5vckQk8%71;s+Wn2m zc-#NL;SGl#7&>ie+s@zcWq@zC9&DY~+BW=$Zv*81%0HyPfrGQZ%-w$rGoMj9M@>0= z;6KBka}4DF^~8v-yPyUs=9{;evFr*ez}mMEOW*40t;d3&nuedEa?^j|r>2f9yTZ2} zdf{U#h*Q_$zd(Enh`+8cAx;5t)XM)G#7FT{bOj~AhcTUVvj2q;8PL)pzAyEbdvD_NQbfGGp15hNvLHRn)0Werir1Vn;WFhjQ?XSGBXB z8W`#Qr*P`YOa(th12BCvsKeN}abmG_>9)JRz7FCPkSE0V>zxlsS6p$}Vz6HN-^}mq z+50cilq=uiF@A|IgxN)z-ahYQw+DVoq_kx075r3UZ+d&sd;Y>#15xe^0SmqI#B8}e zK6Q=dqAq~F$qTjgQ#3u*r!C;8Fkry<4UU28%h^x$D#RJfuBJGrKWl(t;YP98YY617 zrl=*+VQ-IGN7Lx1bZ2&C+0_)zB$xls;65Xa82qzYlo2n@>(LgAHptavKnWkc9$fe- zT+xtu>CVfpLTr*8%schIsKC?L?Jwlctv(io`4|~{!2ukS@mKmvkE?>GhQ*0$J}j<8 zo&CgmUhN2Ury31Ksi_LA3SGB8rH)nMNpvx7K}q-TUdvD6%anoqy??U`pK4eY)xP_d z6%I)4Gp_o8`>CEoN0gV5qYK{$vHMl^@l#ai61h8!9W~Cx*mv#KtWb_d94_J&{1Qr^ z|Ak+oP=ZQ=iO_py4~s%qMXHGTnL3Y->-BVrm3GpeV37lr!tRQP(nYBMQ= z2ty)BDT7cqWMETs2NKVu78{_7@)A!NMuAv_Zc;ad2o!;siDpta1TT~kjR?75Hw2Fw zXrTQ^XeFhx_@b5t7~v3j#nM@>mlR-~ZXU47z|rzs&7vKkL=FA4A7bz&rJ^N^t1Pk=RK3#N`6&mHynqU7MWRsw$P#bs0SE=d%yJ_@ z#(dWy2odQWLE?3~EewGaKM^eZuXm6e@+|~wCUn1>Z>gxZwuz5+kif!FNfNw3$UksG zF7cO7$?XNcB3r{qjvp}zQjw)EqCzo+wXyuYU5pS~Dwr8(8*xHZ-`R|Le;lBKXhWzH zklYw>00OViy(tO#2d=zdnx}AfOC%g(`!?1zOQ?Dq-eM3kAl!3B zfQ-RM6hr9BAzv6EIp-B%AA4W3e*-*fF)x_Ski1-O#$1Dzzs;VgQkSwIu^Xv~8fG6( z3A_Xr=6Wb%s@EC}Mp=aRn~$4#y+SGwG9cRcZ+N4F+@QQFUG>%rTjpJ#)INBDDzzWG zp7MFie*WrjYWzr7#FszNs5)(#Z@S67Z>fmRFV5SHPsQ3CT73!RKWfjPTPuKIVc$E*QQ`*rO)Bz-WLU^;2_exEPrc8#RPbvG8;cs zhYv7u!$Gu=sd6RGVeoR33#kGILql?s%3b*fIRjLvX22IlRJ`-n?1PH5WaP>IRpTm&Np!fV0x$4z8_!zJG{LOzW(>{;KhU64z^p5 zv@T7*{rBtU<;`Q8JK?Q>|7jf8n9*3f{=52>^%Ls5*56S3L+$F?NwxRY-dO!p^?TL1 z)eltHuRK-xL1kWLugZk-v*jDhUoL;R{1(&%ZW{Q?z}^EJm!2;zFP&ccXlWDkH!Ldo z3uOPf{|bX8m%9K@jh>>qhwz>o7EOsjjDS?RN2P0LN!xJTW=6d-!0;4Dv z!5+H8v!AZ(xY+3O+2RjoJO#%{7zMC=0zXh0CF(Ars zk6-T76ghWmSqVY>FiGwmL{CM81lID0yK=7&?eWWfbd!5J(G!v7C=zieBO=Fc!3h#! zE-$;i(1A^qBJT?Y5oE>w$d(hK79#X$iL^2z0Y8BeCJ}NHBh3u)E^UzN!kV=ee_{n} z1rU*;5RrODB)BXYJreJ=Y@>v%9u2&}M)6Sr3u_Y_rpJTWMzP{Tv#fBV=&Av&%XM4L zz1roWfXDZi^&zv zU&;Hs)+B};0-E&cKw#gixd^Kk6lDw5g7F8wBdzXdJMQlZtxMi`B<}stW-k!h_m>@! zt?L9$1P>*NXqXU(JA~dVVZ>n>BH;6Mp_~{wG~?X_LJ*`i+UH$H-SA|01ws%F8Ad8_ za0Ur^R+Quf6=EKFd7&CLf>`l+;42{s2R!~|K9heXBw`7nbsdncOI~Jx*<(0^M<7=5 zV-BI0r4ZJHk!&Tr%gYQQ8rFn;LM!jDS%|1c+6}yarjt+-fxMAd4J;@7W$OwAAV36o z-`62Ryh{XW@iW=7@{dqwaS0pI=UE)d*imp3_xitDKasL-1-0q6b6jEa#rByl*R z;u-LfzI-WfNCqKfULVf{rgtzA5y2F(;yM@VQc6N3;8k6FuP2DLmXBoIt9vYkRQAar z>Y|i|h%30(jQ92swI9L0gi!wPiYx)w0*EZebq1a@>kaH}>bq8VtFBx5V3LVfHZ1R1 zIVH*9t0&=YfN$U~Ksl`ie5-wEd&_nmuL4}y>mPFa!oSjj+~1}p_BR0!UM>8eT()mU z<}SQyV<#2%;oM1E(6bYmqEbe&@JjF4_%n1CqPq6+z*=Uqb8JboyL79WiJ^?0Nqd-LHB6dNDgmx6V`03`3xxh;4`%XN924vAYyA$D#i-^qJtUH3o1cZn-?T+A^ z3bPgq?ci*3EIyU@b(xlQ9ev?dn>gN|%A0#Ph;O3wLM1NGGyA`-D=Wf!V1HLR9~5au zsO`ixLcH(c7~xNlSW8iP`IO4_X36^PjR|31VlxDg+XIXITXDrrr@G->bbh3kZuQ_&MwK6U=JV6;t`L#38X2 zl!Zl10LYzQCA~mmK$fhZQ7L^%b04HK<|~U|(iRzn#ICZ~6BTQbJ_F|8ex==o*;k!u zF0`|ui8Fds^Af80ExgKykQWCb+K8`o2F72$w7VX&OJWOm4z9f2hYdOwJW_}HQ!gjL9tY&V*Kn*i%#&yx-j zd?aq7v}1@9*>Ixye;0j}b_|J2Lcq!rUry)G7+R}WFCG*3W4_kQQisHUAus2~MM}v% z8pl$HA_%dMI&A7C1EB$Wx`8keh1d+D*$+c}CAJqT)W|{-6*-78Zx6md1S^qN6+z z5qAV*KxVnr+yp!^vUzc;3>{?RPdZkKx`U{KnG3_Pq^^g!1;qVDE zwyTHqK!t8%#JhM%4^+tZuinl~P7H+oCrs|3QgMxEO4%_g<08-ulWwKI(-{fA3w z|Nj@A^9C;%Jalk+r-D}iDeK>YZUJ--YF*emytPfMg;xMCX&%)aZam&Nrm<6F&H8Wa z$Jb}nUyrW8{OjOrg1gaQ`R2gi=>ro>i_P5yf2Dl>Z_Mx>FbTWuCeA&5{?3_zY)X#D z;GcIh6TAR2X$rgxIT#@`K$au-O7=0&>oWw8^hQfRH8YWV6(Uf>aZ};mJgzEdk0fUvlV16gryjouL z=7Fj)oc`w>oE0z7L@;U1dpjt6o&LvmF%g6vy3Kt06F#uj%wxBRy&E;RGx6uMb&26d z5;5IQ<#tc&`UBc}MaNe5FbNLA#BgakQ+*@i<2z5m>O0 z77&l2v{Z;tuM!ZAM_`Uc2)e&540!N96Z-|G9Yn-V=A6}(Axy@{OJ#( z+*!1)2+z=nbwzDp9zesQ5EB}AI{khOaHPkg+>DTx{%Q{mH2YCP&HgB9pBp4p|9=NN zD*TQZu^(e$JftPHJd8?Y5i6L#lbaD$EYNv)Pe$(W z^#VZyi7D8>50$SX#o&vWdSu}AU*NPWWFIY6>GUA6UyNoD#XinDeKP^;x_5&v>w+x{ z?+qfq>~tYQkJAW=5u}_!L^xs%3=INp`*%()gdjf&4H2LI^Aj>ifO}Z7?26IQ&&Cd- zHzmD?B90>P@>A!J#SJ;yl(@SlPcP&gv5ULa5oxVbp7uz~&E^9emItn{zNzx3>J#-{ z>aS1k0t{?ey%x0q%J}aY_|m{0mG4#NRCcedTmEzT`{gf|_b6{T@MQJm+V5*u)lRJK z+Bq-xD!@VQY3)jFoxxuWo0+1zc zEWvzVK_D+tw6#ax-j2$1YGDKsdj$*g(~bNywu!6I5Ymb}S_0<;coDPKc%-~?b19QC zn@g}n=mTY9uQb1FV%+>l&G-(*3O&cBg3iUSoSZ?-EkTGdFk@=_oRqDL)ortN1$_Q1 zU&x3AtT^yY97X_M^o2t47&ciL5;WnCAmUeCFf8vNrVuW$xb=vMk9P~(D#X1gW03=Y z#a;c7Upz{v$j&i%c{?f~sYBBH9=u40)Y;lBKBg~749HAG>4~EZs0DY6IQQhgU%}0f z1Q9SW6f|6!1#GX}-!15Wm89q)Jok?ev!6;N$j2N+pTYFzgD@?E_(3G?yU5!MCJ5qo zeBekafS@6g>Lb95`T`tjeWfoI%ab0i9_c)H5*G5FjEV{-Ll7IaxL~p;h^6xGj0&&8 zCnpzDW|ht@Ug^6#+8l8{ig3zOK`}Cw7)u&6D*8Uk;uW(UL<#s?AU6D9 z4JL37cLr`Wn-1(*YhK(~v;3EVJr|hpo?P9%`X+Sxuc#l_oZZ~E*>3!*amn!A!{-ejG`z)d4c`k`I&{R)HbbqUR_ELN z4=)Siue4Y4_o{h+Ru>2+|M)Kl-fYGPog>W$9h0V0A4wN2ffz$=EY&sJgAT&A5CIY+ zNb3sWb{hk-1W{TFxi+u3jEcO=O$+m3+O;8G0+8JIB(Kc}gN0O3GpJ?@;}?A#g!2+n znZecILJ;f@0m1q96pB!3ej-?*OPzApk^_F)1yDTG#JUi5;7Al|0i^t;Tol1Wf&_(K zB~Y|9L=i@b8T~d2A+XbnXao?IKbjaV&D36)Z?KG@WGl+gRLpn^ zIZffRf--(;9Y=(nB?%E-O(eCrL_jn}QniSvp4RoW3!e8>;vz-rNcbstUYmy%1g{Rs zY8er6c~gLha@cfTzz-J$Oa(S6yl+$`?s4HX(F%{At-$cOggCFG<7j2B#IILI4;$&t z^7Nrjk!rI95cRc8>`NIezDw2>Oq!qGwHqr`n&ABn;slXbk%3VYg$G^~);>K_jG$ty zs1^~z8?oX&fFPZqe4FkRR>rZs10wsN1VR5Ogr2V*Lf3_dD&+K@aZWD)L9s}rrcr~K@#z`60dC1q5mS&MA)|pwqzNs~cz?(n2fW%a`F zX#jZ&W6nJCsjOaD5K><4y1@LKc~)Zd`G}kvXX23~u>a&iPRM#g(kGjQtq|lu2hskE zAmZ3YCjSXU^@ZjIgjm<$mL@`VsStse61eWkeLd+06OK_POznJ5gC_ZZ>>V-tqH-cG zG;}#68pN!~?vD4R%H?5-MM6kiz6||>S{OmNwZxriX3PyUh@o*ZFq)MSE^nx8;`h3R z@uBeo2rbOz=H}O$7v$!AVb)swS^sOzi-JJN<$aN87b+5?837_b&zAN@cZAekna;gt zEXug&b$e(M5H!XF6+q(28N@sL*e6frtL#6!X2 zsDRu|j7TJlDaHDz2d5xJ1ttH&fQR0&)xp~{t_l=5!w4b-hkf?U&Y414f6Q(gdc&1h zrzoa;W~Y7-)PsA*jqmkBgL-h!?9dMl@)yr+ks)-bhr*ofLl9z`L#X{yfI!1GG5%xl z8IygoQD|iIc)1p*y$&azd8>oY(tLg6#Kx}m_tpMbyS8?6^)J=ys$Z;r zpz>tp`pO6Kg1`^UrEcHj0C`3`F2{RW4 zNDzNyi5f`)(c5r*sXwyVEgZZ%1S;qWsGTvs^t0J!GR&bCK?XK9v8!G2y9*8y;APBF zd6Daz7N$-u_~7xSvpghkh6xo7DNiu*Oa~F=;e>rLV2?;@e5tQnKd-5T>Z9XJ_j6R( zCBKY)c>?2okfr-()-I+wl68sT1HNQ@>1P~5%S(kTaT!DA=(eVgG{8Ix{5-<3%zw&3 z*c^Yt2_Pa$CwcjbBAeqcf)FdN&hReH3W$j4qk>wFFDM3C5z&Wb#Wxe!WzB3|vYbq; zxMRcw^oU9)UszmS-$dv?Bz{hGL`aW71PtFDJp9DY)+KWkT9<1$syDhU6#*X4b zp&f~HR5)Ow;yTCtVpy^;q!0mD;mbdwc}nbuAudBLvHKOEf+`jkCS*(ta~UeXUr_|9 zztPOZ9BrXms2#|w20%m~a0tEYHG-DqgJ?0Ak}xj@GptSeAbOs*d_=eb5f=o}nO5ZR zPyHkl`ye{7S&%{m_Pr0HMel`pL5#=kIBr~Je(ozXqIH}=Vew#MVF=fRQ4#`e#}uKp zq7lT2>pF(~5h^nQBFKgkBJ$($NF9+3ad9EA9bdY&L*&~EmJuqk@zmLx7uu9vXb6O* zfmxvxp;*^6qQTFZczPGT6C~jA5TU20qFoC?#C9a!U5G9wa;Vpiy-K8r3=$xUIFBt9ui_-nhR0c%t3S{O;q@Pw3pL2b&!CCsSh4m3v)Be>RD{C zj~0|*pZ3ZonI>71o%jhL0=w(&{UDIYk1urza4$5F$d4~|32-k6YxcexeWliky2xXt z^_EP){IXxhyB_!&U%F8SG3<#22jROOZ>Wtgo!}v%g^6yZg}m8A^sYx6f>Xi$|G8%K z+WSlOb={l)2X&^k|K7f?{l)ek?F|Q?9{j=Jyum#O-`skp^~2Vwt-YGhHkUQO(%if8 zLgSXkR~v7y|E+#|{fzo2>s1FDgZD+c$D7Y>Wr_)0Q5yGM_8WH`_(dwQia!2-Ic@L3EOL~av9wv5m z>(U*0Kja`h^onYK9{4oQ>||L-D;SUDqPuj$exq9BY7@P&AB;7w;cQ{% zaV0NwT*d6ml=^Pw=Pr&4s1bt}GWMW_Ek@flkytOx!02!LT(+(fOM$_@y%(sS1K7>P z&||t!c)OXl7J3LW1tu!K`ZGgWBtDZaiYz#?&%Di7e|mu+NjdX}s4XYVzianhcbuG6 z->oJw%OXyOxbac*I+vtC#2|VL&X$z5`<0e(SwWO(NU^uzaLFKwwEzU`yyflLI`w9w z8xeeaB567EmJPZf(6;8Ajh1z@FKh7!BuGiPaU{$-YNDKtWfkfblLw;OXsP({<$GFQ zdh!6Q+`LZ4%BU6>5S)2Z>&ql^y|#!uC8NlRaEGsMEt0v zbuCB6mYADXBMt8Iu!7XM+_~~Ff`=6(;N?D<&~Af9eR)B13Qm}K!!Bw>heaGpMCB%o zoFtkr>Ai+_i5P>T?RnGez95#0+tG$MlgT7eHI`FzM8(xl%oEC5sL(8QPY{F(sTDt= z6{#Ro2;yUfULX`++~i}0ULclz#0uHMdf>%EoO?38P$3h$Y27YHiTHQ-R0y*X0-L(Gnb*BTbi=b2AeeMlPBzT)a(NfJ7B_rM^2b|;F0_8cgU=n z%vIwT_*m2^{lG5${Q%>WG`7rZOuKe``aq7<5yWfkeyy<}KK5 zrKEPDJr6;2qh3Ar9{c5qIjxnYYw;uC*R+Z#8_^(7@nBjbrhy-^G~ie^0a1c%*f4Yunb~ z;I{`qhyH)7-N0@B^Ey-^xUYQyy$vw**`X=J=i1l*cCL%R!He`?XKM0S-YfYly&U{o ztCapx(2p}H{m;a?XVGPi`k%GJ1^rCI2&5tjf@iswa~*>aAD?juW^d&iN}s}XLLqrPULqC@#O5wP z3yV=KxO{{8cYmq^;*S1Q1;nEMR0YJ${!|4-)Ss#}S z97chNKGhu|HUbd2mt>c-bD>~aRkVyTl#qsg4+SB@`vNioYEP6_xbRXv za%!D`Xb8afp0xsQF+CI?)yvYKQUR4k=^M(MHstI7)R9+bBJDRfLD~x<293zLW$~&~ z>ds^kQG3GNd2(M6P%%qT5>J_DcY5(wZ8D-Pbkf8Ke1xb!QOfa3UYKeYy<96|*U0Dh z`z#d*Oy>z_$hv&KuU0_{Q#1JWU<8reEnQN*RHiu?cMez_n%fP)ELu{Qvm`f*3h9U9m zJw$P$A;`rR&aG#V5HA=XX2CFh>vrKBOq(X=BHzNMSrnyvQp+mW1`SZ5vIRebqSkEl zE(Dzkm6H@JlvC#sps>1;@e%M7f$)hS)eI6^6l!Ebjo9_8T#Uw_%(R;eGxH+RC(dyM zC0Yy-3EiSymD|FT0Cp@)J(qGfgwN@Q9&Gyki@#G z5rMFfSo^SiVMuR#=tY)OXk~-h%CzQ5lUm3tKbT2O6iBVaV3OR3kvW{T8V7y4yLhr; zA;_F~Jp~Y28A_3fO$OADE~sAFYF{3ZA27jY!S%Jg8QV`upS5~gMx+D!TZxa1Jc8n0JKGf(n_+iJ2AyMvRCe zU@FIEMAYXJaB>IF)Z85&`5gxfkp+12N1cpH$RA;BO|U}TyTjgSD)clR4<@a^&^t^u zuR}0En*u-WMPy`{d zk3f5&Lg(-t1nh+-hEr8sV53dE5_w&^FfB2k@~GLZ50x({_&-ria9{i@UKE@> zF`ABtLom`J%z6v_6g4?QRQmj>X|2|WO2_p7ThNc1dBn0xG-uT3vO+&Kt@R=EyZ`W~ zW-NP_>TAhr<}pG(2hx;wtC1qREP#6K?bVMh_f7>f@x}G6t zLWuaD_^IThV3+T*&rZANh@(S6Ghe*p41{-j8iBcM;aW$5*trW0e6CD1+D5@3ra1bQ zE=7#G-n{JD?K9#fDcvFjLdF7-P`guhyJ@-Pp{+j54ZZ6l@QyZq3Ng-W_$d|1Mfj;G z`>E3MURMPM(K6y;QH-BLi!Ig1fAmwdD!+~U_$fN&xzmofT=vXHh$ME{XoJ@`>f7zV zJEmc1nHoUNPk+Hlq31ns zZ>R}@V%zx}?8+*G2oR?rD6z5M_o_{b3speX{$Jx%U|!{?pe|}XB(CN^QWv=zUx1MU zM*|W5iAPJcuio-nh|@J?VJrA4*h>F==$|4!e0x5?2ckZnQxP8&SobMJBta^CrkzMu z`(OAe+KCkKCO_4)Ib&67rj>q*(t!R~1#iQHYGSbU-}xz0R1H5BKHK01R0W3=MU}{e zkDd=!{1lu8*EvM;4APwBr+PmVkddmJ1@u#BA@r*#Oqc0#6#Ue_*-!PpDtm23%w0gb z&-hswxebu>VmtFw1aZJK9|ZBRKCo6bVoV4>IizWjkLLRv8l-#G{fZsLWpf zUASCKK8flt5qEJwsplPKgK$+9UiOSDkEjD8h(PwR=(TW8O=|9UX)^SEujQxkXoaka z;*7?Hf_~3vdc23uXrOUYy$1B86pe;{|LDn6Q#6%X`;0DdjzuZ@9j^sFX^RxS$!kJq zQhU2Y@3{YN2Of6tp0f_w_qZJnKl+fF??3#g?Pu+9$l*t3(;+s^uyN6pj5gK$`{WzP zLWag6pQ8JqJ(|gUV}~X|^cc}4=xNKILAX%b#>RsQ?Hvz1a{tfnJNtlHA3p5Bqq+ox zoytNpq5N-C`AlVE`QNQ;=@o$1?!%*vCmUaCe6X=${nYx0YV&J**EX)cP`$bO_R33@ zTU+Zk|I)m!b#nT3fcrYr@p-=<{)X<6f2H@DYxUm*`;sYI-V4u022*-{t~@Zj*AAtt z%oxhlse8ItbU|>gqEgAXbqq++ohuYGtA24vs;wMQw@H2BA5|V_7=)V(|D1;iB^N;^`4Stus}5-<5MdYfm-4Tq zu)FF-5E$j+Lox-(USdLo+eKXYu^B(uA+)@}yhe=qfh7J?OvVYfiwH#G12cJvcc=;= zq!nLZl%;jcil~54NpkVtj*9#kuZ756K@jxOQ=@z;q(}*=e#A`l0oJQf!SA1oU03+~ zG@LBjDFpF@c>4D>gnA0+;toWz?PN~@XFp}ltXLG)mYFd>At!tL79!)y`VVs7(lfn4 zNFnD=aNNregIg+csGnFtk2Bn{f(p^=;B_zBzDuZd#66w}kTG8%mzDb>h<}!)Cn{tu^c;S|z3kUn zBC>Bm2yCq05pm;sGq#6QiZ&Md?3_r<2H$Jq5A+2g`|{tiF|t_+`yvzLhEJ?e5N54q zmUef@T(}pus;3f#MX2vDLtbk1J!-CRVqc1w7os9!087PBLIkWBoob$uM=eawAcjv3 zKVV>Z&XjX+H>B%{2CM~lV8oj=L?!pajHaR?mdZ!n!t`b#2tVm*MB`k{1t)3=crYNu z_9EZnGBMMOnP*HN}$9=RIW@82=;nWvMPOh ze5h?!xDCu-u(9$*Nkm+bi2?a3X3|nOai`kzVaTFSWSq#MS<6X!g$o>fWB2U0RYMzQ zi|m&3O#b8>RB%a{)~*p>FqLueP&M~i|6Bn z`A7~?S%f-mqH%uvl7dHih=#kyQ6Ofn(GMa5B6?jv2SbCytick z%nkN0R{+5OI&tp&#RdLp3Vo|pb@6apXZ~V$kn;x{CZ!Nrh9n|XfwSA2JHar5h%6e) z^d)w;gz}s z2q|;IFkZ~_6U$o-EeD=`E-u7`ufu3G56c-F`(qP zF+wMPo6LWfhp-sH>RUsquQxy6(?PzXndYGhC_IRH!<1ouhi?i^ChJmrbyu@weFx!@ zA3^BTM%+LmK*sz;?{cvy+cgyP6jAM1lbe6m5KOYmgS`f3u5nhyKh6aS+Xj!q9AoNh zl=j2k44t7CgynI=8pYZooNv7&5MR$6n-8C)VlaGzVH3^^&d~YGD$Zi0kEZOo_9miEhdp1W z<{u7&jfF&paA^Jw#b!w(hbmP9TM4a3LN0~@i zb3zvkgzmAf<*3`FUhEd3N3a4fCems^enNfaBnyx>N%6c4I3s*4A%?tCh-AfDi>{E& zzj?b1qT&}U44Z`o3KOE%gJ$xf8N~ci@nYYP&a0l3;;tnquZLxkh2;S>1U>&&PeaQK z8JS!bAh&!vTUKeWy|>@pzp6pj0)H&MK0#>sGc4i+!sCLdT{mOCf-FUBA+qxeDnEq_ zE6@rQi7!lu=nV$;7y^T^fzka6ISvy=ZD1bRuNXt4Ks`$h!W{z=yZppR2)%WxisIn@wzZ15hgxubS8vJd z2QpTatAI&D$YM)&4m2};lpwt^>Phl$HpF!gLj6M3)3z60k|16wy9&n&uL^4sHaRqq z@6hm)CB-{9Rs;L%aX&aFoePZ$NIjCZ{2cDPV6$Mz1`wgg;RDPP?~nAt=qo0g{U702 zEtD8+OctN9u>bSP{7T`Ea1_HV`Tn8<@Be(?LAn<}aI6X;6U6IYN(?rs?!}VC?tPEr zMVbqEN2O2rRzU9YeosXQyZ+xWjw)!o# z-G?_B+O)a6^<4EYt(!Wh41It28E>}WD| z3dk}i;N6}HUc*kA zkQdr2BLg_mlC$PmwIceCG2cBA0GKFAt%n!Shy?9w!NbVv7rnQ6T+x7JMWcF3x$+tF z&umq^(N)04zX(p<6tjT?Q|ue8X{JN)x-2bU%>7&8qKY7l5C|7uluAmt@XHcW88I$W;0+r~LdVDexQ(Gr1Row0$zfDk zWPD70v0f7nN+BsAe0@Q^5Id4Y~;fw|$^z{EPaP}noO|FY#4k=7RT;O7xWA@(u zP#@Uhf1|tEGSvd&P>e1lGu`JLjw92B*-wOmFS_F4JU$x-fb!lP&5mmL|a* z((Qgf*A%@_h$CNY#rlh8rH}Rbvr3Z-AwR<{n=oUD+>nEa7zxrljV>W1Ifz^r?%wD& zCDt{|M=x?+MUZIJtxKpED$-7#Ond%O*}_UZ5S@(e2t$>n7nnr!UPmSWRiQ~_c6hl; z9*3678#5~6TVF(l?smz;1Pk+L=&yw)LlD~8U-mr`v9oOlE|5;n`LZ8r&{TjD8K|XF z&UjH0qbi-Op%eS3uAM;?`^n_GaFhgrH%JXeE-VCz2bY=HhltX~0KtY4sSc=oz2m6- zLwpKfg{ ziFJNdnzUiIFmZU|n4*^%xf72&KQgO|0T7pr=>fPa1IVKjbqAz*g7t~3SHZU=veHYU z>{BlZS`Q1?HW_8WJ@kp(*(}^DF1G2iF#yTgjAL`*E}&(P&E~5dn{+cu#G_O2OEa-U z!;8g0AI<^co`HxEMWqOF)F6Vw@vb-9*ZlsJ0R+7bB0u&J54~(Y;)iH%5blXcU}@V= zoIB^7t=&?%;1D?BABih%c>ZzD!d?FZc}*MsY?mVttRMyu86ik6pmKeWkqtZ#_o7=2 z-)*ALI4-%s!6i;z`Kb)rtmgoddPFI4g!4Fc`LRPUh`SU(ZwthSvNbrRQ~I!p%}r)F zd%1sl=fcim?WOI*+glGlg!lW77~E#C)q1$~xz@XzM>V%=4&koG-&RDyia@y@0`GEPDepYmL%3`|q8O7SVr zvq4B;Kfd2B?3EBipZ4QRcK48wj6)FL4|*X;MeJcx%lk65oTw2P0_8Hsq`~+Sm%PgF zZ9$O=fm3vR34(>xBCiP&3Fsd2SPEfZ_D&QDDghDC@DMF84QV`@n}7%$65u6dl)m=$ zqUI&=%n8`{wXYZT!Zd_r?8+nTs}BkHREFUdc0!~2suh|7r#yKy?|uNQ$zys4uizwr%; zX$TqrI~+vk5(E(oqisx?r}Zy^&;O4N zgjjj2gXq|psPJPV0+pGrV5Nh6U9h5cMQ_QN*Fk;&LCe}GTb2o&-7tR6yxsT{JVbk> zFyze{r1W#WS;7z$#nS!t^IoVR+nu>V#(ltpgNTqY5YhS$5u_myo$7bZ#?{Z4S{JpB zXnqcF`CZcJ)E}u2)wZvGzV^E6W3@-?->Dzf_*HA0R;&4N^V@@44>ns54Ig0d{^RZc zp@GgfJ6m*W?fct@w(GC2EI7(fr0f)PnNFtm4XTMl{5Aq zj1k>@0=UF~`ELYW$<~lF)7VMyC49@$FWs?ocLaAOgjnPXWnmiJoCq-!5m&cW@p1tn zA{TIlX>hFpQTmySQ%YaT+n*h}1nbf?Ftl=ui&IKp%G*Xah(F!uYASjTf~fe@oxed~ z=lc`{r^x(Ud{dcyt~6O#7~+p=b|g56aHB-UpH(ae${@OhHUAcWR;*g_W4Uvb^B2 zJeijRG8ySy%F9BvFua1!ha76#o6mR&v-k-#V8eJeQY3(YOg!Gvkk=moK_Ki@UwzCh zanq*!v$pts{7Zc$6Ob`qx?`R_fndCgJC&%uor!(vPD%LVu>ZCGCDjZ0yUBe39S4#+H6PEFf|1%{KK^cAn~2@A%; zFh0rM7fEdFILCf~7n%X*!4~lXU!O`$L(sSjc)Y**=v*%h?8_=FsQlS4OzQe&AGSfjG5Yna}_0=NHee7PC zB|nHP#FZ7*!f3=(wO^TaG6F|ozK%O8A2M(Tx{ z{DD+{{&PpVg-HlC`NiRL zX|-SuSUMO$UO33DODjKC4S3Sz3u||Spfw^oq<}o{3X5vc9IHYaz%@x!p6}{l(5%!} z`5S){Nwq*?q4A6Pzy3nTi&_{USeW(}FEuiVGGvgzG>tZ~7kwBa^#TYsrQR+t`j{f1 z7gWl`!rEJ!@nSbd^V~{e?QfY`F40mW@PH7CJ4;w)pEnbr$$vZ3S29ipuY@MCt}Yj) zEJP-Npz<%*u~KTW5P9r%4l=PfWbG_yqFcMye|1wnAbjkMK43EcpKjQaj|WhkfTtVe zo+JcXL*b2|AcX2W_n6ohC4M11B_J>`!3l``1FA11f&)zK$f0kT_z-9K0V2rC#k!!B zzxyCb8$LX^sKV2}|GN+LwBge;`#g`b5VySsUSSPz5;1vju_K2^yQ>}#BL^1tvU3&6 zz(55vQ9@$i<>iB&#H2%lTHq-KFT>~N3qSIl02NrW*pZ;}H(z7WQ~;4-KC;5Gj$4?v zeEOo2=H;cfgJ|s&L@caR+01NP-oM;Dr@4P)b)!~)puV)eZM{=_tae##=i1uUtI^Tl zt-5aIFO};nrwpGre9&-h=z*c7Lq`mCI*)d~+c~zgb7$@LAKKTnPj0V2_|)L3xIyrI z>#MDgwcb(Lv-^c2B`@vVTn{4fEzP5S8*QKiHA0gIN&DKx%p<2H+fL3I8j| zScK@`5yJWA{4{~5A%mY+S(JJrkw|#$t=@#NKv?|fq2=6 z_1s+P?NeffM|MQR_0B>x)LUVMctaOHP-hW6Js|$RP9cJrkjW_!&vug)c7>Sv#5Q^s z9xc2ppl_6i`M!e!pLK&c0mkXUA)fyc2^3X}NKj3NZzGWSN3o3{iKm+w-2G!wuFE7` zAlV^#5UxLB!}WiRwp?-{VpU+H(BXhYpt!K&pP%ZYKFXBUcKWA_eia*3R#8`nMppdO zJ+-ORY`bzKPrLb>{BSdz+7@)d1>T3N1INWbG20f_cv2$Z`!9kz zo`P_b%9Y{+dkMF86dz9wbVJ}w5_}*ya-8Sm-joj-IA@kSamBw14-8vQQCAICyu5DV zlCbsEL5%(Sw*$K&a7^-inh?d?4^l$(%9R1czlv9d;uECH*hbHK#owlPSrrZL3ef`L zTcgsbuqv1c*EneW+ufE?3P(W{jz_KPB_HN!8Yqg0<^*WG;_`_A4SGm`J2xO+@*7ao z!09AvHE?b(tyyI1h(Q7ckrl5LvjGdi|5FNl@d&4m+yf=nZb1VzN-iqwrWX<473?PJ z_{m!jVB zw1Irp^DbspRs{qVC%AMcu2@wVj$l!AK5+o<|Nq+TfJgR*@1mFghezq9zoDr^<<7mf zuU~C{3w`}92M-(E3VnZj3!v3*{;GLN^T_6Vnw`cYjqfy$YHZgSsy|x4w0?Ab``Y8E z8yr*Hv9?C_^6IhGovLeAep9)kazbU-$~xsI%GaXnzk7Mzfj{Sa{iQFJ_9$&&p0aQK zB`^Nv|G#PK&;AF-JTCP;1UcV@=mSR*H*Qp*#xM1yF*)B=2ytnW8f3Q+k-Awb2W5s~ zt=U@_?r)Z^(l}Y&9(~@ z*|%Mo^9X7pE`e~5U?Hx3YL*142nc4PE_IRpdOaYlTAcedD}oTd!!2ZAConn5pRf{8 z3xdN`#&VKB1VQC_{8Ch36Q3(bpe;hi3WPxHog&2WXb53B`J`J`z`&3KiV%i~xbil8 z&>}GwN}re~p~>t^(FRVI#a<>ZKv>oh@1=!BB=I zV8oRpjGW1bfC1rpw^a6aRIbykgdw=~keW&_RP09ikb?xaBjOUyeq4W@iQSw*zBZZd zVBG{IKe4Bya*f_8fCSk07a!OROQK0tFt8GHi5H(?=>~CyjL;SamB7N@?|2CqKB5ib zS}oh)J46IG37O zF5<{Rcxe;QMUG#(i-%}K29*HBl{ZZ0T-ylm$nK`LTy(NcMjgUCs1YcSG~NtN4rNJwH5 zLM|M0DT(dNQDX#DxN^#!zGVdgXR1kgtXhb0NfxrTgGlZZ2sg2K@In)Bl|hsjvk*}j zuxHDb87piM4_dJZ5xH2zbcYbu5=4-M{dlB|s4PS`8^d4D3`bFr?$6VoDI-1$wWx7k#g4=s*)q?6NK(0^4hI zw=Q|}!`A6knHB5uWghmG1nZCJjYX~%>s&U=sPHMtWU~ZHv!LRVS(UOt#tK3f7NLJs zs1+bYZb~BF#H~w?@>?RJf@p2hm%f*Vv?3u$D|1&LqT3ls1#62q0d`nsx zZ|r!HQI(}4AL}6Y-;zPp9fJfCFv^WQM6-`RjDU11*PAz2CNye0)YfbqSYO)uSo0sv zeVday-yN>ikFb*f$JHNbOhXU<+~$v3?-<+&-Tmc*rwnz5@5U^^7L`*fdsZfN|0_S& z{m)$fs(+OHmp!D13W;+i{*Fu{&eZ)5D8H+i^^Zm zJvNs+{WBU+6A#G=;ap&d2KxVkje!F^8;9vdp#;Xy%P0?+6$EhWjKKHVnV@>AkOJWH zZ%u(7ZWCr!{*323|80b<&WlYZn5b-0LIRpb7P+@WGRabnO+?izUW9wi5Z?H^BAl)0sFw0e^n5+;zb|k=d!Pi z3yev*6c@YQZHWW8X`m2JgQPMfUU|Mdfz0g+ftH$l4}4_h`Ch2Eb2WfQ7~wlCqKZri zYO-)u*N!f^%7JDB@3%-cs#kX78`VN-ej_W-b1uHb=V!K{HQ}%p8yf@qFpbpw?iZ3m z0RTN5VX#18+hqtLsUifbScx@BzAZr3KR}{T-^iC$(;%vEJ#pn+Xd|H^odM=5=!sRX z49vH zZF=QbUFAn{LIIsp;l!1vA6z6X8Z%XE8d-Vzh8f$c4GsjVD}sxWm0xs)BGu`GrK7#X zom4!s@=TZcDFg;9(1LUh!QM!S8>@>Y1*Vbs31bHdpY>|(frO0aU{+wG$gI#sm9BPV z<=0)?Ty;M%Sb?4l=R0ZwQqF`Mf{^#&w%c4-%s9(ip?~#@>K73!~tl(IiS*_&avj-jtxx%mM#z3AwYgozz3~L4SbNO z#ykyi$N~YsBituQ`0kQkRT$wSbR!S)0$F|8mCW<6U8Xyhrp~$lj7K_;6xupCr$9_t z$;6eXt(}QV+M#{vQ=0nFw#5{vimf(mG(56$vGeM3lha*$gfOC#jSKo+6o@e}8M%$D zJlkJ3(88s=Jlrcp$o#q~FpTJ?zqGdfs=pSImD6?+XD!kXB-iADt|B&$`_f+MV0+48<+o3 zzG(Q?;W@+a86Fxsc4+6JwL2$ucI&L${!9D%_9^W>@r{6+T4%OC)!MxI@8%uNMNQMV zyK!FQphm6uuY8gIGxzlM2SN1spMiZn~)5+$v~bNicfh zQkqd2AYWWt5CkbQjpwt4nJY8``Im6nV8tK0{0NBKX?|35&ro8@KSzXJGwu-;(vA@c!Vx&yV3eFxZgAX2opKp znC2(l#`_}QcoZcf0Tw>Jjt-DR{E;2C(}AGahsR^l$g0!V%@Cs8LkPN+ENG0ZI?Xr# zey>-B)0U}WLe#k1tZs~~THt0Ajb;X4a+Bp1z}x{9LZEc233)gDN3}G%9m94AzT~#* zI%Gwu)7^<9aIKCaCZ>}KQ<{+%v4~BkV+NN#h`?#Uw_S5!M#JRZi?V(T8H*}10CAO@ zrjkbi&G|wpoCf%~(l?4$!#FK~5Qg`lB!b!-BGeq73V?!A4xDvOY@ z;>fD=eGPy|m(!{80iDaz;HvZ8*n)^hEdm>n+ZFgYzv5OUX<(vXRSlx{1RwI{KWJe2 zKmq~{^35K1uFi!qQiDK1iQGyeAbc1jH5ft=jbfc+J5jF6s~;n){F`-ZMfAl-2{H5))+4~qRkoI5@OtD=!&P6M{Pc#T30+UaZgji8ZLi@cRcOGHZr z`Vj4;kyYnlP$jipX(jeZkSKW3J5*ShYT>c2Q}v?VF{lIL|4ug0-T@et%P@?D7Ho&K=_gf!D+jX;0D1t zb1f9yw)(>}gCIQBGy6ymm-$`EVuYRw-3tssDd}Gb#rPVpr-Es5( z&z0*cU&K5Azfa%!e`EEJc>Dj#`U#C4o7*>E*LbXTbZh(8aPv{zA^1k}9f9HUU?=+< znil%QZ>E3ceadeu-J$+=E8)-l!2ZePf8yN5^W7bN{$O5~GJFO@8w|AqjO^77K{69WIe z|0R(&j{!D(7fs*60yq(u{n;YZU`Zg@^bTUR6e>PxPJo;b4P#10K}rc zi~)dI)3Zh8CP^~kBCO>0hC!so^S$qxuQf|mdUpQPoBp46l@HUCF#xi8$QZJ9q21tw zg%y3x-8@!5kF*0dPHxb|#DX0&w{CI;4Ey_lr~n*uPK&?lqkPE(B{#D7NL0>V(^26s zh*6n@ZU%Gd;;zBsg-2%kI9Lc52<4_}T?=P)BZ6Dhf(Su;hNrnlKqh*9MCGiL9Tm+z zMP$6qf9R-3qi}a=+^IVn&8koJWiVnUrre)F+&yCTZ#{`*3kH}4&;VQNP zXM`*6;-MDO$@zXe3S$BD@L%H8kMaKH;%~k$<3(^!5Y&RW-zF;G@GUJ(g$lAf_>EhS z@4I?!s+snM#9|3%4w0MGwrxQ47pm=tn4o2Ltm^jNHV4{Wos=?GSm3?p!Q(e-EUC($>oZ0ed}Mhlsm@!aXfgR@P% zmZQS1Gaw#=UsX4($WMORML5DKzF@RoUSBkY)%KlQlG!g7x-W$^)m z9HErXA!ZhG%fwX#nHLB!Z(?7e%he6DAO{fz-;u=psk1Xql(9f5dLoS=C{m~Pb(7Fa z0uihb^C+eytZb(dRO(=U5*9gdHV*ET2)j|5=us62U@Qase%M1oRAfy7kP!^tBHB=;aL;4 z2uG11WFZZRr8vHd5LB$=Q3xGHOSg5)5-tx!bp0akR1Y<8s~j<0JEV3#zU}u|bPa_FAw{q=#yT7%~d?l<_Z){0g%_{#7=<%rs}!8d!%7eQiIZZh0f2|_0)-$c>CS zqzmFCK>R!Bw1YfE@lpWsnYGruhS-IDwl6AC^;e~tvmAtbT+$1Yagi@X^@mOTaR<>7 zL(-cI&G5C?+jq-07C$v3JWNKD_&j+Ws{)Rn6FDnW*w_C}tQGz6BXT{71|b1iT~m z6AC^7r4R& ze`R?x-5G*yiG=}i1=^ZnwNP_JU6umkI$S>qBal(kyHz|Y17dk0E0%eAWiXmpzryU~ z=KiI?sA{3irFpSg%kL7KSb^}*3YkL*OE-BN$L78P5ikbKLP}$RnO-+FGr9a|qcu4Q zM2irRn+F{v*9EZ~T((V%aB z^ST5X=@r{_LBJ0P&jHr2aAjL1E#g9zFQM4TC4k4Ucda9uP=I_zID%!}fJ7_I2>c)Q zFS&`fN6Z3W``}r51eZy^-*SSV{&^?+X=#^Gn;zipe9A@D3XB37LeITcpmuszX4+SG$|ihUa_{y{d|HLT}r93&llaLTaZ(Lmf>1V4ySM zg(rOx+$j9DD5)S#oO881Bc&d(E)=b}eMLi6vj$olo(6v6UWDUC0;Gbs*wVvO&0@?O z`JdPaGO(XuMkqshiz<-=5v^H_pkWohb7&jfiWno=Y)VNmH&`f#kb(XJJExElXjUL7 zD!cKhjEdUQ)O}ZlWl*^dj|7FO&=Y&=w2Ow3lKu>OO+$X^kO9I$EPOb~+=^TzEMuC^ zl4eb&@C$c*Y2%?QSKJgx#<#;n3uTPy5GmtM?MSmxbvx6#uX%s-TaCf`FKd_7-c##T zzf(P`x?S~=`s{kU_N(Th%`F=bG%jo$*1Di|NNalTt-yiKd7T40Q#<9*Uv((_S6Zj= z?~Nt)7wrGrioozL?$~8-)l3?t%}b#k^Y#$VylwE zEUn|t1&x3QlBK=!ndXnKINu8&7<`y_$(yoO^@4~%W3G#{#5ZlMuwbad{Q|Nc%7+Q- zydne5UV^QaYL>nFVKs~JQ=a3MPngxSGe|(c1X0n#yi0sGeT@=61-Zf`Xkos3%L^mK zCZsRkm5H&iv6C`3_hj*fMd)}es@!g3-+H`7FAO)Mg)nO$E3I;aXQJY3$-qqt{{_g; zXLXYpIvtwII2>52m)xC{bjN{xF(VyUKW@gh_7KfW5R!WxioJG}Xde*n3UEry`>wB| z&W6lr7@@B)RZRDx61i$qI98w9B%95z}7qX-q-02a5;DmObDEnmGyc^JBO-1>j zkPE0FG112NgDtv25JmIzgXD7kF&QMZFx`?S$on#g2`mgTi`Yo@ZB6XWLT)7Rf{Z{f z>^f(B0V?RO%a{fWyRqG6VaPCLi2{%xZrlxm?J5>lzu3eWK1%hXd4Y)s{KyYnh+@vx zsst}W`;B*-xY+ez;{_)A=g#}St2YEx35awGVE_BuJ6^OZsr)CLLbGlrp>~q8&kL-y zUjSi#1SD?iW-V016%qzynXg6bRiPp&>*@q?P9(rP6)^=Pt(u94GDb>z<0GIIU0K>J zHy)8e0yatWL7JBvQS>O>#mFJ#W&xG&xsqXk3bMz5#J=Zy<=Vg~;S?FvAgYW$HqvH1 zO850yI7RH=?05+XnWnbIc|Z`~XwwS=M1)90Wx20dHEyg$4Kit$Suvlqylohw+P8aQLqL_j?1pz{a%k-?DEvDyZCR0bT;7S>(mB_b^(>aN{!O>6A`0Yn8q-P`RHtpm1`>N)z7c*)i|+zW#Qky+J%3eOZ6Xb>HlZ{f2Dm4g%mS3+F;X0>08l+ z!)H%8^zhlUCLDRx>;n%wV8XumUuPb8GK~kmX|NMY_NONI z^-E%h#HE{ZS5L0oZTCI4vj!Dl6zx^?r7?AEq-dB?59eX z^!`&+ndJ5xg>C!20bw2QX@2k??cqr-;dX_dZpBsApDcewy={r_+jQgoR zED@Kbsyarj(_dMzTCO>d1V~pTO^s25dT+9-yf2xt{8B2y_bo$R&?mE^2&n&`Lc}g? z0YCKy_ftJHPO~DiNEbENG`rxZ?A4IcN0F37xxmb%AG9ch z9Y~S6!;Iw@yCWjM1-i#xFcJKk*iD@s2PmOT_;@+TN7pb8KZS%&IAf%Zf6jht;P-v~ zl&lovr^p!kT$LTm5>J3*`n!y=?Bu6C%g*eiqhDY{J0j#Ijg zK%;V&!Jb22{F0ich&yYVFStcr)W@R8<+DXaolCtTnu~Jh7Cgr59F3ks5_k+8vm%Lu zI&8RY(}q66H|%El80ydwez|JjV0KRTUq+UH=k4Ib`a|V0>^&1vq@arcR0Xwq>Ny6c ztAMKBK|h5Vp+e$x`G{xYK$ISREyTk=b!PTcy?YF}D}6g)_#povK;RgnS~8C#Vjz4u zNxF9A#tMN0_!6q~Bx3I)oThJ9b0N|@hA#E!egBiAR2N*Zs#>_lcKvsB!@vG|-1y`gfzOMYm^7^eyliUA;LxY#tZwQVKm+%F_&o*}+niBde?GpSup_KexQF4E1-l4jQ zR21eH`cJO^&oA^l9CIqvrT#f;+(`pDjNti!MXc8q;Y+*&cbR=C@k&A*_5l^k2qi_r z%K`FMWWvdUV$teFZ3_|SDE>{nX7;nHQA-6dHT77IOA}FLPkwf4{(~vWLSRwcGUIY= zUTHXlD9l9q zs*78QET$5~)n7~Z2}TPcj!#ug1ti!F{_V_60U`ErP>4en3;XTV3=*QE&tZbNx_F3+ zdSM82Ve@{2Y&&dAU6{itQc7r1{Jg`_&&1hLU>ZR zF2qcFUBBMJ5xG(+5_i0Wxx}@rOiUSU;%Kym1>SIiydFQScwIQ9<>WNv^*EId6C!f_ z39T)9hMc)qYF0c>*<2xn=4mwq!Dj*qsGhExi_KEs#l*fHsn`+?m8h`ecqh5ZT>e8mgH)UH@q^VhjOsk-!F zA7htdVW9HMt-4Xsqtt*r^w|tjx=jfgr66gR*kOMv74I-yI1Zd{4^a-62uyaV(LW0| zP#;<+g9Hp2W6N?~gWH+OSXV+N#0q`MB)=)a`yYxMn;3$?5vnEp`&}~{YMuoUEKA$u z@2TKj#5^GKJrXSJcitoA9*MKFWN^pX6^L20kDK5Eh=<+A5A0&J=tY7+zTyw={0cy5 zc3L?7cE`+eM@zu+F|jQhn}9^K3fWIOQ`}e3x(?0|0o4a4C!#it@?n6Ajw5t=L^Ko) z-97M*y$Z?Lg~|K@Y4okTISBhi9l}jWm}cqo7B(U7Tx^!S&qLJy3PZ+RkD7mD)dsaN z7&*-ZDzP_9_Knpd2&8=1rfy-&Iy)#>txlq%{AK&=Lf2wBxI1qor z-vy4LKT@5tXv@wVPyW*i>tG%+g97J_E-Ks`}<<~1LX|{o+>?8IxY7%H+}u@2R!?qICsIRh)zPL zJ(U6gm^R;}$m18BTCf>11mB~$pS|Ezx2^MEVZ&*YLgWEOL>k$$j%NF(06|3DE;7$! zlW*oz{kfrEkRcT6a{pK(qse!9#uz)@Cs@XiqNLl9zi^X5l=CT_g^-||ytx^ULSKt8 zOxX>=4^cwQ>`$jaMF0QmG^9i^@{X)=!Kvj;TKr-|suB6VO=Wj8=2Pa}1K-{{wKG|8 zstW{7?n(4wNaasvNq+_%12TqlDz&a>LfngB0Pc6eseKw`V`=%OJ~t;IU-`US7=NA3 z3faD(gteUO$EW1KLa40o+7rb2b#oC*;HOfP1ks;JVgOl;US%pIxz8~=Mx8bmF_DlK z`9Z)Zgj@kp!`!&-wBQ`CiU0(>@VE@OP8Xa*-R9(o?gc{b3lcT}{E(KCL0BhwZ;<3kywl>3}Rx-jx%{K%%gf5vth z#Aq7>L?(;vd(9G8zX=!&>T04&G_7->8FS7)3=vI|Q9xo}kkG26@f6Mrsq$<4IbO7o zF)`(NA0K{WeRiW6ZGs4Vc_G5}FSl%$shsKXW-461j!M7m(X+Z-f7h3YHnuvp-t zgZ#HlQthM5si%_{eAO>3Kn2MkkJyNpuO93criF}xUkKvbuK^pQ=N5#J5gUCKyd;sN z4630<^{^DWtfk0}y%>GG&LVO0`rOlyDS+I0cwZ0-ahG@*_dgPTSo*N(A)mfSCb5w1 z>yb8sxJFMvV)O`zcKoMz^%iJC@PshxRG%}s6msgO=21oFBK=AN)JSrI{2B(#VlXwGfU3z_p25zUHK3cBD4k?j_!S6U;k4n<2JT2pSo(##LF{Eb&2lPcMQ1GUjuXmFl-Kp{Y}WIk#==RKcSmQU%@} zk@d~$|CGiL$RMSkYAWcj^MoS;WY$;)F)wNex*)>y0FrBIez5ky?u$t>B`@p7*+5_+kHvrmwC7Z1_wD+rn5?NtW}s1kFkTw-y3 z4Rdb=xW_R9lx{8Y3=t(=dNz_EzDy|I9SlO^+KDDYfRk9gcohr?dYE7M6%cvM>qf5& z&*;egOAxOcy)F%j>&Kgzh8k`9ET06z!l?f*jw_|; zOo_mF*cpKcO;4*RV$P$Ud;XrOh3G7;@wmCurzyEFQ`43qDjL!}%8YI5xYtw=5y=P| z5dWfu(NqEu$oLT#LI>1>*0i{xMfU%QkGuFA@DUZ|;mUZZMlybcCXcQ1rHr8xl(e`} z65?05LfQ?%&-sX$cOztq6Vkg(St)=3K|R+>a0z zx~AIff4OI-_y8mH_#yXVQR`xmiCs500D_H)GC(wFpvi}K%P8eP7iO&z?ueAh5>CXn za~|H@L%55@zo+Yj-1(8cJnYM+a!-aJmP*T0;a-`jpxVNz5ab~rr%Nve2+~KM3(~?K z@@3P&!W6_(@yCUrf_w|=juiQ9NI#kKaNG6|x6B@FYy=>>)f1V%YT z<%D+FgHyU7aJ&k`9IBKS!XGEbFJ8YSrNH!Bti@|B-Ns-qYe~rUULvrm1+_a+=@iPOAs<5A~7XYNp44?sE8P9YAIiP zTXgR2CF=XHXW09!wf1v*j`q7>j^D3-n*X!*8ur?2t-bc%9!97UQJ6A_470(vhX@L@ z!W}nz&ESNLVUe&%Ud)ICAo|f?;$?&oNKd)h6C%KzOb|Gv(0XYe5Y$i3X@K<&PVK^d zg9yS;5v~)Fa9k=a>Aw9CC~*V!z`g#65SYN+u?Bs|w(OunIQNIvJu>YqBiEkYLn zCa-s4_)PBcAY)n~g+=!L%uq!>W<<(3MsTYqzp~!72TCH4ur4rCo*dLtDtcwXlo!kg zjofd{wz*Fm+q<7{JeuCA6k{x1`?prBUT#gyRisvPL&SPY=&t1caCAuJDyslYn;yoji{ z6_;gOS&*JP&468Tb8Ec=6Aq3B=6Y?XX^6f}k{~uf&8_o7)Ov8$r5{V#&#?q8=EZl9 z&{db(Xp?vOScr1HS6#YoN`=3NlS1Sf2jayR({dLndqKyNj)bndbnBE#j=j1QQPGe{ zm9FU12_)=2&9`uTtN3h8U7OnQKQuwqsNCgS%Cz^ls zrt~%17df*(u2^ zDv*gM`-e}m1M?&kXffeb$iK`uF@=~_ zzJbZq6jTO~`zOoSDlKGC;i-H;{r|^1NC#9R_K&j=cA_vAGInA3N)hpLtc9=(w=F~r z3^{CgjD>iXVr*Rq+b4+)SO|OYE2SbJXve&22FhNE#Mo1BS&#;{AwFCjXYlUdS>^r8 z?<&1eT2}f-Y5&ru#b3lH0itsOyTo_=*XPxbuaB->hgSf`RCcSBinkQcE{^Nu*PIvs z@_XP{)jxAY zs0YQ4?a)@M8y<}cG=vEOaj`82dH4W=PoR9CY!Km_vVrWXM6uq{yK zp5&4tTS7mjm=S;sY-y>mLP*3sZod)*<)FBw30;Yz69~Nh)JLq!c;Xd{82dZI{6OVl z2rOBJ*DHxp8CpO<-AH_Li`diq|m3=7$Ijqf4=w@#%)@N+LfH-#- zQSn07x#Gv5W*9L9_Z_=pVC!7*gZGm~%JV}|{7BZ_PN*P;n7YnYKRSVoAqc7;T~HZK z5Lf=_gbK}&b#{MFwA1<7k07XjbTKgWn@?TmY_}63qpf@DI#&Sc1QJwEGCQ~eNIUlN z@n^o6vf!Dq+8T-LXRMw0Y+hF-s>sW2lI`(6XdIQ^2avfgqa~D z0E-}Q*X9SB7k%y>$1(=2#LQC)g8O0Qtp|XFfn}ecNT(@J-6gG&;sokonEHg>Pw~tb zy0?o5$q{55OGU4v84$OhvR?C|sDzDcP3V$F5Bs>ZNJM_%WrI_t7BY3NX67 zfvvZDcAhClxA5rDWxZXyJrbj%KOTr(yFJlP2E?x29Z?Azr8CXe#hXoSx9StsQ>uGZ ztCdqL_3|_2o62XD_bK<4o-6HJ+NAh=@#e}?mAxv9s|%y5Ku@!`vA!|CaZ+QqMybA` zzOa5ueb0KW_O$*L_lti$|Iz06#h$J6f6TAR4K;6=wfr~nWS9Pkv&#Q6%?u z6JSQhVJc6LN5i&oVU^f-N7A03H9A#1udEJFA<9$Cp6gQNzcGvSLtv5l9c)XLe_UMe z7*}p5EEDZG;i(fHEqVhvbvp#lGzqa59={!ePkBNNj%bSzYZoE<5g@doAuOH{uHC{b zE0F@B;FVzx=vGV=A|`JH*}oL^KE5t59^kXZ$a|AIGU?;qD zL|8g6+6qphJk|gdvyNd2X#p~59V%}CY6CgiZoQr7<6R!u1d$QgNQyb(MYl-4s^hr$ zius4Ft{ApMo$63TQV6|gU*-0M9@E1D5#hOp0)pL#cvz?T5ONQZh`6PcA8AN9NrR8d zUS_~nNDM1(g9Y@$>2^3kLYw}IvrZ8NNw$iGXD@c@dqwa75`b`5O0#gWT@S^r7bz7D zSu`n~g+|IYqM~=gW-mH0g@|HTLO9G|9AY-aX^4bKZ zR{%(?$UtxcB1jv#MH2J#T`+jRfFL(PqAjLixz+?Zk0XfgsGWTi*2l!iq%r|P(MVVfQTdF8NGBFS z1Qk?0XWwL}n8#JZjmz2$xWDoAHr!(#YYE?oji*eVz-F}KZ?r{npW^iq_`Xr*Vfej7 zUUNiz3+Cwr7t>>uo0l9!7=IRIz!v<)wU5!tifts}E0IHlwvfwP7voq&L!g!DlK*&_ zlv6C4`+^s`W}zPq5V4Fq@fJ~TgK(;I1O+ck94C4P<9whz4o(oHb(vO-rC6R1Z1ftl zeb0%eY)U^XeYLcC-?e?mH#amFHg0Z=Z@jnutNP^n!S&5+U#M+e{ZsY()vs07Rwh(N zR`TU_dhMaBg>J#4QLuA44EUq>4XB z0IA!1?O{a14N8)r`n%fN zER4&2->RdfMm2Qff7!y$2iaJ6r6;Z6{KZN>bmMPMNlixsaJ#OEl7nFzf9;B_EpPvV zyIo=a2ub8x*?YO;uJtrtg1}o|^7hlA8(*=#E^<&f^o1x<1_>KqvGoHDpjWNtaxFGS^`a{?aT_5T^nQSn z)h`ciLj(6|iS{PY_=R&wnseOrB%|q}8-Fp*Z|XECI=3j&g3`5a<_p6ejYyS@LjBHUSJ(D5TxhN02ugtH#D@mZALl36N7M}Hk4&JR4`GtRoD<-uE1oXHjhNZ^^O zrQt!S;5Qt)@#lz2<4{f*63qp?7%m(d04O0=~Fp=6tnR67T z=({9*;}gTuK?y%TI!1`DYUq2z*V`a)qmTCE8{DcYEd)D?s_lqqAT9Q;E;K57JBBkJ z*6%QvrwAq72qCu^fH*2kf3(dhuR{m`u#t~6TTF8lx0Fpi?mDzI-+E&hd_N8^p2;^% zS4<5;I3K5JAUY5$Uf4Lh9UBPXR0(C{o@>VjMU~u7VKS{B(`HccY@#|7_7%1bVq-K9AG+HeT`Y zLGO_$ZLB-44Ik)B5}jNa)w-`)gm8u!6}`>J!Ur_jY<%=v7Qv%h3ULsd3ok--2|JrS ze0ZYyM)44{ZDCrjv{~^t#k-1I6nRM1xT}j4 z)t&jk1Rw0qe1Pch&U}Dy_jmYB^j|lh!qz7Am{0UFwBO>w-b-4Z_i8PBMWz+aHesY8 zsLZvoySQjFrNXCM0LVa3YQW+`$81QLcMxIo@xVBhu=)%0^|Mo3`KCtb8~cG6c6yB1 zvHUe3qP1{?za84`VDV&U#09NDECq=?({!FNdo$au6unCb?B<_s2NJUg=V}x-Zmf&U=pwbaySbSozh zw<3XUl_I>(U*2g+0&`n0OB506J{3d=^1+l9u^}394+wYvVd-TvqARZg))!iLsu|Jm zG?C^Px^0xDiV><231g|f%N%3F8`0_J*GVv}_M8b_7xi13j3?}Zye6jdGFrsAc}mDD zGGpw~C)UFE(4vtcZssCJBfy;bho-8ZpvHyrmF|6+vj|(Lv3Y3(J=HAcBV@eD^;+oJ zr5`pRP8N-9$BEi0D%XfTNH&P>pCTeR$#I-$nj0FyfFLjaSJMKNkqOQQhhU=V#s8J=Xcoc~a zYVM5!82;S%S;$IdU^FFpEJ2U~n{b$wuKb*=j(&*ie=?m=!8K)b7JMN!mrlH7*tj;g zy(?U>!{AY93CAi~!E=7wj7_=E?WbAsLGpic#g6G(VD^jxw6Ua^e%!+}9e)v`MLYjM z!9mn`{E*NE9$K^-f>w?>i)~hFc*8(6ufVl%5zxkBlv=aaEXo*p+(B#B;)A$x6RuOSih=pIhyh+gFBifcW27u!5jT<;yp%MU^IsS7I6z--~h zv!2lFI(o@o>~!x@B$gmyVbJ{|*NS()Hec)|XvhNBC#EGv0gLus3v6ZHBe4t!>?KoT z8bT6V@F@%NI92LOV!>C?DBWm2TwlL++TA)H0~6@ zN*Fc&Gjz(}_fAfyQk*8?FT63D|EJ->$S9{7LtS|43=ef=tVREpFZWFmd~y+DaF_N7 zk;wwlkEoyx4N=vN`b08%`IAuzYXl;<_ST?{omMQ~|hy&Ak1%XQ20_Q~if7$KcoHC+rLV zOAh5nb`pvQHj;tKom4owA0V=c9o-2+c~A?u5zZ9chbTT~crE;WTH@Hs9#&{z&PG-% zGQh}9DGcmKUrh(bkBLOApv6JBAR>ZQG#;3bdo(GC(786oJp8p3;!!>&vYh<@5O+w^ zqkKOk{7P3;NcrD)?WS^RfL_#zep=*y3(2QPxzHhhDJp#kFoLm_&t{=l^ zXUiA~xp4CYv8$Yi3NFr;yG>x_`=}JetZ3b%BTDL?n75TwZN}8u#iPwg!Zri+3=3^= zqD_IO*8|R4v=!rIrxGy+_P}RTR^%cF&LJEn8esniHY(6& zOs5}&8RKI56I{(hI(<}Pd?la3)wq#l@S%3ok`h!dHe%=@mk4PYAPg3pIgSIwHqsFO*@55!Mx(4wsjZ6U%X6OErDXvw4jgeV$-k+s$(c_s{Ms-9u3 zwFOc=D|LZ1Y~m$P>yivVMj9Cz!USQLNNidTuz9RsL87M#U1ZS-gfzd_7B4;A(;*ga zEJS54_S}*Qqt|?5U(9{t1$(wBM1)_MV_rz;N)w$>p_O7STwknvZ7pC$JX=rJvbHBh zXopNY+;dT;HQ!tvyv+Qai2o@mjOmS9z|ov~p%;lk)S?ErR=( zTYjap+x_xS=bvt#kUJy&nLE8dXo&skJIMNKy-7;_cRYNc&EA_(u!&{wNAUGCLfG=2 z2LT7i1&K7gdABX^`4KjB$~R1afIo9QFl)g9v@~F2Ier;^ytl8re*keiIQ%mDHjn`4 zGUIV=#iAK1>*3g(sB2+{&RL4B(PZxEQW%}I6B!0UPIC}8-4ZH3$Rr2x4NO47g30ZO zQbWc#{s8!&^ll!AfaOT{+tA+3+pBgUEdCoh6hXe&< zE_XYs`~+YEY3V+sF}ZA{lQE41ftL5a`1J-60mTM&pxpd9%ZA)l0vq%^2@4qDn&#YM zGkm$XmU}mVz~r@Q-E0G8ae6soo*H2}C&j;* zzuG`q?TSYOiki_OMk97IYCUtHlLyYtl-(UvN|SlQRi zwdS2WUw)A~Sv`<}FW5nJLL~&1(76MCHvt(sQPJ*T1yYWz$qj@IJBWLf(vx*VPj0lI z%Y=&{F6Poki<*&0H_6UdR4f(#3~j`UA5wM@tri6dtNWPnTnq6C3|@za7c{WtRxN77 z5i&+fqut^1gDe&8rIBrWB({8xG`>*4rs^%Q=>j=am`L@hGko>Xo>~W#)485S*Z#Bdi7E zx&=Ngp7*kYB|^w{6hgp-#Rw1Y=s^>O20~z}bdDft-D2|t*;5sbO3p15GX`9RL2k6i z5HT!zn9oheP9S7lx45E&c3@Ox5p#SPy`bvNB}P=19-l%Kl_-aiR*cm0El`Oq z%#*nxGv`w!+N4D^&idQ?)W){_DZ3f7fA`|JdfwDtlu0|HZ#Q|>nAjhYaWXZ|3~|F z>3gL7ba_d6QhBd(z4Y_ajiry5n#E_ce>fkI{CakjzueVXKX}%eH@%0X+>-kbn=*6h zd6q+-KaHla6&puFDEQ3MZ~2v#B6v6hWzAe_7xdijY}WZ9FuR#ct-low(ispMmrb_0 z*+qz+9dn1H^~q;s$rpti8wtct=zeL3;IaY2ykSdBo-yE{laLJ%YteAsjt2LXL}M`5 z9>JFtLiC%q2$3riBKUTDgy6jQJLb(U4GEC7&6EhQ;3WzX4-g~F>)McdSDT}|G$cTV zw=*P638s?5^xV)x=& zi%hz7H}cGuDuhSANQXoTy7*tE19LmsctR|7(a^A+#8*eeIWt!vR`)9f%%DaoBwRYs zJb+L=M({W?q5*{FWrYj7*9$eqL<9sxjv8wv#$MkVo>JkQ1c2;(bULnc1ra!P(HB~N zI`_xDQwkng(fLfQztF?I_-YcPtP!6@7K?y`FYKhcd$&#@Mp`W(s4WY20r}p(7NRAD z4K3M_UOCl-uG8l&Jur3LkaT^Ib#QV5VqBO_nw5KOIG^)ykG6Lnq!9P_xG;E;Soc5$ zSt)nb5yV9tuP9c~DerNL_c-_SilUMMaV@I%Dk}QSb~Lb$rE2lm2&l;U1om&6m_j_t zM@>THOhjcRCRE}b9#8|r_N<&y)w&7o9*xn;2NijyhNw8bXsg6QY{3f+>~<`nnYK^I z`-S!!h1zZ=IKocD*2f>CiHp5PvDZvw?i!Yo@rVptXS!)%=3OYTWO*&x(&Hfq5m`0H z5?P@PhEA?CH$Q}?%SxLx>ghrP6WjxF`-tpep@b#&3xdX|+z2EAiS9Ql-BZ`U@V~?A zrPj;&Js9#ztt-}$0FaiL-V2e{c?j%ot9*}%(cJ)?O4t}>`j1T6KUedjRga)N_hV1LVCPozm&*WH7wM;#J&$1%N>r$CzY{KQ;POscetXn_Tc(XD0=#` z<&1$xDOe}O5>HA&8j_fcrUG-376!=eZfVhmuWx`O8GrYrl#0je*`7H} zPpJ!Dn%A`YFc16cwsq3WcP%fiN7J#rMo|G?JLLr#nDUOE#0+JD?>M;>+Jg#N(w_d|Brn&!?n>^bnA zeF~jEV)rK;K5Wfm8=RXJ2Of0D$6Ki5J|4^}L4Ew1#o!=eWOb*EAaI3I^G^lEvAsR% zr*e;W^(lEfX8r;vll)6vd{eFz6ha=c?%`92 zc)B%FI&`H^nXXx6n*np5{lw=E-M?jiQ0$4IDGCXQRMfCFbYFS0+)I}M;z+;vsv3e1T8Crbw}Khm_%%!Rw*ObhW{u1f zwQC;f1^5)jM=_NL7?tBD9y27v!$wKC44g`@IB9i0Z}BPJ6OK_)P8jR3*~O@k_-Y2N zS?9X=6r8wh4#B8s$0C+h7h&Og-2b%o4E|5KkfjTe z(2bK?QP^+jUb^~IBodbvOP7q|4pIup}wJh3^ZS!_IxxBn(K#&&xCpY8|9&2INI zZ)W`NGI!}RfiZnUr(CffeJ*hwneYAWimQR?6abeRw)L-AZ(n)Ejbypmra$XcK>P)9 z>BmSQf~->k34-qqjm-VngsyadEi1_+!xSx2Vg7D21HLR~jGx6y5Hhv|;wvV>6un*rOmV)!#_(P-!zN?sfTBpk3*{=h1*8IZzxEgKIf z_{JrU_=UX(=lUrRj#=hKyItwRa7-HRi~~SMSmp8KG|{khqaMlY6PCz*dR)5iuJ>T` zuq|`u9`!-wMqS~+mMdFwkFsr-WMC3P1EYK}=6<1<3O9b#U$1!F?Nlw)T2YZ#fPwvk z66-k85WT}BW2E9j_kcX)bpJ;&FhHnqk%j1}|3w~Hh85tYgC01(%^alPh6 zLol%5{pqASL?AFO2~L+Bz=yqZhCi#(!O!S5)7YJ7I+v zO}J&sx$L2XeBtTVt9*8q!#F3%*V=& zX230S+9>Hc00F6?&w}ElETi;5FtA^`vYj3nDm${D0o*_H!EEm7&T}y(fp`&m%#;_} zZAI)DR2wEd#j>L97>ByWW)L~nmz;s=iI0o3Mcx(G_H4bgRZ~GSAvdW28F0I2S}k~= zPM)^~By?ejT#8^}8UkKkJleAVpmHyOh^h>+|Kd?yL9l&x#fxZW$(+YnB!pg?kL3dU zroGXu(59|XK7!e|-HmoKsDRz0(||iMTDzY@KjaeXeSn!jN5=f5XOmwLqX*g*EqhKX>trb)uZd;1PLuKoj^tr zBybS6==rHc5ULx;(M~5+M#ElSsio}eB_H?YixNLs*voJ)Sr$g8WyQh@PG0^%IxO=t zlNTux7v_upL$dsr5$h!8@-k!I4*I`%qC*RW0Su+ z+m1`SW4dKRIQ_myOt`a!Xdi}VLLp-s*RN2C&eRGlSv86PaqZMvt=ZdntU0fFJZ=eWl%6TwSX@^8M)8H( zp7ly`|Kg^FbKCuJazOpeEA4(0CVBGzzE5G|B^J&P-;AU)G0<4+Jj%Uf`fVo#uN6dp z9r*%R@JJv6NHSKiAHhBD$ow+1(Jci$BlQyr0C~`^(Bhmy3gN3q*wbhFZ3rmN8Dv97 zAOvj3N~^3U3>i9Q+HZGE0h=-Rk&qCr7D4aTxj%l)>f?4VgcnBOKBoQFWilIl5SjLY z%6G8$6f?4OM~J!^v=h4%MA%z5{hOyWym}W|9PvSWgmH{H#WyOk21cyg_TStEK8TK& zr~MW&WAl+QV3TA&^GN_ud@z6H=Tk9l#g>a`IOu=k zp#psDwBLTtBJ^l9qWEC$Ef@88CX{Nr!SXuow+Ey|4)qa{Sw2Z=Tsy%c<`YwpAp56~ z+{21_JYFuAi%1t}V~o}3Ugm)79Yl~88}ukv_!&uiHP|2IvnB+h-!eE#Fz7=BKm>^D z5*i&KFxct;v6~&NG*1wL+{Kzp5CqPNc}iQ0A>3VJ5=_77ObfYO4@~b65CkTaO@+3l zSjJ3LF1FF8@eEA&=vHfHaDo+>QVR8r3xfcnzuzJhCmIm|5g?t(Qi?{9QZBTULHP{S zAt7X5Eg;@6v?+jxcR;k8nSLQkADI#cM3^>FnSNM1hj2n3?uJh!Yb2rBRZLQhQB+yzLx_ z92ZFF;1Q6&BY4b^GN>S(CN3{XzN=AT-_WH4J zlgu#1KJ^xfIZ5o>Vzg#oBWR_#z~v#@A>qDE5u1_fFDRy*cvKIF?tq`R(Y0vkAc0Qi zt64dHnyVD*fzf^TITrw>R6Hw~K`z6~^_x zSu58!FMOlAy7ITmvdWQ__mv+iPcH9L`fcg@(&tL$+GDi~`&RWGkCOr$nitb)fyPaZ z!)u>yyt}@({;l5Lo_l&G=5NTokh?thN%MB*?@B|z_J8tE=9Yr>xG!mbXZ@f7794s3 zhs$I%K6QBJr^es+3alljlmAI)bV8IDuyr6~&2jg=OokT?`CFZT2}M#-j|#@!_bXJ^ z;xFyr>6fsxilYO|`? zL#KRT|4dhT@hMc26V?7ppMt$THzu{WGddp>ELYUG!(!7c$Drb32se^|iq+Vq;ucDX zb5b@sZ92{P)X?Gh7@bCq%p{-tXPk_`?-_Eh@#L8H&;EA&mPmk!Pu;{ac)ITy7duU3 z=Yuj3AWn-;O#C066G!YSvle`cilH5H?f4-5iKwQ!w|N7f^6QU^+G?|*K48|S#5>nt z)~B*&WfU+QVdgYTSL#Vgn@hxx+eD2O39|qYTI2H~zk7U2l1Zr>w}P zqnZy3m;-$3J*jx}-Hl81GSjE*(Wu^S{g*yPqe3K=eCj)0jY>El z`V=CpsRKHd2z9fmlr0>3-?Io- z;uw5au@+#Gs~k5B8^fRwDpf_~x9gOA^fA%HL9+mfe=L(uBihK|P}b#zO~eJy45Wkl zmt;bDKQeRs)eJbCLBT0eMT5Nlgys{CS&eb^H*1g9=G6|Z{zvsoe)4SW^O0^ z_152@c_+WN`9B6_1G|n7OGWKQ^7RlLyj=11R8}3I8Kh6)MsktRj$5#coR1wtr-#AfPYE9r|N zG#wTmA_h@6dWbqb!&j`2|i_|#xJs@%FRWTh*7%eTpU&ZFzS+p-_tz z`$%EysJd~YwDrR^h*Q)n#zz3U{V8J5Zb)=B)o}7htP<7xT2gbpuArnQlMEni*wxLt;`tP; zWY0EMLa!BYM@wa@SR&m@Czf-JigwDo4lL>}qkQr4}a?x?XBg3zDH7RPGKg=w%+8(K0^n86*&+#VU#QN@yV)N1Fwaw$2qnbT^Kf?MB;q#Rn}je0Rfe5ZF7l|OhkmQEF*g^%pIOB z%Lu`p1|fE$jf`kmUK*l~3WRwB8y4*lLRvtqt+hueKFnaXJwowe`YUY_qQXLa1m*S! zzAuT_BL`=dQUpI2muOH%UNG@~+L6hYu1KV!H%JQY5kgjlEm|+Fy~t;a;wV`F$iNoX z7I_aoae_QmNQ)pXC&4uYiJaVLAjp}P3O}|K$qQ*D*J4Cvl7;Y7UI|3DqZB5aqYt$Z zewHkPs57JiAj7-SW9hm4_O6wTAJmM*g@BEha>LSdxxZoKDVgnBTsY+=Yz6IlgLATO ze~73c0Bcb_jPa(^Q$yir)y80zLSLr{*NDJPR#NI2Svo%_I)UlUgTb3<$&KvS2SMi< zpCkmi5#!2+=mXtg<;KHOR^+_GxR9BNm5Ls6NWIkH0v#I#5 zX&#)9b`=+U<=5#?OM1QPPnCjtGWf zT=Ryd5UqM0nbWxDxx7Hz7p`3sr`bu7^KvOGo=Hqk0P~25s9cK~nJHq5^YsL~c5KRu zHZTZ4`pDWs6S^RZ-+MsRHfttQl~MLb&EiPOfksCaIY z1!U3JEQB9Tj|PSs4`1zw$|Blgir5#2#{Cd7%0*Pth#?*qChp;hUHH|s?H)m-g++}d z;#^8Zgf`@oafz547N%IifyTkPSn>S22N7CXc`p|@nd^cn{#ZyPVyuxO%poE+gqEHH zMDPy}p-IAXP0ERy!x2O_34_QD*yN5m(Y^(}r?Ln`RHBP9BY7z*-~;=oJdutd?ff@F zNl_7uAjp`rRgcwM8`xsn`_CE}?MUc>&BM~2NrhVcgbM@vH#&!;Z4#S&GNz&_X`>zS zCI?wQoyOx-$S7}c^Gn)G1d$~zQl&lXEiE4isFDjTY?K@3qoqxH@rvIWrDv*(tEbi{ zHco2n)^|+b$m*Vy|5N5)eztr@?TOmL+MdYwpK6rqPt+GQufcnO$n_iR`X1@Ky0lMe z6YsCDd^-Jd_jdVPHH6;b`y=LYKFR;>|KPv>#X3>pt43p8^IXzH5Uihxl3!y1S^|-6 zwFKGTLU?4JLd0|>h_yZ=9}C04^g%6xY;LLW>(3%8zJoL~|3d8_J=1enx$^KG%xR@! z;3gFSGQm01JJ{*g3`qWaW}r)90}}qf7k1BdGxvW_*zwB1@0!cdPi0c!9v2bb;j=Xn zr-y({e_v_^;wFfc3J(cUnC!imx{PB_x4WhS!x50)-?tUfdUd`dbn@sMsbFa$VaB{in9vOl#J{O81Q893 z`nlry_&dcsPAQ9AfUM=uF6f-2AoQd}n$nhsPMLMlRw)l-#owhCS=rHm&(FH3$Bsz8 z&IX7+mW6kEHloBEPb*D?suC*Cnz_*uQ7;Z*iwEryDGx&?o*Wl4W^T0Af}IaKV80Qz z#bh+)i^$4FED)A&GRIPPM(k6XU)bj$jzOZOt2h9K`?Uv&+9io>ij9QTV@MD&YEs;` z!b;PGD3E3k4fp-3)p*uqdjp($3yTz~wrJ>aK5B=u0ys$s0Q1B{g}O9i$N|EAfeOMd zRpFmCnL3Okh1V!0ed4jaBA-En?(vV{zA@hn9GyaPnEKN4;W5O(0BJv2Xd#v<@XWXDWbs%&ie;kj zjeNxgwwB@X6=?aBiBkh=Ip3zu+QvxvdbUg*NZI!cj2iNU?qQYxa867HA+Sm$TZ+oe ze;^1+=Hwnql`v$X%CPw}GrXBvm}Ui;BcJ#X*Ys~#5_(j$*m2iN5}xi79nS&=afwm} z1UwC^aMl8b{MTc})Aq9C(yZ&-Xt31Jx`2+jW=(s#jYgOxQp5pj4~dsjf3hyyn^qyys$>UZ(^Z*p=kJsndPpWOGEvQYb?OrQapQtXZo?LmlvZT1O zIHh=SakIi*$oP-x%lE$2dt2{$@BG(uZu&EKwE5Y*KmC{dPd{npGRP)TfZiPXhdbR} zu|Iz00S>~}=xj*8^HiNsK?6&E#CS)ggMp1PCijnVT|q_z^3eWWL69ouuCfuD8SH?4 zf=t-AD=NDH671t39Z(qsg}(jqt{~JU^st*1o#=(A%(bqkBlaO=Gho{nJA#0H6YkL! zFJlV7G$BHv#9OWP8jNtfn5_@*of2m#>Qbk+2Yvis!U*cK5F0^5_^j}qe7aPaY3B@u|{ z)$yvZ@Ly&josf$cp8LeG0KskmCxV@z$-lP4;)T~B3Tf4_hE19Lf53V|gS+mvEgBrKiR@^V0qKea$A zrMs#{Lu_^`pVhYuVQ6Dp+JAMHH$B4i1RZhu6XFq02`SqRxj@j5N9VZh{@}Ngm`JbAAKANCt_T%EF_J>>ora=0s5V?G(wkl za62KN^2>>K>S|8lxMYq^kdqulaiSp+6`RZ|&jowOW}9GzsMunWkv=68;vzBWxd72m z?h+LjiFv5_A)7n)mF~&esr+Q}FKL4)_K#Zk8WJ{kH3N17!pPN#j>4%d2#^pHI9 zz%&Hx|DrdAWhrr@#?BO0Y2H}bcfmpwDM2LI&u66~vy9M*Km!QHOZ~|06b`t##1|Ve3!okq} zf5@n^5UAtGT``b(1&c%)O$ZB%dgO#r27OnX04)PqL{NS# zX2&I0`WV93J5(7azkH&FXeyqtu+e+38QOc1K}MfL{(nO6MTJ9)-!8wmv1|SM!bf^v zEgn?-P~q35TTADb4k*39KBiu*JzkqweF~idbUt9;$|mKri!T>%FF#Mc0@YJ%yEm?@ zEolCXx&!*IrY?fkU(Xjaf7|5$oc}@o()?HQAItqU_ru)G+*fnko1d7U%o+wsq<>K1 zm|e6Su1b`J%zHK*UaSvUB%=$n)XD|K*HImh5xkpyG<+Q)`0Pb9!mQaY=#+c=5k&Y1 zDy+?Zj~%SsppPMH8JacQHG9duV;=;jHETA)qQrjXp1uzf4Ge*50$IXLK4D)Na0F>s z$n#zZUxrY&pEVo3`3aTpdm$=n@u@eyvMd@HE-es_7^TSBJ*g(;rZ%_-f)jzen>9Oc z5qek(f$VP9Y#ZarO>G~Ip!gXxaGvFzx3njW$lX&w!f!bU^N<-3%-x5&vwI-scCVAm z&bH%{`wtQKvJTn%dTak-rzSbag}B;S^ikQMFwKnU$|PZsSJ?TecB`-eVS|g?Fq!=o zu$9<`{Sdj=4#*t0X3Od@s31cVYj)`+b5s|zo(5$#l6y#53bvi3MhN0+ld{H-L17b# zPm_ps7kTL!uOYi&o?NkII} zA-oFB_$yJ)%34uyk*@CUoOPvJAGF$OpNhvSB;i53!h4L1x+v8OKWot0yl0xA@FQvr zA3(L2d5eHc+a^DGF0yfDYVE!6c_tBhCY{vjY zg36g@1a?AWrJSo6q3$|vETC~M!pCF<^4JPe6u!)pPOf&TqsLZ|p^0G;#8L5ZLb)?9 zWz?!>#7=EEq0$dSz#gydPXT&n;VnO10GM^{XD#n9X=(XRWz4!7-Cl{fvT$eM*3 z>nEBKSRJyg3kb0R4jS{ymWCD=?d1z`(Xdcn%48l}no?en@Vw8b!_pE45gAB;$W>uV z#Atg&Hp{0X9p9RDmD9YQD9C1YEB~x3zhSB9i9%bgd^QI4^(M4FLi9jWgaa2TteAq^ z%bn_F7YjTQyoB&~&EA$*Qghnh(c^49h714+UGVXink(oO5}J$#h6Ezfq-S7g`w{Ge zmpNEdlIf*|j1Wgy80lr6-Gx*wDKHkViOt#CQqh*L@9LmEwSKp#ys6kn+Q_%SF|6yp zY-wnD(X)Jfc9FcUbHmc+g6r0V^Csr6YqvtslP|)rlDv*h2j-KPu8spT$3}Rb*#hQ; zFQ$QAzg0>_?aV_fa1}a^ydGIfqI(@o;ht2nr9|n|^>D2TL@Sc6Ruy&($ZXs9;|VCJ zR4P1Dqxgc^ytsdk_V>%rly5A(t8{Z|-|{}?zP^!h7T+AzIKKY3`j6|g>qpf7r#7c{ zWOZ$IuzGa#>fio&@voy_V|4oKS)+cJ^nAHzyZm2rYg>Ms=c1pv2S5I2=#<&FnbaeS z+?~4ZlxxSyuGzPu$<~|gCkQ@QBLwodb_gCgpgu7BRx5iWGQOCIZc>|lE4K3z4fEGy zNBbef2`W7CxXx*rsn~tr$)>?xp@?!M9Uys4Ej2yR`380=0}K=gN~ zDj!-sA~Sa2qxgl4<>W1;8!(vH(z=YOX?fpF-5A{E!JQz8A+6z&nNB zVtF9PiRO{mz9#5#(FHLq>j&d|n&f6&vMIR~G*=L0lit zW9-ue!5)ZC(H%RW zaDodjcnI1q?kw%lU7a%sen&z?T%xQWLMIqtL}{l}el|}eS3Y$Th&W?G-NAF;mGUA2krbjOc9*Nla8H{+ zM5&)lY?V7I#O)=5=mo5ipJqOiKQxy=wD^g_OSrdhm%e=S(VoxHZGidT<-c3Ft#Dr9 zQ-u%o{-55Jy;FKW-Me{xef|2L3+gA;cT3I)j72wq=ZC)+|E{m&Xa4gY{~)`}KRqAL z&4G7K0z7`=b_}h*DEKIsbmglqY2fCbLX;}5eAOil;^wr3ikOEzA2x4%A@xaHv1u3) zp_@2ZyfSRcm9Kuqa-(g( za;Q=ZwG#>Mi|;i9HWf0rD}mA5)?CKK{p+r1sac_x7jBUe#AQ!xaz(75w?gL1#0qM* z@lt%K9v5`anU9Fry~g~Ttv~|&3ilIXWfL_!FB_x~F(nD|F*`68hs3szfeDB)g~Jes#N4;;dkjqxyb+j|h!fMluN^D(E(r=a z{Scz~p6T-dkpd9!0J6@v5ET_CBW7QN9Nt&a#KlX2;&B?E$jbppAo z)mGwx=^mCw!Gxc(5ax?xh&MER-Ic!niImLi%hui10<<`HFLfQTJ%^2M*Y12!zrPI(crbOhPV@^YV# zinJGGumkV0kd+#On^MGV0VI64gJ_9q2-yqD44L+#W4%UYXR}q|7y0rlrS+u?i>DWN zD2*-tseE<$kiNV6PVC#V`Bd|g;(s>xY5aF%dE={F<^6N;SFAUbd0U&W`2|CzH^Vpg!{4I@4X#FmN>2(psybdEKe z(o!yxaNO!29S(mOeQHGKlNP77r7OXpY&TYJykdjSRC30{>i44Q5gSPteoTKVz^Cld zkdBBGB2wV$2WXQg9z&;wO3ndi)wx!JajSnksasJ};H0wnaQx~YpW6MPqEAUX9k%*@ z?C~a%t}rgTh6nY2p5lZ<$F2Se3KiX%1o)u&#zPwL@e?wME`^KlU`Y_J6e6JlXxE>D zt%%?xz^A_Sjy{EOLWa_-@83U_Zf+X4c~m7K73s}Lx@ha@TDoYN6yA)aORDW!Bse%A z<9nDcs<_<^ike=r_uM^MG_j+d*8{R=$bxmQ#2?fwp|a(b6pDtMH}9cq&j`P za+H6S$Dr!(U{FXQMbjin3Y`w!tB=OT7Y~vYHC%V+I`J8-09@v<&Y#eBR<~cm?vRMi z!$!}&=A%8|Emt?GJXgD+c4~cLWohNC%Knv2%jcF4D8Ik-O6iW$X2stWR~64Myju8P z;iBH}_g>ojm7bqOZvp(gdPDWJdZm6!^y1$&c=gZotB*~8xeNc@l3 zsbJWYOQxO^KJwA>5i zM{s2mqTg;(dJw1&w(N)XOf#Wt0A@wY;n9$Etv)~944^s|GZC~Flz_l`gf3$q!G|Fr zq1&2&+lP@Iz&)QekHCGkqas8V3&7ns7%1VX3YLEf=Jv#%WZ`ap{rWX z5fJDS#=`3&Vejuu&wrb0Z^X^eDVMCUGeA0BojQa?@T}21t4vvln`WXQNzLi%!0w4nGTcxmk2x9%lPq$$NwHTR~PPya;yM1cd zP70{@D9XcySPYm1OidK7Vtv1 z?WU!L^C)r|29X7n*hJFOL_C*URrfLd6hdXlH^jUWrUFEOB2DKAlJER4r1BMKNJ;G| zaf*T^$#?#iDG?7NC{2oC0dc+crW%2|m2Q8yM^K}gCR?0#nB`O1^HyPEuA_&CQ4k9uf z(#fqK%whz-5djqssSMvowRT@mn+uo`v0hLgYerZD({7mVZsojSTy&~7!@i&uCk0QX*0*v;mI5AkqAvH1jYPp+|^# zx)rfF0Uw3y`U)ak<~M+*l$eURFCv1#AoXBDF;TgD|1DS5c1?{qqyAcSXhy7Uf0~Ua$03?+yQV?`HaT=`tJ2|?c~x~ z<$WrR+Spp9`eb!c^{DEWmDelx(o2B!Mj+k++)!UopV%xk);CW;1z<+sm;1JB{-yZM z;`riw3NIE`@L%s{?$`61^q0Rc{~zX!tl#MqCY{Y&1%^(UJ{{Xfu_Sq7J(89uu*nx& z9Oj=s9ciyX(5{SdClkg+>G$F)JXDiA>M+8HMCu0?xhCrA%sI(I) z-A_Ys2gF)Lw(SsnktZ61XSPL%aF7uFXS7Es&P{;exy`6VB?@;1eyyI(Xbf6-`^y1{)QLY7zotlWIBerg3@(K6av(N(@JZ+*$GGn_`#-q8sNRgHJc=80YY`B7>50-bbWvvwqX06XCwe?ZzKZdRJU+*Ot| zpLAA46d?)HY$F=FBvh<+1VLh&N|PlU5o2D+EyFBCPhxmuxdegA0u#5*h_QNfBl3{U0(xdXNIRF&LWP|-`@2M);Xw!=;>MpU}= zt&+FfvuGY({E*u|o;fhgSglI1R|r@616X0~Dz|QX zEd`lAovCEgcvtBD9$RJb=pJPmv92~Cud(Jz)3>Vc_`Z)cUu)jmJf*o!dpPC+i=q{iZgrc4)0sy{~#|b=%6b=n^=*GPJz0e0zDIyjf{o>AKR1rQJ&9 z;_Bk0;&z4S3YQg*C=A65fmilU=-sSmUC*?h&-Rq_tMilc+vT3iU6vbX-ZT$_u>a4n zH4l6~)evvV9x)s<9?T0<34!=rSBPNzng>1$MBHw&w4-LIm^db?m_hi|q4ra+b@wUm z?n8X)GwG*tf9?EJa0YTC8lNJYjTr3koI%7OxqC5p@hPgrbuBBnTIp@@DT@7~Pvtx7 zQjbTaH_z~?gVIl#KXf50*FJoTBG{OZPAxJ1lqd^_Id4R&5?xqJmg{4q-Q$UCmZFFr56dm(rg7iT#X#A-zEEFNI4CwGFv@Il` z>U5?NgDQ`tNxSF2=Tl^&d*D-1oyRk2Q5q6un~^|_?FvE0u=_tjaD&?gh~2tEkfNw6 z7AdM@pAYGxE+sYuNxD=xia*uqN<^R1XGicU+;x!Xd`{=nnO@Q24vrWcWk1!0gQKDq z_xa(_H4p5PMv9+Pei{IAxRwATy8)00DRYfP*zsCNB1A;V`6lCWH975j@HoBPI0f+$ zDe;b1M-a!ptqk4qsp0>gPm%t1wx8-kf9MJj`>FIPO24}{P#j4T?cSs)#Le9+iV{|C zRrINy(oc2R_#dqv=oOIb4L(IVR@ajmyZdrfFkK`gaZ;#l9sPcya!R(oeK!E&8y)kB z2zTmyj)S(`d4R2>)|WWr!_>?KLM(OUzPD|U@GL{yyrbbF_29t@P0g(>aXmGWukZ$# zC@gSge9a*0hGJ)z82qTE(Fua|fu5vTAEpbROVtt1AWgI(>8H9e>EYOI=bxfc(H2Z( z(jA`2j%EjaiZ6~N611pgS_!pki6{mLbeDF4pyATp0P%3U2v+FM1X0Msr#Acde2Vlz zMZ~ThAC(-q5Q9ePRI^pFVenqxsAf<6Vqg8S`gQda>busiubo&MQ(aJE)4orYcRF?@8-4(1KClEx$O%aT{9 zMgp<+z3mZPE`%8DPG3Ouzq>6B5eN{CVAJ*puHccqTbl=LVbSx1hv%syKrY{;J&_h+ zLGD)%q!wiOwMdb6(TT;!MDN*!*lUiB&hTrIvLJ`%jy&2zcoSL*X&DqX9MizQltOZA zSrs;d(52P9rcgN4ym@5GIlt{SLa6)ABO-2RL_a}JSn%9V%Vp}{{o3@HjQ0Sg@ zHNvCL5!jobb+wIx&Se|55hI#LVU;-=IYOcnkASJ8T}W${8Sa*9kAM;Hw9b*zrsnTd zhm3rU>FA*@Kz`!N3LX-u1&DRG+Av2@tt|Fv9tfQ_gl#Ny-G(m<+dzhaY95bvu?aM5 z*|F(&&C5b>K1f8x_6l?aAs4>P&8AMMkO?kxv#AqaA_!b~qKQtZkVP%4r8anm<{mM< zs0dXzm;pDgIa@&7HhuC4?h^j*Z(Go+tE?p2&p~Nvum4Jxt zlW1Uex5~VtCFX_PfJV1$UXZ2<QcRev0tWSSAW9 z0m<09B+p~Y9tdQ-(7Ghi3=nA&0uwF?kOlVmp?YNyI-%o)JdPxY9heV7M~OKEd2&nd zqMrI5dubH=%;tsXduu0SUw_YPtum>ySLw9U-oEDM=x!{cxQvZ&$6-Vvg zu!Ve{#*ReE19MAkBGBRdwOCVqiEn}smK9w9fKq-t1fL_(1puhnw?pvEfe-<_T{{F{ z9I0piZhJAna624HuMA)swn2z;AtCxvO>c(~vI4?gZtT^d z=&nIVaKW2ycJQJOu}(!-?oY7(T=1q{84N#8lmUUU4Ps?z$BEDgZ1YW&!D9qJcb8~H zG{Yi|z2HsT+1d#rEWF>mwN2{f48M~gg9so$b=~s(^6ZFrY&daWie=$~H)|=C+z*(O zkEkH<;>-u2(vNaP%sgKfA|k549yB((?2+HJ9wBrTfu|4N{#-gN5A*08*Pir(jW!|@ zx5g*T%Vuj(X{j0hO)(EDB8mtA3GHUB;g^jkRD2?KDc9wS3VALue~T;3L#0&2vJaZd zyR8TEhfbMx#kaHmGRhDr+=vyVc#|18EtRek6(G8zKWxghtH!s1;B>jzcnyYOU{@h{ zjtxa}fhr72_ab;KHB4Acsqnjiadra`%y+>Hh+K}=>?|T75Zny~rDsft>Shw8$liZ& z@7c)#k-UXS6;gMmCqkVz$HrS~Vnq;rQhwUCb}iBJLWCykzCpQsnhEXxh(}`Hz-HRD zeU_QWg*_tJL}Q4U^3eV@pL7tGH8a0@^|4l{a`tA~s-&Cr#MG}XY|T#ftVCykoG)Nyo=a%utfb}&&r5aF=Gp8tcY(0| z7$OEnRIu%kxC<%cNG-D67LZxxOb8WBluK?rmU|0MJf))4f))gM7l$#uJGusEo@&wz z(_ITFWKNrjf??JSql*lLdj%^qT?IhO7({TsMr1+8^vtpQSLrd9U}SQdGKOdw&vZ$k zRz59w!X<&qP^U@$=xfA134l*9@G`^Ni)Y!R^jxqHfz7~Xa+bi5Y|7#nZY8(^mY*o{ zHDO`2VXVgmDhsgH>!*V1s;+JY5H(4U`Ox*?&lqqZ7!JlBCo~%|0EL@-j%D* zt4*x!UMp9hs4lFYTzRt5(_G)YzH&-sk4m-tRJ6z6C_Gy@qp)w`U4@(C{r=Kk<;CSw z%X^k?p^wwYg zu>7{UKj*%m`-=G+|DB9IOURD@={pFy%+M(_mLUU-r$(GJ(tkqq+WMb{C+=kw***4L zV{@Sk08dX9X!tvkqv-4@Y>}r!NSyOu>*(8)&K@$6MvWA8#e#(00R8k^py3bhV>h>!;g}BgQC0m2qP;t99olv36mEV9LYNtNFpwP+r zwXKz){YIp%_QTU*@lc8ogK%8!Xz-a!h<;T2+91TzK!^ZYZ99a}V&PyjXye=6*v53i zhqz`f1fm~1qA`u#d^!|}0El3MMfg5{ILy{ z0&-JVLjI!|PP|OE3(=ay?xf6_Y71H(JI$>YQzROgut{?AE1fUZ z%J<&=He=->c3>U|B1bK;J8kX9XkMb5mSu=C<4#w<^H8DcyM}zm4vZf`C%w@5R1d`E z0D53_!M?D4QsqIG3h(}iw68ALCRN^gpo3`RR}k#Z&S*Jj?J*byAywY$>Lr~($Shad zh~8*RMqVyk3jtZ-=8KjX0zuCdTjeZSOAJ)>QUu)?*b1Bcd;A_1*n~&wE0|uu?haE*;(RyRC7mDAtHoV*7uW|u za3R)LP`S(P=kuYH|8p49?7N;+4$^#BXe){J8TK8USJ`uv50P~vfv-5?TsN|B2JL@Y3fdv4u3otB4a zKL$iA_h9{QrxR((uoU$1wEq35?`y{0u3o~g3W?N+Y}Nz8MtGum4;2s+#@|3Sa;xH# zrgU=U@yh(lN!2m66QW#wWb3#-NI`s(%76C0x% zJ@s{z?KiIN%az8KD#a%=ey0>qsVu21>G^QGU;fqn_wpC!KbQY#?)SOXx$oq@l-tJq z$^56e6Y61qhEAEf1cecDiO9;2KnHuwagI0YhtyPo_CT&V_~5BGIB&;0vr~wY>(m?U z+9(=?5{PW6A}V%m>GMc8eK|d;1*Ha2oglH&4CGwlR2&kuEgi>lMwC=)#nEyIh()N)q}SPJ$ei@}j8tAYrXw2F^<% zMhcmFnN=aD_E_tFxd){)+&%_(8TS z0`G|Dgrg@&wkyhl+++QU@?O~b#eSC7{yjFy^zfn~#LGRd^2INukEWQ4%n1_R?~~Y= zm@htqA+x;4=GYw#j35t=aH>>P(8eKxwFuH;FiQIwkQRgKfJ#`q&I}-!&se*_KKg6K z+C|3y`F0SLOL!_ryxePxWj=|45RcBo`tfGKZh(4bC9Zgsd!~&?P3TGtdRAhEP^ zcm{^~qDux-A8wiZ!p1N#Kcr>u3mfx6A`g=thWOkCK_0cWLJuz^eq4oSq$Y@4_ zALBMg+FxVKABsu@ktKYB?CXRqB$f%;$3cX|e2}p3nAY>K(vqVUS^{3o;^PG! zsG9wC)pTGTE#hN{ik+2yDq@OJg&{=hkzxGQ^rJissN9R4$|Tm4aVsFoT|^!RTa_t9 z>BR$Sl+G}lm-fvy9&4P~DApgZpM?GYQ!0xqwesGjXG=Gg_AO7UEr@ypD%B_IyVd76 z#w2_BBl~jAYwhp2ruSETA^%iIzkTxdhb#Y+E%c#NE?bH%EbpJbPhb-%j!}8X_-Hb6 z)#ZX$0HSZTL-4gXLTuBX22bT8#MW&QVw);LY}FpY4K_j`)^5Xx=oyX>Tee4dI3Lm; zVL9(D<#vKI$Q%!pA->*QGH<{av_tUBeIyWTKi(E0`hWnq($<9x-&7|1!0qs2c@6>T zN8vmk)i;@gN)eXlsKFxuB0w=EM(|WWLC9YJ;^p~2?~zVWBM#`0*rGK!4}E6i~u2$_~(I^B$XKSuDDg#;lANnzn1xvwJt zNDxZE;9VdBAcmnoK0)|Kr4eQ$cGhEr$1NxtBwkngUFsW^EHD@TVXi`pS>ns*dWR(n zb%0E;dj)2$kBUsG0SOLCInl-iX-SO`D>l3~ylRoEgwMpVc)2;+hSz45cU-MeERk?s z#edU(AIp+py}WPkR-5yf-+Lk4$UdXI(%2Irhuu{bwQYC*2aXWcHf4Q8&Z#>#~TRP?|AX=$&L z1BM2yP}&rJ2iC zx|m*S65LZ&ojZ^k26iVRbpOBrfsFN(ytAz#10tw^mpg5$X*>gicTpAZ%kIQFkSN~+ z!D$)6egowUSN-&8QeR+ALUuJHk0w!?;RB<k_z;po>y<2zL3RfiW1VX&59GVWy@G4uvzTkyy|Npjj ztwDAb$9c}(yL;ce2yDW`*fL;11_|jL35kag1Q}rjn6e3&5KI7Rk;6+8l7J%MC_ERC zmR+iprEEvo;*r>Z1q3@WtiS{XA@tZ?EqY*^vN1|1mn+1H;~y>_`TCqQGk3b@+?DE8&r`7Beig&KkQ#D#ONfsQM)1Q^;Y&$+0#n5O1OxdIGfAKVi`;yq zBSnC>`9u3zh;V2;5Ml+<@=R6`mzBHaxl0TYX~U^9pXo7(JonWsA_y4(;c5$tv{hvN zYrbB9K#iq&dCo4eM~=`*cNdd_HI>+Kiv(MNYzJFn(w1x!4v07>W6j5%Cwt=~X2jSh zD#jiMucC3Lt%ue+>F(mN(fN)#s(4ONJg4hdU1yhXE}w}P{@?5_HpWo5e_i9``YH8F zZC!0~ZFc9=ows$)?>wluxA;u)8(r(WZY>{B`bFufTD7{X`e=1&bx!56%CgGol^*%4 zKGOW_SSfzzbsSoFxA0uyZwsFeexrVitiS#JP+b2fuN)jnJe%N16~Z$}^w9P9XT_m$ zt|BPTEnrB183$$45{fIt9nIf27jEc`ReUgv8)k`7L z{0xq?zhFC7=mleKr-%y0@q{TI++p0V!0jZXA@1fPec54!?}f-b!r%^j({*165f!{Q z=Po2su{K`n3uP)@I}uOJL~7KdLSF#!Eby${^r?Avq1~x^ajd4R)hCr0c7joLbCovNvL2Tyyr@o1C%Zdei!$kLPlL!O>JVcCCe1`-e%uJBl!x&}SFYJ1D zp^J@Cmxi!Fd%U?Id$z`)G6s(-q2iesDy_LB31Xd!>xEbVVS$;be!Yrtb4q!+Q><7h zpCu8Miws0ck|0dQ2x2Aah9=_O1qieF_@4b18)5VuMM&$q-d+TV?c~7{ASo3Oq^Z>4 zyFT`L5dhsBk!na+%}*hhLWg}67z7=k;UD}A!xW1r17FX$G+?KdGhG(y@6 z)FrW_2q)3tn9>NjSqQ;|0!Bvv+A!h~y(}7lo4)|jvXpmeU8r7)9V>J*uyH(TUAz$W zp>-%djxM&O%S)VS|4TD5k2@_PSg=ue;K`xtCjMeE;?R6C(o zto}=7H*WHmR3=qViN6XsEB-3rlEzOP|Jb;(aa{eE^&gbqs^3yRt9)STnbKAE*Hxik ziBSIp?%_w(BMNWmq4M*Np~M&dAdzjKFhi}&J1YcQD5UOQh^7p0qh09Z zeI|k+9t8NHG+MGG^YRi0AN*E15qyl1cNq_*a`S=pKyZS)ox@`%Wb)xflpk!`>CX45 zpmIRq7-7EJl;KemUsX>zdO`?lHX*joC`H&32A|5iR^FkiM>Oesz7JQ$e9)U)*M-8e zkJ2@$O$lOF_|H9Buysb@RcDw>>Z`;R4#c-pIYFDmeM5oxcJnwR;I`U}0P$P*4e_XY zouYta!pHU|(PByL{l~Q?Gg0+|vhDVRr zyeqzS&~LztFsWUSNhXAQ;L&s`j2nwewPBJyL*b%kU63|RGOPd#WkzQXkK#~GzAC-E z$(Xdf=wL;pn*sB4gzH5o_rkM6{3 zAWo9qKwJ+k>^Mk8D-6UtF;)?WRQ}L_NdUV6VNHek%!s=V4J^}fv1!e5F^yms)Ue}e z6(I$fo=%%21UCkciXj1*LhkZHTuH`jY#j+FTA54?iDtIOod>Fi$dgF4@);i$UUdja zukjevGg2!-#r3X2K%(m`mFA9wW?~FNVlg=?wpY#TxU;b9}4a zQYlfS%G8CH*ro%Vq(d?7Y)eGA?=X<$#9Ll- z&ZA2W6_2q%GMm|#$_f?PJfO!UQNWwUJiv=h&w36Q0g2^;Y)H!fTp#<~R?>=DPkydX zls;j!wI^Ph-Pnpc8&R?Ory-P)>Hlo=444SL@=V~f$HCn<8Qq64ZlU5=ZmYPcEIh2MlFDa^@sve?yPL_2=H%|tM zRg8k-3B-8}rm3(j5K)P~XdzNx#D{fa_Rlhqr+pB9gc19wWJz^jnlbRgvM0zK4-K5D zwNiRXKrp{5Y*d=QwCK@ewZ`bovxX8-rH#++(8Dyc8%~j31EfCzq-d%G)K=X7bF(_sT!hoOVN8G-H@ZL zdh%$#ulQwX;1ok84O{5xq%U8TB$JM?`9Z;6r(^8BMXs^ zN@@5QVKn0B50PfX?PI7#!uNb5SfP#%mKTEG2mcxjbo_Vmx7{<))$iNr;XhVeTf3&? z{*FKIIJ)q^g_jHc#TSeB7e7}kRmZE}sa{t-xmvF5tgK7F5%6evX?ae$UV6N=taQ5k zRp(dsR`#l&wefovo&S;_R>Jwyb1u%cWL?~ve@cl{58-5QgSB4hPO5H>;~(eRD7@)< zr6C{@lt)9F7d;D7=vI-v!?CwRl%khCTBZ~xsY79DQ!-9r%jA{)cg)q?x!+JD?$GQ? z?yCOV&BcrL2PO#e zt%-?=VlN!0{r4d}m@droj0zt7AQ8a!J0SPk2m)T`Nsok>zS0u!XXeGFLa7c< zU(xRfSV=TYPV9c;v9O9@nix(xR=gBV={!1U>`(SWTUjFaF}IftynQshVlezr9`0tmkm_5|hcBaM)#*o{cjUgQ)9A#Bady@0s6X7oiGD^x49OBAHC`okkN zgg@GZc|k&rImLLow)(?E3}mZZFnXfn+*BiUkp0D<7|5`IpkW8!ljVs`&Xkf6Dy0>Q zy!r#P#%|y^G4HrWxD$iEtp32($vA=I7y^BI@C#<*Tx?(z&FO`A+W#P2flMO@URitv zu6h51pV5+*#)PuZ%-1UKYVHK}0b5Ya3+|a~7HR(t8WXSh)*zYjv?lE)8&+3x%Tixs z$^C$hM|r5oN=R`30Pba3rquIU#@dN0GQk3m^+BaAYwJPW_uHGCWQ9KE=Pnp=-){`I zlClTHW8?en2AnO#LcP{qNyZbaXm#iMED)?vm$<91eH}b9OqeM>~eX$uR6$3kr2ceJiM&xHV`QmKzLjg3$`lA zUNHKM2UFwvOcnKLBEq@JI(hqy6X97f9M+x%yT_a(9@$gBTb5A)EBBbIi8K|m^8=~z zJ(D#no=r?G1KGLT=uo}ZT=OFl+(X0IDT)snG&R29N1_)(6DymENkM`ND=Hvf?l!yF zLk*8Jv zT_#!}j93D3CFJYln;FM^w?0#3bAoDe>(IX>-@Q#%~O) z3+Y7FliQPo(8SI&RNNN>DHWa}z{HwbIl304W=mv1PaR&JEuMBl&V<;Tzw@T5kmK3@NB{rdXsdabs*_GoQsZBDIT-BW$6dPB8Q zc^ohP=a_zg=mULKj(Mu-K=TO(W+2@#rXxSxh=@6a?Mc;yDOC{ENiSrpu{ z<%Sb_5>i5BHD=HVu~?an8MMy1 zYxQx|l=cF0ZpmUD?CkVZOIg8W*g0P<_=-jx??Z4;9f%M)r-VixLbOf#>XoIHizq0A$sX(6_s(s)nu4ll|TNr*2XTxp{uKa>z$ zhum#Nkg2#nCClaZSV$RhiInCBYi=^La&q~4Q}LT4AXgfD<}*&XJuu_czM_=ost>K( z;hrLz5!V^Ux!bqiW*k0}tA*2@MXo?)s6(%o>!!v;;My@xa0%{P4`(=8;7cVDTpnC0 zMj+Dk9gFP}f?JIX3CpLc_pOuutPjFEv6LTEp{bVmvH(m6CyWM`>jjg^S8}nQ*nPYp&L?iCeYUfR z`X6_Z(V&Wgqwb*H(B@-m_T>5<3G7(rz23nu1e#F@M%h7eMff%pjm;|XH9yTmjn@g|0* z^%LYY{nH`{0xfL6fXGX@(|M;AGw#!tmtc?+B3!`|2)~|UUN70@VnRt+VLk<&MlV8+ zne#${s8q>e>xOtNvb18D*YmS9D?XEi_$oVGx-qfmaiPze7{27f^I>rBkH1DE+&n^T z!*Ok7E*KE6Sx0YJh#t{pZuh2OUb~DSLl+YF^5fC3*!S+$^U8yWlm7@VC%orDkkQ|D zprlUo?iK5*#Zo*Q*y<&+0 z;ac1%tx(6HNq^T{m1=2j`H}LHa;>tnG@-P+d}?_Yviq}fyZ>g-qMjK&h3@U>@qYq( z1CBQSzHxP9R->~%R$p7c244jz)yDCafa`0s<8FYDRF@>b+R3$(>r32Uu%Y>`nkT|_@2xW_tSOF7biC`|h?}`U6b@ILu&u=3qa9j05)1cE2V%|4 z)(F>|AjATglvXrcOGk)sMr(xYeoXJWsqmgD5xK>Yx8{Rs6%fP7fF-lK#W_i`5%(bh z)`|}|(u-|dII2B4!JPcgCnqZp<`IHM@UlsL`gMV=E)Wmk1yu_^n4>~8zGi%GKMlco zaNKb%X)rIHOxz#frMH+B%k2N^tNF7F{Ay;V&`@vH+~OMQ^Y+yGfur+AN`RExRi zr3t~%0h)@4ZX>!NZ$Vu*DWI;nRIizPSjBXNFBID|TpSbG=RpwvLzlFJpcwi_ThPm6 z=vXo2HiQ@4|H=x@zQ}{di_EXUWSJ3mPdIU14&oh`X0{u{urxtM@KRFW@#j+dqCpo5 z5&AdTYZEWqp{S4WwK1{RKc^?=#wBQCaBR3Qgx5v=uOWn$@Zy1x6X8@lgq6kW3OujL zLQu_gb5Id%Y(cCf<(y}z$OZJ}@?W z1oKWwy*9%;O{fH`gcQ;7lV#gzVz1q*AtG-I_HmbC3k=BC&uEB9146%W`E_j`P3*N# zYlugQaV=%(CYsnbo7IskhByunepFHaj59t{lz_0?A5CnlEo0;b6X1muz|}86HlL}f zc-W`=GGo8{TWZlf4e>1UG?X8?Hb1P52Mciqr@Z{95G6h=%Ps*?y@aXl!O@Z-e?(a1 z!xw@WvoEYG=7kafDgWI|G!>E31_ZXXd50zHzuVTOj4^Iv2tQn){=2be{%s5d98%XQ zq&l8m#_VxZ0fg@c*uU#Q&577AfM8cLxnR9^+5j$BOF*bLLnzEnxH_p+W=rM~lW`$r z_1>76%{+<~xxQdt<46gm`m&Cl`1n?Y(0$rr%BvArm=DvocOm$CaE^9l&}s^En-g>dDu zN8bvT+>aJoaSxLu^=0I&RuCLW%-sVoBS&k9j~B$r-Q7ZpJn{(*@mOTkb+htm+FoOP%BHL}4ly5K!WN_6F8^H#3aBzR2vbuarX>aM-(w9obuCcCa@$$m23l|hB zg|)%`#REIu>D<%#51soLU+wy{${D4VmHo^A#(%--t$*tK><96-^`~P-Q**bGe61r+ zM42_zgl8=<6m8z55yT%gRMb3F;qA6&#fz$@Y(zdYELa6^0_~+ctybUNMtV zd_w&|4;3`44`|TUDbcIk@&MaN6EJyzhEdV{dWE4V>BLTv4Nu~FlAi5u|F07f+eU1k z69*r3h9qm1v)@ZP6mxhZ3`M50&7q*`^peNnBkH_V9jb?7+72p|P)!!TJMS)pIfVbf z79K-gsE5kiy)Nb*UZ|_RQPiH`ln}VzyND zwALr_!wl!SwLKZib&Mhq{}hHws;E80kr`mVC*)*`2c%#zTW(#6hJ9S&Hs>SLN4H_7 zhY;<-hQXYjpfZL+6Mkcs*dEMm)=C;mGM5{TN{HLsvtSU{7k3d!cPXLX=1`awE<;Qc zmq8#VgOo=gWZ`h7OE*q#^#O5|iMp1Wh9bAR?LA1%*XQ--Oc>P;L{6kFp*rZ+Bo?T@1x`R0u6Gw@%M#K#^A0ERkN>=)W}K5<%1L)YA=e zJ0F-XY?(_OyS8A%R#K^DL@DZ-6_ z6xl?jSGS$5Ms+mI0L; + +public static class BatteryTty +{ + const String DevDir = "/dev"; + + public static async Task GetTty() + { + Console.WriteLine("searching battery connection..."); + + return await GetTtyFromDBus() + ?? await GetTtyFromDev(); + } + + private static async Task GetTtyFromDev() + { + var ttys = await FileSystem + .Local + .GetFiles(DevDir, FileType.CharacterDevice); + + var candidateTtys = ttys + .Where(f => f.StartsWith(DevDir + "/ttyUSB")) + .NotNull() + .ToList(); + + if (!candidateTtys.Any()) + { + Console.WriteLine("no USB converter cable attached!"); + return null; + } + + if (candidateTtys.Count == 1) + return candidateTtys[0]; + + return "Select TTY:".ChooseFrom(candidateTtys); + } + + private static async Task GetTtyFromDBus() + { + var tty = await LsDBus + .ExecuteBufferedAsync() + .Select(ParseBatteryTty); + + if (tty == null) + return null; + + Console.WriteLine("found battery on DBus"); + + return $"{DevDir}/{tty}"; + } + + private static CommandTask GetNodes(String tty) + { + const String defaultArgs = "--system --print-reply --type=method_call / com.victronenergy.BusItem.GetValue"; + + return DBusSend + .AppendArgument($"--dest=com.victronenergy.battery.{tty}") + .AppendArgument(defaultArgs) + .ExecuteBufferedAsync() + .Select(ParseBatteryNodes); + } + + private static Nodes ParseBatteryNodes(BufferedCommandResult result) + { + return result + .StandardOutput + .Split(Environment.NewLine) + .Where(l => l.Contains("_Battery/")) + .Select(l => l.Split('/')[1]) + .Where(n => Byte.TryParse(n, out _)) + .Select(Byte.Parse) + .Distinct() + .OrderBy(n => n) + .ToList(); + } + + private static String? ParseBatteryTty(BufferedCommandResult result) + { + return result + .StandardOutput + .Split(Environment.NewLine) + .Where(l => l.Contains("com.victronenergy.battery.")) + .SelectMany(l => l.Split('.')) + .LastOrDefault(); + } + +} + diff --git a/csharp/App_backup/BmsTunnel/BmsTunnel.cs b/csharp/App_backup/BmsTunnel/BmsTunnel.cs new file mode 100644 index 000000000..d7f455996 --- /dev/null +++ b/csharp/App_backup/BmsTunnel/BmsTunnel.cs @@ -0,0 +1,191 @@ +using System.IO.Ports; +using System.Text; +using CliWrap.Buffered; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.BmsTunnel; + + +public class BmsTunnel : IDisposable +{ + private SerialPort SerialPort { get; } + + public String Tty { get; } + public Byte Node { get; set; } + + private const Int32 BaudRate = 115200; + private const Int32 DataBits = 8; + private const Parity Parity = System.IO.Ports.Parity.Even; + private const StopBits StopBits = System.IO.Ports.StopBits.One; + + private const Int32 CrcLength = 2; + + private const Byte TunnelCode = 0x41; + private const String CrcError = "?? CRC FAILED"; + + public BmsTunnel(String tty, Byte node) + { + Tty = tty; + Node = node; + + StopSerialStarter(); + + SerialPort = new SerialPort(Tty, BaudRate, Parity, DataBits, StopBits); + SerialPort.ReadTimeout = 100; + + SerialPort.Open(); + } + + + private IEnumerable Header + { + get + { + yield return Node; + yield return TunnelCode; + } + } + + private static IEnumerable NewLine + { + get + { + yield return 0x0D; + } + } + + + public IEnumerable SendCommand(String command) + { + var reply = SendSingleCommand(command); + + while (!reply.StartsWith("??")) + { + yield return reply; + + if (reply.EndsWith("chars answered. Ready.")) + yield break; + + reply = GetMore(); + } + + if (reply == CrcError) + { + yield return ""; + yield return CrcError.Substring(3); + } + } + + private String GetMore() => SendSingleCommand(""); + + + private String SendSingleCommand(String command) + { + var payload = Header + .Concat(CommandToBytes(command)) + .ToList(); + + var crc = CalcCrc(payload); + + payload.AddRange(crc); + + SerialPort.Write(payload.ToArray(), 0, payload.Count); + + var response = Enumerable + .Range(0, 255) + .Select(ReadByte) + .TakeWhile(b => b >= 0) + .Select(Convert.ToByte) + .ToArray(); + + if (!CheckCrc(response)) + { + // TODO: this should go into outer loop instead of returning magic value CrcError + + //Console.WriteLine(BitConverter.ToString(response).Replace("-", " ")); + return CrcError; + } + + return response + .Skip(2) + .TakeWhile(b => b != 0x0D) + .ToArray() + .Apply(Encoding.ASCII.GetString); + + Int32 ReadByte(T _) + { + try + { + return SerialPort.ReadByte(); + } + catch (TimeoutException) + { + return -1; + } + } + } + + private static IReadOnlyList CalcCrc(IEnumerable data) + { + UInt16 crc = 0xFFFF; + + foreach (var b in data) + { + crc ^= b; + + for (var bit = 0; bit < 8; bit++) + { + var bit0 = (crc & 0x0001) != 0; + crc >>= 1; + if (bit0) crc ^= 0xA001; + } + } + + var hi = 0xFF & crc; + var lo = (crc >> 8) & 0xFF; + + return new[] {(Byte) hi, (Byte) lo}; // big endian + } + + private static Boolean CheckCrc(IReadOnlyList data) + { + var expectedCrc = data.SkipLast(CrcLength).Apply(CalcCrc); + var actualCrc = data.TakeLast(CrcLength); + + return actualCrc.SequenceEqual(expectedCrc); + } + + private static IEnumerable CommandToBytes(String command) + { + if (command == "") + return Enumerable.Empty(); + + return command + .Apply(Encoding.ASCII.GetBytes) + .Concat(NewLine); + } + + private void StopSerialStarter() + { + CliPrograms.StopTty + .WithArguments(Tty) + .ExecuteBufferedAsync() + .Task + .Wait(3000); + } + + private void StartSerialStarter() + { + CliPrograms.StartTty + .WithArguments(Tty) + .ExecuteBufferedAsync() + .Task + .Wait(3000); + } + + public void Dispose() + { + SerialPort.Dispose(); + StartSerialStarter(); + } +} \ No newline at end of file diff --git a/csharp/App_backup/BmsTunnel/BmsTunnel.csproj b/csharp/App_backup/BmsTunnel/BmsTunnel.csproj new file mode 100644 index 000000000..886f107fd --- /dev/null +++ b/csharp/App_backup/BmsTunnel/BmsTunnel.csproj @@ -0,0 +1,18 @@ + + + + + + InnovEnergy.App.BmsTunnel + + + + + + + + + + + + diff --git a/csharp/App_backup/BmsTunnel/CliPrograms.cs b/csharp/App_backup/BmsTunnel/CliPrograms.cs new file mode 100644 index 000000000..c27df92df --- /dev/null +++ b/csharp/App_backup/BmsTunnel/CliPrograms.cs @@ -0,0 +1,11 @@ +using CliWrap; + +namespace InnovEnergy.App.BmsTunnel; + +public static class CliPrograms +{ + public static Command LsDBus { get; } = Cli.Wrap("/opt/innovenergy/scripts/lsdbus"); + public static Command DBusSend { get; } = Cli.Wrap("/usr/bin/dbus-send"); + public static Command StartTty { get; } = Cli.Wrap("/opt/victronenergy/serial-starter/start-tty.sh"); + public static Command StopTty { get; } = Cli.Wrap("/opt/victronenergy/serial-starter/stop-tty.sh"); +} \ No newline at end of file diff --git a/csharp/App_backup/BmsTunnel/Program.cs b/csharp/App_backup/BmsTunnel/Program.cs new file mode 100644 index 000000000..b9968d63e --- /dev/null +++ b/csharp/App_backup/BmsTunnel/Program.cs @@ -0,0 +1,85 @@ +// dotnet publish BmsTunnel.csproj -c Release -r linux-arm -p:PublishSingleFile=true --self-contained true && \ +// rsync -av bin/Release/net6.0/linux-arm/publish/ root@10.2.1.6:/home/root/tunnel && clear && \ +// ssh root@10.2.1.6 /home/root/tunnel/BmsTunnel + +using InnovEnergy.Lib.Utils; +using static System.String; + +namespace InnovEnergy.App.BmsTunnel; + +public static class Program +{ + private const Byte DefaultNode = 2; + + public static async Task Main(String[] args) + { + var tty = await BatteryTty.GetTty(); + + if (tty is null) + return 2; + + Console.WriteLine("\nstarting BMS tunnel\n"); + + using var tunnel = new BmsTunnel(tty, 2); + + ExplainNode(); + ExplainExit(); + + //Console.WriteLine(""); + + while (true) + { + //Console.WriteLine(""); + Console.Write($"node{tunnel.Node}> "); + + var cmd = Console.ReadLine()?.ToUpper().Trim(); + + if (IsNullOrEmpty(cmd)) + continue; + + if (cmd.StartsWith("/")) + { + var exit = ProcessLocalCommand(cmd); + if (exit) + break; + continue; + } + + tunnel.SendCommand(cmd).Skip(1).ForEach(Console.WriteLine); + } + + + Boolean ProcessLocalCommand(String cmd) + { + cmd = cmd.TrimStart('/').Trim().ToUpper(); + + if (cmd == "EXIT") + return true; + if (cmd.StartsWith("NODE ")) + ChangeNode(cmd); + else + Console.WriteLine("unrecognized command"); + + return false; + } + + return 0; + + + void ChangeNode(String cmd) + { + var ndStr = cmd[5..].Trim(); + + if (!Byte.TryParse(ndStr, out var newNode)) + { + ExplainNode(); + return; + } + + tunnel.Node = newNode; + } + } + + private static void ExplainExit() => Console.WriteLine("/exit exit bms cli"); + private static void ExplainNode() => Console.WriteLine("/node change to node number "); +} \ No newline at end of file diff --git a/csharp/App_backup/BmsTunnel/debug.sh b/csharp/App_backup/BmsTunnel/debug.sh new file mode 100644 index 000000000..09c8fa1ff --- /dev/null +++ b/csharp/App_backup/BmsTunnel/debug.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +csproj="BmsTunnel.csproj" +exe="BmsTunnel" +remote="10.2.1.6" +#remote="10.2.2.152" + +netVersion="net6.0" +platform="linux-arm" +config="Release" +host="root@$remote" +dir="/data/innovenergy/$exe" + +set -e + +dotnet publish "$csproj" -c $config -r $platform -p:SuppressTrimmAnalysisWarnings=true -p:PublishSingleFile=true -p:PublishTrimmed=true -p:DebugType=None -p:DebugSymbols=false --self-contained true +rsync -av "bin/$config/$netVersion/$platform/publish/" "$host:$dir" + +clear +ssh "$host" "$dir/$exe" + \ No newline at end of file diff --git a/csharp/App_backup/BmsTunnel/parameters.txt b/csharp/App_backup/BmsTunnel/parameters.txt new file mode 100644 index 000000000..e69de29bb diff --git a/csharp/App_backup/Collector/Collector.csproj b/csharp/App_backup/Collector/Collector.csproj new file mode 100644 index 000000000..d3842cf17 --- /dev/null +++ b/csharp/App_backup/Collector/Collector.csproj @@ -0,0 +1,19 @@ + + + + + + InnovEnergy.App.Collector + false + + + + + + + + + + + + diff --git a/csharp/App_backup/Collector/src/BatteryDataParser.cs b/csharp/App_backup/Collector/src/BatteryDataParser.cs new file mode 100644 index 000000000..38b3c4fc0 --- /dev/null +++ b/csharp/App_backup/Collector/src/BatteryDataParser.cs @@ -0,0 +1,343 @@ +using System.Net; +using System.Text; +using InnovEnergy.App.Collector.Influx; +using InnovEnergy.App.Collector.Records; +using InnovEnergy.App.Collector.Utils; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Utils.Net; +using Convert = System.Convert; + + +namespace InnovEnergy.App.Collector; + +using Data = IReadOnlyList; + +public static class BatteryDataParser +{ + + public static IReadOnlyList ParseDatagram(UdpDatagram datagram) + { + return ParseV3Datagram(datagram); + + // if (IsV4Payload(buffer)) + // return ParseV4Datagram(endPoint, buffer); + + // throw new Exception($"Wrong protocol header: Expected '{Settings.ProtocolV3}'"); + } + + private static Boolean IsV4Payload(Byte[] buffer) + { + return buffer + .ParseLengthValueEncoded() + .First() + .ToArray() + .Apply(Encoding.UTF8.GetString) + .Equals(Settings.ProtocolV4); + } + + private static Boolean IsV3Payload(IEnumerable buffer) + { + return buffer + .ToArray(Settings.ProtocolV3.Length) + .Apply(Encoding.UTF8.GetString) + .Equals(Settings.ProtocolV3); + } + + + // private static LineProtocolPayload ParseV4Datagram(IPEndPoint endPoint, Byte[] buffer) + // { + // var timeOfArrival = DateTime.UtcNow; // influx wants UTC + // + // BatteryDataParserV4.ParseV4Datagram(endPoint, buffer); + // return new LineProtocolPayload(); + // } + + private static IReadOnlyList ParseV3Datagram(UdpDatagram datagram) + { + var timeOfArrival = DateTime.UtcNow; + + var data = datagram + .Payload + .ToArray() + .Apply(Encoding.UTF8.GetString) + .Split('\n'); + + data.ParseProtocolVersion().Apply(CheckProtocolId); + + var installationName = data.ParseInstallationName(); + + return ParseBatteryRecords(data, installationName, timeOfArrival, datagram.EndPoint); + } + + + private static String ParseString(this Data data, Int32 i) => data[i].Trim(); + private static UInt16 ParseUInt16(this Data data, Int32 i) => UInt16.Parse(ParseString(data, i)); + + private static UInt16 ParseUInt16Register(this Data data, Int32 register) + { + var i = register.RegToIndex(); + return data.ParseUInt16(i); + } + + private static UInt32 ParseUInt32Register(this Data data, Int32 register) + { + var lo = ParseUInt16Register(data, register); + var hi = ParseUInt16Register(data, register + 1); + + return Convert.ToUInt32(((hi << 16) | lo) & UInt32.MaxValue); + } + + private static UInt64 ParseUInt64Register(this Data data, Int32 register) + { + return Enumerable + .Range(register, 4) + .Reverse() + .Select(data.ParseUInt16Register) + .Aggregate(0ul, (a, b) => a << 16 | b); + } + + private static Decimal ParseDecimalRegister(this Data data, + Int32 register, + Decimal scaleFactor = 1, + Decimal offset = 0) + { + var i = register.RegToIndex(); + Int32 n = data.ParseUInt16(i); + + if (n >= 0x8000) + n -= 0x10000; // fiamm stores their integers signed AND with sign-offset @#%^&! + + return (Convert.ToDecimal(n) + offset) * scaleFactor; // according fiamm doc + } + + private static Int32 RegToIndex(this Int32 register) => register - 992; + + + private static Leds ParseLeds(this Data data, String installation, String batteryId) + { + var ledBitmap = ParseUInt16Register(data, 1004); + LedState Led(Int32 n) => (LedState) (ledBitmap >> (n * 2) & 0b11); + + return new Leds + { + Installation = installation, + BatteryId = batteryId, + + Green = Led(0), + Amber = Led(1), + Blue = Led(2), + Red = Led(3), + }; + } + + + private static IoStatus ParseIoStatus(this Data data, String installation, String batteryId) + { + var ioStatusBitmap = data.ParseUInt16Register(1013); + Boolean IoStatus(Int32 b) => (ioStatusBitmap >> b & 1) > 0; + + return new IoStatus + { + Installation = installation, + BatteryId = batteryId, + + MainSwitchClosed = IoStatus(0), + AlarmOutActive = IoStatus(1), + InternalFanActive = IoStatus(2), + VoltMeasurementAllowed = IoStatus(3), + AuxRelay = IoStatus(4), + RemoteState = IoStatus(5), + HeatingOn = IoStatus(6), + }; + } + + private static Warnings ParseWarnings(this Data data, String installation, String batteryId) + { + var warningsBitmap = data.ParseUInt64Register(1005); + Boolean Warning(Int32 b) => (warningsBitmap >> b & 1ul) > 0; + + return new Warnings + { + Installation = installation, + BatteryId = batteryId, + + TaM1 = Warning(1), + TbM1 = Warning(4), + VBm1 = Warning(6), + VBM1 = Warning(8), + IDM1 = Warning(10), + vsM1 = Warning(24), + iCM1 = Warning(26), + iDM1 = Warning(28), + MID1 = Warning(30), + BLPW = Warning(32), + Ah_W = Warning(35), + MPMM = Warning(38), + TCMM = Warning(39), + TCdi = Warning(40), + LMPW = Warning(44) + }; + } + + private static Alarms ParseAlarms(this Data data, String installation, String batteryId) + { + var alarmsBitmap = data.ParseUInt64Register(1009); + Boolean Alarm(Int32 b) => (alarmsBitmap >> b & 1ul) > 0; + + return new Alarms + { + Installation = installation, + BatteryId = batteryId, + + Tam = Alarm(0), + TaM2 = Alarm(2), + Tbm = Alarm(3), + TbM2 = Alarm(5), + VBm2 = Alarm(7), + VBM2 = Alarm(9), + IDM2 = Alarm(11), + ISOB = Alarm(12), + MSWE = Alarm(13), + FUSE = Alarm(14), + HTRE = Alarm(15), + TCPE = Alarm(16), + CME = Alarm(18), + HWFL = Alarm(19), + HWEM = Alarm(20), + ThM = Alarm(21), + vsm1 = Alarm(22), + vsm2 = Alarm(23), + vsM2 = Alarm(25), + iCM2 = Alarm(27), + iDM2 = Alarm(29), + MID2 = Alarm(31), + CCBF = Alarm(33), + AhFL = Alarm(34), + TbCM = Alarm(36), + HTFS = Alarm(42), + DATA = Alarm(43), + LMPA = Alarm(45), + HEBT = Alarm(46), + }; + } + + + private static BatteryStatus ParseBatteryStatus(this Data data, + String installation, + String batteryId, + Decimal temperature, + Warnings warnings, + Alarms alarms, + DateTime lastSeen, + IPEndPoint endPoint) + { + var activeWarnings = Active(warnings); + var activeAlarms = Active(alarms); + + return new BatteryStatus + { + InstallationName = installation, + BatteryId = batteryId, + + HardwareVersion = data.ParseString(3), + FirmwareVersion = data.ParseString(4), + BmsVersion = data.ParseString(5), + AmpereHours = data.ParseUInt16(6), + + Soc = data.ParseDecimalRegister(1053, 0.1m), + Voltage = data.ParseDecimalRegister(999, 0.01m), + Current = data.ParseDecimalRegister(1000, 0.01m, -10000m), + BusVoltage = data.ParseDecimalRegister(1001, 0.01m), + Temperature = temperature, + + RtcCounter = data.ParseUInt32Register(1050), + + IpAddress = endPoint.Address.ToString(), + Port = endPoint.Port, + + // stuff below really should be done by Grafana/InfluxDb, but not possible (yet) + // aka hacks to get around limitations of Grafana/InfluxDb + + NumberOfWarnings = activeWarnings.Count, + NumberOfAlarms = activeAlarms.Count, + + WarningsBitmap = data.ParseUInt64Register(1005), + AlarmsBitmap = data.ParseUInt64Register(1009), + + LastSeen = lastSeen.ToInfluxTime() + }; + + static IReadOnlyCollection Active(BatteryRecord record) => record + .GetFields() + .Where(f => f.value is true) + .Select(f => f.key) + .ToList(); + + } + + + private static Temperatures ParseTemperatures(this Data data, String installation, String batteryId) + { + return new Temperatures + { + Installation = installation, + BatteryId = batteryId, + + Battery = data.ParseDecimalRegister(1003, 0.1m, -400m), + Board = data.ParseDecimalRegister(1014, 0.1m, -400m), + Center = data.ParseDecimalRegister(1015, 0.1m, -400m), + Lateral1 = data.ParseDecimalRegister(1016, 0.1m, -400m), + Lateral2 = data.ParseDecimalRegister(1017, 0.1m, -400m), + CenterHeaterPwm = data.ParseDecimalRegister(1018, 0.1m), + LateralHeaterPwm = data.ParseDecimalRegister(1019, 0.1m), + }; + } + + + private static String CheckProtocolId(String ascii) + { + var protocolId = ascii.Substring(0, Settings.ProtocolV3.Length); + if (protocolId != Settings.ProtocolV3) + throw new Exception($"Wrong protocol header: Expected '{Settings.ProtocolV3}' but got '{protocolId}'"); + + return protocolId; + } + + + private static IReadOnlyList ParseBatteryRecords(Data data, + String installation, + DateTime lastSeen, + IPEndPoint endPoint) + { + var batteryId = data.ParseBatteryId(); + var warnings = data.ParseWarnings (installation, batteryId); + var alarms = data.ParseAlarms (installation, batteryId); + var leds = data.ParseLeds (installation, batteryId); + var temperatures = data.ParseTemperatures (installation, batteryId); + var ioStatus = data.ParseIoStatus (installation, batteryId); + + var batteryStatus = data.ParseBatteryStatus(installation, + batteryId, + temperatures.Battery, + warnings, + alarms, + lastSeen, + endPoint); + + return new BatteryRecord[] + { + batteryStatus, + temperatures, + leds, + ioStatus, + warnings, + alarms + }; + } + + + private static String ParseProtocolVersion (this Data data) => data.ParseString(0); + private static String ParseInstallationName(this Data data) => data.ParseString(1); + private static String ParseBatteryId (this Data data) => data.ParseString(2); + +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/BatteryDataParserV4.cs b/csharp/App_backup/Collector/src/BatteryDataParserV4.cs new file mode 100644 index 000000000..632eb926e --- /dev/null +++ b/csharp/App_backup/Collector/src/BatteryDataParserV4.cs @@ -0,0 +1,365 @@ +using System.Net; +using System.Text; +using InnovEnergy.App.Collector.Influx; +using InnovEnergy.App.Collector.Records; +using InnovEnergy.App.Collector.Utils; +using InnovEnergy.Lib.Utils; +using Convert = System.Convert; + + +// NOT (YET) USED + +namespace InnovEnergy.App.Collector; + +using Data = IReadOnlyList; + +public static class BatteryDataParserV4 +{ + // public static LineProtocolPayload ParseV4Datagram(IPEndPoint endPoint, Byte[] buffer) + // { + // var timeOfArrival = DateTime.UtcNow; // influx wants UTC + // + // Log.Info($"Got V4 datagram from {endPoint}"); + // + // using var enumerator = buffer.ParseLengthValueEncoded().GetEnumerator(); + // + // var protocolVersion = enumerator + // .Next() + // .ToArray() + // .Apply(Encoding.UTF8.GetString) + // .Equals(Settings.ProtocolV4); + // + // var nBatteries = enumerator.NextByte(); + // + // foreach (var _ in Enumerable.Range(0, nBatteries)) + // { + // ParseBattery(enumerator); + // } + // + // + // return new LineProtocolPayload(); + // } + + private static void ParseBattery(IEnumerator> e) + { + // var hardwareVersion = e.NextString(); + // var firmwareVersion = e.NextString(); + // var bmsVersion = e.NextString(); + // + // var modbusData = e.Next(); + // + // Int32 ReadRegisterAtIndex(Int32 index) => (modbusData[index * 2] << 8) + modbusData[index * 2 + 1]; + // Int32 ReadRegister(Int32 register) => ReadRegisterAtIndex(register - 999); + // + // Double ReadDouble(Int32 register, Double scaleFactor = 1, Double offset = 0) + // { + // var value = ReadRegisterAtIndex(register - 999); + // + // if (value > 0x8000) + // value -= 0x10000; // fiamm stores their integers signed AND with sign-offset @#%^&! + // + // return (value + offset) * scaleFactor; + // } + + // TODO + } + + private static Byte NextByte(this IEnumerator> enumerator) + { + return enumerator.Next().Single(); + } + + private static String NextString(this IEnumerator> enumerator) + { + return enumerator + .Next() + .ToArray() + .Apply(Encoding.UTF8.GetString); + } + + + private static String ParseString(this Data data, Int32 i) => data[i].Trim(); + private static UInt16 ParseUInt16(this Data data, Int32 i) => UInt16.Parse(ParseString(data, i)); + + private static UInt16 ParseUInt16Register(this Data data, Int32 register) + { + var i = register.RegToIndex(); + return data.ParseUInt16(i); + } + + private static UInt32 ParseUInt32Register(this Data data, Int32 register) + { + var lo = ParseUInt16Register(data, register); + var hi = ParseUInt16Register(data, register + 1); + + return Convert.ToUInt32(lo | (hi << 16)); + } + + private static UInt64 ParseUInt64Register (this Data data, Int32 register) + { + return Enumerable + .Range(0, 4) + .Select(i => Convert.ToUInt64(data.ParseUInt16Register(register + i)) << (i * 16)) + .Aggregate(0ul, (a, b) => a + b); // Sum() does not work for UInt64 :( + } + + private static Decimal ParseDecimalRegister(this Data data, + Int32 register, + Decimal scaleFactor = 1, + Decimal offset = 0) + { + var i = register.RegToIndex(); + UInt32 n = data.ParseUInt16(i); + + if (n >= 0x8000) + n -= 0x10000; // fiamm stores their integers signed AND with sign-offset @#%^&! + + return (Convert.ToDecimal(n) + offset) * scaleFactor; // according fiamm doc + } + + private static Int32 RegToIndex(this Int32 register) => register - 992; + + + private static Leds ParseLeds(this Data data, String installation, String batteryId) + { + var ledBitmap = ParseUInt16Register(data, 1004); + LedState Led(Int32 n) => (LedState) (ledBitmap >> (n * 2) & 0b11); + + return new Leds + { + Installation = installation, + BatteryId = batteryId, + + Green = Led(0), + Amber = Led(1), + Blue = Led(2), + Red = Led(3), + }; + } + + + private static IoStatus ParseIoStatus(this Data data, String installation, String batteryId) + { + var ioStatusBitmap = data.ParseUInt16Register(1013); + Boolean IoStatus(Int32 b) => (ioStatusBitmap >> b & 1) > 0; + + return new IoStatus + { + Installation = installation, + BatteryId = batteryId, + + MainSwitchClosed = IoStatus(0), + AlarmOutActive = IoStatus(1), + InternalFanActive = IoStatus(2), + VoltMeasurementAllowed = IoStatus(3), + AuxRelay = IoStatus(4), + RemoteState = IoStatus(5), + HeatingOn = IoStatus(6), + }; + } + + private static Warnings ParseWarnings(this Data data, String installation, String batteryId) + { + var warningsBitmap = data.ParseUInt64Register(1005); + Boolean Warning(Int32 b) => (warningsBitmap >> b & 1ul) > 0; + + return new Warnings + { + Installation = installation, + BatteryId = batteryId, + + TaM1 = Warning(1), + TbM1 = Warning(4), + VBm1 = Warning(6), + VBM1 = Warning(8), + IDM1 = Warning(10), + vsM1 = Warning(24), + iCM1 = Warning(26), + iDM1 = Warning(28), + MID1 = Warning(30), + BLPW = Warning(32), + Ah_W = Warning(35), + MPMM = Warning(38), + TCMM = Warning(39), + TCdi = Warning(40), + LMPW = Warning(44) + }; + } + + private static Alarms ParseAlarms(this Data data, String installation, String batteryId) + { + var alarmsBitmap = data.ParseUInt64Register(1009); + Boolean Alarm(Int32 b) => (alarmsBitmap >> b & 1ul) > 0; + + return new Alarms + { + Installation = installation, + BatteryId = batteryId, + + Tam = Alarm(0), + TaM2 = Alarm(2), + Tbm = Alarm(3), + TbM2 = Alarm(5), + VBm2 = Alarm(7), + VBM2 = Alarm(9), + IDM2 = Alarm(11), + ISOB = Alarm(12), + MSWE = Alarm(13), + FUSE = Alarm(14), + HTRE = Alarm(15), + TCPE = Alarm(16), + CME = Alarm(18), + HWFL = Alarm(19), + HWEM = Alarm(20), + ThM = Alarm(21), + vsm1 = Alarm(22), + vsm2 = Alarm(23), + vsM2 = Alarm(25), + iCM2 = Alarm(27), + iDM2 = Alarm(29), + MID2 = Alarm(31), + CCBF = Alarm(33), + AhFL = Alarm(34), + TbCM = Alarm(36), + HTFS = Alarm(42), + DATA = Alarm(43), + LMPA = Alarm(45), + HEBT = Alarm(46), + }; + } + + + private static BatteryStatus ParseBatteryStatus(this Data data, + String installation, + String batteryId, + Decimal temperature, + Warnings warnings, + Alarms alarms, + DateTime lastSeen, + IPEndPoint endPoint) + { + var activeWarnings = Active(warnings); + var activeAlarms = Active(alarms); + + return new BatteryStatus + { + InstallationName = installation, + BatteryId = batteryId, + + HardwareVersion = data.ParseString(3), + FirmwareVersion = data.ParseString(4), + BmsVersion = data.ParseString(5), + AmpereHours = data.ParseUInt16(6), + + Soc = data.ParseDecimalRegister(1053, 0.1m), + Voltage = data.ParseDecimalRegister(999, 0.01m), + Current = data.ParseDecimalRegister(1000, 0.01m, -10000m), + BusVoltage = data.ParseDecimalRegister(1001, 0.01m), + Temperature = temperature, + + RtcCounter = data.ParseUInt32Register(1050), + + IpAddress = endPoint.Address.ToString(), + Port = endPoint.Port, + + // stuff below really should be done by Grafana/InfluxDb, but not possible (yet) + // aka hacks to get around limitations of Grafana/InfluxDb + + NumberOfWarnings = activeWarnings.Count, + NumberOfAlarms = activeAlarms.Count, + + WarningsBitmap = data.ParseUInt64Register(1005), + AlarmsBitmap = data.ParseUInt64Register(1009), + + LastSeen = lastSeen.ToInfluxTime() + }; + + static IReadOnlyCollection Active(BatteryRecord record) => record + .GetFields() + .Where(f => f.value is Boolean b && b) + .Select(f => f.key) + .ToList(); + + } + + + private static Temperatures ParseTemperatures(this Data data, String installation, String batteryId) + { + return new Temperatures + { + Installation = installation, + BatteryId = batteryId, + + Battery = data.ParseDecimalRegister(1003, 0.1m, -400m), + Board = data.ParseDecimalRegister(1014, 0.1m, -400m), + Center = data.ParseDecimalRegister(1015, 0.1m, -400m), + Lateral1 = data.ParseDecimalRegister(1016, 0.1m, -400m), + Lateral2 = data.ParseDecimalRegister(1017, 0.1m, -400m), + CenterHeaterPwm = data.ParseDecimalRegister(1018, 0.1m), + LateralHeaterPwm = data.ParseDecimalRegister(1019, 0.1m), + }; + } + + + + // private static LineProtocolPayload CreatePayload(params LineProtocolPoint[] points) => + // CreatePayload((IEnumerable) points); + // + // + // private static LineProtocolPayload CreatePayload(IEnumerable points) + // { + // var payload = new LineProtocolPayload(); + // + // foreach (var point in points) + // payload.Add(point); + // + // return payload; + // } + + private static String CheckProtocolId(String ascii) + { + var protocolId = ascii.Substring(0, Settings.ProtocolV3.Length); + if (protocolId != Settings.ProtocolV3) + throw new Exception($"Wrong protocol header: Expected '{Settings.ProtocolV3}' but got '{protocolId}'"); + + return protocolId; + } + + + private static IReadOnlyList ParseBatteryRecords(Data data, + String installation, + DateTime lastSeen, + IPEndPoint endPoint) + { + var batteryId = data.ParseBatteryId(); + var warnings = data.ParseWarnings (installation, batteryId); + var alarms = data.ParseAlarms (installation, batteryId); + var leds = data.ParseLeds (installation, batteryId); + var temperatures = data.ParseTemperatures (installation, batteryId); + var ioStatus = data.ParseIoStatus (installation, batteryId); + + var batteryStatus = data.ParseBatteryStatus(installation, + batteryId, + temperatures.Battery, + warnings, + alarms, + lastSeen, + endPoint); + + return new BatteryRecord[] + { + batteryStatus, + temperatures, + leds, + ioStatus, + warnings, + alarms + }; + } + + + private static String ParseProtocolVersion (this Data data) => data.ParseString(0); + private static String ParseInstallationName(this Data data) => data.ParseString(1); + private static String ParseBatteryId (this Data data) => data.ParseString(2); + +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Influx/FieldAttribute.cs b/csharp/App_backup/Collector/src/Influx/FieldAttribute.cs new file mode 100644 index 000000000..58dc3d0ba --- /dev/null +++ b/csharp/App_backup/Collector/src/Influx/FieldAttribute.cs @@ -0,0 +1,21 @@ +using static System.AttributeTargets; + +#nullable disable + +namespace InnovEnergy.App.Collector.Influx; + +[AttributeUsage(Property)] +public class FieldAttribute : Attribute +{ + public FieldAttribute(Type type) + { + Type = type; + } + + public FieldAttribute() + { + Type = null; + } + + public Type Type { get; } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Influx/InfluxRecord.cs b/csharp/App_backup/Collector/src/Influx/InfluxRecord.cs new file mode 100644 index 000000000..8b67c547d --- /dev/null +++ b/csharp/App_backup/Collector/src/Influx/InfluxRecord.cs @@ -0,0 +1,92 @@ +using System.Text; +using InnovEnergy.App.Collector.Utils; +using InnovEnergy.Lib.Utils; +using static System.Globalization.CultureInfo; +using static InnovEnergy.App.Collector.Influx.LineProtocolSyntax; + +namespace InnovEnergy.App.Collector.Influx; + +public static class InfluxRecord +{ + public static IEnumerable<(String key, String value)> GetTags(this Object record) + { + return record + .GetProperties() + .Where(p => p.HasAttribute()) + .Where(p => p.IsReadable) + .Select(p => (key: p.Name, value: ConvertTag(p))); + + } + + public static IEnumerable<(String key, Object? value)> GetFields(this Object record) + { + return record + .GetProperties() + .Where(p => p.HasAttribute()) + .Where(p => p.IsReadable) + .Select(p => (key: p.Name, value: ConvertField(p))); + } + + + private static Object? ConvertField(Property p) + { + var value = p.Get(); + var type = p.GetAttributes().Single().Type; + + return type != null + ? Convert.ChangeType(value, type, InvariantCulture) + : value; + } + + private static String ConvertTag(Property p) + { + return p.Get()?.ToString()!; + } + + public static String Serialize(this Object record) + { + var sb = new StringBuilder(); + + record.GetType() // Measurement Name, TODO: NameAttribute + .Name + .Apply(EscapeName) + .Apply(sb.Append); + + var tags = record + .GetTags() + .Where(t => !String.IsNullOrEmpty(t.value)) + .OrderBy(t => t.key); + + foreach (var (key, value) in tags) + { + sb.Append(','); + sb.Append(EscapeName(key)); + sb.Append('='); + sb.Append(EscapeName(value)); + } + + var fieldDelimiter = ' '; + + foreach (var (key, value) in record.GetFields()) + { + sb.Append(fieldDelimiter); + fieldDelimiter = ','; + sb.Append(EscapeName(key)); + sb.Append('='); + sb.Append(FormatValue(value!)); + } + + + // TODO: timestamp handling + + // let the DB add the timestamp + + // if (point.UtcTimestamp != null) + // { + // sb.Append(' '); + // sb.Append(FormatTimestamp(point.UtcTimestamp.Value)); + // } + + return sb.ToString(); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Influx/LineProtocolSyntax.cs b/csharp/App_backup/Collector/src/Influx/LineProtocolSyntax.cs new file mode 100644 index 000000000..2c55b3725 --- /dev/null +++ b/csharp/App_backup/Collector/src/Influx/LineProtocolSyntax.cs @@ -0,0 +1,76 @@ +using System.Diagnostics.CodeAnalysis; +using static System.Globalization.CultureInfo; + +namespace InnovEnergy.App.Collector.Influx; + +internal static class LineProtocolSyntax +{ + private static readonly DateTime Origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + + public static String EscapeName(String nameOrKey) + { + return nameOrKey + .Replace("=", "\\=") + .Replace(" ", "\\ ") + .Replace(",", "\\,"); + } + + [SuppressMessage("ReSharper", "RedundantVerbatimPrefix")] + public static String FormatValue(Object value) + { + return value switch + { + String @string => FormatString (@string), + Single @single => FormatFloat (@single), + Double @double => FormatFloat (@double), + Int32 @int32 => FormatInteger (@int32), + UInt32 @uInt32 => FormatInteger (@uInt32), + Int64 @int64 => FormatInteger (@int64), + UInt64 @uInt64 => FormatInteger (@uInt64), + Decimal @decimal => FormatFloat (@decimal), + Int16 @int16 => FormatInteger (@int16), + UInt16 @uInt16 => FormatInteger (@uInt16), + SByte @sByte => FormatInteger (@sByte), + Byte @byte => FormatInteger (@byte), + Boolean @boolean => FormatBoolean (@boolean), + TimeSpan @timeSpan => FormatTimespan(@timeSpan), + _ => FormatString (value.ToString()) + }; + } + + private static String FormatInteger(T i) where T: IFormattable + { + return FormatFloat(i) + "i"; + } + + private static String FormatFloat(T f) where T: IFormattable + { + return f.ToString(format: null, InvariantCulture); + } + + private static String FormatTimespan(TimeSpan timeSpan) + { + return timeSpan + .TotalMilliseconds + .ToString(InvariantCulture); + } + + private static String FormatBoolean(Boolean b) => b ? "t" : "f"; + + + private static String FormatString(Object? o) + { + var s = o?.ToString(); + + return s is null + ? "" + : "\"" + s.Replace("\"", "\\\"") + "\""; + } + + public static String FormatTimestamp(DateTime utcTimestamp) + { + var t = utcTimestamp - Origin; + return (t.Ticks * 100L).ToString(InvariantCulture); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Influx/TagAttribute.cs b/csharp/App_backup/Collector/src/Influx/TagAttribute.cs new file mode 100644 index 000000000..db028d6a8 --- /dev/null +++ b/csharp/App_backup/Collector/src/Influx/TagAttribute.cs @@ -0,0 +1,8 @@ +using static System.AttributeTargets; + +namespace InnovEnergy.App.Collector.Influx; + +[AttributeUsage(Property)] +public class TagAttribute : Attribute +{ +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Program.cs b/csharp/App_backup/Collector/src/Program.cs new file mode 100644 index 000000000..9adb55306 --- /dev/null +++ b/csharp/App_backup/Collector/src/Program.cs @@ -0,0 +1,173 @@ +using System.Net.Sockets; +using System.Reactive.Concurrency; +using System.Reactive.Linq; +using System.Reactive.Subjects; +using System.Text.Json; +using InnovEnergy.App.Collector.Influx; +using InnovEnergy.App.Collector.Records; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Utils.Net; +using InnovEnergy.Lib.WebServer; +using static System.Text.Encoding; +using static InnovEnergy.Lib.Utils.ExceptionHandling; + + +namespace InnovEnergy.App.Collector; + +// dotnet publish Collector.csproj -c Release -r linux-x64 -p:PublishTrimmed=false -p:PublishSingleFile=true --self-contained true ; scp ./bin/Release/net6.0/linux-x64/publish/* ig@salidomo.innovenergy.ch:~/collector + +internal record BatteryData +( + String Installation, + String Battery, + Double EnergyCapacity, + Double EnergyStored, + Double Power +); + + +internal static class Program +{ + //private static readonly Logger Logger = new Logger(Settings.LoggingEndPoint); + + private static UdpClient _incomingSocket = new UdpClient(Settings.IncomingEndPoint); + private static UdpClient _dbSocket = new UdpClient(); + + private static readonly Subject Batteries = new Subject(); + private static readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions { WriteIndented = true }; + + public static void Main(String[] args) + { + Task.Run(ServeJsonStats); + + while (true) + ProcessDatagram(); + + // ReSharper disable once FunctionNeverReturns + } + + private static void ServeJsonStats() + { + var json = ""; + + Batteries.ObserveOn(TaskPoolScheduler.Default) + .Buffer(TimeSpan.FromSeconds(4)) + .Select(b => b.GroupBy(d => d.Battery).Select(d => d.First()).ToList()) + .Select(ToJson) + .Subscribe(j => json = j); + + HttpResponse ServeRequest(HttpRequest httpRequest) + { + return new HttpResponse + { + Content = json.Apply(UTF8.GetBytes), + ContentType = ContentType.ApplicationJson, + Headers = new[] { new HttpHeader("Access-Control-Allow-Origin", "*") } + }; + } + + WebServer.ServeOnLocalHost(3333, ServeRequest); + } + + private static String ToJson(IReadOnlyCollection batteryData) + { + var nInstallations = batteryData.GroupBy(d => d.Installation).Count(); + var nBatteries = batteryData.Count; + var energyStored = batteryData.Sum(d => d.EnergyStored).Apply(Math.Round); + var energyCapacity = batteryData.Sum(d => d.EnergyCapacity).Apply(Math.Round); + var chargingPower = batteryData.Where(d => d.Power > 0).Sum(d => d.Power / 1000).Apply(Math.Round); + var dischargingPower = batteryData.Where(d => d.Power < 0).Sum(d => -d.Power / 1000).Apply(Math.Round); + + var json = new + { + nInstallations, + nBatteries, + energyStored_kWh = energyStored, + energyCapacity_kWh = energyCapacity, + chargingPower_kW = chargingPower, + dischargingPower_kW = dischargingPower, + }; + + return JsonSerializer.Serialize(json, JsonOptions); + + + // Console.WriteLine($"nInstallations : {nInstallations}"); + // Console.WriteLine($"nBatteries : {nBatteries}"); + // Console.WriteLine($"energyStored : {Math.Round(energyStored)} kWh"); + // Console.WriteLine($"energyCapacity : {Math.Round(energyCapacity)} kWh"); + // Console.WriteLine($"chargingPower : {Math.Round(chargingPower / 1000)} kW"); + // Console.WriteLine($"dischargingPower: {Math.Round(dischargingPower/ 1000)} kW"); + + } + + + private static void ProcessDatagram() + { + ReadDatagram() + .ThenTry(ParseDatagram) + .ThenTry(SendToDb) + .OnErrorDo(Console.WriteLine); + } + + private static Try ParseDatagram(UdpDatagram datagram) + { + Byte[] Parse() + { + var batteryRecords = BatteryDataParser + .ParseDatagram(datagram); + + if (batteryRecords.FirstOrDefault() is BatteryStatus bs) + { + var battery = bs.InstallationName + bs.BatteryId; + var capacity = 48.0/1000 * bs.AmpereHours; + var energyStored = (Double) bs.Soc / 100 * capacity; + var power = bs.Current * bs.Voltage; + + var data = new BatteryData(bs.InstallationName, + battery, + capacity, + energyStored, + (Double)power); + + Batteries.OnNext(data); + } + + return batteryRecords + .Select(InfluxRecord.Serialize) + .JoinLines() + .Apply(UTF8.GetBytes); + } + + return Try(Parse) + .OnErrorLog("ParseDatagram failed " + datagram.EndPoint.Address); + } + + private static Try ReadDatagram() + { + return Try(_incomingSocket.ReadDatagram) + .OnErrorLog("Failed to read from UDP socket") + .OnErrorDo(ResetIncomingSocket); + } + + + private static Try SendToDb(Byte[] data) + { + Int32 Send() => _dbSocket.SendDatagram(data, Settings.DbEndPoint); + + return Try(Send) + .OnErrorLog("SendToDb failed") + .OnErrorDo(ResetDbSocket); + } + + private static void ResetDbSocket(Exception e) + { + _dbSocket.Dispose(); + _dbSocket = new UdpClient(); + } + + private static void ResetIncomingSocket(Exception e) + { + _incomingSocket.Dispose(); + _incomingSocket = new UdpClient(Settings.IncomingEndPoint); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Records/Alarms.cs b/csharp/App_backup/Collector/src/Records/Alarms.cs new file mode 100644 index 000000000..4d995c6cf --- /dev/null +++ b/csharp/App_backup/Collector/src/Records/Alarms.cs @@ -0,0 +1,43 @@ +using InnovEnergy.App.Collector.Influx; + +// ReSharper disable IdentifierTypo +// ReSharper disable UnusedAutoPropertyAccessor.Global +// ReSharper disable InconsistentNaming + +namespace InnovEnergy.App.Collector.Records; + +public class Alarms : BatteryRecord +{ + [Tag] public required String Installation { get; init; } + [Tag] public required String BatteryId { get; init; } + + [Field(typeof(Int32))] public required Boolean Tam { get; init; } + [Field(typeof(Int32))] public required Boolean TaM2 { get; init; } + [Field(typeof(Int32))] public required Boolean Tbm { get; init; } + [Field(typeof(Int32))] public required Boolean TbM2 { get; init; } + [Field(typeof(Int32))] public required Boolean VBm2 { get; init; } + [Field(typeof(Int32))] public required Boolean VBM2 { get; init; } + [Field(typeof(Int32))] public required Boolean IDM2 { get; init; } + [Field(typeof(Int32))] public required Boolean MSWE { get; init; } + [Field(typeof(Int32))] public required Boolean FUSE { get; init; } + [Field(typeof(Int32))] public required Boolean HTRE { get; init; } + [Field(typeof(Int32))] public required Boolean TCPE { get; init; } + [Field(typeof(Int32))] public required Boolean CME { get; init; } + [Field(typeof(Int32))] public required Boolean HWFL { get; init; } + [Field(typeof(Int32))] public required Boolean HWEM { get; init; } + [Field(typeof(Int32))] public required Boolean ThM { get; init; } + [Field(typeof(Int32))] public required Boolean vsm1 { get; init; } + [Field(typeof(Int32))] public required Boolean vsm2 { get; init; } + [Field(typeof(Int32))] public required Boolean vsM2 { get; init; } + [Field(typeof(Int32))] public required Boolean iCM2 { get; init; } + [Field(typeof(Int32))] public required Boolean iDM2 { get; init; } + [Field(typeof(Int32))] public required Boolean MID2 { get; init; } + [Field(typeof(Int32))] public required Boolean CCBF { get; init; } + [Field(typeof(Int32))] public required Boolean AhFL { get; init; } + [Field(typeof(Int32))] public required Boolean TbCM { get; init; } + [Field(typeof(Int32))] public required Boolean HTFS { get; init; } + [Field(typeof(Int32))] public required Boolean DATA { get; init; } + [Field(typeof(Int32))] public required Boolean ISOB { get; init; } + [Field(typeof(Int32))] public required Boolean LMPA { get; init; } + [Field(typeof(Int32))] public required Boolean HEBT { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Records/BatteryRecord.cs b/csharp/App_backup/Collector/src/Records/BatteryRecord.cs new file mode 100644 index 000000000..49cfcc00c --- /dev/null +++ b/csharp/App_backup/Collector/src/Records/BatteryRecord.cs @@ -0,0 +1,4 @@ +namespace InnovEnergy.App.Collector.Records; + +public abstract class BatteryRecord +{} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Records/BatteryStatus.cs b/csharp/App_backup/Collector/src/Records/BatteryStatus.cs new file mode 100644 index 000000000..809248f21 --- /dev/null +++ b/csharp/App_backup/Collector/src/Records/BatteryStatus.cs @@ -0,0 +1,32 @@ +using InnovEnergy.App.Collector.Influx; + +namespace InnovEnergy.App.Collector.Records; + +public class BatteryStatus : BatteryRecord +{ + [Tag] public required String InstallationName { get; init; } + [Tag] public required String BatteryId { get; init; } + + [Field] public required String HardwareVersion { get; init; } + [Field] public required String FirmwareVersion { get; init; } + [Field] public required String BmsVersion { get; init; } + [Field] public required UInt32 AmpereHours { get; init; } + [Field] public required UInt32 RtcCounter { get; init; } + + [Field] public required Decimal Voltage { get; init; } + [Field] public required Decimal Current { get; init; } + [Field] public required Decimal BusVoltage { get; init; } + [Field] public required Decimal Soc { get; init; } + [Field] public required Decimal Temperature { get; init; } + + [Field] public required Int32 NumberOfWarnings { get; init; } + [Field] public required Int32 NumberOfAlarms { get; init; } + + [Field] public required UInt64 WarningsBitmap { get; init; } + [Field] public required UInt64 AlarmsBitmap { get; init; } + + [Field] public required Int64 LastSeen { get; init; } + + [Field] public required String IpAddress { get; init; } + [Field] public required Int32 Port { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Records/IoStatus.cs b/csharp/App_backup/Collector/src/Records/IoStatus.cs new file mode 100644 index 000000000..ad3e04807 --- /dev/null +++ b/csharp/App_backup/Collector/src/Records/IoStatus.cs @@ -0,0 +1,18 @@ +using InnovEnergy.App.Collector.Influx; + + +namespace InnovEnergy.App.Collector.Records; + +public class IoStatus : BatteryRecord +{ + [Tag] public required String Installation { get; init; } + [Tag] public required String BatteryId { get; init; } + + [Field(typeof(Int32))] public required Boolean MainSwitchClosed { get; init; } + [Field(typeof(Int32))] public required Boolean AlarmOutActive { get; init; } + [Field(typeof(Int32))] public required Boolean InternalFanActive { get; init; } + [Field(typeof(Int32))] public required Boolean VoltMeasurementAllowed { get; init; } + [Field(typeof(Int32))] public required Boolean AuxRelay { get; init; } + [Field(typeof(Int32))] public required Boolean RemoteState { get; init; } + [Field(typeof(Int32))] public required Boolean HeatingOn { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Records/Leds.cs b/csharp/App_backup/Collector/src/Records/Leds.cs new file mode 100644 index 000000000..8b197094b --- /dev/null +++ b/csharp/App_backup/Collector/src/Records/Leds.cs @@ -0,0 +1,26 @@ +using InnovEnergy.App.Collector.Influx; + +// ReSharper disable UnusedAutoPropertyAccessor.Global +// ReSharper disable UnusedMember.Global + +namespace InnovEnergy.App.Collector.Records; + +public class Leds : BatteryRecord +{ + [Tag] public required String Installation { get; init; } + [Tag] public required String BatteryId { get; init; } + + [Field] public required LedState Green { get; set; } + [Field] public required LedState Amber { get; set; } + [Field] public required LedState Blue { get; set; } + [Field] public required LedState Red { get; set; } +} + + +public enum LedState : byte +{ + Off = 0b00, + On = 0b01, + BlinkingSlow = 0b10, + BlinkingFast = 0b11, +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Records/Temperatures.cs b/csharp/App_backup/Collector/src/Records/Temperatures.cs new file mode 100644 index 000000000..34d53a92e --- /dev/null +++ b/csharp/App_backup/Collector/src/Records/Temperatures.cs @@ -0,0 +1,21 @@ +using InnovEnergy.App.Collector.Influx; + +namespace InnovEnergy.App.Collector.Records; + + +#pragma warning disable CS8618 + +public class Temperatures : BatteryRecord +{ + + [Tag] public String Installation { get; set; } + [Tag] public String BatteryId { get; set; } + + [Field] public Decimal Battery { get; init; } + [Field] public Decimal Board { get; init; } + [Field] public Decimal Center { get; init; } + [Field] public Decimal Lateral1 { get; init; } + [Field] public Decimal Lateral2 { get; init; } + [Field] public Decimal CenterHeaterPwm { get; init; } + [Field] public Decimal LateralHeaterPwm { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Records/Warnings.cs b/csharp/App_backup/Collector/src/Records/Warnings.cs new file mode 100644 index 000000000..6a1f50feb --- /dev/null +++ b/csharp/App_backup/Collector/src/Records/Warnings.cs @@ -0,0 +1,30 @@ +using System.Diagnostics.CodeAnalysis; +using InnovEnergy.App.Collector.Influx; + +namespace InnovEnergy.App.Collector.Records; + +#pragma warning disable CS8618 + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "IdentifierTypo")] +public class Warnings : BatteryRecord +{ + [Tag] public required String Installation { get; init; } + [Tag] public required String BatteryId { get; init; } + + [Field(typeof(Int32))] public required Boolean TaM1 { get; init; } + [Field(typeof(Int32))] public required Boolean TbM1 { get; init; } + [Field(typeof(Int32))] public required Boolean VBm1 { get; init; } + [Field(typeof(Int32))] public required Boolean VBM1 { get; init; } + [Field(typeof(Int32))] public required Boolean IDM1 { get; init; } + [Field(typeof(Int32))] public required Boolean vsM1 { get; init; } + [Field(typeof(Int32))] public required Boolean iCM1 { get; init; } + [Field(typeof(Int32))] public required Boolean iDM1 { get; init; } + [Field(typeof(Int32))] public required Boolean MID1 { get; init; } + [Field(typeof(Int32))] public required Boolean BLPW { get; init; } + [Field(typeof(Int32))] public required Boolean Ah_W { get; init; } + [Field(typeof(Int32))] public required Boolean MPMM { get; init; } + [Field(typeof(Int32))] public required Boolean TCMM { get; init; } + [Field(typeof(Int32))] public required Boolean TCdi { get; init; } + [Field(typeof(Int32))] public required Boolean LMPW { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Settings.cs b/csharp/App_backup/Collector/src/Settings.cs new file mode 100644 index 000000000..7708dc819 --- /dev/null +++ b/csharp/App_backup/Collector/src/Settings.cs @@ -0,0 +1,13 @@ +using System.Net; + +namespace InnovEnergy.App.Collector; + +public static class Settings +{ + public const String ProtocolV3 = "48TL200V3"; + public const String ProtocolV4 = "48TL200V4"; + + public static readonly IPEndPoint IncomingEndPoint = IPEndPoint.Parse("10.2.0.1:8134"); + public static readonly IPEndPoint DbEndPoint = IPEndPoint.Parse("127.0.0.1:8089"); + public static readonly IPEndPoint LoggingEndPoint = IPEndPoint.Parse("127.0.0.1:6030"); +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Utils/Extensions.cs b/csharp/App_backup/Collector/src/Utils/Extensions.cs new file mode 100644 index 000000000..9b79e4ab4 --- /dev/null +++ b/csharp/App_backup/Collector/src/Utils/Extensions.cs @@ -0,0 +1,44 @@ +using System.Globalization; + +namespace InnovEnergy.App.Collector.Utils; + +public static class Extensions +{ + + + public static IEnumerable SplitBefore(this String s, String separator) + { + var start = 0; + + Int32 NextSeparator() => s.IndexOf(separator, start + 1, StringComparison.Ordinal); + + while (true) + { + var index = NextSeparator(); + + if (index < 0) + { + yield return s.Substring(start); + yield break; + } + + yield return s.Substring(start, index-start); + + start = index; + } + } + + public static Int64 ToInfluxTime(this DateTime date) + { + var timeSinceEpoch = date.ToUniversalTime() - Utils.Epoch; + return Convert.ToInt64(timeSinceEpoch.TotalMilliseconds) ; + } + + public static String FormatTimestamp(DateTime utcTimestamp) + { + return ((utcTimestamp - Utils.Epoch).Ticks * 100L).ToString(CultureInfo.InvariantCulture); + } + + public static void Nop(T t) + {} +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Utils/Log.cs b/csharp/App_backup/Collector/src/Utils/Log.cs new file mode 100644 index 000000000..8e32f0174 --- /dev/null +++ b/csharp/App_backup/Collector/src/Utils/Log.cs @@ -0,0 +1,39 @@ +namespace InnovEnergy.App.Collector.Utils; + +internal static class Log +{ + public static void Info(this String l) + { + Console.WriteLine($"[{DateTime.Now.ToLongTimeString()}] {l}"); + } + + public static void Error(this String l) + { + Console.WriteLine($"[{DateTime.Now.ToLongTimeString()}] {l}"); + } + + + public static void Warning(this String l) + { + Console.WriteLine($"[{DateTime.Now.ToLongTimeString()}] {l}"); + } + + public static void Debug(this String l) + { + Console.WriteLine($"[{DateTime.Now.ToLongTimeString()}] {l}"); + } + + public static T Dump(this T t) + { + Console.WriteLine(t); + return t; + } + + public static void Dump(this T l, Int32 n) + { + Console.WriteLine(l); + + for (var i = 0; i < n; i++) + Console.WriteLine(); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Utils/Property.cs b/csharp/App_backup/Collector/src/Utils/Property.cs new file mode 100644 index 000000000..9bf825c26 --- /dev/null +++ b/csharp/App_backup/Collector/src/Utils/Property.cs @@ -0,0 +1,49 @@ +using System.Reflection; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.Collector.Utils; + +public readonly struct Property +{ + public Object Instance { get; } + private PropertyInfo PropertyInfo { get; } + + public Property(Object instance, PropertyInfo propertyInfo) + { + Instance = instance ?? throw new ArgumentException("instance cannot be null", nameof(instance)); + PropertyInfo = propertyInfo; + } + + public Boolean IsWritable => PropertyInfo.CanWrite; + public Boolean IsReadable => PropertyInfo.CanRead; + + public IEnumerable Attributes => GetAttributes(); + + public String Name => PropertyInfo.Name; + public Type Type => PropertyInfo.PropertyType; + + public Object? Get() => PropertyInfo.GetValue(Instance); + + public T? Get() => (T?) PropertyInfo.GetValue(Instance); + + public void Set(Object value) => PropertyInfo.SetValue(Instance, value); + + public IEnumerable GetAttributes () where T : Attribute => PropertyInfo + .GetCustomAttributes(inherit: false) + .OfType(); + + public Boolean HasAttribute () where T : Attribute => GetAttributes().Any(); + +} + +public static class PropertyExtensions +{ + public static IEnumerable GetProperties(this Object instance) + { + return instance + .GetType() + .GetProperties(BindingFlags.Instance | BindingFlags.Public) + .Unless(p => p.GetIndexParameters().Any()) // no indexers please + .Select(pi => new Property(instance, pi)); + } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Utils/ReadOnlyListExtensions.cs b/csharp/App_backup/Collector/src/Utils/ReadOnlyListExtensions.cs new file mode 100644 index 000000000..7c8d915b3 --- /dev/null +++ b/csharp/App_backup/Collector/src/Utils/ReadOnlyListExtensions.cs @@ -0,0 +1,45 @@ +namespace InnovEnergy.App.Collector.Utils; + +public static class ReadOnlyListExtensions +{ + public static IReadOnlyList Select(this IReadOnlyList src, Func map) + { + var a = new R[src.Count]; + var i = 0; + + foreach (var t in src) + a[i++] = map(t); + + return a; + } + + public static T[] ToArray(this IReadOnlyCollection src) + { + if (src is T[] a) + return a; + + var array = new T[src.Count]; + var i = 0; + + foreach (var s in src) + array[i++] = s; + + return array; + } + + + public static IReadOnlyList SelectMany(this IReadOnlyList source, Func> selector) + { + var outer = source.Select(selector); + var n = outer.Sum(o => o.Count); + + var inner = new R[n]; + var i = 0; + + foreach (var o in outer) + foreach (var p in o) + inner[i++] = p; + + return inner; + } +} \ No newline at end of file diff --git a/csharp/App_backup/Collector/src/Utils/Utils.cs b/csharp/App_backup/Collector/src/Utils/Utils.cs new file mode 100644 index 000000000..4232c5656 --- /dev/null +++ b/csharp/App_backup/Collector/src/Utils/Utils.cs @@ -0,0 +1,19 @@ +namespace InnovEnergy.App.Collector.Utils; + +public static class Utils +{ + public static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + public static IEnumerable> ParseLengthValueEncoded(this Byte[] source) + { + var index = 0; + + while (index < source.Length) + { + var length = source[index++]; + + yield return new ArraySegment(source, index, length); + index += length; + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/DeligreenBatteryCommunication/DeligreenBatteryCommunication.csproj b/csharp/App_backup/DeligreenBatteryCommunication/DeligreenBatteryCommunication.csproj new file mode 100644 index 000000000..176ad9f64 --- /dev/null +++ b/csharp/App_backup/DeligreenBatteryCommunication/DeligreenBatteryCommunication.csproj @@ -0,0 +1,22 @@ + + + + InnovEnergy.App.DeligreenBatteryCommunication + + + + + + + + + + + + + + + + + + diff --git a/csharp/App_backup/DeligreenBatteryCommunication/DeviceState.cs b/csharp/App_backup/DeligreenBatteryCommunication/DeviceState.cs new file mode 100644 index 000000000..4fac5fc9d --- /dev/null +++ b/csharp/App_backup/DeligreenBatteryCommunication/DeviceState.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.DeligreenBatteryCommunication; + +public enum DeviceState +{ + Disabled, + Measured, + Computed +} \ No newline at end of file diff --git a/csharp/App_backup/DeligreenBatteryCommunication/Program.cs b/csharp/App_backup/DeligreenBatteryCommunication/Program.cs new file mode 100644 index 000000000..1ca6610a2 --- /dev/null +++ b/csharp/App_backup/DeligreenBatteryCommunication/Program.cs @@ -0,0 +1,124 @@ +using System.Net; +using InnovEnergy.Lib.Devices.BatteryDeligreen; +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Utils.Net; + +namespace InnovEnergy.App.DeligreenBatteryCommunication; + +internal static class Program +{ + private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(2); + + private static Channel _relaysChannel; + + private const String Port = "/dev/ttyUSB0"; + + + static Program() + { + Console.WriteLine("Hello, Deligreen World!"); + + // BatteriesChannel = new SerialPortChannel(Port, BaudRate, Parity, DataBits, StopBits); + + } + + public static async Task Main(String[] args) + { + var device1 = new SalimaxDevice { Host = "10.0.1.3" , Port = 502, DeviceState = DeviceState.Measured }; + + _relaysChannel = CreateChannel(device1); + + var saliMaxRelaysDevice = new RelaysDeviceAmax(_relaysChannel); + + /* var listOfBatteries = new List + { + new BatteryDeligreenDevice(Port, 0), + new BatteryDeligreenDevice(Port, 1) + }; + + var batteryDevices = new BatteryDeligreenDevices(listOfBatteries);*/ + + Console.WriteLine("Starting Battery Communication"); + + while (true) + { + try + { + var startTime = DateTime.Now; + Console.WriteLine("***************************** Reading Battery Data *********************************************"); + // Console.WriteLine($"Start Reading all Batteries: {startTime}"); + //var batteriesRecord = batteryDevices.Read(); + var stopTime = DateTime.Now; + //Console.WriteLine($"Finish Reading all Batteries: {stopTime}"); + var relays = saliMaxRelaysDevice.Read(); + + Console.WriteLine("***************************** Writing register 27 to true Amax *********************************************"); + + relays.K0 = true; + relays.K1 = true; + relays.R0 = true; + relays.R1 = true; + relays.R2 = true; + relays.R3 = true; + // relays.K0Input.WriteLine(" : K0input"); + saliMaxRelaysDevice.Write(relays); + + Console.WriteLine("***************************** Reading Amax *********************************************"); + + + // relays.K1GridBusIsConnectedToGrid.WriteLine(" : K1"); + + await Task.Delay(2000); + + Console.WriteLine("***************************** Writing register 27 to false Amax *********************************************"); + relays.K0 = false; + relays.K1 = false; + relays.R0 = false; + relays.R1 = false; + relays.R2 = false; + relays.R3 = false; + // relays.K0Input.WriteLine(" : K0input"); + + saliMaxRelaysDevice.Write(relays); + + Console.WriteLine("***************************** Reading Amax *********************************************"); + + + /* + + + Console.WriteLine("Time used for reading all batteries:" + (stopTime - startTime)); + + Console.WriteLine("Average SOC " + batteriesRecord?.Soc); + Console.WriteLine("Cell Alarm 1 : " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.CellAlarmList[0]); + Console.WriteLine("Cell Alarm 2 : " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.CellAlarmList[1]); + + Console.WriteLine("Cell Temperature Alarm 1 : " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.CellTemperatureAlarm[0]); + Console.WriteLine("Cell Temperature Alarm 2 : " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.CellTemperatureAlarm[1]); + + Console.WriteLine("Battery 1 EnviTemp Alarm: " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.EnviTempAlarm); + Console.WriteLine("Battery 1 Current Alarm : " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.CurrentAlarm); + + Console.WriteLine("Battery 2 EnviTemp Alarm: " + batteriesRecord?.Devices[1].BatteryDeligreenAlarmRecord.EnviTempAlarm); + Console.WriteLine("Battery 2 Current Alarm : " + batteriesRecord?.Devices[1].BatteryDeligreenAlarmRecord.CurrentAlarm); + + Console.WriteLine("TotalVoltage Alarm : " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.TotalVoltageAlarm); + Console.WriteLine("PowerTemp Alarm : " + batteriesRecord?.Devices[0].BatteryDeligreenAlarmRecord.PowerTempAlarm);*/ + + + // Wait for 2 seconds before the next reading + await Task.Delay(2000); // Delay in milliseconds (2000ms = 2 seconds) + } + catch (Exception e) + { + // Handle exception and print the error + Console.WriteLine(e + " This the first try loop "); + await Task.Delay(2000); // Delay in milliseconds (2000ms = 2 seconds) + } + } + + Channel CreateChannel(SalimaxDevice device) => new TcpChannel(device); + } + +} \ No newline at end of file diff --git a/csharp/App_backup/DeligreenBatteryCommunication/RelaysDeviceAmax.cs b/csharp/App_backup/DeligreenBatteryCommunication/RelaysDeviceAmax.cs new file mode 100644 index 000000000..9adef3106 --- /dev/null +++ b/csharp/App_backup/DeligreenBatteryCommunication/RelaysDeviceAmax.cs @@ -0,0 +1,38 @@ +using InnovEnergy.Lib.Devices.Amax5070; +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.DeligreenBatteryCommunication; + +public class RelaysDeviceAmax +{ + private Amax5070Device AmaxDevice { get; } + + public RelaysDeviceAmax(Channel channel) => AmaxDevice = new Amax5070Device(channel); + + public RelaysRecordAmax? Read() + { + + try + { + return AmaxDevice.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAmax)}\n{e}".WriteLine(); + return null; + } + } + + public void Write(RelaysRecordAmax r) + { + try + { + AmaxDevice.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAmax)}\n{e}".WriteLine(); + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/DeligreenBatteryCommunication/RelaysRecordAmax.cs b/csharp/App_backup/DeligreenBatteryCommunication/RelaysRecordAmax.cs new file mode 100644 index 000000000..af77d4ce1 --- /dev/null +++ b/csharp/App_backup/DeligreenBatteryCommunication/RelaysRecordAmax.cs @@ -0,0 +1,98 @@ +using InnovEnergy.Lib.Devices.Amax5070; + +namespace InnovEnergy.App.DeligreenBatteryCommunication; + +public class RelaysRecordAmax +{ + private readonly Amax5070Registers _regs; + + private RelaysRecordAmax(Amax5070Registers regs) => _regs = regs; + + //public UInt16 K0Input + //{ + // get => _regs.DigitalInput; + //} + + + public Boolean K0 + { + get => _regs.DigitalOutput0; + set => _regs.DigitalOutput0 = value; + } + + public Boolean K1 + { + get => _regs.DigitalOutput1; + set => _regs.DigitalOutput1 = value; + } + + public Boolean K2 + { + get => _regs.DigitalOutput2; + set => _regs.DigitalOutput2 = value; + } + + public Boolean K3 + { + get => _regs.DigitalOutput3; + set => _regs.DigitalOutput3 = value; + } + + + public Boolean R0 + { + get => _regs.Relay12; + set => _regs.Relay12 = value; + } + + public Boolean R1 + { + get => _regs.Relay22; + set => _regs.Relay22 = value; + } + + public Boolean R2 + { + get => _regs.Relay32; + set => _regs.Relay32 = value; + } + + public Boolean R3 + { + get => _regs.Relay42; + set => _regs.Relay42 = value; + } + + + /* + public Boolean K1GridBusIsConnectedToGrid => _regs.DigitalInput22; + public Boolean K2IslandBusIsConnectedToGridBus => !_regs.DigitalInput20; + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + private Boolean K3Inverter1IsConnectedToIslandBus => !_regs.DigitalInput16; + private Boolean K3Inverter2IsConnectedToIslandBus => !_regs.DigitalInput17; + private Boolean K3Inverter3IsConnectedToIslandBus => !_regs.DigitalInput18; + private Boolean K3Inverter4IsConnectedToIslandBus => !_regs.DigitalInput19; + + public Boolean FiWarning => !_regs.DigitalInput21; + public Boolean FiError => !_regs.DigitalInput23;*/ + + //public Boolean K2ConnectIslandBusToGridBus + //{ + // get => _regs.Relay22; + // set => _regs.Relay22 = value; + //} + + + public static implicit operator Amax5070Registers(RelaysRecordAmax d) => d._regs; + public static implicit operator RelaysRecordAmax(Amax5070Registers d) => new RelaysRecordAmax(d); +} \ No newline at end of file diff --git a/csharp/App_backup/DeligreenBatteryCommunication/SalimaxDevice.cs b/csharp/App_backup/DeligreenBatteryCommunication/SalimaxDevice.cs new file mode 100644 index 000000000..a31c73a99 --- /dev/null +++ b/csharp/App_backup/DeligreenBatteryCommunication/SalimaxDevice.cs @@ -0,0 +1,13 @@ +using InnovEnergy.Lib.Utils.Net; + +namespace InnovEnergy.App.DeligreenBatteryCommunication; + +public class SalimaxDevice : Ip4Address +{ + public required DeviceState DeviceState { get; init; } + + public override String ToString() => $"{base.ToString()} ({DeviceState})"; + + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), DeviceState); + +} \ No newline at end of file diff --git a/csharp/App_backup/DeligreenBatteryCommunication/deploy.sh b/csharp/App_backup/DeligreenBatteryCommunication/deploy.sh new file mode 100755 index 000000000..05983dda8 --- /dev/null +++ b/csharp/App_backup/DeligreenBatteryCommunication/deploy.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +dotnet_version='net6.0' +salimax_ip="$1" +username='ie-entwicklung' +root_password='Salimax4x25' +set -e + +echo -e "\n============================ Build ============================\n" + +dotnet publish \ + ./DeligreenBatteryCommunication.csproj \ + -p:PublishTrimmed=false \ + -c Release \ + -r linux-x64 + +echo -e "\n============================ Deploy ============================\n" + +rsync -v \ + --exclude '*.pdb' \ + ./bin/Release/$dotnet_version/linux-x64/publish/* \ + $username@"$salimax_ip":~/salimax \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/Config.cs b/csharp/App_backup/EmuMeterDriver/Config.cs new file mode 100644 index 000000000..c78c9490d --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/Config.cs @@ -0,0 +1,65 @@ +using System.Reflection; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.EmuMeterDriver; + +public static class Config +{ + public const String Version = "1.0"; + public const String BusName = "com.victronenergy.grid.emu"; + public const Byte ModbusNodeId = 1; + public const String OwnAddress = "10.0.0.1"; + public const String PeerAddress = "10.0.0.2"; + //public const String PeerAddress = "127.0.0.1"; + public const UInt16 PeerPort = 502; + + public static TimeSpan TcpTimeout { get; } = TimeSpan.FromSeconds(2); + + + public static readonly TimeSpan UpdatePeriod = TimeSpan.FromSeconds(1); + + public static readonly IReadOnlyList Signals = new Signal[] + { + new(s => s.Ac.L1.Current, "/Ac/L1/Current", "0.0 A"), + new(s => s.Ac.L2.Current, "/Ac/L2/Current", "0.0 A"), + new(s => s.Ac.L3.Current, "/Ac/L3/Current", "0.0 A"), + new(s => s.Ac.L1.Current + s.Ac.L2.Current + s.Ac.L3.Current, "/Ac/Current", "0.0 A"), + + new(s => s.Ac.L1.Voltage, "/Ac/L1/Voltage", "0.0 A"), + new(s => s.Ac.L2.Voltage, "/Ac/L2/Voltage", "0.0 A"), + new(s => s.Ac.L3.Voltage, "/Ac/L3/Voltage", "0.0 A"), + new(s => (s.Ac.L1.Voltage + s.Ac.L2.Voltage + s.Ac.L3.Voltage) / 3, "/Ac/Voltage", "0.0 A"), + + new(s => s.Ac.L1.Power.Active, "/Ac/L1/Power", "0 W"), + new(s => s.Ac.L2.Power.Active, "/Ac/L2/Power", "0 W"), + new(s => s.Ac.L3.Power.Active, "/Ac/L3/Power", "0 W"), + new(s => s.Ac.Power.Active, "/Ac/Power", "0 W"), + + // new(s => s.EnergyImportL123, "Ac/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL123, "Ac/Energy/Reverse", "0.00 kWh"), + // + // new(s => s.EnergyImportL1, "Ac/L1/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL1, "Ac/L1/Energy/Reverse", "0.00 kWh"), + // + // new(s => s.EnergyImportL2, "Ac/L2/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL2, "Ac/L2/Energy/Reverse", "0.00 kWh"), + // + // new(s => s.EnergyImportL3, "Ac/L3/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL3, "Ac/L3/Energy/Reverse", "0.00 kWh"), + }; + + public static VeProperties DefaultProperties => new VeProperties + { + new("/ProductName" , "Grid meter" ), + new("/CustomName" , "EMU Professional II"), + new("/DeviceInstance" , 30), + new("/DeviceType" , 72), + new("/Mgmt/Connection" , "Modbus TCP"), + new("/Mgmt/ProcessName" , Assembly.GetEntryAssembly()?.Location ?? "unknown"), + new("/Mgmt/ProcessVersion", Version), + new("/Connected" , 1), + new("/ProductId" , 45058, "b002"), + new("/Role" , "grid"), + }; + +} \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/EmuMeterDriver.cs b/csharp/App_backup/EmuMeterDriver/EmuMeterDriver.cs new file mode 100644 index 000000000..0aa36aa30 --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/EmuMeterDriver.cs @@ -0,0 +1,66 @@ +using System.Reactive.Linq; +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Protocols.DBus; +using InnovEnergy.Lib.Protocols.Modbus.Clients; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.EmuMeterDriver; + +public static class EmuMeterDriver +{ + public static Task Run(String hostName, Bus dbusAddress) + { + return Run(hostName, ModbusTcpClient.DefaultPort, dbusAddress); + } + + public static async Task Run(String hostName, UInt16 port, Bus dbusAddress) + { + // var ep = new UnixDomainSocketEndPoint("/home/eef/graber_dbus.sock"); + // var auth = AuthenticationMethod.ExternalAsRoot(); + // dbusAddress = new Bus(ep, auth); + + var emuMeter = new EmuMeterDevice(hostName, port, Config.ModbusNodeId); + + + var meterStatus = Observable + .Interval(Config.UpdatePeriod) + .Select(_ => emuMeter.Read()) + .Publish(); + + var poller = meterStatus.Connect(); + + var properties = Config.DefaultProperties; + + var signals = Config + .Signals + .Select(signal => meterStatus.Select(signal.ToVeProperty)) + .Merge() + .Do(p => properties.Set(p)); + + // TODO: remove when possible + // Apparently some VE services need to be periodically reminded that + // this service is /Connected + meterStatus.Subscribe(_ => properties.Set("/Connected", 1)); + + // Wait until status is read once to make sure all + // properties are set when we go onto the bus. + var dbus = meterStatus + .Skip(1) + .Take(1) + .SelectMany(_ => PublishPropertiesOnDBus(properties, dbusAddress)); + + return await signals + .MergeErrors(dbus) + .Finally(poller.Dispose) + .SelectErrors(); + + } + + + private static Task PublishPropertiesOnDBus(VeProperties properties, Bus bus) + { + Console.WriteLine($"Connecting to DBus {bus}"); + return properties.PublishOnDBus(bus, Config.BusName); + } +} \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/EmuMeterDriver.csproj b/csharp/App_backup/EmuMeterDriver/EmuMeterDriver.csproj new file mode 100644 index 000000000..5afaaff4a --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/EmuMeterDriver.csproj @@ -0,0 +1,24 @@ + + + + + InnovEnergy.App.EmuMeterDriver + + + + + + + + + + + + + + + + + + + diff --git a/csharp/App_backup/EmuMeterDriver/Nic.cs b/csharp/App_backup/EmuMeterDriver/Nic.cs new file mode 100644 index 000000000..2c507cb8d --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/Nic.cs @@ -0,0 +1,149 @@ +using System.Text.Json.Nodes; +using CliWrap; +using CliWrap.Buffered; + +namespace InnovEnergy.App.EmuMeterDriver; + +public readonly struct Nic +{ + private static Command IpCommand { get; } = Cli + .Wrap("/sbin/ip") + .WithValidation(CommandResultValidation.None); + + private readonly JsonNode _Node; + + private Nic(JsonNode node) + { + _Node = node; + } + + public Boolean IsEthernet + { + get + { + try + { + return _Node["link_type"]!.GetValue() == "ether"; + } + catch + { + return false; + } + } + } + + public Boolean IsUp + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["operstate"]!.GetValue() == "UP"; + } + catch + { + return false; + } + } + } + + public IReadOnlyList Ip4Addresses + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["addr_info"]! + .AsArray() + .TryWhere(n => n!["family"]!.GetValue() == "inet") + .TrySelect(n => n!["local"]!.GetValue()) + .ToList(); + } + catch + { + return Array.Empty(); + } + } + } + + public String Name + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["ifname"]!.GetValue(); + } + catch + { + return ""; + } + } + } + + + + public async Task AddPointToPoint(String sourceAddress, String destinationAddress) + { + var result = await IpCommand + .WithArguments($"address add local {sourceAddress} peer {destinationAddress} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + public async Task RemoveAddress(String address) + { + var result = await IpCommand + .WithArguments($"address del {address} dev {Name}") + .ExecuteBufferedAsync(); + + return result.ExitCode == 0; + } + + + public async Task AddRoute(String route) + { + var result = await IpCommand + .WithArguments($"route add {route} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + public async Task RemoveRoute(String route) + { + var result = await IpCommand + .WithArguments($"route del {route} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + + public static async Task> GetNetworkInterfaces() + { + + try + { + var result = await IpCommand + .WithArguments("-details -pretty -json address") + .ExecuteBufferedAsync(); + + return JsonNode + .Parse(result.StandardOutput)! + .AsArray() + .Where(n => n != null) + .Select(n => new Nic(n!)) + .ToList(); + } + catch + { + return Array.Empty(); + } + } + +} \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/Program.cs b/csharp/App_backup/EmuMeterDriver/Program.cs new file mode 100644 index 000000000..6ad63d04d --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/Program.cs @@ -0,0 +1,60 @@ +using InnovEnergy.App.EmuMeterDriver; +using InnovEnergy.Lib.Protocols.DBus; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Utils.Net; + + +// dotnet publish EmuMeter.csproj -c Release -r linux-arm -p:PublishSingleFile=true --self-contained true && \ +// rsync -av bin/Release/net6.0/linux-arm/publish/ root@10.2.1.6:/home/root/emu && clear && \ +// ssh root@10.2.1.6 /home/root/emu/EmuMeter + + +Console.WriteLine("Starting EmuMeter Driver " + Config.Version); + +var networkInterfaces = await Nic.GetNetworkInterfaces(); + +var candidates = networkInterfaces.Where(n => n.IsUp && + n.IsEthernet && + (!n.Ip4Addresses.Any() || n.Ip4Addresses.Contains(Config.OwnAddress))); + +foreach (var nic in candidates) +{ + Console.WriteLine($"Found new network interface: {nic.Name}"); + + if (!nic.Ip4Addresses.Contains(Config.OwnAddress)) + { + Console.WriteLine($"Configuring Point-to-Point connection on {nic.Name}"); + Console.WriteLine($" own address: {Config.OwnAddress}"); + Console.WriteLine($" peer address: {Config.PeerAddress}"); + + var success = await nic.AddPointToPoint($"{Config.OwnAddress}/16", $"{Config.PeerAddress}/16"); + + if (!success) + { + Console.WriteLine($"Failed to configure network interface: {nic.Name}"); + continue; + } + } + + Console.WriteLine($"Pinging peer @ {Config.PeerAddress}"); + + var ping = await Config.PeerAddress.Ping(); + + if (ping) + { + Console.WriteLine($"Got answer from {Config.PeerAddress}"); + var ex = await EmuMeterDriver.Run($"{Config.PeerAddress}:{Config.PeerPort}", Bus.System); + + Console.WriteLine($"{nameof(EmuMeterDriver)} FAILED with\n{ex}"); + } + else + { + Console.WriteLine($"No answer from {Config.PeerAddress}"); + } + + Console.Write($"Removing Point-to-Point connection on {nic.Name} ..."); + var removed = await nic.RemoveAddress($"{Config.OwnAddress}/16"); + Console.WriteLine(removed ? "done" : "failed"); +} + +Console.WriteLine("Stopping EmuMeter Driver"); \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/Signal.cs b/csharp/App_backup/EmuMeterDriver/Signal.cs new file mode 100644 index 000000000..7d22b547b --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/Signal.cs @@ -0,0 +1,16 @@ +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.EmuMeterDriver; + + +// TODO: Does not compile +public record Signal(Func Source, ObjectPath Path, String Format = "") +{ + public VeProperty ToVeProperty(EmuMeterRegisters status) + { + var value = Source(status); + return new VeProperty(Path, value, String.Format($"{{0:{Format}}}", value)); + } +} \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/Utils.cs b/csharp/App_backup/EmuMeterDriver/Utils.cs new file mode 100644 index 000000000..65f02de6a --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/Utils.cs @@ -0,0 +1,49 @@ +namespace InnovEnergy.App.EmuMeterDriver; + +public static class Utils +{ + public static IEnumerable TryWhere(this IEnumerable src, Func predicate) + { + foreach (var e in src) + { + var ok = false; + + try + { + ok = predicate(e); + } + catch + { + // ignored + } + + if (ok) + yield return e; + } + } + + public static IEnumerable TrySelect(this IEnumerable src, Func map) + { + foreach (var e in src) + { + var ok = false; + var result = default(R); + + try + { + result = map(e); + ok = true; + } + catch + { + // ignored + } + + if (ok) + yield return result!; + } + } + + + +} \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/debug.sh b/csharp/App_backup/EmuMeterDriver/debug.sh new file mode 100644 index 000000000..799b56950 --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/debug.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +csproj="EmuMeter.csproj" +exe="EmuMeter" +#remote="10.2.1.6" +remote="10.2.2.152" + +netVersion="net6.0" +platform="linux-arm" +config="Release" +host="root@$remote" +dir="/opt/innovenergy/$exe" + +set -e + +dotnet publish "$csproj" -c $config -r $platform -p:SuppressTrimmAnalysisWarnings=true -p:PublishSingleFile=true -p:PublishTrimmed=true -p:DebugType=None -p:DebugSymbols=false --self-contained true +rsync -av "bin/$config/$netVersion/$platform/publish/" "$host:$dir" +#clear +#ssh "$host" "$dir/$exe" + \ No newline at end of file diff --git a/csharp/App_backup/EmuMeterDriver/deploy.sh b/csharp/App_backup/EmuMeterDriver/deploy.sh new file mode 100644 index 000000000..eacfec15f --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/deploy.sh @@ -0,0 +1,61 @@ +#!/bin/bash + + +csproj="SchneiderMeterDriver.csproj" +exe="SchneiderMeterDriver" +remote="10.2.4.114" +platform="linux-arm" +netVersion="net6.0" +config="Release" +host="root@$remote" +dir="/opt/innovenergy/$exe" +log_dir="/var/log/SchneiderMeterDriver" + +set -e + +# Publish the project locally +dotnet publish "$csproj" -c $config -r $platform -p:SuppressTrimmAnalysisWarnings=true -p:PublishSingleFile=true -p:PublishTrimmed=true -p:DebugType=None -p:DebugSymbols=false --self-contained true + +# Sync the published files to the remote server +rsync -av "bin/$config/$netVersion/$platform/publish/" "$host:$dir" + +# Execute commands on the remote server +ssh "$host" << 'EOF' +set -e + +# Remount the root filesystem with read and write permissions +mount -o remount,rw / + +# Create service and log directories +mkdir -p /opt/innovenergy/SchneiderMeterDriver/service +mkdir -p /opt/innovenergy/SchneiderMeterDriver/service/log +mkdir -p /var/log/SchneiderMeterDriver + +# Create the service run script +cat << 'EOL' > /opt/innovenergy/SchneiderMeterDriver/service/run +#!/bin/sh +exec 2>&1 +exec softlimit -d 200000000 -s 2000000 -a 200000000 /opt/innovenergy/SchneiderMeterDriver/SchniederDriver +EOL +chmod +x /opt/innovenergy/SchneiderMeterDriver/service/run + +# Create the log run script +cat << 'EOL' > /opt/innovenergy/SchneiderMeterDriver/service/log/run +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/SchneiderMeterDriver +EOL +chmod +x /opt/innovenergy/SchneiderMeterDriver/service/log/run + +# Create the symbolic link for the service +ln -sf /opt/innovenergy/SchneiderMeterDriver/service /service/SchneiderMeterDriver + +# Wait a bit for the symlink to be recognized + +sleep 2 + +# Start the service +start SchneiderMeterDriver +EOF + +echo "Deployment and service setup completed successfully." diff --git a/csharp/App_backup/EmuMeterDriver/service/log/run b/csharp/App_backup/EmuMeterDriver/service/log/run new file mode 100755 index 000000000..62e2f8679 --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/service/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/EmuMeter diff --git a/csharp/App_backup/EmuMeterDriver/service/run b/csharp/App_backup/EmuMeterDriver/service/run new file mode 100755 index 000000000..58cdb6ff7 --- /dev/null +++ b/csharp/App_backup/EmuMeterDriver/service/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec softlimit -d 100000000 -s 1000000 -a 100000000 /opt/innovenergy/EmuMeter/EmuMeter diff --git a/csharp/App_backup/InnovEnergy.App.props b/csharp/App_backup/InnovEnergy.App.props new file mode 100644 index 000000000..0cf09ae83 --- /dev/null +++ b/csharp/App_backup/InnovEnergy.App.props @@ -0,0 +1,25 @@ + + + + + + + linux-x64 + true + true + false + true + true + true + + + + full + + + + Exe + + + + \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/AccToken.cs b/csharp/App_backup/OpenVpnCertificatesServer/AccToken.cs new file mode 100644 index 000000000..bd8ea28e6 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/AccToken.cs @@ -0,0 +1,17 @@ +using System.Diagnostics.CodeAnalysis; + +namespace InnovEnergy.App.OpenVpnCertificatesServer; + + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] +internal class AccToken +{ + public String bearer { get; init; } = ""; + public UInt64 idUser { get; init; } + public String verification_mode { get; init; } = "password"; + public Boolean verification_sent { get; init; } = false; + public Boolean success { get; init; } = false; + public String token { get; init; } = ""; + public String idAccessToken { get; init; } = ""; +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/Files.cs b/csharp/App_backup/OpenVpnCertificatesServer/Files.cs new file mode 100644 index 000000000..00fbf58d5 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/Files.cs @@ -0,0 +1,35 @@ +namespace InnovEnergy.App.OpenVpnCertificatesServer; + +public static class Files +{ + public const String ReadMeTxt = @" +for systemd: + store everything in /etc/openvpn/client + sudo systemctl start openvpn-client@innovenergy.service + sudo systemctl enable openvpn-client@innovenergy.service + +otherwise: + openvpn --config innovenergy.conf +"; + + public const String OvpnConf = @" +client +nobind +resolv-retry infinite +ca ca-certificate +cert client-certificate +key client-key +remote salidomo.innovenergy.ch +port 7002 +proto udp +dev innovenergy +dev-type tun +auth SHA256 +cipher AES-256-CBC +verb 3 +keepalive 10 120 +persist-key +persist-tun +"; + +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/Http.cs b/csharp/App_backup/OpenVpnCertificatesServer/Http.cs new file mode 100644 index 000000000..5442047ae --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/Http.cs @@ -0,0 +1,48 @@ +using System.Net; +using Flurl; + +namespace InnovEnergy.App.OpenVpnCertificatesServer; + +public static class Http +{ + // TODO: use worker thread + // TODO: could make it more efficient using TcpClient + SSL/TLS + + public static void ServeGet(this String prefix, Func f) + { + var listener = new HttpListener(); + listener.Prefixes.Add(prefix); + listener.Start(); + + Console.WriteLine("Server started on " + prefix); + + while (true) + { + var context = listener.GetContext(); + var request = context.Request; + var response = context.Response; + + if (request.HttpMethod.ToUpper() == "GET") + { + var url = new Url(request.Url?.OriginalString ?? ""); + var reply = f(url); + + if (reply != null) + { + using var stream = response.OutputStream; + stream.Write(reply); + } + else + { + response.StatusCode = 404; + } + } + else + response.StatusCode = 403; + + response.Close(); + } + + // ReSharper disable once FunctionNeverReturns + } +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj b/csharp/App_backup/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj new file mode 100644 index 000000000..3319ad099 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj @@ -0,0 +1,26 @@ + + + + + InnovEnergy.App.OpenVpnCertificatesServer + + + + + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/csharp/App_backup/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs b/csharp/App_backup/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs new file mode 100644 index 000000000..b782c8165 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs @@ -0,0 +1,141 @@ +using Org.BouncyCastle.Asn1.Pkcs; +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Generators; +using Org.BouncyCastle.Crypto.Operators; +using Org.BouncyCastle.Math; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.X509; + +namespace InnovEnergy.App.OpenVpnCertificatesServer.PKI; + +public static class CertificateAuthority +{ + private const Int32 KeySize = 2048; + private const Double DaysPerYear = 365.25; + + private static X509Certificate CaCertificate { get; } = Pem.Decode(CaCertificatePem); + private static RsaKeyPairGenerator KeyGenerator { get; } = new RsaKeyPairGenerator(); + private static SecureRandom Rng { get; } = new SecureRandom(); + + static CertificateAuthority() + { + var parameters = new KeyGenerationParameters(Rng, KeySize); + KeyGenerator.Init(parameters); + } + + public static AsymmetricCipherKeyPair CreateKeyPair() + { + Console.WriteLine("Creating key pair"); + return KeyGenerator.GenerateKeyPair(); + } + + public static X509Certificate CreateCertificate(String subjectName, AsymmetricCipherKeyPair subjKeyPair) + { + Console.WriteLine($"issuing certificate for {subjectName}"); + + var caKey = Pem.Decode(CaKeyPem, "max helfried harald ursin"); + + if (caKey == null) + throw new Exception("Failed to decode the CA key!"); + + var subjectDn = new X509Name("CN=" + subjectName); + var issuerDn = CaCertificate.IssuerDN; + var notBefore = DateTime.UtcNow; + var notAfter = notBefore.Add(TimeSpan.FromDays(DaysPerYear*100)); + var serialNo = BigInteger.ValueOf(Rng.Next()); + + var cg = new X509V3CertificateGenerator(); + + cg.SetIssuerDN(issuerDn); + cg.SetSubjectDN(subjectDn); + cg.SetSerialNumber(serialNo); + cg.SetNotAfter(notAfter); + cg.SetNotBefore(notBefore); + cg.SetPublicKey(subjKeyPair.Public); + + var algorithm = PkcsObjectIdentifiers.Sha256WithRsaEncryption.ToString(); + var sign = new Asn1SignatureFactory(algorithm, caKey.Private); + var subjCert = cg.Generate(sign); + + if (!Validate(subjCert, caKey.Public)) + throw new Exception("Failed to validate newly created certificate!"); + + return subjCert; + } + + + private static Boolean Validate(X509Certificate cert, ICipherParameters pubKey) + { + cert.CheckValidity(DateTime.UtcNow); + + var tbsCert = cert.GetTbsCertificate(); // To Be Signed + var sig = cert.GetSignature(); + + var signer = SignerUtilities.GetSigner(cert.SigAlgName); + + signer.Init(forSigning: false, + parameters: pubKey); + + signer.BlockUpdate(input: tbsCert, + inOff: 0, // offset + length: tbsCert.Length); + + return signer.VerifySignature(sig); + } + + private const String CaKeyPem = + @"-----BEGIN RSA PRIVATE KEY----- + Proc-Type: 4,ENCRYPTED + DEK-Info: AES-256-CBC,C0B37765BDFC7D269C7057A3A463AB63 + + gSajHtV+qhJHBONKDktf3XoGS2Vwp0dHpk9sr1dRIThxLf6D7O1dYcTjIXJ/Iz+M + DkV7vnyigADH//9Hv7BwEyJCnie44ChTVxfIGLIwtxlp2oKBVuNmOJRtl+VFgKeG + zzzPxhMpgZJjpRm/jmdLp2YII374+P0fix+ZCTlzWDE5nbjnuumfK5+f+xtQMC4l + F1QoiZSe6k80Li7e/9Qd+e7i8nMNwCrS7jA6ayGIr7/vLWDjMtEjLF6YGAzGGHzQ + 3JHb8rsmUX1I6KApYjlZVYHsdnqtN34TZen9zcWyqijSJS6S+hQLf0i+F8hY0Z/J + Y5fHk6br61n/6ZeEY7ijklVUeesbpc+JbjWAhYsg8wyVFTEQGVlLy7D0okO0x6J7 + ej/aYUd9Fo2Jnl1I5BZYLXgg9WDsL4hu8u8EqbM4j4oIFxg6wlClMb4gS4iIl26v + 36gisNzUY0xNVffLGKyAHsfi6pU8NSbh4Oil/TJcYR9jYu6GhB9Yvpnunc2/ae0W + 1uRz6LP+RV9KWme2Diz3Kw1A049eiRC4qCJCsCGAJZzrKq6Anc7Ia47FDEC9J2yC + +5vaPPv6j+pWJJv3wbopl8AStm0hTjg26HAyju3BYFqawP/XcjmVsO+y675vclaH + g+Anr8gi3K4YNzOOLSOl2Fe/IK1BnMpHvabKy4Jo+NYfEIHUnWW1YBRAL6lWE2j2 + wuZ5u+mhBYGkdQvhRCpJbe9GmXORjy5GJF/Pkyh27KHU/BxsnceY5OW12wk7nGBf + HUajeFI5G9DyftJvVJ/WyACe5915JoujVIgSnYM3z/kg3VzOB8OdvUYkNBj+Xj3i + Bwd1k3Due1HSlPnrW4JlCkMGQV2uhoOSZhHgxkUw/JRmBNBll6qyyqdyeRFFFIMD + KaELfoCSpjlh6uA6zgS2MO1KdilINgTevyrSeMMqPY7YlH9YyEknyqSpwXNqyDfb + itHs03n9lrksPgKQGstG9yrbKBan6dDn5rXnbvWrkEIUfrer/1YteCy1IYG49uZZ + /jo82FEO/h7fyApevk/CHWMBt52EgXzAzAqz9okRNp93aGoc6jWFvfdAxp/vxIOp + NGNN3LMvFwROr2y1d7VFKe45skCjFsYSGKqjnMZfUGHyFJSKV7LiOj9N32Mt9pj8 + 6nN8JFW2NmhOOPJd1CK7r1zXv4UWwnFFNlqzQkLujTNUUmhJhrqPCsbWOcVT9kqp + 6GyyE4XO0u02ORpcA9WdniJmua5lTVF25BVZ8lwErJ5hlYaOPYpTbIlJGNZo9e1A + 73ZfmANg/5TO4FqI0NJrUJN7ZIwwUPU8qH1wZcsTrnhSqaEKES+xqP6GfORMgIaE + J3aLMd7BRVPWC05/6ki98LJz8+/ZURS9oGVNKwy4S7rCi0me2Vi/shzmEk6cRH4R + uthELMaGMFCUjjKGclIdsT8MfMHPZ3VvzTEZANTMWSljdVat4UUcEj+MAQr5Q9uL + VcaAe/AweVaVI3hmXORzph3Uv4o8Im0eWss+IHUziE1uqwOrLhXIljNUNztrD2hP + kF20s1oGUKZ/V+lC/az7V7aZP8PreYV0P5mvP+v8gNepx62yCPLcyks9+IINz349 + -----END RSA PRIVATE KEY-----"; + + public const String CaCertificatePem = + @"-----BEGIN CERTIFICATE----- + MIIDNDCCAhygAwIBAgIJAOtFlqoxtDSsMA0GCSqGSIb3DQEBCwUAMBUxEzARBgNV + BAMMCjQ4VEwyMDBfY2EwIBcNMTgxMTE5MTUxMjQ5WhgPMjExODExMjAxNTEyNDla + MBUxEzARBgNVBAMMCjQ4VEwyMDBfY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw + ggEKAoIBAQCyPY+iqCVOwIEulgIwKktMA4RpGPwHxDXKBak+M2/uG2skW1DnoaaK + taWxcGBJrxsRJQEoAKkYDZAmleBwRcd7oaVK/NcRtyA83y7GJ4y77HxvVKYxwBMB + 37EgkUXnBUcnUedrITVDZ6Fr+JYzRzfTb5M0x06W3RZvkTfyirq27CdnZ9SJXHC1 + cgeyqnJzlPqH7etmxdUnqPeuRMa6g1lsGGjz0p03Fqbu5rjkB+TXGSkUqPbAho4b + Qg+7XFR1El5MP0u83rmRyID+6k5yt2KLPlr6VH0xUL/EQzezNmEgwuFv5AWt33HT + /VCpo5TDXkZBvgjxlBvoeoswuKYv9wR7AgMBAAGjgYQwgYEwHQYDVR0OBBYEFKtA + pTzAM02NhCrCtEuuw+x9S08gMEUGA1UdIwQ+MDyAFKtApTzAM02NhCrCtEuuw+x9 + S08goRmkFzAVMRMwEQYDVQQDDAo0OFRMMjAwX2NhggkA60WWqjG0NKwwDAYDVR0T + BAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAJPK22mlvUA2 + yKnNJKC+91AVtclwuVB+862RyGb1d1RwI2+fB7KkqyBUXaIqvDS3c5R/gXksx2Nj + nDZT0wUZpuSK8jCS6vaibQZOeucq1hYdTJUuPW34LWVUQs8LD4kaF9CNbiWMtuUg + UOKul0yD2xVhbR+ZfBqdp836gYQmR44SRNRd7IwZJsuopciQKnoVPZPXk6isyusK + hvx12IpeWtmc0n2ubOhDKhiK8kVU6QKQvCcuhiNqPKc7FvUyHrVBUhUuHluxXy2T + TltkEV+VSpv5sA/c25zp8hGyLtV+LirphEMUZgBG3cE2dX2O0PUFDBTVJUDUTCQw + aO2cAFGrouw= + -----END CERTIFICATE-----"; + +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/PKI/Pem.cs b/csharp/App_backup/OpenVpnCertificatesServer/PKI/Pem.cs new file mode 100644 index 000000000..8015c4e71 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/PKI/Pem.cs @@ -0,0 +1,53 @@ +using Org.BouncyCastle.OpenSsl; + +namespace InnovEnergy.App.OpenVpnCertificatesServer.PKI; + +public static class Pem +{ + public static String Encode(Object obj) + { + using var sw = new StringWriter(); + + var pem = new PemWriter(sw); + pem.WriteObject(obj); + pem.Writer.Flush(); + + return sw.ToString(); + } + + public static T Decode(String pem) + { + using var reader = new StringReader(pem); + var pemReader = new PemReader(reader); + return (T) pemReader.ReadObject(); + } + + public static T? Decode(String pem, IPasswordFinder pwf) + { + try + { + using var reader = new StringReader(pem); + var pemReader = new PemReader(reader, pwf); + return (T) pemReader.ReadObject(); + } + catch + { + return default; + } + } + + public static T? Decode(String pem, String password) + { + try + { + using var reader = new StringReader(pem); + var pwf = new PwdFinder(password); + var pemReader = new PemReader(reader, pwf); + return (T) pemReader.ReadObject(); + } + catch (Exception) + { + return default; + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/PKI/PwdFinder.cs b/csharp/App_backup/OpenVpnCertificatesServer/PKI/PwdFinder.cs new file mode 100644 index 000000000..3bbe9354a --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/PKI/PwdFinder.cs @@ -0,0 +1,15 @@ +using Org.BouncyCastle.OpenSsl; + +namespace InnovEnergy.App.OpenVpnCertificatesServer.PKI; + +public class PwdFinder : IPasswordFinder +{ + private readonly Char[] _Password; + + public PwdFinder(String password) + { + _Password = password.ToCharArray(); + } + + public Char[] GetPassword() => _Password; +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/Program.cs b/csharp/App_backup/OpenVpnCertificatesServer/Program.cs new file mode 100644 index 000000000..189653434 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/Program.cs @@ -0,0 +1,287 @@ +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using System.Text.Json; +using Flurl; +using ICSharpCode.SharpZipLib.Tar; +using InnovEnergy.App.OpenVpnCertificatesServer.PKI; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VictronVRM; +using Org.BouncyCastle.Crypto; +using static InnovEnergy.App.OpenVpnCertificatesServer.PKI.CertificateAuthority; + +namespace InnovEnergy.App.OpenVpnCertificatesServer; + +// export SolutionDir=$(pwd) +// dotnet publish OpenVpnCertificatesServer.csproj -c Release -r linux-x64 -p:PublishSingleFile=true --self-contained true && scp bin/Release/net6.0/linux-x64/publish/OpenVpnCertificatesServer ig@salidomo.innovenergy.ch:~/get_cert/get_cert +// scp bin/Release/net6.0/linux-x64/publish/token.json ig@salidomo.innovenergy.ch:~/get_cert/token.json + + +// http://localhost:4000/get_cert?machine_serial=HQ2032UAWYM +// http://localhost:4000/get_cert?unique_id=985dadd0cf29 + +// quotes!! +// wget 'http://localhost:4000/get_cert?name=MYNAME&pw=MwBRbQb3QaX7l9XIaakq' + +[SuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic access otherwise can break functionality when trimming application code")] +public static class Program +{ + // TODO: use fody weaver to obfuscate strings? + + private const String VpnSubnet = "10.2."; + private const String VpnGateway = "10.2.0.1"; + + private const String VpnDir = "/etc/openvpn/server/Salino"; + private const String CcdDir = VpnDir + "/ccd"; + private const String CertsDir = VpnDir + "/certs"; + private const String Endpoint = "http://localhost:4000/"; + + private static AccToken? ReadAccessToken() + { + var content = File.ReadAllText("./token.json"); + + return JsonSerializer.Deserialize(content); + } + + + private const String ManualPw = "MwBRbQb3QaX7l9XIaakq"; + + private const String QueryPath = "/get_cert"; + private const String NameQueryParam = "name"; + private const String UniqueIdQueryParam = "unique_id"; + private const String MachineSerialQueryParam = "machine_serial"; + private const String PwdQueryParam = "pw"; + + + private const Int64 MachineSerialAttribute = 556; // TODO: enum + + private static readonly (String, String)? InvalidRequest = null; + + private static IEnumerable CcdFiles => Directory.GetFiles(CcdDir); + + public static void Main(String[] args) => Endpoint.ServeGet(GetCert); + + private static Byte[]? GetCert(Url url) + { + var request = ParseRequest(url).Result; + + if (!request.HasValue) + return null; + + var (ccdName, humanReadableName) = request.Value; + + var ip = GetNextFreeIp(); + var keyPair = CreateKeyPair(); + var cert = CreateCertificate(ccdName, keyPair).Apply(Pem.Encode); + var tar = PackTar(cert, humanReadableName, keyPair, ip); + + WriteServerCertificateFiles(ccdName, ip, tar); + + Console.WriteLine($"returning certificate for {humanReadableName}\n"); + return tar; + } + + private static Byte[] PackTar(String certificate, String certificateName, AsymmetricCipherKeyPair keys, String ip) + { + Console.WriteLine("packing tar"); + + var publicKey = keys.Public .Apply(Pem.Encode); + var privateKey = keys.Private.Apply(Pem.Encode); + + using var ms = new MemoryStream(); + + using (var ts = new TarOutputStream(ms, Encoding.UTF8) {IsStreamOwner = false}) + { + ts.WriteTextFile("installation-ip" , ip); + ts.WriteTextFile("installation-name" , certificateName); + ts.WriteTextFile("ca-certificate" , CaCertificatePem.Replace(" ", "")); // remove leading spaces + ts.WriteTextFile("client-certificate", certificate); + ts.WriteTextFile("client-key.pub" , publicKey); + ts.WriteTextFile("client-key" , privateKey); + ts.WriteTextFile("innovenergy.conf" , Files.OvpnConf); + ts.WriteTextFile("README.txt" , Files.ReadMeTxt); + } + // MUST Dispose to commit data to underlying MemoryStream !!!! + + return ms.ToArray(); + } + + + private static async Task<(String CcdName, String HumanReadableName)?> ParseRequest(Url? url = null) + { + Console.WriteLine($"got request {url}"); + + if (!url.Path.EndsWith(QueryPath)) + { + Console.WriteLine("Malformed request\n"); + return InvalidRequest; + } + + var ps = url.QueryParams; + + var ccdName = ps.FirstOrDefault(UniqueIdQueryParam) ?.ToString() ?? + ps.FirstOrDefault(MachineSerialQueryParam)?.ToString() ?? + ps.FirstOrDefault(NameQueryParam) ?.ToString(); + + if (!IsCcdNameValid(ccdName)) + { + Console.WriteLine($"Invalid ccd name {ccdName}\n"); + return InvalidRequest; + } + + if (!IsCcdNameAvailable(ccdName)) + { + Console.WriteLine($"ccd name {ccdName} is already in use\n"); + return InvalidRequest; + } + + return ps.Contains(NameQueryParam) ? ParseManualRequest(ps, ccdName!) + : ps.Contains(UniqueIdQueryParam) ? await LookupInstallationNameByUniqueId(ccdName!) + : ps.Contains(MachineSerialQueryParam) ? await LookupInstallationNameByMachineSerial(ccdName!) + : InvalidRequest; + } + + private static async Task<(String ccdName, String humanReadableName)?> LookupInstallationNameByUniqueId(String uniqueId) + { + Console.WriteLine($"looking up unique id {uniqueId} on VRM"); + + //var installationName = await LookupInstallationNameByUniqueId(ccdName); + var token = ReadAccessToken(); + + var vrm = VrmAccount.Token(token.idUser, token.token); + + + var installations = await vrm.GetInstallations(); + + var installationName = installations + .Where(i => i.UniqueId == uniqueId) + .Select(i => i.Name) + .FirstOrDefault(); + + return !String.IsNullOrWhiteSpace(installationName) + ? (uniqueId, installationName) + : null; + } + + private static async Task<(String ccdName, String humanReadableName)?> LookupInstallationNameByMachineSerial(String ccdName) + { + Console.WriteLine($"looking up {ccdName} on VRM"); + var token = ReadAccessToken(); + + using var vrm = VrmAccount.Token(token.idUser, token.token); + + var installations = await vrm.GetInstallations(); + + foreach (var installation in installations) + { + var details = await installation.GetDetails(); + + var id = details.MachineSerial(); + + if (id == ccdName) + return (ccdName, installation.Name); + } + + Console.WriteLine($"not found"); + return null; + } + + + private static (String ccdName, String humanReadableName)? ParseManualRequest(QueryParamCollection ps, String ccdName) + { + Console.WriteLine("parsing manual request"); + + var pw = ps.FirstOrDefault(PwdQueryParam)?.ToString(); + + if (pw == ManualPw) + return (ccdName, ccdName); // ccd and hr name are the same in this case + + Console.WriteLine("Malformed request\n"); + + return null; + } + + + private static Boolean IsCcdNameValid(String? ccdName) + { + return ccdName != null && ccdName.All(IsValidChar); + + Boolean IsValidChar(Char c) => Char.IsLetterOrDigit(c) || c is '_' or '-'; + } + + private static Boolean IsCcdNameAvailable(String? ccdName) + { + Console.WriteLine($"checking ccdName {ccdName ?? ""}"); + + return ccdName != null && !CcdFiles + .Select(Path.GetFileName) + .Contains(ccdName); + } + + private static void WriteServerCertificateFiles(String ccdName, String ip, Byte[] certsTar) + { + Console.WriteLine($"storing certificate {ccdName} in {CertsDir}"); + + var ccdContent = $"ifconfig-push {ip} {VpnGateway}"; + var ccdFile = $"{CcdDir}/{ccdName}"; + var tarFile = $"{CertsDir}/{ccdName}.tar"; + + File.WriteAllText (ccdFile, ccdContent); + File.WriteAllBytes(tarFile, certsTar); + } + + + // TODO: this could be made simpler using OrderBy/ThenBy + private static Int32 GetId(String ccdFile) + { + var ip = File + .ReadAllLines(ccdFile) + .Select(l => l.Trim()) + .SingleOrDefault(l => l.StartsWith("ifconfig-push"))? + .Split(" ", StringSplitOptions.RemoveEmptyEntries) + .ElementAtOrDefault(1); + + if (ip == null) + return 0; + + var bytes = ip.Split("."); + + var hi = bytes.ElementAtOrDefault(2); + var lo = bytes.ElementAtOrDefault(3); + + // TODO: GetIp => tuple (a,b,hi,lo) ? + + if (hi == null || lo == null) + return 0; + + if (!Byte.TryParse(hi, out var hiByte) || !Byte.TryParse(lo, out var loByte)) + return 0; + + return hiByte * 256 + loByte; + } + + + // TODO: this could be made simpler using OrderBy/ThenBy + private static String GetNextFreeIp() + { + // 10.2.hi.lo + // id := 256 * hi + lo + + var id = CcdFiles.Max(GetId) + 1; + + var lo = id % 256; + + // x.y.z.0 and x.y.z.255 are reserved + if (lo == 0) id += 1; + if (lo == 255) id += 2; + + var hi = id / 256; + lo = id % 256; + + Debug.Assert(lo != 0); + Debug.Assert(lo != 255); + Debug.Assert(hi != 255); + + return $"{VpnSubnet}{hi}.{lo}"; + } +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/Utils.cs b/csharp/App_backup/OpenVpnCertificatesServer/Utils.cs new file mode 100644 index 000000000..aea6faf59 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/Utils.cs @@ -0,0 +1,38 @@ +using System.Text; +using ICSharpCode.SharpZipLib.Tar; + +namespace InnovEnergy.App.OpenVpnCertificatesServer; + +public static class Utils +{ + public static void WriteFile(this TarOutputStream tar, String fileName, Byte[] contents, Boolean executable = false) + { + var header = new TarHeader + { + Name = fileName.Trim('\\', '/'), + Mode = executable ? 33261 : 33188, // chmod: 100755, 100644 + Size = contents.Length, + ModTime = DateTime.UtcNow, + TypeFlag = TarHeader.LF_NORMAL, // normal file + UserName = "", + GroupName = "", + }; + + var entry = new TarEntry(header); + + tar.PutNextEntry(entry); + tar.Write(contents); + tar.CloseEntry(); + } + + public static void WriteTextFile(this TarOutputStream tar, + String fileName, + String contents, + Encoding? encoding = null, + Boolean executable = false) + { + encoding ??= Encoding.UTF8; + var data = encoding.GetBytes(contents); + tar.WriteFile(fileName, data, executable); + } +} \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/newToken.sh b/csharp/App_backup/OpenVpnCertificatesServer/newToken.sh new file mode 100755 index 000000000..37984f65a --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/newToken.sh @@ -0,0 +1,32 @@ +#!/bin/bash +## create a new VRM access token +## USAGE: ./newToken.sh -u Username -p Password -n UniqueTokenName + + +while getopts u:p:n: flag +do + case "${flag}" in + u) username=${OPTARG};; + p) password=${OPTARG};; + n) name=${OPTARG};; + esac +done + +response=$(curl --request POST \ + --url https://vrmapi.victronenergy.com/v2/auth/login \ + --header 'Content-Type: application/json' \ + --data '{"username":"'$username'","password":"'$password'","sms_token":null,"remember_me":false,"language":""}') + +echo -n '{"bearer' > token.json +token=$(echo $response | jq ".token") + +uid=$(echo $response | jq ".idUser") +echo -n ${response:7:-1} >> token.json + +response2=$(curl --request POST \ + --url https://vrmapi.victronenergy.com/v2/users/$uid/accesstokens/create \ + --header 'Content-Type: application/json' \ + --header 'x-authorization: Bearer '${token:1:-1} \ + --data '{"name":"'$name'"}') +echo -n , >> token.json +echo -n ${response2:1} >> token.json \ No newline at end of file diff --git a/csharp/App_backup/OpenVpnCertificatesServer/token.json b/csharp/App_backup/OpenVpnCertificatesServer/token.json new file mode 100644 index 000000000..456c09453 --- /dev/null +++ b/csharp/App_backup/OpenVpnCertificatesServer/token.json @@ -0,0 +1 @@ +{"bearer":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjJmYzY5NTNiMjhjNTg3NWQyMzQwNzM3ZjlhNGIzM2RjIn0.eyJ1aWQiOiI1NTQ1MCIsInRva2VuX3R5cGUiOiJkZWZhdWx0IiwiaXNzIjoidnJtYXBpLnZpY3Ryb25lbmVyZ3kuY29tIiwiYXVkIjoiaHR0cHM6Ly92cm1hcGkudmljdHJvbmVuZXJneS5jb20vIiwiaWF0IjoxNjc5NTg2ODU0LCJleHAiOjE2Nzk2NzMyNTQsImp0aSI6IjJmYzY5NTNiMjhjNTg3NWQyMzQwNzM3ZjlhNGIzM2RjIn0.AsLJU7qDPBHO-_FjVo9a8RbyoxhYrDrwZX7V3z4Xq8EoUulv2VyTqy9OXLpez4JI2FVAfSO5a7Amj4XvK1AWtDr9MxP07IBfPyMu5LLGTzjPMAJ6fvZbvZ-eRsP1-aARCFekMGoeSvEEBDrZB9_0kps4h9idQwwGwAby2Tya0vNGu6QEw9WmHcbL8qjvJzxavg8bK6Lttv2-3l_11iZoqiYLdXbwBi32GYK_sdwp-fbGvPE1d6g6eVll94JfSqNLZl9baijtOksx_Qouu7YB8knCgFNrx535d4iJtCkMv9xWztWXbevpSQiy9S8pCgLSpmHNztlVDjacEYyduwUzyw","idUser":55450,"verification_mode":"password","verification_sent":false,"success":true,"token":"108a1407da84afea182b8102a202a2c6b73e9bd6ad919f521033b09837e6e564","idAccessToken":"385119"} \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/Login.cs b/csharp/App_backup/RemoteSupportConsole/Login.cs new file mode 100644 index 000000000..7e3edbe35 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/Login.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.App.RemoteSupportConsole; + +public static class Login +{ + public const String Token = "ccf470115ca6b729475b9f6a8722a7eb4036df043e7cbaf5002c2c18ccd2e4ee"; + public const UInt64 UserId = 55450; +} \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/ObservablePipeSource.cs b/csharp/App_backup/RemoteSupportConsole/ObservablePipeSource.cs new file mode 100644 index 000000000..a5e1af9d7 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/ObservablePipeSource.cs @@ -0,0 +1,20 @@ +using System.Reactive.Linq; +using System.Reactive.Threading.Tasks; +using CliWrap; + +namespace InnovEnergy.App.RemoteSupportConsole; + +public static class ObservablePipeSource +{ + + // TODO: move to utils? + + public static PipeSource AsPipeSource(this IObservable observable) + { + return PipeSource.Create((destination, cancellationToken) => + observable + .Select(data => destination.WriteAsync(data, 0, data.Length, cancellationToken)) + .ToTask(cancellationToken) + ); + } +} \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/Program.cs b/csharp/App_backup/RemoteSupportConsole/Program.cs new file mode 100644 index 000000000..03067a613 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/Program.cs @@ -0,0 +1,162 @@ +using System.Reflection; +using System.Text; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VictronVRM; +using static System.Globalization.CompareOptions; + +namespace InnovEnergy.App.RemoteSupportConsole; + +// dotnet publish -c release -r ubuntu-x64 +// dotnet publish RemoteSupportConsole.csproj -c Release -r linux-x64 -p:PublishSingleFile=true --self-contained true + +public static class Program +{ + public static async Task Main(String[] args) + { + Console.WriteLine(); + + var options = args.Where(IsOption).Select(a => a.Trim('-').ToLower()).ToList(); + var installationName = args.LastOrDefault(a => !a.IsOption()) ?? ""; + + if (options.Contains("h") || options.Contains("help")) + { + PrintUsage(); + return 0; + } + + var vrm = VrmAccount.Token(Login.UserId, Login.Token); + + var installations = await VrmInfo.GetInstallations(vrm); + + // await DumpInstallations(installations); + + var chosenInstallation = installations.ChooseInstallation(installationName); + + if (!chosenInstallation.HasValue) + return 0; + + var installation = chosenInstallation.Value; + + var details = await installation.GetDetails(); + var useVrmTunnel = options.Contains("vrm"); + + var connection = useVrmTunnel + ? VrmConnection.Open(installation, details) + : VpnConnection.Open(installation, details); + + return await connection; + } + + + + private static void PrintUsage() + { + var asm = Assembly.GetExecutingAssembly().GetName().Name; + + Console.WriteLine(); + Console.WriteLine($"Usage: {asm} [--vpn|--vrm] [InstallationName]"); + Console.WriteLine(" "); + Console.WriteLine(" --vpn use InnovEnergy VPN to connect (default) "); + Console.WriteLine(" --vrm use Victron remote support to connect "); + Console.WriteLine(" "); + Console.WriteLine(" InstallationName can be omitted or partial (case insensitive)"); + Console.WriteLine(); + } + + private static Installation? ChooseInstallation(this IReadOnlyList chooseFrom, + String installationName) + { + + // IgnoreNonSpace: u==ü, ignore umlauts and the like + Boolean Match(Installation i) => i.Name.Contains(installationName, IgnoreCase | IgnoreSymbols | IgnoreNonSpace); + + var matchingInstallations = chooseFrom + .Where(Match) + .ToList(); + + if (matchingInstallations.Count == 1) + return matchingInstallations.First(); // found a single match, return it + + var input = matchingInstallations.Count > 0 ? installationName : ""; + + // zero or more than 1 found, let user choose + var iName = "Select installation:".ChooseFrom(chooseFrom.Select(i=>i.Name), input); + + if (chooseFrom.All(i => i.Name != iName)) + return null; + + return chooseFrom.First(i => i.Name == iName); + } + + private static Boolean IsOption(this String arg) => arg.StartsWith("-"); + + // DEBUG + private static async Task DumpInstallations(IReadOnlyList installations) + { + const String vrmLink = "https://vrm.victronenergy.com/installation/"; + + var sb = new StringBuilder(); + + + var header = new[] + { + "Name Installation", + "Kunde", + "Ort", + "Region", + "Firma", + "Auftragsnummer", + "Erste Inbetriebnahme", + "VRM Id", + "VRM Link", + "Geraet Typ", + "Geraet Name", + "Geraete Serienummer", + "Firmware Version" + }; + + sb.AppendLine(header.JoinWith("$")); + + foreach (var i in installations) + { + var devices = await i.GetDevices(); + + foreach (var device in devices) + { + var x = i.Name.Split('|'); + var nameLocation = x.FirstOrDefault()?.Split(',', 2); + + var customer = nameLocation?.FirstOrDefault()?.Replace("IBN", "").Trim("_ ".ToCharArray()) ?? ""; + var locationRegion = nameLocation?.LastOrDefault()?.Trim() ?? ""; + var location = locationRegion.Split("/").FirstOrDefault()?.Trim() ?? ""; + var region = locationRegion.Split("/").LastOrDefault()?.Trim() ?? ""; + + var company = x.LastOrDefault()?.Split('(').FirstOrDefault()?.Trim() ?? ""; + var sn = x.LastOrDefault()?.Split('(').LastOrDefault()?.Trim("() ".ToCharArray()) ?? ""; + + var created = i.Created.DateTimeFromUnixTime().ToString("dd.MM.yyyy HH:mm"); + + var line = new[] + { + i.Name, + customer, + location, + region, + company, + sn, + created, + i.UniqueId, + vrmLink + i.IdSite, + device.Type, + device.ProductName, + device.SerialNumber, + device.FirmwareVersion + }; + + sb.AppendLine(line.JoinWith("$").WriteLine()); + } + } + + File.WriteAllText("Installations.csv", sb.ToString()); + } +} diff --git a/csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj b/csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj new file mode 100644 index 000000000..ac1e5336b --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj @@ -0,0 +1,21 @@ + + + + + + InnovEnergy.App.RemoteSupportConsole + + + + + + + + + + + + + + + diff --git a/csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings b/csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings new file mode 100644 index 000000000..4887f9475 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings @@ -0,0 +1,2 @@ + + CSharp100 \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/Ssh.cs b/csharp/App_backup/RemoteSupportConsole/Ssh.cs new file mode 100644 index 000000000..dd4fe7a4e --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/Ssh.cs @@ -0,0 +1,46 @@ +using CliWrap; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.RemoteSupportConsole; + +public static class Ssh +{ + const String ConfigFile = "/data/innovenergy/openvpn/installation-name"; + + public static Task Interactive(String host, String? installationName, String user, String port) + { + var fixInstallationName = $"echo '{installationName}' > {ConfigFile}; exec bash -l"; + + var args = GetArgs(host, user, port) + .Append(fixInstallationName); + + return Cli + .Wrap("ssh") + .WithArguments(args, true) + .ExecuteInteractive(); + } + + public static Command Command(String host, String user , String port) + { + var args = GetArgs(host, user, port); + + return Cli + .Wrap("ssh") + .WithArguments(args, true); + } + + private static IEnumerable GetArgs(String host, String user, String port) + { + return new[] + { + "-o UserKnownHostsFile=/dev/null", + "-o StrictHostKeyChecking=no", + "-o ServerAliveInterval=5", + "-o PasswordAuthentication=no", + "-o LogLevel=ERROR", + "-tt", // allocate PTS, necessary + $"-p {port}", + $"{user}@{host}" + }; + } +} \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/VpnConnection.cs b/csharp/App_backup/RemoteSupportConsole/VpnConnection.cs new file mode 100644 index 000000000..b2442eea1 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/VpnConnection.cs @@ -0,0 +1,25 @@ +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VictronVRM; +using static System.ConsoleColor; + +namespace InnovEnergy.App.RemoteSupportConsole; + +public static class VpnConnection +{ + public static async Task Open(Installation installation, IReadOnlyList details) + { + var machineSerial = details.MachineSerial(); // DEPRECATED + var installationId = installation.UniqueId; + + var vpnIp = await VpnInfo.LookUpIp(installationId, machineSerial); // look up by InstallationId OR machineSerial + + if (String.IsNullOrWhiteSpace(vpnIp)) + return 1; + + "Starting VPN connection with ".Write(); + installation.Name.WriteLine(Green); + Console.WriteLine(); + + return await Ssh.Interactive(vpnIp, installation.Name, "root", "22"); + } +} \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/VpnInfo.cs b/csharp/App_backup/RemoteSupportConsole/VpnInfo.cs new file mode 100644 index 000000000..0137a3b50 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/VpnInfo.cs @@ -0,0 +1,36 @@ +using Flurl; +using Flurl.Http; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.RemoteSupportConsole; + +public static class VpnInfo +{ + private const String Address = "http://10.2.0.1"; + private const String Path = "vpnstatus.txt"; + + public static async Task LookUpIp(params String?[] commonNames) + { + $"looking up ip of {String.Join("/", commonNames)} in VPN routing table... ".Write(); + + var raw = await Address + .AppendPathSegment(Path) + .GetStringAsync(); + + var ip = raw + .Split('\n') + .Select(l => l.Split(',')) + .Where(l => l.Length > 2 && commonNames.Contains(l[2].Trim()) && l[0] == "ROUTING_TABLE") + .Select(l => l[1]) + .SingleOrDefault(); + + if (String.IsNullOrEmpty(ip)) + "not found".WriteLine(ConsoleColor.Red); + else + ip.WriteLine(ConsoleColor.Cyan); + + return ip; + } + + +} \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/VrmConnection.cs b/csharp/App_backup/RemoteSupportConsole/VrmConnection.cs new file mode 100644 index 000000000..03dd1e252 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/VrmConnection.cs @@ -0,0 +1,128 @@ +using System.Reactive.Linq; +using System.Reactive.Subjects; +using System.Text; +using CliWrap.EventStream; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VictronVRM; +using static System.ConsoleColor; +using static System.StringSplitOptions; + +namespace InnovEnergy.App.RemoteSupportConsole; + +public static class VrmConnection +{ + public static async Task Open(Installation installation, IReadOnlyList details) + { + var rsHost = details.RemoteSupportIp(); + var rsPort = details.RemoteSupportPort(); + + "starting remote support connection with ".Write(); + installation.Name.WriteLine(Green); + + using var proxy = await OpenProxy(rsHost!, rsPort!); + + "initiating SSH connection\n".WriteLine(); + + return await Ssh.Interactive(proxy.Host, installation.Name, proxy.User, proxy.Port); + + } + + private static async Task OpenProxy(String rsHost, String rsPort) + { + "contacting Victron remote support host at ".Write(); + rsHost.Write(Cyan); + " ... ".Write(); + + var stdIn = new Subject(); + + var stdInPipe = stdIn + .Select(l => l + "\n") + .Select(Encoding.UTF8.GetBytes) + .AsPipeSource(); + + var stdOut = Ssh + .Command(rsHost, "ccgxsupport", "22") + .WithStandardInputPipe(stdInPipe) + .Observe() + .OfType() + .Select(e => e.Text) + .Replay(); + + var connection = stdOut.Connect(); + + await stdOut.FirstAsync(l => l.StartsWith("Full readline support")); + + "ok".WriteLine(); + "requesting tunnel through port ".Write(); + rsPort.Write(Cyan); + " ... ".Write(); + + stdIn.OnNext($"proxyport {rsPort}"); + + var connectMsg = await stdOut.FirstAsync(l => l.StartsWith("You can now connect")); + + "ok".WriteLine(); + + var portUserHost = connectMsg.Split(" ", RemoveEmptyEntries); + var userHost = portUserHost[^1].Split("@"); + var user = userHost[0]; + var host = userHost[1]; + var port = portUserHost[^2]; + + return new VrmProxy(connection, user, host, port); + } + + public static IObservable Log(this IObservable es) + { + return es.Do(e => Console.WriteLine(Log(e))); + } + + private static String Log(CommandEvent e) => e switch + { + StandardOutputCommandEvent so => "=> " + so.Text, + StandardErrorCommandEvent se => "!! " + se.Text, + StartedCommandEvent => "START", + ExitedCommandEvent => "EXIT", + _ => "UNKNOWN MESSAGE: " + e.GetType().Name + }; +} + + +// ReSharper disable CommentTypo + +// $ ssh ccgxsupport@3.72.120.57 +// Welcome to the Victron remote support tunnel creator. +// +// You will given a one-time tunnel. SSH authentication to +// the Color Control is done with your SSH public key. +// +// ***************************************************************************** +// * IMPORTANT NOTE: * +// * * +// * There are now multiple SSH support hosts. Logging in directly * +// * is not officially supported behavior, because you may end up on the wrong * +// * server. A script called 'rs' to use the new format '1.2.3.4;45630' is * +// * available. Ask your Victron contact to supply you with it. * +// ***************************************************************************** +// +// The proxy opened up to the CCGX will be restricted to your IP: 145.40.192.17 +// +// Commands are: +// proxyport [port] - take color control [port] and temporarily make it available to the outside. +// iptoport [ip] - show the ports being listened on by that IP. Note, you do need to know +// which server the device is connected to. Currently, possibilites are: +// - 84.22.108.49 (EU) +// - 84.22.107.120 (EU) +// - 3.69.217.175 (EU) +// - 3.72.120.57 (EU) +// - 3.25.10.245 (AUS Sydney) +// - 35.165.124.40 (USA West) +// - 13.244.154.199 (South Africa) +// - 13.246.113.18 (South Africa) +// A good start would be the last known, as seen on the diagnostics page. +// exit - exits the shell and all tunnels you set up +// +// Full readline support (command history and editing) is available. +// +// proxyport 24337 +// You can now connect to the CCGX with: ssh -o 'UserKnownHostsFile=/dev/null' -o 'StrictHostKeyChecking=no' -o 'ServerAliveInterval=60' -p 4001 root@3.72.120.57 \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/VrmInfo.cs b/csharp/App_backup/RemoteSupportConsole/VrmInfo.cs new file mode 100644 index 000000000..32568ae23 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/VrmInfo.cs @@ -0,0 +1,45 @@ +using Flurl.Http; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VictronVRM; +using static System.ConsoleColor; + +namespace InnovEnergy.App.RemoteSupportConsole; + + +public static class VrmInfo +{ + public static async Task> GetInstallations(this VrmAccount account) + { + "Fetching installations from VRM... ".Write(); + + try + { + var installations = await account.GetInstallations(); + + $"success ({installations.Count})".WriteLine(Green); + + if (installations.Count <= 0) + { + "No installations found".WriteLine(Red); + Environment.Exit(1); + } + + return installations; + } + catch (AggregateException ae) when (ae.InnerExceptions.FirstOrDefault() is FlurlHttpException fhe && + fhe.Call.Completed) + { + fhe.Call.Response.StatusCode.ToString().WriteLine(); + "failed!".WriteLine(Red); + Environment.Exit(1); + } + catch (Exception e) + { + e.Message.WriteLine(); + "failed!".WriteLine(Red); + Environment.Exit(1); + } + + return Array.Empty(); + } +} \ No newline at end of file diff --git a/csharp/App_backup/RemoteSupportConsole/VrmProxy.cs b/csharp/App_backup/RemoteSupportConsole/VrmProxy.cs new file mode 100644 index 000000000..c629c5476 --- /dev/null +++ b/csharp/App_backup/RemoteSupportConsole/VrmProxy.cs @@ -0,0 +1,6 @@ +namespace InnovEnergy.App.RemoteSupportConsole; + +public readonly record struct VrmProxy(IDisposable Connection, String User, String Host, String Port) : IDisposable +{ + public void Dispose() => Connection.Dispose(); +} \ No newline at end of file diff --git a/csharp/App_backup/ResetBms/ResetBms.csproj b/csharp/App_backup/ResetBms/ResetBms.csproj new file mode 100644 index 000000000..394fd6b96 --- /dev/null +++ b/csharp/App_backup/ResetBms/ResetBms.csproj @@ -0,0 +1,14 @@ + + + + + InnovEnergy.App.ResetBms + + + + + + + + + diff --git a/csharp/App_backup/S3Explorer/Program.cs b/csharp/App_backup/S3Explorer/Program.cs new file mode 100644 index 000000000..e00a2df02 --- /dev/null +++ b/csharp/App_backup/S3Explorer/Program.cs @@ -0,0 +1,156 @@ +using Amazon.IdentityManagement.Model; +using Amazon.S3; +using Amazon.S3.Model; +using InnovEnergy.Lib.S3Utils; +using InnovEnergy.Lib.S3Utils.DataTypes; +using InnovEnergy.Lib.Utils; +using S3Cfg = InnovEnergy.Lib.S3Utils.S3Cfg; + +namespace InnovEnergy.App.S3Explorer; + +public static class Program +{ + private const String BucketSalt = "-3e5b3069-214a-43ee-8d85-57d72000c19d"; + + public static async Task Main(String[] args) + { + var region = S3Cfg.GetDefaultRegionAndCredentials(); + var x = Iam.GetIamClient(region!); + + var c = await x.ListRolesAsync(new ListRolesRequest()); + + + + + + + // Todo refactor S3Access into Lib + + // Sssssecret + if (args.Contains("-s")) + await SnakeGameSs.PlaySnake(); + + // Help message + if (args.Length < 1 || args.Contains("-h")) + { + Console.WriteLine("Usage: S3Explorer installation-id [from-unix-time] [to-unix-time] [nb-data-points]"); + Console.WriteLine("-h Shows this message."); + Console.WriteLine("-s 🐍"); + return 0; + } + + // Parsing Arguments + var bucketName = args[0] + BucketSalt; + var now = DateTime.Now; + + var startTime = Int64.Parse(args.ElementAtOr(1, (now - TimeSpan.FromSeconds(20)).ToString())); + var endTime = Int64.Parse(args.ElementAtOr(2, now.ToString())); + var nDataPoints = Int64.Parse(args.ElementAtOr(3, "10")); + + var timestampList = GetDataTimestamps(startTime, endTime, nDataPoints); + + await PrintFiles(bucketName, timestampList); + + // Success + return 0; + } + + public static async Task ListingObjectsAsync(IAmazonS3 client, String bucketName) + { + var request = new ListObjectsV2Request { BucketName = bucketName , Prefix = "1689236"}; + + var listObjectsV2Paginator = client.Paginators.ListObjectsV2(request); + + await foreach (var response in listObjectsV2Paginator.Responses) + { + Console.WriteLine($"HttpStatusCode: {response.HttpStatusCode}"); + Console.WriteLine($"Number of Keys: {response.KeyCount}"); + + foreach (var entry in response.S3Objects) + { + Console.WriteLine($"Key = {entry.Key} Size = {entry.Size}"); + } + } + } + + + private static IEnumerable GetDataTimestamps(Int64 startTime, Int64 endTime, Int64 nDataPoints) + { + // Calculating temporal distance of data files from the number of requested points. (rounding for int division) + var timeSpan = endTime - startTime; + var timeBetweenDataPoints = (Double)timeSpan / nDataPoints; + // We only upload data every second second so sampling more is impossible. + // If this ever changes we might have to change this as well. + + // Building a List of the timestamps we want to grab the files for. + for (Double i = startTime; i <= endTime; i += timeBetweenDataPoints) + { + //Rounding to even numbers only (we only save every second second) + var integer = (Int64) Math.Round(i); + yield return integer / 2 * 2; + } + } + + private static async Task PrintFiles(String bucketName, IEnumerable timestamps) + { + var columns = new Dictionary> + { + ["timestamp"] = new() + }; + var index = 0; + + foreach (var timestamp in timestamps) + { + var csvFileText = await GetFileText(bucketName, timestamp); + + columns["timestamp"].Add(timestamp.ToString()); + + var dict = csvFileText is null + ? new Dictionary() + : csvFileText + .Select(l => l.Split(";")) + .ToDictionary(kv => kv[0], kv => kv[1]); + + foreach (var key in dict.Keys) + { + // if a key is not yet present in columns we need to backfill it with nulls + if (!columns.ContainsKey(key)) + columns[key] = Enumerable.Repeat(null, index).ToList(); + + columns[key].Add(dict[key]); + } + + // if a key in columns is not present in this record (dict) (except the timestamp) we need to set it to null + foreach (var key in columns.Keys.Where(key => !dict.ContainsKey(key) && key != "timestamp")) + { + columns[key].Add(null); + } + index++; + } + + var headerKeys = columns + .Keys + .OrderBy(k => k) + .Where(k => k != "timestamp") + .Prepend("timestamp") + .ToList(); + + String.Join(';', headerKeys).WriteLine(); + + Enumerable.Range(0, index) + .Select(i => headerKeys.Select(hk => columns[hk][i]).JoinWith(";")) + .ForEach(Console.WriteLine); + } + + // This Method extracts the Text from a given csv file on the s3 bucket + private static async Task?> GetFileText(String bucketName, Int64 timestamp) + { + var csv = await S3Cfg + .GetDefaultRegionAndCredentials()! + .Bucket(bucketName) + .Path($"{timestamp}.csv") + .GetObjectAsString(); + + return csv.Split(Environment.NewLine); + } +} \ No newline at end of file diff --git a/csharp/App_backup/S3Explorer/S3Explorer.csproj b/csharp/App_backup/S3Explorer/S3Explorer.csproj new file mode 100644 index 000000000..920519e5e --- /dev/null +++ b/csharp/App_backup/S3Explorer/S3Explorer.csproj @@ -0,0 +1,20 @@ + + + + + + InnovEnergy.App.S3Explorer + + + + + + + + + + + + + + diff --git a/csharp/App_backup/S3Explorer/SnakeGameSS.cs b/csharp/App_backup/S3Explorer/SnakeGameSS.cs new file mode 100644 index 000000000..1c07985e5 --- /dev/null +++ b/csharp/App_backup/S3Explorer/SnakeGameSS.cs @@ -0,0 +1,283 @@ +namespace InnovEnergy.App.S3Explorer; + +public static class SnakeGameSs +{ + public static async Task PlaySnake() + { + var tickRate = TimeSpan.FromMilliseconds(90); + var snakeGame = new SnakeGame(); + + using (var cts = new CancellationTokenSource()) + { + async Task MonitorKeyPresses() + { + while (!cts.Token.IsCancellationRequested) + { + if (Console.KeyAvailable) + { + var key = Console.ReadKey(intercept: true).Key; + snakeGame.OnKeyPress(key); + } + + await Task.Delay(10); + } + } + + var monitorKeyPresses = MonitorKeyPresses(); + + do + { + snakeGame.OnGameTick(); + snakeGame.Render(); + await Task.Delay(tickRate); + } while (!snakeGame.GameOver); + + // Allow time for user to weep before application exits. + for (var i = 0; i < 3; i++) + { + Console.Clear(); + await Task.Delay(500); + snakeGame.Render(); + await Task.Delay(500); + } + + cts.Cancel(); + await monitorKeyPresses; + } + } + + enum Direction + { + Up, + Down, + Left, + Right + } + + interface IRenderable + { + void Render(); + } + + readonly struct Position + { + public Position(int top, int left) + { + Top = top; + Left = left; + } + + public int Top { get; } + public int Left { get; } + + public Position RightBy(int n) => new Position(Top, Left + n); + public Position DownBy(int n) => new Position(Top + n, Left); + } + + class Apple : IRenderable + { + public Apple(Position position) + { + Position = position; + } + + public Position Position { get; } + + public void Render() + { + Console.SetCursorPosition(Position.Left, Position.Top); + Console.Write("🐜"); + } + } + + class Snake : IRenderable + { + private List _body; + private int _growthSpurtsRemaining; + + public Snake(Position spawnLocation, int initialSize = 1) + { + _body = new List { spawnLocation }; + _growthSpurtsRemaining = Math.Max(0, initialSize - 1); + Dead = false; + } + + public bool Dead { get; private set; } + public Position Head => _body.First(); + private IEnumerable Body => _body.Skip(1); + + public void Move(Direction direction) + { + if (Dead) throw new InvalidOperationException(); + + Position newHead; + + switch (direction) + { + case Direction.Up: + newHead = Head.DownBy(-1); + break; + + case Direction.Left: + newHead = Head.RightBy(-1); + break; + + case Direction.Down: + newHead = Head.DownBy(1); + break; + + case Direction.Right: + newHead = Head.RightBy(1); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + if (_body.Contains(newHead) || !PositionIsValid(newHead)) + { + Dead = true; + return; + } + + _body.Insert(0, newHead); + + if (_growthSpurtsRemaining > 0) + { + _growthSpurtsRemaining--; + } + else + { + _body.RemoveAt(_body.Count - 1); + } + } + + public void Grow() + { + if (Dead) throw new InvalidOperationException(); + + _growthSpurtsRemaining++; + } + + public void Render() + { + Console.SetCursorPosition(Head.Left, Head.Top); + Console.Write("◉"); + + foreach (var position in Body) + { + Console.SetCursorPosition(position.Left, position.Top); + Console.Write("■"); + } + } + + private static bool PositionIsValid(Position position) => + position.Top >= 0 && position.Left >= 0; + } + + class SnakeGame : IRenderable + { + private static readonly Position Origin = new Position(0, 0); + + private Direction _currentDirection; + private Direction _nextDirection; + private Snake _snake; + private Apple _apple; + + public SnakeGame() + { + _snake = new Snake(Origin, initialSize: 5); + _apple = CreateApple(); + _currentDirection = Direction.Right; + _nextDirection = Direction.Right; + } + + public bool GameOver => _snake.Dead; + + public void OnKeyPress(ConsoleKey key) + { + Direction newDirection; + + switch (key) + { + case ConsoleKey.W: + newDirection = Direction.Up; + break; + + case ConsoleKey.A: + newDirection = Direction.Left; + break; + + case ConsoleKey.S: + newDirection = Direction.Down; + break; + + case ConsoleKey.D: + newDirection = Direction.Right; + break; + + default: + return; + } + + // Snake cannot turn 180 degrees. + if (newDirection == OppositeDirectionTo(_currentDirection)) + { + return; + } + + _nextDirection = newDirection; + } + + public void OnGameTick() + { + if (GameOver) throw new InvalidOperationException(); + + _currentDirection = _nextDirection; + _snake.Move(_currentDirection); + + // If the snake's head moves to the same position as an apple, the snake + // eats it. + if (_snake.Head.Equals(_apple.Position)) + { + _snake.Grow(); + _apple = CreateApple(); + } + } + + public void Render() + { + Console.Clear(); + _snake.Render(); + _apple.Render(); + Console.SetCursorPosition(0, 0); + } + + private static Direction OppositeDirectionTo(Direction direction) + { + switch (direction) + { + case Direction.Up: return Direction.Down; + case Direction.Left: return Direction.Right; + case Direction.Right: return Direction.Left; + case Direction.Down: return Direction.Up; + default: throw new ArgumentOutOfRangeException(); + } + } + + private static Apple CreateApple() + { + // Can be factored elsewhere. + const int numberOfRows = 20; + const int numberOfColumns = 20; + + var random = new Random(); + var top = random.Next(1, numberOfRows); + var left = random.Next(1, numberOfColumns); + var position = new Position(top, left); + var apple = new Apple(position); + + return apple; + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/Doc/AllStates.graphml b/csharp/App_backup/SaliMax/Doc/AllStates.graphml new file mode 100644 index 000000000..5877679af --- /dev/null +++ b/csharp/App_backup/SaliMax/Doc/AllStates.graphml @@ -0,0 +1,934 @@ + + + + + + + + + + + + + + + + + + + + + + + 23 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 19 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 3 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 9 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 1 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 13 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 29 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 5 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 7 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 11 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 15 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 21 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 17 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 25 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 27 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 31 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 28 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 24 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 8 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 6 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 0 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 4 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 22 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 16 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 20 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 18 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 2 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 10 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 12 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 14 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 26 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 30 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + switch to +grid tie + + + + + + + + + + + K3's open + + + + + + + + + + + close K2 + + + + + + + + + + + turn on +Inverters + + + + + + + + + + + K3's close + + + + + + + + + + + + + + open K2 + + + + + + + + + + + open K2 + + + + + + + + + + + + + + turn off +inverter + + + + + + + + + + + turn off +inverters and open K2 + + + + + + + + + + + turn off +inverters + + + + + + + + + + + turn off +inverters and open K2 + + + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + K3's close + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + switch to +island mode + + + + + + + + + + + turn on +inverters + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + K3 opens + + + + + + + + + + + open K2 + + + + + + + + + + + + + turn off +inverters and Open K2 + + + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + open K2 + + + + + + + + + + + K3 opens + + + + + + + + + + + open K2 + + + + + + + + + + + + + turn off +inverters and open K2 + + + + + + + + + + + turn off +inverters + + + + + + + + + + + K1 closes + + + + + + + + + + + K1 opens + + + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + + + K3's open + + + + + + + + + + + + + + K3's open + + + + + + + + + diff --git a/csharp/App_backup/SaliMax/Doc/SalimaxConfigReadme.txt b/csharp/App_backup/SaliMax/Doc/SalimaxConfigReadme.txt new file mode 100644 index 000000000..559eb6ca8 --- /dev/null +++ b/csharp/App_backup/SaliMax/Doc/SalimaxConfigReadme.txt @@ -0,0 +1,110 @@ +"MinSoc": Number, 0 - 100 this is the minimum State of Charge that the batteries must not go below, + "ForceCalibrationCharge": Boolean (true or false), A flag to force a calibration charge, + "DisplayIndividualBatteries": Boolean (true or false), To display the indvidual batteries + "PConstant": Number 0 - 1, P value of our controller. + "GridSetPoint": Number in Watts, The set point of our controller. + "BatterySelfDischargePower": Number, 200, this a physical measurement of the self discharging power. + "HoldSocZone": Number, 1, This is magic number for the soft landing factor. + "IslandMode": { // Dc Link Voltage in Island mode + "AcDc": { + "MaxDcLinkVoltage": Number, 810, Max Dc Link Voltage, + "MinDcLinkVoltage": Number, 690, Min Dc Link Voltage, + "ReferenceDcLinkVoltage": Number, 750, Reference Dc Link + }, + "DcDc": { + "LowerDcLinkVoltage": Number, 50, Lower Dc Link Window , + "ReferenceDcLinkVoltage": 750, reference Dc Link + "UpperDcLinkVoltage": Number, 50, Upper Dc Link Window , + } + }, + "GridTie": {// Dc Link Voltage in GrieTie mode + "AcDc": { + "MaxDcLinkVoltage":Number, 780, Max Dc Link Voltage, + "MinDcLinkVoltage": Number, 690, Min Dc Link Voltage, + "ReferenceDcLinkVoltage": Number, 750, Reference Dc Link + }, + "DcDc": { + "LowerDcLinkVoltage": Number, 20, Lower Dc Link Window , + "ReferenceDcLinkVoltage": 750, reference Dc Link + "UpperDcLinkVoltage": Number, 20, Upper Dc Link Window , + } + }, + "MaxBatteryChargingCurrent":Number, 0 - 210, Max Charging current by DcDc + "MaxBatteryDischargingCurrent":Number, 0 - 210, Max Discharging current by DcDc + "MaxDcPower": Number, 0 - 10000, Max Power exported/imported by DcDc (10000 is the maximum) + "MaxChargeBatteryVoltage": Number, 57, Max Charging battery Voltage + "MinDischargeBatteryVoltage": Number, 0, Min Charging Battery Voltage + "Devices": { This is All Salimax devices (including offline ones) + "RelaysIp": { + "DeviceState": 1, // 0: is not present, 1: Present and Can be mesured, 2: Present but must be computed/calculted + "Host": "10.0.1.1", // Ip @ of the device in the local network + "Port": 502 // port + }, + "GridMeterIp": { + "DeviceState": 1, + "Host": "10.0.4.1", + "Port": 502 + }, + "PvOnAcGrid": { + "DeviceState": 0, // If a device is not present + "Host": "false", // this is not important + "Port": 0 // this is not important + }, + "LoadOnAcGrid": { + "DeviceState": 2, // this is a computed device + "Host": "true", + "Port": 0 + }, + "PvOnAcIsland": { + "DeviceState": 0, + "Host": "false", + "Port": 0 + }, + "IslandBusLoadMeterIp": { + "DeviceState": 1, + "Host": "10.0.4.2", + "Port": 502 + }, + "TruConvertAcIp": { + "DeviceState": 1, + "Host": "10.0.2.1", + "Port": 502 + }, + "PvOnDc": { + "DeviceState": 1, + "Host": "10.0.5.1", + "Port": 502 + }, + "LoadOnDc": { + "DeviceState": 0, + "Host": "false", + "Port": 0 + }, + "TruConvertDcIp": { + "DeviceState": 1, + "Host": "10.0.3.1", + "Port": 502 + }, + "BatteryIp": { + "DeviceState": 1, + "Host": "localhost", + "Port": 6855 + }, + "BatteryNodes": [ // this is a list of nodes + 2, + 3, + 4, + 5, + 6 + ] + }, + "S3": { // this is parameters of S3 Buckets and co + "Bucket": "8-3e5b3069-214a-43ee-8d85-57d72000c19d", + "Region": "sos-ch-dk-2", + "Provider": "exo.io", + "Key": "EXO502627299197f83e8b090f63", + "Secret": "jUNYJL6B23WjndJnJlgJj4rc1i7uh981u5Aba5xdA5s", + "ContentType": "text/plain; charset=utf-8", + "Host": "8-3e5b3069-214a-43ee-8d85-57d72000c19d.sos-ch-dk-2.exo.io", + "Url": "https://8-3e5b3069-214a-43ee-8d85-57d72000c19d.sos-ch-dk-2.exo.io" + } diff --git a/csharp/App_backup/SaliMax/Doc/States_Table.xlsx b/csharp/App_backup/SaliMax/Doc/States_Table.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..776df481c302db83a3432e19368da995773906b0 GIT binary patch literal 13885 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 + + + + + + + + + + + + + + + + + + + + + + + 19 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 3 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 9 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 1 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 13 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 29 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 23 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 5 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 7 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + + 11 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + + 15 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 21 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 17 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + + 25 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + + 27 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + + 31 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + + switch to +grid tie + + + + + + + + + + + + + + + K3's open + + + + + + + + + + + + close K2 + + + + + + + + + + + + turn on +Inverters + + + + + + + + + + + + K3's close + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + + turn on +Inverters + + + + + + + + + + + + close K2 + + + + + + + + + + + + + + + turn off +inverter + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + + + + turn off +inverters + + + + + + + + + diff --git a/csharp/App_backup/SaliMax/Doc/TransitionToIsland.graphml b/csharp/App_backup/SaliMax/Doc/TransitionToIsland.graphml new file mode 100644 index 000000000..800dffa96 --- /dev/null +++ b/csharp/App_backup/SaliMax/Doc/TransitionToIsland.graphml @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + 28 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 24 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 8 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 6 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 0 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 4 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 22 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 16 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 20 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 18 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 2 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 10 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 12 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 14 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 26 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 30 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + K3's open + + + + + + + + + + + K3's close + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + + + + + switch to +island mode + + + + + + + + + + + + turn on +inverters + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + + + + K3 opens + + + + + + + + + + + + open K2 + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + + + + open K2 + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + + K3 opens + + + + + + + + + + + + open K2 + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + turn off +inverters + + + + + + + + + diff --git a/csharp/App_backup/SaliMax/HostList.txt b/csharp/App_backup/SaliMax/HostList.txt new file mode 100755 index 000000000..9a03162c9 --- /dev/null +++ b/csharp/App_backup/SaliMax/HostList.txt @@ -0,0 +1,14 @@ + +Prototype ie-entwicklung@10.2.3.115 Prototype +Salimax0001 ie-entwicklung@10.2.3.104 Marti Technik (Bern) +Salimax0002 ie-entwicklung@10.2.4.29 Weidmann d (ZG) +Salimax0003 ie-entwicklung@10.2.4.33 Elektrotechnik Stefan GmbH +Salimax0004 ie-entwicklung@10.2.4.32 Biohof Gubelmann (Walde) +Salimax0004A ie-entwicklung@10.2.4.153 +Salimax0005 ie-entwicklung@10.2.4.36 Schreinerei Schönthal (Thun) +Salimax0006 ie-entwicklung@10.2.4.35 Steakhouse Mettmenstetten +Salimax0007 ie-entwicklung@10.2.4.154 LerchenhofHerr Twannberg +Salimax0008 ie-entwicklung@10.2.4.113 Wittmann Kottingbrunn +Salimax0010 ie-entwicklung@10.2.4.211 Mohatech 1 (Beat Moser) +Salimax0011 ie-entwicklung@10.2.4.239 Thomas Tschirren (Enggistein) +SalidomoServer ig@134.209.238.170 \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/SaliMax.csproj b/csharp/App_backup/SaliMax/SaliMax.csproj new file mode 100644 index 000000000..a62f192ea --- /dev/null +++ b/csharp/App_backup/SaliMax/SaliMax.csproj @@ -0,0 +1,44 @@ + + + + + InnovEnergy.App.SaliMax + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csharp/App_backup/SaliMax/deploy.sh b/csharp/App_backup/SaliMax/deploy.sh new file mode 100755 index 000000000..2e839ec08 --- /dev/null +++ b/csharp/App_backup/SaliMax/deploy.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +dotnet_version='net6.0' +salimax_ip="$1" +username='ie-entwicklung' +root_password='Salimax4x25' +set -e + +# Define directories and configurations +DEST_DIR="/home/$username/salimax/SaliMax" # Path to the specific file +BACKUP_ROOT="/home/$username/salimax/salimax_backup" # Base backup directory +TIMESTAMP=$(date +'%Y%m%d_%H%M%S') +BACKUP_DIR="${BACKUP_ROOT}/script_backup_${TIMESTAMP}" +# Backup directory with unique name +MAX_BACKUPS=5 # Limit to 5 backups + +echo -e "\n============================ Build ============================\n" + +# Build the project +dotnet publish \ + ./SaliMax.csproj \ + -p:PublishTrimmed=false \ + -c Release \ + -r linux-x64 + +echo -e "\n============================ Backup Old SaliMax File ============================\n" + +# SSH into the remote machine and create the backup directory +ssh $username@$salimax_ip "mkdir -p $BACKUP_DIR" + +# Move the 'SaliMax' file to the backup folder on the remote machine +ssh $username@$salimax_ip "rsync -av --exclude='${BACKUP_ROOT}/script_backup_*' --exclude='salimax_backup/*' $DEST_DIR $BACKUP_DIR/" + +echo -e "\n============================ Cleanup Old Backups ============================\n" + +# Cleanup old backups if the total number exceeds the maximum allowed +echo "Existing backups:" +ssh $username@$salimax_ip "ls -1d ${BACKUP_ROOT}/script_backup_* 2>/dev/null" + +# Count the backups created by this script +BACKUP_COUNT=$(ssh $username@$salimax_ip "ls -1d ${BACKUP_ROOT}/script_backup_* 2>/dev/null | wc -l") +echo "Current number of backups: $BACKUP_COUNT" + +if [ "$BACKUP_COUNT" -gt "$MAX_BACKUPS" ]; then + # Find and delete the oldest backup created by the script + OLD_BACKUP=$(ssh $username@$salimax_ip "find ${BACKUP_ROOT} -type d -name 'script_backup_*' | sort | head -n 1") + echo "Old backup to delete: $OLD_BACKUP" + + if [ -n "$OLD_BACKUP" ]; then + echo "Backup limit reached. Deleting old backup: $OLD_BACKUP" + ssh $username@$salimax_ip "rm -rf $OLD_BACKUP" && echo "Deleted: $OLD_BACKUP" || echo "Failed to delete: $OLD_BACKUP" + else + echo "No valid backups to delete." + fi +else + echo "Backup limit not reached. Current number of backups: $BACKUP_COUNT" +fi + + +echo -e "\n============================ Deploy ============================\n" + +# Deploy new files to the remote destination +rsync -v \ + --exclude '*.pdb' \ + ./bin/Release/$dotnet_version/linux-x64/publish/* \ + $username@"$salimax_ip":~/salimax + +echo -e "\nDeployment complete!\n" + + +#echo -e "\n============================ Execute ============================\n" + +#sshpass -p "$root_password" ssh -o StrictHostKeyChecking=no -t "$username"@"$salimax_ip" "echo '$root_password' | sudo -S sh -c 'cd salimax && ./restart'" 2>/dev/null diff --git a/csharp/App_backup/SaliMax/deploy_all_installations.sh b/csharp/App_backup/SaliMax/deploy_all_installations.sh new file mode 100755 index 000000000..533946856 --- /dev/null +++ b/csharp/App_backup/SaliMax/deploy_all_installations.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +dotnet_version='net6.0' +salimax_ip="$1" +username='ie-entwicklung' +root_password='Salimax4x25' + +set -e + +echo -e "\n============================ Build ============================\n" + +dotnet publish \ + ./SaliMax.csproj \ + -p:PublishTrimmed=false \ + -c Release \ + -r linux-x64 + +echo -e "\n============================ Deploy ============================\n" +#ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.29" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" "10.2.4.113" "10.2.4.211") +#ip_addresses=("10.2.4.154" "10.2.4.29") +ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.29" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" ) + + + +for ip_address in "${ip_addresses[@]}"; do + rsync -v \ + --exclude '*.pdb' \ + ./bin/Release/$dotnet_version/linux-x64/publish/* \ + $username@"$ip_address":~/salimax + + ssh "$username"@"$ip_address" "cd salimax && echo '$root_password' | sudo -S ./restart" + + echo "Deployed and ran commands on $ip_address" +done + + + diff --git a/csharp/App_backup/SaliMax/downloadBatteryLogs/download-bms-log b/csharp/App_backup/SaliMax/downloadBatteryLogs/download-bms-log new file mode 100644 index 000000000..b9c2e8f23 --- /dev/null +++ b/csharp/App_backup/SaliMax/downloadBatteryLogs/download-bms-log @@ -0,0 +1,284 @@ +#!/usr/bin/python2 -u +# coding=utf-8 +import os +import re +import struct +import serial +import logging +from sys import argv, exit +from datetime import datetime +from pymodbus.pdu import ModbusRequest, ModbusResponse, ExceptionResponse +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.exceptions import ModbusException +from pymodbus.pdu import ExceptionResponse +from pymodbus.factory import ClientDecoder +from pymodbus.client import ModbusSerialClient as Modbus +logging.basicConfig(level=logging.INFO) + + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import List, Optional, NoReturn + +RESET_REGISTER = 0x2087 +FIRMWARE_VERSION_REGISTER = 1054 +SERIAL_STARTER_DIR = '/opt/victronenergy/serial-starter/' +INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' +OUTPUT_DIR = '/data/innovenergy' + + +class ReadLogRequest(ModbusRequest): + + function_code = 0x42 + _rtu_frame_size = 5 # not used + + def __init__(self, address = None, **kwargs): + + ModbusRequest.__init__(self, **kwargs) + self.sub_function = 0 if address is None else 1 + self.address = address + + # FUGLY as hell, but necessary bcs PyModbus cannot deal + # with responses that have lengths depending on the sub_function. + # it goes without saying that this isn't thread-safe + ReadLogResponse._rtu_frame_size = 9 if self.sub_function == 0 else 9+128 + + def encode(self): + + if self.sub_function == 0: + return struct.pack('>B', self.sub_function) + else: + return struct.pack('>BI', self.sub_function, self.address) + + def decode(self, data): + self.sub_function = struct.unpack('>B', data) + + def execute(self, context): + print("EXECUTE1") + + def get_response_pdu_size(self): + return ReadLogResponse._rtu_frame_size - 3 + + def __str__(self): + return "ReadLogAddressRequest" + + +class ReadLogResponse(ModbusResponse): + + function_code = 0x42 + _rtu_frame_size = 9 # the WHOLE frame incl crc + + def __init__(self, sub_function=0, address=b'\x00', data=None, **kwargs): + ModbusResponse.__init__(self, **kwargs) + self.sub_function = sub_function + self.address = address + self.data = data + + def encode(self): + pass + + def decode(self, data): + self.address, self.address = struct.unpack_from(">BI", data) + self.data = data[5:] + + def __str__(self): + arguments = (self.function_code, self.address) + return "ReadLogAddressResponse(%s, %s)" % arguments + +# unfortunately we have to monkey-patch this global table because +# the current (victron) version of PyModbus does not have a +# way to "register" new function-codes yet +ClientDecoder.function_table.append(ReadLogResponse) + + +class LockTTY(object): + + def __init__(self, tty): + # type: (str) -> None + self.tty = tty + + def __enter__(self): + os.system(SERIAL_STARTER_DIR + 'stop-tty.sh ' + self.tty) + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + os.system(SERIAL_STARTER_DIR + 'start-tty.sh ' + self.tty) + + +def wrap_try_except(error_msg): + def decorate(f): + def applicator(*args, **kwargs): + try: + return f(*args, **kwargs) + except: + print(error_msg) + exit(1) + return applicator + return decorate + + +def init_modbus(tty): + # type: (str) -> Modbus + + return Modbus( + port='/dev/' + tty, + method='rtu', + baudrate=115200, + stopbits=1, + bytesize=8, + timeout=0.5, # seconds + parity=serial.PARITY_ODD) + + +@wrap_try_except("Failed to download BMS log!") +def download_log(modbus, node_id, battery_id): + # type: (Modbus, int, str) -> NoReturn + + # Get address of latest log entry + # request = ReadLogRequest(unit=slave_id) + + print ('downloading BMS log from node ' + str(node_id) + ' ...') + + progress = -1 + log_file = battery_id + "-node" + str(node_id) + "-" + datetime.now().strftime('%d-%m-%Y') + ".bin" + print(log_file) + + with open(log_file, 'w') as f: + + eof = 0x200000 + record = 0x40 + for address in range(0, eof, 2*record): + + percent = int(100*address/eof) + + if percent != progress: + progress = percent + print('\r{}% '.format(progress),end='') + + request = ReadLogRequest(address, slave=node_id) + result = modbus.execute(request) # type: ReadLogResponse + + address1 = "{:06X}".format(address) + address2 = "{:06X}".format(address+record) + + data1 = result.data[:record] + data2 = result.data[record:] + + line1 = address1 + ":" + ''.join('{:02X}'.format(byte) for byte in data1) + line2 = address2 + ":" + ''.join('{:02X}'.format(byte) for byte in data2) + + lines = line1 + "\n" + line2 + "\n" + f.write(lines) + + print("\r100%") + print("done") + print("wrote log to " + log_file) + + return True + + +@wrap_try_except("Failed to contact battery!") +def identify_battery(modbus, node_id): + # type: (Modbus, int) -> str + + target = 'battery #' + str(node_id) + print('contacting ' + target + ' ...') + + request = ReportSlaveIdRequest(slave=node_id) + response = modbus.execute(request) + + index_of_ff = response.identifier.find(b'\xff') + sid_response = response.identifier[index_of_ff + 1:].decode('utf-8').split(' ') + + response = modbus.read_input_registers(address=FIRMWARE_VERSION_REGISTER, count=1, slave=node_id) + + fw = '{0:0>4X}'.format(response.registers[0]) + print("log string is",sid_response[0]+"-"+sid_response[1]+"-"+fw) + + #return re.sub(" +", "-", sid + " " + fw) + return sid_response[0]+"-"+sid_response[1]+"-"+fw + + +def is_int(value): + # type: (str) -> bool + try: + _ = int(value) + return True + except ValueError: + return False + + +def print_usage(): + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' 2 ttyUSB0') + print ('') + print ('You can omit the "ttyUSB" prefix of the serial device:') + print (' ' + __file__ + ' 2 0') + print ('') + print ('You can omit the serial device entirely when the "com.victronenergy.battery." service is running:') + print (' ' + __file__ + ' 2') + print ('') + + +def get_tty_from_battery_service_name(): + # type: () -> Optional[str] + + import dbus + bus = dbus.SystemBus() + + tty = ( + name.split('.')[-1] + for name in bus.list_names() + if name.startswith('com.victronenergy.battery.') + ) + + return next(tty, None) + + +def parse_tty(tty): + # type: (Optional[str]) -> str + + if tty is None: + return get_tty_from_battery_service_name() + + if is_int(tty): + return 'ttyUSB' + argv[1] + else: + return tty + + +def parse_cmdline_args(argv): + # type: (List[str]) -> (str, int) + + slave_id = element_at_or_none(argv, 0) + tty = parse_tty(element_at_or_none(argv, 1)) + + if slave_id is None or tty is None: + print_usage() + exit(2) + + print("tty=",tty) + print("slave id= ",slave_id) + + return tty, int(slave_id) + + +def element_at_or_none(lst, index): + return next(iter(lst[index:]), None) + + +def main(argv): + # type: (List[str]) -> () + + tty, node_id = parse_cmdline_args(argv) + + with init_modbus(tty) as modbus: + battery_id = identify_battery(modbus, node_id) + download_log(modbus, node_id, battery_id) + + exit(0) + + +main(argv[1:]) diff --git a/csharp/App_backup/SaliMax/downloadBatteryLogs/download_battery_logs.sh b/csharp/App_backup/SaliMax/downloadBatteryLogs/download_battery_logs.sh new file mode 100755 index 000000000..20c3f05b4 --- /dev/null +++ b/csharp/App_backup/SaliMax/downloadBatteryLogs/download_battery_logs.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +#Prototype 10.2.3.115 Prototype +#Salimax0001 10.2.3.104 Marti Technik (Bern) +#Salimax0002 10.2.4.29 Weidmann d (ZG) +#Salimax0003 10.2.4.33 Elektrotechnik Stefan GmbH +#Salimax0004 10.2.4.32 Biohof Gubelmann (Walde) +#Salimax0005 10.2.4.36 Schreinerei Schönthal (Thun) +#Salimax0006 10.2.4.35 Steakhouse Mettmenstetten +#Salimax0007 10.2.4.154 LerchenhofHerr Twannberg +#Salimax0008 10.2.4.113 Wittmann Kottingbrunn + +dotnet_version='net6.0' +ip_address="$1" +battery_ids="$2" +username='ie-entwicklung' +root_password='Salimax4x25' + +if [ "$#" -lt 2 ]; then + echo "Error: Insufficient arguments. Usage: $0 " + exit 1 +fi + +# Function to expand battery ids from a range +expand_battery_ids() { + local range="$1" + local expanded_ids=() + + IFS='-' read -r start end <<< "$range" + for ((i = start; i <= end; i++)); do + expanded_ids+=("$i") + done + + echo "${expanded_ids[@]}" +} + +# Check if battery_ids_arg contains a hyphen indicating a range +if [[ "$battery_ids" == *-* ]]; then + # Expand battery ids from the range + battery_ids=$(expand_battery_ids "$battery_ids") +else + # Use the provided battery ids + battery_ids=("$battery_ids") +fi + +echo "ip_address: $ip_address" +echo "Battery_ids: ${battery_ids[@]}" + +#ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" "10.2.4.113" "10.2.4.29") +#battery_ids=("2" "3" "4" "5" "6" "7" "8" "9" "10" "11") + +set -e + +scp download-bms-log "$username"@"$ip_address":/home/"$username" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl stop battery.service" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S apt install python3-pip -y" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S pip3 install pymodbus" + +for battery in "${battery_ids[@]}"; do + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S python3 download-bms-log " "$battery" " ttyUSB0" +done +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl start battery.service" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S rm download-bms-log" +scp "$username"@"$ip_address":/home/"$username/*.bin" . +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S rm *.bin" + +echo "Deployed and ran commands on $ip_address" +done + + diff --git a/csharp/App_backup/SaliMax/resources/Battery.Service b/csharp/App_backup/SaliMax/resources/Battery.Service new file mode 100644 index 000000000..ebead9a53 --- /dev/null +++ b/csharp/App_backup/SaliMax/resources/Battery.Service @@ -0,0 +1,12 @@ +[Unit] +Description=Battery48TL_TCP_Bridge + +[Service] +Type=simple +ExecStart=socat -x -d -d TCP-LISTEN:6855 GOPEN:/dev/ttyUSB0,rawer,b115200,cs8,parenb=1,parodd=1 +Restart=always +RestartSec=500ms +StartLimitInterval=0 + +[Install] +WantedBy=multi-user.target diff --git a/csharp/App_backup/SaliMax/resources/PublicKey b/csharp/App_backup/SaliMax/resources/PublicKey new file mode 100644 index 000000000..ae41b2935 --- /dev/null +++ b/csharp/App_backup/SaliMax/resources/PublicKey @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCed5ANekhbdV/8nEwFyaqxbPGON+NZKAkZXKx2aMAbX6jYQpusXSf4lKxEp4vHX9q2ScWycluUEhlzwe9vaWIK6mxEG9gjtU0/tKIavqZ6qpcuiglal750e8tlDh+lAgg5K3v4tvV4uVEfFc42UzSC9cIBBKPBC41dc0xQKyFIDsSH6Qha1nyncKRC3OXUkOiiRvmbd4PVc9A5ah2vt+661pghZE19Qeh5ROn/Sma9C+9QIyUDCylezqptnT+Jdvs+JMCHk8nKK2A0bz1w0a8zzO7M1RLHfBLQ6o1SQAdV/Pmon8uQ9vLHc86l5r7WSTMEcjAqY3lGE9mdxsSZWNmp InnovEnergy \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/resources/Salimax.Service b/csharp/App_backup/SaliMax/resources/Salimax.Service new file mode 100644 index 000000000..d823b591f --- /dev/null +++ b/csharp/App_backup/SaliMax/resources/Salimax.Service @@ -0,0 +1,13 @@ +[Unit] +Description=Salimax Controller +Wants=battery.service + +[Service] +WorkingDirectory=/home/ie-entwicklung/salimax +ExecStart=/home/ie-entwicklung/salimax/SaliMax +WatchdogSec=30s +Restart=always +RestartSec=500ms + +[Install] +WantedBy=multi-user.target diff --git a/csharp/App_backup/SaliMax/src/AggregationService/Aggregator.cs b/csharp/App_backup/SaliMax/src/AggregationService/Aggregator.cs new file mode 100644 index 000000000..6c32e435b --- /dev/null +++ b/csharp/App_backup/SaliMax/src/AggregationService/Aggregator.cs @@ -0,0 +1,355 @@ +using InnovEnergy.App.SaliMax.Ess; +using InnovEnergy.Lib.Utils; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using static System.Double; + +namespace InnovEnergy.App.SaliMax.AggregationService; + +public static class Aggregator +{ + + public static async Task HourlyDataAggregationManager() + { + var currentDateTime = DateTime.Now; + var nextRoundedHour = currentDateTime.AddHours(1).AddMinutes(-currentDateTime.Minute).AddSeconds(-currentDateTime.Second); + + // Calculate the time until the next rounded hour + var timeUntilNextHour = nextRoundedHour - currentDateTime; + + // Output the current and next rounded hour times + Console.WriteLine("------------------------------------------HourlyDataAggregationManager-------------------------------------------"); + Console.WriteLine("Current Date and Time: " + currentDateTime); + Console.WriteLine("Next Rounded Hour: " + nextRoundedHour); + // Output the time until the next rounded hour + Console.WriteLine("Waiting for " + timeUntilNextHour.TotalMinutes + " minutes..."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + // Wait until the next rounded hour + await Task.Delay(timeUntilNextHour); + + while (true) + { + try + { + AggregatedData hourlyAggregatedData = CreateHourlyData("JsonLogDirectory",DateTime.Now.AddHours(-1).ToUnixTime(),DateTime.Now.ToUnixTime()); + hourlyAggregatedData.Save("HourlyData"); + } + catch (Exception e) + { + Console.WriteLine("An error has occured when calculating hourly aggregated data, exception is:\n" + e); + } + await Task.Delay(TimeSpan.FromHours(1)); + } + } + + public static async Task DailyDataAggregationManager() + { + var currentDateTime = DateTime.Now; + var nextRoundedHour = currentDateTime.AddDays(1).AddHours(-currentDateTime.Hour).AddMinutes(-currentDateTime.Minute).AddSeconds(-currentDateTime.Second); + + // Calculate the time until the next rounded hour + var timeUntilNextDay = nextRoundedHour - currentDateTime; + Console.WriteLine("------------------------------------------DailyDataAggregationManager-------------------------------------------"); + // Output the current and next rounded hour times + Console.WriteLine("Current Date and Time: " + currentDateTime); + Console.WriteLine("Next Rounded Hour: " + nextRoundedHour); + // Output the time until the next rounded hour + Console.WriteLine("Waiting for " + timeUntilNextDay.TotalHours + " hours..."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + // Wait until the next rounded hour + await Task.Delay(timeUntilNextDay); + + while (true) + { + try + { + var currentTime = DateTime.Now; + AggregatedData dailyAggregatedData = CreateDailyData("HourlyData",currentTime.AddDays(-1).ToUnixTime(),currentTime.ToUnixTime()); + dailyAggregatedData.Save("DailyData"); + if (await dailyAggregatedData.PushToS3()) + { + //DeleteHourlyData("HourlyData",currentTime.ToUnixTime()); + //AggregatedData.DeleteDailyData("DailyData"); + } + + } + catch (Exception e) + { + Console.WriteLine("An error has occured when calculating daily aggregated data, exception is:\n" + e); + } + await Task.Delay(TimeSpan.FromDays(1)); + } + } + + private static void DeleteHourlyData(String myDirectory, Int64 beforeTimestamp) + { + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); + Console.WriteLine("Delete data before"+beforeTimestamp); + foreach (var jsonFile in jsonFiles) + { + if (IsFileWithinTimeRange(jsonFile, 0, beforeTimestamp)) + { + File.Delete(jsonFile); + Console.WriteLine($"Deleted hourly data file: {jsonFile}"); + } + } + } + + // this for test + private static AggregatedData CreateHourlyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) + { + // Get all CSV files in the specified directory + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); + var batterySoc = new List(); + var pvPowerSum = new List(); + var heatingPower = new List(); + var gridPowerImport = new List(); + var gridPowerExport = new List(); + var batteryDischargePower = new List(); + var batteryChargePower = new List(); + + + Console.WriteLine("File timestamp should start after "+ afterTimestamp); + + foreach (var jsonFile in jsonFiles) + { + if (jsonFile == "LogDirectory/log.json") + { + continue; + } + + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) + { + try + { + // Read and parse JSON + + var jsonData = File.ReadAllText(jsonFile); + + // Step 2: Find the first '{' character and trim everything before it + int startIndex = jsonData.IndexOf('{'); + if (startIndex != -1) + { + jsonData = jsonData.Substring(startIndex); // Trim everything before '{' + } + + var jsonObject = JObject.Parse(jsonData); + + + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Soc"] != null) + { + batterySoc.Add((double)jsonObject["Battery"]["Soc"]); + } + if (jsonObject["PvOnDc"] != null && jsonObject["PvOnDc"]["DcWh"] != null) + { + pvPowerSum.Add((double)jsonObject["PvOnDc"]["DcWh"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Dc"]["Power"] != null) + { + double batteryPower = (double)jsonObject["Battery"]["Dc"]["Power"]; + if (batteryPower < 0) + batteryDischargePower.Add(batteryPower); + else + batteryChargePower.Add(batteryPower); + } + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerExportT3"] != null) + { + gridPowerExport.Add((double)jsonObject["GridMeter"]["ActivePowerExportT3"]); + } + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerImportT3"] != null) + { + gridPowerImport.Add((double)jsonObject["GridMeter"]["ActivePowerImportT3"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["HeatingPower"] != null) + { + heatingPower.Add((double)jsonObject["Battery"]["HeatingPower"]); + } + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); + } + } + } + + //Average Power (Watts)= Sum of Power Readings/Number of Readings + + //Then, you can use the average power in the energy formula: + // + //Energy (kWh)= (Average Power / 3600) × Time (1 seconds) + // + // Dividing the Average power readings by 3600 converts the result from watt-seconds to kilowatt-hours. + + var dischargingEnergy = (batteryDischargePower.Any() ? batteryDischargePower.Average() : 0.0) / 3600; + var chargingEnergy = (batteryChargePower.Any() ? batteryChargePower.Average() : 0.0) / 3600; + var heatingPowerAvg = (heatingPower.Any() ? heatingPower.Average() : 0.0) / 3600; + + var dMaxSoc = batterySoc.Any() ? batterySoc.Max() : 0.0; + var dMinSoc = batterySoc.Any() ? batterySoc.Min() : 0.0; + var dSumGridExportPower = gridPowerExport.Any() ? gridPowerExport.Max() - gridPowerExport.Min(): 0.0; + var dSumGridImportPower = gridPowerImport.Any() ? gridPowerImport.Max() - gridPowerImport.Min(): 0.0; + var dSumPvPower = pvPowerSum.Any() ? pvPowerSum.Max() : 0.0; + + + AggregatedData aggregatedData = new AggregatedData + { + MaxSoc = Math.Round(dMaxSoc, 2), + MinSoc = Math.Round(dMinSoc, 2) , + DischargingBatteryPower = Math.Round(dischargingEnergy, 2) , + ChargingBatteryPower = Math.Round(chargingEnergy, 2) , + GridExportPower = Math.Round(dSumGridExportPower, 2) , + GridImportPower = Math.Round(dSumGridImportPower, 2) , + PvPower = Math.Round(dSumPvPower, 2) , + HeatingPower = Math.Round(heatingPowerAvg, 2) + }; + + // Print the stored CSV data for verification + Console.WriteLine($"Max SOC: {aggregatedData.MaxSoc}"); + Console.WriteLine($"Min SOC: {aggregatedData.MinSoc}"); + + Console.WriteLine($"DischargingBatteryBattery: {aggregatedData.DischargingBatteryPower}"); + Console.WriteLine($"ChargingBatteryPower: {aggregatedData.ChargingBatteryPower}"); + + Console.WriteLine($"SumGridExportPower: {aggregatedData.GridExportPower}"); + Console.WriteLine($"SumGridImportPower: {aggregatedData.GridImportPower}"); + + Console.WriteLine($"Min SOC: {aggregatedData.MinSoc}"); + + + Console.WriteLine("CSV data reading and storage completed."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + return aggregatedData; + } + + private static AggregatedData CreateDailyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) + { + // Get all CSV files in the specified directory + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); + var batterySoc = new List(); + var pvPower = new List(); + var gridPowerImport = new List(); + var gridPowerExport = new List(); + var batteryDischargePower = new List(); + var batteryChargePower = new List(); + var heatingPowerAvg = new List(); + + + + Console.WriteLine("File timestamp should start after "+ afterTimestamp); + + foreach (var jsonFile in jsonFiles) + { + if (jsonFile == "LogDirectory/log.json") + { + continue; + } + + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) + { + + try + { + var jsonData = File.ReadAllText(jsonFile); + //Console.WriteLine("Parse file "+jsonFile); + + // Parse JSON into a Dictionary + var jsonDict = JsonConvert.DeserializeObject>(jsonData); + + // Process values + foreach (var (variableName, value) in jsonDict) + { + switch (variableName) + { + case "MinSoc": + case "MaxSoc": + batterySoc.Add(value); + break; + + case "PvPower": + pvPower.Add(value); + break; + + case "DischargingBatteryPower": + batteryDischargePower.Add(value); + break; + + case "ChargingBatteryPower": + batteryChargePower.Add(value); + break; + + case "GridExportPower": + gridPowerExport.Add(value); + break; + + case "GridImportPower": + gridPowerImport.Add(value); + break; + + case "HeatingPower": + heatingPowerAvg.Add(value); + break; + + default: + // Ignore unknown variables + break; + } + } + + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); + } + + + } + } + + AggregatedData aggregatedData = new AggregatedData + { + MaxSoc = batterySoc.Any() ? batterySoc.Max() : 0.0, + MinSoc = batterySoc.Any() ? batterySoc.Min() : 0.0, + DischargingBatteryPower = batteryDischargePower.Any() ? batteryDischargePower.Average(): 0.0, + ChargingBatteryPower = batteryChargePower.Any() ? batteryChargePower.Average() : 0.0, + GridExportPower = gridPowerExport.Any() ? gridPowerExport.Sum() : 0.0, + GridImportPower = gridPowerImport.Any() ? gridPowerImport.Sum() : 0.0, + PvPower = pvPower.Any() ? pvPower.Last() : 0.0, + HeatingPower = heatingPowerAvg.Any() ? heatingPowerAvg.Average() : 0.0, + }; + + // Print the stored CSV data for verification + Console.WriteLine($"Pv Power: {aggregatedData.PvPower}"); + Console.WriteLine($"Heating Power: {aggregatedData.HeatingPower}"); + Console.WriteLine($"Max SOC: {aggregatedData.MaxSoc}"); + Console.WriteLine($"Min SOC: {aggregatedData.MinSoc}"); + + Console.WriteLine($"ChargingBatteryPower: {aggregatedData.DischargingBatteryPower}"); + Console.WriteLine($"DischargingBatteryBattery: {aggregatedData.ChargingBatteryPower}"); + + Console.WriteLine($"SumGridExportPower: {aggregatedData.GridExportPower}"); + Console.WriteLine($"SumGridImportPower: {aggregatedData.GridImportPower}"); + + + + Console.WriteLine("CSV data reading and storage completed."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + return aggregatedData; + } + + // Custom method to check if a string is numeric + private static Boolean GetVariable(String value, String path) + { + return value == path; + } + + private static Boolean IsFileWithinTimeRange(string filePath, long startTime, long endTime) + { + var fileTimestamp = long.TryParse(Path.GetFileNameWithoutExtension(filePath).Replace("log_", ""), out var fileTimestamp1) ? fileTimestamp1 : -1; + + return fileTimestamp >= startTime && fileTimestamp < endTime; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/AggregationService/HourlyData.cs b/csharp/App_backup/SaliMax/src/AggregationService/HourlyData.cs new file mode 100644 index 000000000..a7e50f83c --- /dev/null +++ b/csharp/App_backup/SaliMax/src/AggregationService/HourlyData.cs @@ -0,0 +1,118 @@ +using System.IO.Compression; +using System.Text; +using System.Text.Json; +using Flurl.Http; +using InnovEnergy.App.SaliMax.Devices; +using InnovEnergy.App.SaliMax.SystemConfig; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; +using Newtonsoft.Json; +using static System.Text.Json.JsonSerializer; + +namespace InnovEnergy.App.SaliMax.AggregationService; +// shut up trim warnings +#pragma warning disable IL2026 + +public class AggregatedData +{ + public required Double MinSoc { get; set; } + public required Double MaxSoc { get; set; } + public required Double PvPower { get; set; } + public required Double DischargingBatteryPower { get; set; } + public required Double ChargingBatteryPower { get; set; } + public required Double GridExportPower { get; set; } + public required Double GridImportPower { get; set; } + public required Double HeatingPower { get; set; } + + + private readonly S3Config? _S3Config = Config.Load().S3; + + public void Save(String directory) + { + var date = DateTime.Now.ToUnixTime(); + var defaultHDataPath = Environment.CurrentDirectory + "/" + directory + "/"; + var dataFilePath = defaultHDataPath + date + ".json"; + + if (!Directory.Exists(defaultHDataPath)) + { + Directory.CreateDirectory(defaultHDataPath); + Console.WriteLine("Directory created successfully."); + } + Console.WriteLine("data file path is " + dataFilePath); + + try + { + // Convert the object to a JSON string + var jsonString = JsonConvert.SerializeObject(this, Formatting.None); + + // Write JSON to file + File.WriteAllText(dataFilePath, jsonString); + } + catch (Exception e) + { + $"Failed to write config file {dataFilePath}\n{e}".WriteLine(); + throw; + } + } + + public static void DeleteDailyData(String directory) + { + + var jsonFiles = Directory.GetFiles(directory, "*.json"); + foreach (var jsonFile in jsonFiles) + { + File.Delete(jsonFile); + Console.WriteLine($"Deleted daily data file: {jsonFile}"); + } + } + + public async Task PushToS3() + { + var jsonString = JsonConvert.SerializeObject(this, Formatting.None); + if (_S3Config is null) + return false; + + var s3Path = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + ".json"; + var request = _S3Config.CreatePutRequest(s3Path); + + // Compress CSV data to a byte array + byte[] compressedBytes; + using (var memoryStream = new MemoryStream()) + { + //Create a zip directory and put the compressed file inside + using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) + { + var entry = archive.CreateEntry("data.json", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive + using (var entryStream = entry.Open()) + using (var writer = new StreamWriter(entryStream)) + { + writer.Write(jsonString); + } + } + + compressedBytes = memoryStream.ToArray(); + } + + // Encode the compressed byte array as a Base64 string + string base64String = Convert.ToBase64String(compressedBytes); + + // Create StringContent from Base64 string + var stringContent = new StringContent(base64String, Encoding.UTF8, "application/base64"); + + // Upload the compressed data (ZIP archive) to S3 + var response = await request.PutAsync(stringContent); + + + if (response.StatusCode != 200) + { + Console.WriteLine("ERROR: PUT"); + var error = await response.GetStringAsync(); + Console.WriteLine(error); + return false; + } + + return true; + } + + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/DataTypes/AlarmOrWarning.cs b/csharp/App_backup/SaliMax/src/DataTypes/AlarmOrWarning.cs new file mode 100644 index 000000000..e316d977f --- /dev/null +++ b/csharp/App_backup/SaliMax/src/DataTypes/AlarmOrWarning.cs @@ -0,0 +1,9 @@ +namespace InnovEnergy.App.SaliMax.DataTypes; + +public class AlarmOrWarning +{ + public String? Date { get; set; } + public String? Time { get; set; } + public String? Description { get; set; } + public String? CreatedBy { get; set; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/DataTypes/Configuration.cs b/csharp/App_backup/SaliMax/src/DataTypes/Configuration.cs new file mode 100644 index 000000000..57f023816 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/DataTypes/Configuration.cs @@ -0,0 +1,12 @@ +using InnovEnergy.App.SaliMax.SystemConfig; + +namespace InnovEnergy.App.SaliMax.DataTypes; + +public class Configuration +{ + public Double MinimumSoC { get; set; } + public Double GridSetPoint { get; set; } + public CalibrationChargeType CalibrationChargeState { get; set; } + public DateTime CalibrationChargeDate { get; set; } +} + diff --git a/csharp/App_backup/SaliMax/src/DataTypes/StatusMessage.cs b/csharp/App_backup/SaliMax/src/DataTypes/StatusMessage.cs new file mode 100644 index 000000000..42655a543 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/DataTypes/StatusMessage.cs @@ -0,0 +1,20 @@ +using InnovEnergy.App.SaliMax.Ess; + +namespace InnovEnergy.App.SaliMax.DataTypes; + +public class StatusMessage +{ + public required Int32 InstallationId { get; set; } + public required Int32 Product { get; set; } + public required SalimaxAlarmState Status { get; set; } + public required MessageType Type { get; set; } + public List? Warnings { get; set; } + public List? Alarms { get; set; } + public Int32 Timestamp { get; set; } +} + +public enum MessageType +{ + AlarmOrWarning, + Heartbit +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Devices/AcPowerDevice.cs b/csharp/App_backup/SaliMax/src/Devices/AcPowerDevice.cs new file mode 100644 index 000000000..ca375347a --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Devices/AcPowerDevice.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.App.SaliMax.Devices; + +public class AcPowerDevice +{ + public required AcPower Power { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Devices/DcPowerDevice.cs b/csharp/App_backup/SaliMax/src/Devices/DcPowerDevice.cs new file mode 100644 index 000000000..486bc0c04 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Devices/DcPowerDevice.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Power; + +namespace InnovEnergy.App.SaliMax.Devices; + +public class DcPowerDevice +{ + public required DcPower Power { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Devices/DeviceState.cs b/csharp/App_backup/SaliMax/src/Devices/DeviceState.cs new file mode 100644 index 000000000..728e3c3f1 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Devices/DeviceState.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SaliMax.Devices; + +public enum DeviceState +{ + Disabled, + Measured, + Computed +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Devices/SalimaxDevice.cs b/csharp/App_backup/SaliMax/src/Devices/SalimaxDevice.cs new file mode 100644 index 000000000..ff7c8c6ca --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Devices/SalimaxDevice.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Utils.Net; + +namespace InnovEnergy.App.SaliMax.Devices; + +public class SalimaxDevice : Ip4Address +{ + public required DeviceState DeviceState { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Ess/Controller.cs b/csharp/App_backup/SaliMax/src/Ess/Controller.cs new file mode 100644 index 000000000..5eab3ec60 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Ess/Controller.cs @@ -0,0 +1,318 @@ +using InnovEnergy.App.SaliMax.SystemConfig; +using InnovEnergy.Lib.Devices.Battery48TL; +using InnovEnergy.Lib.Devices.Battery48TL.DataTypes; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc.DataTypes; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.SaliMax.Ess; + +public static class Controller +{ + private static readonly Double BatteryHeatingPower = 200.0; // TODO: move to config + private static Boolean _hasRepetitiveCalibrationChargeChecked = false; + private static DateTime _nextDayAt10Am = DateTime.Now; + + private static EssMode SelectControlMode(this StatusRecord s) + { + //return EssMode.OptimizeSelfConsumption; + + return s.StateMachine.State != 23 ? EssMode.Off + : s.MustHeatBatteries() ? EssMode.HeatBatteries + : s.MustDoCalibrationCharge() ? EssMode.CalibrationCharge + : s.MustReachMinSoc() ? EssMode.ReachMinSoc + : s.GridMeter is null ? EssMode.NoGridMeter + : EssMode.OptimizeSelfConsumption; + } + + + public static EssControl ControlEss(this StatusRecord s) + { + var mode = s.SelectControlMode().WriteLine(); + + if (mode is EssMode.Off) // to test on prototype + { + if (s.StateMachine.State == 28 ) + { + return new EssControl + { + LimitedBy = EssLimit.NoLimit, + Mode = EssMode.OffGrid, + PowerCorrection = 0, + PowerSetpoint = 0 + }; + } + return EssControl.Default; + } + + // if we have no reading from the Grid meter, but we have a grid power (K1 is close), + // then we do only heat the battery to avoid discharging the battery and the oscillation between reach min soc and off mode + if (mode is EssMode.NoGridMeter) + return new EssControl + { + LimitedBy = EssLimit.NoLimit, + Mode = EssMode.NoGridMeter, + PowerCorrection = 0, + PowerSetpoint = s.Battery == null ? 1000 : s.Battery.Devices.Count * s.Config.BatterySelfDischargePower // 1000 default value for heating the battery + }; + + var essDelta = s.ComputePowerDelta(mode); + + var unlimitedControl = new EssControl + { + Mode = mode, + LimitedBy = EssLimit.NoLimit, + PowerCorrection = essDelta, + PowerSetpoint = 0 + }; + + var limitedControl = unlimitedControl + .LimitChargePower(s) + .LimitDischargePower(s) + .LimitInverterPower(s); + + var currentPowerSetPoint = s.CurrentPowerSetPoint(); + + return limitedControl with { PowerSetpoint = currentPowerSetPoint + limitedControl.PowerCorrection }; + } + + private static EssControl LimitInverterPower(this EssControl control, StatusRecord s) + { + var powerDelta = control.PowerCorrection.Value; + + var acDcs = s.AcDc.Devices; + + var nInverters = acDcs.Count; + + if (nInverters < 2) + return control; // current loop cannot happen + + var nominalPower = acDcs.Average(d => d.Status.Nominal.Power); + var maxStep = nominalPower / 25; //TODO magic number to config + + var clampedPowerDelta = powerDelta.Clamp(-maxStep, maxStep); + + var dcLimited = acDcs.Any(d => d.Status.PowerLimitedBy == PowerLimit.DcLink); + + if (!dcLimited) + return control with { PowerCorrection = clampedPowerDelta }; + + var maxPower = acDcs.Max(d => d.Status.Ac.Power.Active.Value); + var minPower = acDcs.Min(d => d.Status.Ac.Power.Active.Value); + + var powerDifference = maxPower - minPower; + + if (powerDifference < maxStep) + return control with { PowerCorrection = clampedPowerDelta }; + + var correction = powerDifference / 4; //TODO magic number to config + + + // find out if we reach the lower or upper Dc limit by comparing the current Dc voltage to the reference voltage + return s.AcDc.Dc.Voltage > s.Config.GridTie.AcDc.ReferenceDcLinkVoltage + ? control with { PowerCorrection = clampedPowerDelta.ClampMax(-correction), LimitedBy = EssLimit.ChargeLimitedByMaxDcBusVoltage } + : control with { PowerCorrection = clampedPowerDelta.ClampMin(correction), LimitedBy = EssLimit.DischargeLimitedByMinDcBusVoltage }; + } + + + private static EssControl LimitChargePower(this EssControl control, StatusRecord s) + { + + //var maxInverterChargePower = s.ControlInverterPower(s.Config.MaxInverterPower); + var maxBatteryChargePower = s.MaxBatteryChargePower(); + maxBatteryChargePower.WriteLine("MaxBattery Charge Power"); + + return control + //.LimitChargePower(, EssLimit.ChargeLimitedByInverterPower) + .LimitChargePower(maxBatteryChargePower, EssLimit.ChargeLimitedByBatteryPower); + + } + + private static EssControl LimitDischargePower(this EssControl control, StatusRecord s) + { + var maxBatteryDischargeDelta = s.Battery?.Devices.Where(b => b.IoStatus.ConnectedToDcBus).Sum(b => b.MaxDischargePower) ?? 0; + var keepMinSocLimitDelta = s.ControlBatteryPower(s.HoldMinSocPower()); + + return control + .LimitDischargePower(maxBatteryDischargeDelta , EssLimit.DischargeLimitedByBatteryPower) + .LimitDischargePower(keepMinSocLimitDelta , EssLimit.DischargeLimitedByMinSoc); + } + + private static Double ComputePowerDelta(this StatusRecord s, EssMode mode) + { + var chargePower = s.AcDc.Devices.Sum(d => d.Status.Nominal.Power.Value); + + return mode switch + { + EssMode.HeatBatteries => s.ControlInverterPower(chargePower), + EssMode.ReachMinSoc => s.ControlInverterPower(chargePower), + EssMode.CalibrationCharge => s.ControlInverterPower(chargePower), + EssMode.OptimizeSelfConsumption => s.ControlGridPower(s.Config.GridSetPoint), + _ => throw new ArgumentException(null, nameof(mode)) + }; + } + + private static Boolean MustHeatBatteries(this StatusRecord s) + { + var batteries = s.GetBatteries(); + + if (batteries.Count <= 0) + return true; // batteries might be there but BMS is without power + + return batteries + .Select(b => b.Temperatures.State) + .Contains(TemperatureState.Cold); + } + + private static Double MaxBatteryChargePower(this StatusRecord s) + { + // This introduces a limit when we don't have communication with batteries + // Otherwise the limit will be 0 and the batteries will be not heated + + var batteries = s.GetBatteries(); + + var maxChargePower = batteries.Count == 0 + ? s.Config.Devices.BatteryNodes.Length * BatteryHeatingPower + : batteries.Sum(b => b.MaxChargePower); + + return maxChargePower; + } + + private static Double CurrentPowerSetPoint(this StatusRecord s) + { + return s + .AcDc + .Devices + .Select(d => + { + var acPowerControl = d.Control.Ac.Power; + + return acPowerControl.L1.Active + + acPowerControl.L2.Active + + acPowerControl.L3.Active; + }) + .Sum(p => p); + } + + private static Boolean MustReachMinSoc(this StatusRecord s) + { + var batteries = s.GetBatteries(); + + return batteries.Count > 0 + && batteries.Any(b => b.Soc < s.Config.MinSoc); + } + + private static IReadOnlyList GetBatteries(this StatusRecord s) + { + return s.Battery?.Devices ?? Array.Empty(); + } + + private static Boolean MustDoCalibrationCharge(this StatusRecord statusRecord) + { + var calibrationChargeForced = statusRecord.Config.ForceCalibrationChargeState; + var additionalCalibrationRequired = AdditionalCalibrationDateHasBeenPassed(statusRecord.Config.DayAndTimeForAdditionalCalibration); + var repetitiveCalibrationRequired = RepetitiveCalibrationDateHasBeenPassed(statusRecord.Config.DayAndTimeForRepetitiveCalibration); + + var mustDoCalibrationCharge = calibrationChargeForced == CalibrationChargeType.ChargePermanently || + (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && additionalCalibrationRequired) || + (calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && repetitiveCalibrationRequired); + + Console.WriteLine("Next Repetitive calibration charge date is "+ statusRecord.Config.DayAndTimeForRepetitiveCalibration); + Console.WriteLine("Next Additional calibration charge date is "+ statusRecord.Config.DayAndTimeForAdditionalCalibration); + + if (statusRecord.Battery is not null) + { + if (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && statusRecord.Battery.Eoc ) + { + statusRecord.Config.ForceCalibrationChargeState = CalibrationChargeType.RepetitivelyEvery; + + } + else if (calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && statusRecord.Battery.Eoc && _hasRepetitiveCalibrationChargeChecked) + { + statusRecord.Config.DayAndTimeForRepetitiveCalibration = statusRecord.Config.DayAndTimeForRepetitiveCalibration.AddDays(7); + _hasRepetitiveCalibrationChargeChecked = false; + } + } + + return mustDoCalibrationCharge; + } + + private static Boolean RepetitiveCalibrationDateHasBeenPassed(DateTime calibrationChargeDate) + { + if (DateTime.Now >= calibrationChargeDate ) + { + _hasRepetitiveCalibrationChargeChecked = true; + return true; + } + return false; + } + private static Boolean AdditionalCalibrationDateHasBeenPassed(DateTime calibrationChargeDate) + { + if (DateTime.Now >= calibrationChargeDate ) + { + return true; + } + return false; + } + + private static Double ControlGridPower(this StatusRecord status, Double targetPower) + { + return ControlPower + ( + measurement : status.GridMeter!.Ac.Power.Active, + target : targetPower, + pConstant : status.Config.PConstant + ); + } + + private static Double ControlInverterPower(this StatusRecord status, Double targetInverterPower) + { + return ControlPower + ( + measurement : status.AcDc.Ac.Power.Active, + target : targetInverterPower, + pConstant : status.Config.PConstant + ); + } + + private static Double ControlBatteryPower(this StatusRecord status, Double targetBatteryPower) + { + return ControlPower + ( + measurement: status.GetBatteries().Sum(b => b.Dc.Power), + target: targetBatteryPower, + pConstant: status.Config.PConstant + ); + } + + private static Double HoldMinSocPower(this StatusRecord s) + { + // TODO: explain LowSOC curve + + var batteries = s.GetBatteries(); + + if (batteries.Count == 0) + return Double.NegativeInfinity; + + var a = -2 * s.Config.BatterySelfDischargePower * batteries.Count / s.Config.HoldSocZone; + var b = -a * (s.Config.MinSoc + s.Config.HoldSocZone); + + return batteries.Min(d => d.Soc.Value) * a + b; + } + + private static Double ControlPower(Double measurement, Double target, Double pConstant) + { + var error = target - measurement; + return error * pConstant; + } + + // ReSharper disable once UnusedMember.Local, TODO + private static Double ControlPowerWithIntegral(Double measurement, Double target, Double p, Double i) + { + var errorSum = 0; // this is must be sum of error + var error = target - measurement; + var kp = p * error; + var ki = i * errorSum; + return ki + kp; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Ess/EssControl.cs b/csharp/App_backup/SaliMax/src/Ess/EssControl.cs new file mode 100644 index 000000000..4886974f1 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Ess/EssControl.cs @@ -0,0 +1,53 @@ +using InnovEnergy.Lib.Units.Power; + +namespace InnovEnergy.App.SaliMax.Ess; + +public record EssControl +{ + public required EssMode Mode { get; init; } + public required EssLimit LimitedBy { get; init; } + public required ActivePower PowerCorrection { get; init; } + public required ActivePower PowerSetpoint { get; init; } + + public static EssControl Default { get; } = new() + { + Mode = EssMode.Off, + LimitedBy = EssLimit.NoLimit, + PowerCorrection = 0, + PowerSetpoint = 0 + }; + + + public EssControl LimitChargePower(Double controlDelta, EssLimit reason) + { + var overload = PowerCorrection - controlDelta; + + if (overload <= 0) + return this; + + return this with + { + LimitedBy = reason, + PowerCorrection = controlDelta, + PowerSetpoint = PowerSetpoint - overload + }; + } + + public EssControl LimitDischargePower(Double controlDelta, EssLimit reason) + { + var overload = PowerCorrection - controlDelta; + + if (overload >= 0) + return this; + + return this with + { + LimitedBy = reason, + PowerCorrection = controlDelta, + PowerSetpoint = PowerSetpoint - overload + }; + } +} + + + diff --git a/csharp/App_backup/SaliMax/src/Ess/EssLimit.cs b/csharp/App_backup/SaliMax/src/Ess/EssLimit.cs new file mode 100644 index 000000000..3eb95b07c --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Ess/EssLimit.cs @@ -0,0 +1,20 @@ +namespace InnovEnergy.App.SaliMax.Ess; + +public enum EssLimit +{ + NoLimit, + DischargeLimitedByMinSoc, + DischargeLimitedByBatteryPower, + DischargeLimitedByInverterPower, + ChargeLimitedByInverterPower, + ChargeLimitedByBatteryPower, + ChargeLimitedByMaxDcBusVoltage, + DischargeLimitedByMinDcBusVoltage, +} + + +// limitedBy = $"limiting discharging power in order to stay above min SOC: {s.Config.MinSoc}%"; +// limitedBy = $"limited by max battery discharging power: {maxDischargePower}"; +// limitedBy = $"limited by max inverter Dc to Ac power: {-s.Config.MaxInverterPower}W"; +// limitedBy = $"limited by max battery charging power: {maxChargePower}"; +// limitedBy = "limited by max inverter Ac to Dc power"; \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Ess/EssMode.cs b/csharp/App_backup/SaliMax/src/Ess/EssMode.cs new file mode 100644 index 000000000..08246ae77 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Ess/EssMode.cs @@ -0,0 +1,12 @@ +namespace InnovEnergy.App.SaliMax.Ess; + +public enum EssMode +{ + Off, + OffGrid, + HeatBatteries, + CalibrationCharge, + ReachMinSoc, + NoGridMeter, + OptimizeSelfConsumption +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Ess/SalimaxAlarmState.cs b/csharp/App_backup/SaliMax/src/Ess/SalimaxAlarmState.cs new file mode 100644 index 000000000..3eb4f0d95 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Ess/SalimaxAlarmState.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SaliMax.Ess; + +public enum SalimaxAlarmState +{ + Green, + Orange, + Red +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Ess/StatusRecord.cs b/csharp/App_backup/SaliMax/src/Ess/StatusRecord.cs new file mode 100644 index 000000000..b7c72426c --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Ess/StatusRecord.cs @@ -0,0 +1,55 @@ +using System.Text.Json; +using InnovEnergy.App.SaliMax.Devices; +using InnovEnergy.App.SaliMax.SaliMaxRelays; +using InnovEnergy.App.SaliMax.System; +using InnovEnergy.App.SaliMax.SystemConfig; +using InnovEnergy.Lib.Devices.AMPT; +using InnovEnergy.Lib.Devices.Battery48TL; +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; + +namespace InnovEnergy.App.SaliMax.Ess; + +public record StatusRecord +{ + public required AcDcDevicesRecord AcDc { get; init; } + public required DcDcDevicesRecord DcDc { get; init; } + public required Battery48TlRecords? Battery { get; init; } + public required EmuMeterRegisters? GridMeter { get; init; } + public required EmuMeterRegisters? LoadOnAcIsland { get; init; } + public required AcPowerDevice? LoadOnAcGrid { get; init; } + public required AmptStatus? PvOnAcGrid { get; init; } + public required AmptStatus? PvOnAcIsland { get; init; } + public required AcPowerDevice? AcGridToAcIsland { get; init; } + public required DcPowerDevice? AcDcToDcLink { get; init; } + public required DcPowerDevice? LoadOnDc { get; init; } + public required IRelaysRecord? Relays { get; init; } + public required AmptStatus? PvOnDc { get; init; } + public required Config Config { get; set; } + public required SystemLog Log { get; init; } // TODO: init only + + public required EssControl EssControl { get; set; } // TODO: init only + public required StateMachine StateMachine { get; init; } + + + public string ToJson() + { + // Try to get the "Battery" property via reflection + // var batteryProperty = thing.GetType().GetProperty("Battery"); + // if (batteryProperty == null) + // throw new InvalidOperationException("The object does not have a 'Battery' property."); + // + // // Retrieve the value of the Battery property + // var batteryValue = Battery.GetValue(thing); + var jsonOptions = new JsonSerializerOptions { WriteIndented = true }; + + // Serialize the Battery property + Console.WriteLine("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); + string json = JsonSerializer.Serialize(this.Battery, jsonOptions); + Console.WriteLine(json); + + + return json; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Ess/SystemLog.cs b/csharp/App_backup/SaliMax/src/Ess/SystemLog.cs new file mode 100644 index 000000000..67e2cedb6 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Ess/SystemLog.cs @@ -0,0 +1,11 @@ +using InnovEnergy.App.SaliMax.DataTypes; + +namespace InnovEnergy.App.SaliMax.Ess; + +public record SystemLog +{ + public required String? Message { get; init; } + public required SalimaxAlarmState SalimaxAlarmState { get; init; } + public required List? SalimaxAlarms { get; set; } + public required List? SalimaxWarnings { get; set; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Flow.cs b/csharp/App_backup/SaliMax/src/Flow.cs new file mode 100644 index 000000000..f598b4fe2 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Flow.cs @@ -0,0 +1,56 @@ +using System.Diagnostics.CodeAnalysis; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; + + +namespace InnovEnergy.App.SaliMax; + +public static class Flow +{ + private static readonly String RightArrowChar = ">"; + private static readonly String LeftArrowChar = "<"; + private static readonly String DownArrowChar = "V"; + private static readonly String UpArrowChar = "^"; + private static readonly String UnknownArrowChar = "?"; + + public static TextBlock Horizontal(Unit? amount) => Horizontal(amount, 10); + + public static TextBlock Horizontal(Unit? amount, Int32 width) + { + var label = amount?.ToDisplayString() ?? ""; + + var arrowChar = amount switch + { + { Value: < 0 } => LeftArrowChar, + { Value: >= 0 } => RightArrowChar, + _ => UnknownArrowChar, + }; + + //var arrowChar = amount.Value < 0 ? LeftArrowChar : RightArrowChar; + var arrow = Enumerable.Repeat(arrowChar, width).Join(); + + // note : appending "fake label" below to make it vertically symmetric + return TextBlock.AlignCenterHorizontal(label, arrow, ""); + } + + public static TextBlock Vertical(Unit? amount) => Vertical(amount, 4); + + [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")] + [SuppressMessage("ReSharper", "CoVariantArrayConversion")] + public static TextBlock Vertical(Unit? amount, Int32 height) + { + var label = amount?.ToDisplayString() ?? UnknownArrowChar; + var arrowChar = amount switch + { + { Value: < 0 } => UpArrowChar, + { Value: >= 0 } => DownArrowChar, + _ => UnknownArrowChar, + }; + + // var arrowChar = amount is null ? UnknownArrowChar + // : amount.Value < 0 ? UpArrowChar + // : DownArrowChar; + + return TextBlock.AlignCenterHorizontal(arrowChar, arrowChar, label, arrowChar, arrowChar); + } +} diff --git a/csharp/App_backup/SaliMax/src/LogFileConcatenator.cs b/csharp/App_backup/SaliMax/src/LogFileConcatenator.cs new file mode 100644 index 000000000..60a7f5486 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/LogFileConcatenator.cs @@ -0,0 +1,34 @@ +using System.Text; + +namespace InnovEnergy.App.SaliMax; + +public class LogFileConcatenator +{ + private readonly string _logDirectory; + + public LogFileConcatenator(String logDirectory = "JsonLogDirectory/") + { + _logDirectory = logDirectory; + } + + public String ConcatenateFiles(int numberOfFiles) + { + var logFiles = Directory + .GetFiles(_logDirectory, "log_*.json") + .OrderByDescending(file => file) + .Take(numberOfFiles) + .OrderBy(file => file) + .ToList(); + + var concatenatedContent = new StringBuilder(); + + foreach (var fileContent in logFiles.Select(File.ReadAllText)) + { + concatenatedContent.AppendLine(fileContent); + //concatenatedContent.AppendLine(); // Append an empty line to separate the files // maybe we don't need this + } + + return concatenatedContent.ToString(); + } +} + diff --git a/csharp/App_backup/SaliMax/src/Logfile.cs b/csharp/App_backup/SaliMax/src/Logfile.cs new file mode 100644 index 000000000..e8e290424 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Logfile.cs @@ -0,0 +1,49 @@ +using InnovEnergy.Lib.Utils; +using Microsoft.Extensions.Logging; + +namespace InnovEnergy.App.SaliMax; + +public class CustomLogger : ILogger +{ + private readonly String _logFilePath; + //private readonly Int64 _maxFileSizeBytes; + private readonly Int32 _maxLogFileCount; + private Int64 _currentFileSizeBytes; + + public CustomLogger(String logFilePath, Int32 maxLogFileCount) + { + _logFilePath = logFilePath; + _maxLogFileCount = maxLogFileCount; + _currentFileSizeBytes = File.Exists(logFilePath) ? new FileInfo(logFilePath).Length : 0; + } + + public IDisposable? BeginScope(TState state) where TState : notnull => throw new NotImplementedException(); + + public Boolean IsEnabled(LogLevel logLevel) => true; // Enable logging for all levels + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) + { + var logMessage = formatter(state, exception!); + + // Check the log file count and delete the oldest file if necessary + var logFileDir = Path.GetDirectoryName(_logFilePath)!; + var logFileExt = Path.GetExtension(_logFilePath); + var logFileBaseName = Path.GetFileNameWithoutExtension(_logFilePath); + + var logFiles = Directory + .GetFiles(logFileDir, $"{logFileBaseName}_*{logFileExt}") + .OrderBy(file => file) + .ToList(); + + if (logFiles.Count >= _maxLogFileCount) + { + File.Delete(logFiles.First()); + } + + var roundedUnixTimestamp = DateTime.Now.ToUnixTime() % 2 == 0 ? DateTime.Now.ToUnixTime() : DateTime.Now.ToUnixTime() + 1; + var timestamp = "Timestamp;" + roundedUnixTimestamp + Environment.NewLine; + + var logFileBackupPath = Path.Combine(logFileDir, $"{logFileBaseName}_{DateTime.Now.ToUnixTime()}{logFileExt}"); + File.AppendAllText(logFileBackupPath, timestamp + logMessage + Environment.NewLine); + } +} diff --git a/csharp/App_backup/SaliMax/src/Logger.cs b/csharp/App_backup/SaliMax/src/Logger.cs new file mode 100644 index 000000000..800f92a34 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Logger.cs @@ -0,0 +1,39 @@ +using Microsoft.Extensions.Logging; + +namespace InnovEnergy.App.SaliMax; + +public static class Logger +{ + // Specify the maximum log file size in bytes (e.g., 1 MB) + + //private const Int32 MaxFileSizeBytes = 2024 * 30; // TODO: move to settings + private const Int32 MaxLogFileCount = 5000; // TODO: move to settings + private const String LogFilePath = "JsonLogDirectory/log.json"; // TODO: move to settings + + // ReSharper disable once InconsistentNaming + private static readonly ILogger _logger = new CustomLogger(LogFilePath, MaxLogFileCount); + + public static T LogInfo(this T t) where T : notnull + { + _logger.LogInformation(t.ToString()); // TODO: check warning + return t; + } + + public static T LogDebug(this T t) where T : notnull + { + _logger.LogDebug(t.ToString()); // TODO: check warning + return t; + } + + public static T LogError(this T t) where T : notnull + { + _logger.LogError(t.ToString()); // TODO: check warning + return t; + } + + public static T LogWarning(this T t) where T : notnull + { + _logger.LogWarning(t.ToString()); // TODO: check warning + return t; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/MiddlewareClasses/MiddlewareAgent.cs b/csharp/App_backup/SaliMax/src/MiddlewareClasses/MiddlewareAgent.cs new file mode 100644 index 000000000..32950ff50 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/MiddlewareClasses/MiddlewareAgent.cs @@ -0,0 +1,93 @@ +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Text; +using System.Text.Json; +using InnovEnergy.App.SaliMax.DataTypes; + +namespace InnovEnergy.App.SaliMax.MiddlewareClasses; + +public static class MiddlewareAgent +{ + private static UdpClient _udpListener = null!; + private static IPAddress? _controllerIpAddress; + private static EndPoint? _endPoint; + + public static void InitializeCommunicationToMiddleware() + { + _controllerIpAddress = FindVpnIp(); + if (Equals(IPAddress.None, _controllerIpAddress)) + { + Console.WriteLine("There is no VPN interface, exiting..."); + } + + const Int32 udpPort = 9000; + _endPoint = new IPEndPoint(_controllerIpAddress, udpPort); + + _udpListener = new UdpClient(); + _udpListener.Client.Blocking = false; + _udpListener.Client.Bind(_endPoint); + } + + private static IPAddress FindVpnIp() + { + const String interfaceName = "innovenergy"; + + var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + + foreach (var networkInterface in networkInterfaces) + { + if (networkInterface.Name == interfaceName) + { + var ipProps = networkInterface.GetIPProperties(); + var uniCastIPs = ipProps.UnicastAddresses; + var controllerIpAddress = uniCastIPs[0].Address; + + Console.WriteLine("VPN IP is: "+ uniCastIPs[0].Address); + return controllerIpAddress; + } + } + + return IPAddress.None; + } + + public static Configuration? SetConfigurationFile() + { + if (_udpListener.Available > 0) + { + + IPEndPoint? serverEndpoint = null; + + var replyMessage = "ACK"; + var replyData = Encoding.UTF8.GetBytes(replyMessage); + + var udpMessage = _udpListener.Receive(ref serverEndpoint); + var message = Encoding.UTF8.GetString(udpMessage); + + var config = JsonSerializer.Deserialize(message); + + if (config != null) + { + Console.WriteLine($"Received a configuration message: GridSetPoint is " + config.GridSetPoint + + ", MinimumSoC is " + config.MinimumSoC + " and ForceCalibrationCharge is " + + config.CalibrationChargeState + " and CalibrationChargeDate is " + + config.CalibrationChargeDate); + + // Send the reply to the sender's endpoint + _udpListener.Send(replyData, replyData.Length, serverEndpoint); + Console.WriteLine($"Replied to {serverEndpoint}: {replyMessage}"); + return config; + } + } + + if (_endPoint != null && !_endPoint.Equals(_udpListener.Client.LocalEndPoint as IPEndPoint)) + { + Console.WriteLine("UDP address has changed, rebinding..."); + InitializeCommunicationToMiddleware(); + } + + + return null; + } + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/MiddlewareClasses/RabbitMQManager.cs b/csharp/App_backup/SaliMax/src/MiddlewareClasses/RabbitMQManager.cs new file mode 100644 index 000000000..35931424e --- /dev/null +++ b/csharp/App_backup/SaliMax/src/MiddlewareClasses/RabbitMQManager.cs @@ -0,0 +1,61 @@ +using System.Text; +using System.Text.Json; +using InnovEnergy.App.SaliMax.DataTypes; +using RabbitMQ.Client; + +namespace InnovEnergy.App.SaliMax.MiddlewareClasses; + +public static class RabbitMqManager +{ + public static ConnectionFactory? Factory ; + public static IConnection ? Connection; + public static IModel? Channel; + + public static Boolean SubscribeToQueue(StatusMessage currentSalimaxState, String? s3Bucket,String VpnServerIp) + { + try + { + //_factory = new ConnectionFactory { HostName = VpnServerIp }; + + Factory = new ConnectionFactory + { + HostName = VpnServerIp, + Port = 5672, + VirtualHost = "/", + UserName = "producer", + Password = "b187ceaddb54d5485063ddc1d41af66f", + + }; + + Connection = Factory.CreateConnection(); + Channel = Connection.CreateModel(); + Channel.QueueDeclare(queue: "statusQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); + + Console.WriteLine("The controller sends its status to the middleware for the first time"); + if (s3Bucket != null) InformMiddleware(currentSalimaxState); + + + } + catch (Exception ex) + { + Console.WriteLine("An error occurred while connecting to the RabbitMQ queue: " + ex.Message); + return false; + } + return true; + } + + public static void InformMiddleware(StatusMessage status) + { + var message = JsonSerializer.Serialize(status); + var body = Encoding.UTF8.GetBytes(message); + + Channel.BasicPublish(exchange: string.Empty, + routingKey: "statusQueue", + basicProperties: null, + body: body); + + Console.WriteLine($"Producer sent message: {message}"); + } + + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Program.cs b/csharp/App_backup/SaliMax/src/Program.cs new file mode 100644 index 000000000..614ca5c25 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Program.cs @@ -0,0 +1,1020 @@ +#define Amax +#undef GridLimit + +using System.IO.Compression; +using System.Reactive.Linq; +using System.Reactive.Threading.Tasks; +using System.Text; +using Flurl.Http; +using InnovEnergy.App.SaliMax.Devices; +using InnovEnergy.App.SaliMax.Ess; +using InnovEnergy.App.SaliMax.MiddlewareClasses; +using InnovEnergy.App.SaliMax.SaliMaxRelays; +using InnovEnergy.App.SaliMax.System; +using InnovEnergy.App.SaliMax.SystemConfig; +using InnovEnergy.Lib.Devices.AMPT; +using InnovEnergy.Lib.Devices.Battery48TL; +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Devices.Trumpf.SystemControl; +using InnovEnergy.Lib.Devices.Trumpf.SystemControl.DataTypes; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc.DataTypes; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc.Control; +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; +using InnovEnergy.App.SaliMax.DataTypes; +using Newtonsoft.Json; +using static System.Int32; +using static InnovEnergy.App.SaliMax.AggregationService.Aggregator; +using static InnovEnergy.App.SaliMax.MiddlewareClasses.MiddlewareAgent; +using static InnovEnergy.Lib.Devices.Trumpf.SystemControl.DataTypes.SystemConfig; +using DeviceState = InnovEnergy.App.SaliMax.Devices.DeviceState; + +#pragma warning disable IL2026 + +namespace InnovEnergy.App.SaliMax; + +internal static class Program +{ + private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(2); + + private static readonly IReadOnlyList BatteryNodes; + + private static readonly Channel TruConvertAcChannel; + private static readonly Channel TruConvertDcChannel; + private static readonly Channel GridMeterChannel; + private static readonly Channel IslandBusLoadChannel; + private static readonly Channel PvOnDc; + private static readonly Channel PvOnAcGrid; + private static readonly Channel PvOnAcIsland; + private static readonly Channel RelaysChannel; + private static readonly Channel RelaysTsChannel; + private static readonly Channel BatteriesChannel; + + private static Boolean _curtailFlag = false; + private const String VpnServerIp = "10.2.0.11"; + private static Boolean _subscribedToQueue = false; + private static Boolean _subscribeToQueueForTheFirstTime = false; + private static SalimaxAlarmState _prevSalimaxState = SalimaxAlarmState.Green; + private const UInt16 NbrOfFileToConcatenate = 30; + private static UInt16 _counterOfFile = 0; + private static SalimaxAlarmState _salimaxAlarmState = SalimaxAlarmState.Green; + + static Program() + { + var config = Config.Load(); + var d = config.Devices; + + Channel CreateChannel(SalimaxDevice device) => device.DeviceState == DeviceState.Disabled + ? new NullChannel() + : new TcpChannel(device); + + + TruConvertAcChannel = CreateChannel(d.TruConvertAcIp); + TruConvertDcChannel = CreateChannel(d.TruConvertDcIp); + GridMeterChannel = CreateChannel(d.GridMeterIp); + IslandBusLoadChannel = CreateChannel(d.IslandBusLoadMeterIp); + PvOnDc = CreateChannel(d.PvOnDc); + PvOnAcGrid = CreateChannel(d.PvOnAcGrid); + PvOnAcIsland = CreateChannel(d.PvOnAcIsland); + RelaysChannel = CreateChannel(d.RelaysIp); + RelaysTsChannel = CreateChannel(d.TsRelaysIp); + BatteriesChannel = CreateChannel(d.BatteryIp); + + BatteryNodes = config + .Devices + .BatteryNodes + .Select(n => n.ConvertTo()) + .ToArray(config.Devices.BatteryNodes.Length); + } + + public static async Task Main(String[] args) + { + //Do not await + HourlyDataAggregationManager() + .ContinueWith(t=>t.Exception.WriteLine(), TaskContinuationOptions.OnlyOnFaulted) + .SupressAwaitWarning(); + + DailyDataAggregationManager() + .ContinueWith(t=>t.Exception.WriteLine(), TaskContinuationOptions.OnlyOnFaulted) + .SupressAwaitWarning(); + + InitializeCommunicationToMiddleware(); + + while (true) + { + try + { + await Run(); + } + catch (Exception e) + { + e.LogError(); + } + } + } + + + private static async Task Run() + { + "Starting SodiStore Max".WriteLine(); + + Watchdog.NotifyReady(); + + var battery48TlDevices = BatteryNodes + .Select(n => new Battery48TlDevice(BatteriesChannel, n)) + .ToList(); + + var batteryDevices = new Battery48TlDevices(battery48TlDevices); + var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel); + var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel); + var gridMeterDevice = new EmuMeterDevice(GridMeterChannel); + var acIslandLoadMeter = new EmuMeterDevice(IslandBusLoadChannel); + var pvOnDcDevice = new AmptDevices(PvOnDc); + var pvOnAcGridDevice = new AmptDevices(PvOnAcGrid); + var pvOnAcIslandDevice = new AmptDevices(PvOnAcIsland); + var saliMaxTsRelaysDevice = new RelaysDeviceAdam6060(RelaysTsChannel); + + +#if Amax + var saliMaxRelaysDevice = new RelaysDeviceAmax(RelaysChannel); +#else + var saliMaxRelaysDevice = new RelaysDeviceAdam6360(RelaysChannel); +#endif + + + StatusRecord ReadStatus() + { + var config = Config.Load(); + var devices = config.Devices; + var acDc = acDcDevices.Read(); + var dcDc = dcDcDevices.Read(); + var relays = saliMaxRelaysDevice.Read(); + var tsRelays = saliMaxTsRelaysDevice.Read(); + var loadOnAcIsland = acIslandLoadMeter.Read(); + var gridMeter = gridMeterDevice.Read(); + var pvOnDc = pvOnDcDevice.Read(); + var battery = batteryDevices.Read(); + + var pvOnAcGrid = pvOnAcGridDevice.Read(); + var pvOnAcIsland = pvOnAcIslandDevice.Read(); + + var gridBusToIslandBus = Topology.CalculateGridBusToIslandBusPower(pvOnAcIsland, loadOnAcIsland, acDc); + + var gridBusLoad = devices.LoadOnAcGrid.DeviceState == DeviceState.Disabled + ? new AcPowerDevice { Power = 0 } + : Topology.CalculateGridBusLoad(gridMeter, pvOnAcGrid, gridBusToIslandBus); + + var dcLoad = devices.LoadOnDc.DeviceState == DeviceState.Disabled + ? new DcPowerDevice { Power = 0 } + : Topology.CalculateDcLoad(acDc, pvOnDc, dcDc); + + var acDcToDcLink = devices.LoadOnDc.DeviceState == DeviceState.Disabled ? + Topology.CalculateAcDcToDcLink(pvOnDc, dcDc, acDc) + : new DcPowerDevice{ Power = acDc.Dc.Power}; + +#if Amax + var combinedRelays = relays; +#else + var combinedRelays = new CombinedAdamRelaysRecord(tsRelays, relays); +#endif + + return new StatusRecord + { + AcDc = acDc, + DcDc = dcDc, + Battery = battery, + Relays = combinedRelays, + GridMeter = gridMeter, + PvOnAcGrid = pvOnAcGrid, + PvOnAcIsland = pvOnAcIsland, + PvOnDc = pvOnDc, + AcGridToAcIsland = gridBusToIslandBus, + AcDcToDcLink = acDcToDcLink, + LoadOnAcGrid = gridBusLoad, + LoadOnAcIsland = loadOnAcIsland, + LoadOnDc = dcLoad, + StateMachine = StateMachine.Default, + EssControl = EssControl.Default, + Log = new SystemLog { SalimaxAlarmState = SalimaxAlarmState.Green, Message = null, SalimaxAlarms = null, SalimaxWarnings = null}, //TODO: Put real stuff + Config = config // load from disk every iteration, so config can be changed while running + }; + } + + void WriteControl(StatusRecord r) + { + if (r.Relays is not null) + { +#if Amax + saliMaxRelaysDevice.Write((RelaysRecordAmax)r.Relays); +#else + + if (r.Relays is CombinedAdamRelaysRecord adamRelays) + { + saliMaxRelaysDevice.Write(adamRelays.GetAdam6360DRecord() ?? throw new InvalidOperationException()); + saliMaxTsRelaysDevice.Write(adamRelays.GetAdam6060Record() ?? throw new InvalidOperationException()); + } +#endif + } + + acDcDevices.Write(r.AcDc); + dcDcDevices.Write(r.DcDc); + } + + Console.WriteLine("press ctrl-c to stop"); + + while (true) + { + await Observable + .Interval(UpdateInterval) + .Select(_ => RunIteration()) + .SelectMany(r => UploadCsv(r, DateTime.Now.Round(UpdateInterval))) + .SelectError() + .ToTask(); + } + + + StatusRecord RunIteration() + { + Watchdog.NotifyAlive(); + + var record = ReadStatus(); + /* + if (record.Relays != null) + { + record.Relays.Do0StartPulse = true; + + record.Relays.PulseOut0HighTime = 20000; + record.Relays.PulseOut0LowTime = 20000; + record.Relays.DigitalOutput0Mode = 2; + + record.Relays.LedGreen = false; + + record.Relays.Do0StartPulse.WriteLine(" = start pulse 0"); + + record.Relays.PulseOut0HighTime.WriteLine(" = PulseOut0HighTime"); + + record.Relays.PulseOut0LowTime.WriteLine(" = PulseOut0LowTime"); + + record.Relays.DigitalOutput0Mode.WriteLine(" = DigitalOutput0Mode"); + + record.Relays.LedGreen.WriteLine(" = LedGreen"); + + record.Relays.LedRed.WriteLine(" = LedRed"); + + } + else + { + " Relays are null".WriteLine(); + }*/ + + SendSalimaxStateAlarm(GetSalimaxStateAlarm(record), record); // to improve + + record.ControlConstants(); + record.ControlSystemState(); + + record.ControlPvPower(record.Config.CurtailP, record.Config.PvInstalledPower); + + var essControl = record.ControlEss().WriteLine(); + + record.EssControl = essControl; + + record.AcDc.SystemControl.ApplyAcDcDefaultSettings(); + record.DcDc.SystemControl.ApplyDcDcDefaultSettings(); + + DistributePower(record, essControl); + + record.PerformLed(); + + WriteControl(record); + + $"{DateTime.Now.Round(UpdateInterval).ToUnixTime()} : {record.StateMachine.State}: {record.StateMachine.Message}".WriteLine(); + + record.CreateTopologyTextBlock().WriteLine(); + + (record.Relays is null ? "No relay Data available" : record.Relays.FiWarning ? "Alert: Fi Warning Detected" : "No Fi Warning Detected").WriteLine(); + (record.Relays is null ? "No relay Data available" : record.Relays.FiError ? "Alert: Fi Error Detected" : "No Fi Error Detected") .WriteLine(); + + record.Config.Save(); + + "===========================================".WriteLine(); + + return record; + } + + // ReSharper disable once FunctionNeverReturns + } + + private static void SendSalimaxStateAlarm(StatusMessage currentSalimaxState, StatusRecord record) + { + var s3Bucket = Config.Load().S3?.Bucket; + var subscribedNow = false; + + //Every 15 iterations(30 seconds), the installation sends a heartbit message to the queue + //_heartBitInterval++; + + //When the controller boots, it tries to subscribe to the queue + if (_subscribeToQueueForTheFirstTime == false) + { + subscribedNow = true; + _subscribeToQueueForTheFirstTime = true; + _prevSalimaxState = currentSalimaxState.Status; + _subscribedToQueue = RabbitMqManager.SubscribeToQueue(currentSalimaxState, s3Bucket, VpnServerIp); + } + + //If already subscribed to the queue and the status has been changed, update the queue + if (!subscribedNow && _subscribedToQueue && currentSalimaxState.Status != _prevSalimaxState) + { + _prevSalimaxState = currentSalimaxState.Status; + if (s3Bucket != null) + RabbitMqManager.InformMiddleware(currentSalimaxState); + } + // else if (_subscribedToQueue && _heartBitInterval >= 30) + // { + // //Send a heartbit to the backend + // Console.WriteLine("----------------------------------------Sending Heartbit----------------------------------------"); + // _heartBitInterval = 0; + // currentSalimaxState.Type = MessageType.Heartbit; + // + // if (s3Bucket != null) + // RabbitMqManager.InformMiddleware(currentSalimaxState); + // } + + //If there is an available message from the RabbitMQ Broker, apply the configuration file + Configuration? config = SetConfigurationFile(); + if (config != null) + { + record.ApplyConfigFile(config); + } + } + + // This preparing a message to send to salimax monitor + private static StatusMessage GetSalimaxStateAlarm(StatusRecord record) + { + var alarmCondition = record.DetectAlarmStates(); // this need to be emailed to support or customer + var s3Bucket = Config.Load().S3?.Bucket; + + var alarmList = new List(); + var warningList = new List(); + var bAlarmList = new List(); + var bWarningList = new List(); + + + if (record.Battery != null) + { + var i = 0; + + foreach (var battery in record.Battery.Devices) + { + var devicesBatteryNode = record.Config.Devices.BatteryNodes[i]; + + if (battery.LimpBitMap == 0) + { + // "All String are Active".WriteLine(); + } + else if (IsPowerOfTwo(battery.LimpBitMap)) + { + "1 String is disabled".WriteLine(); + Console.WriteLine(" ****************** "); + + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = "1 String is disabled" + }); + + bWarningList.Add("/"+i+1 + "/1 String is disabled"); // battery id instead ( i +1 ) of node id: requested from the frontend + } + else + { + "2 or more string are disabled".WriteLine(); + Console.WriteLine(" ****************** "); + + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = "2 or more string are disabled" + }); + bAlarmList.Add(i +";2 or more string are disabled"); + } + + foreach (var warning in record.Battery.Warnings) + { + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = warning + }); + bWarningList.Add(i +";" + warning); + } + + foreach (var alarm in battery.Alarms) + { + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = alarm + }); + bWarningList.Add(i +";" + alarm); + } + i++; + } + } + + if (alarmCondition is not null) + { + alarmCondition.WriteLine(); + + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Salimax", + Description = alarmCondition + }); + } + + foreach (var alarm in record.AcDc.Alarms) + { + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "AcDc", + Description = alarm.ToString() + }); + } + + foreach (var alarm in record.DcDc.Alarms) + { + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "DcDc", + Description = alarm.ToString() + }); + } + + foreach (var warning in record.AcDc.Warnings) + { + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "AcDc", + Description = warning.ToString() + }); + } + + foreach (var warning in record.DcDc.Warnings) + { + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "DcDc", + Description = warning.ToString() + }); + } + + _salimaxAlarmState = warningList.Any() + ? SalimaxAlarmState.Orange + : SalimaxAlarmState.Green; // this will be replaced by LedState + + _salimaxAlarmState = alarmList.Any() + ? SalimaxAlarmState.Red + : _salimaxAlarmState; // this will be replaced by LedState + + TryParse(s3Bucket?.Split("-")[0], out var installationId); + + var returnedStatus = new StatusMessage + { + InstallationId = installationId, + Product = 0, + Status = _salimaxAlarmState, + Type = MessageType.AlarmOrWarning, + Alarms = alarmList, + Warnings = warningList + }; + + return returnedStatus; + } + + private static String? DetectAlarmStates(this StatusRecord r) => r.Relays switch + { + { K2ConnectIslandBusToGridBus: false, K2IslandBusIsConnectedToGridBus: true } => " Contradiction: R0 is opening the K2 but the K2 is still close ", + { K1GridBusIsConnectedToGrid : false, K2IslandBusIsConnectedToGridBus: true } => " Contradiction: K1 is open but the K2 is still close ", + { FiError: true, K2IslandBusIsConnectedToGridBus: true } => " Contradiction: Fi error occured but the K2 is still close ", + _ => null + }; + + private static void ControlConstants(this StatusRecord r) + { + var inverters = r.AcDc.Devices; + var dcDevices = r.DcDc.Devices; + var configFile = r.Config; + var maxBatteryDischargingCurrentLive = 0.0; + var devicesConfig = r.AcDc.Devices.All(d => d.Control.Ac.GridType == GridType.GridTied400V50Hz) ? configFile.GridTie : configFile.IslandMode; // TODO if any of the grid tie mode + + // This adapting the max discharging current to the current Active Strings + if (r.Battery != null) + { + const Int32 stringsByBattery = 5; + var numberOfBatteriesConfigured = r.Config.Devices.BatteryNodes.Length; + var numberOfTotalStrings = stringsByBattery * numberOfBatteriesConfigured; + var dischargingCurrentByString = devicesConfig.DcDc.MaxBatteryDischargingCurrent / numberOfTotalStrings; + + var boolList = new List(); + + foreach (var stringActive in r.Battery.Devices.Select(b => b.BatteryStrings).ToList()) + { + boolList.Add(stringActive.String1Active); + boolList.Add(stringActive.String2Active); + boolList.Add(stringActive.String3Active); + boolList.Add(stringActive.String4Active); + boolList.Add(stringActive.String5Active); + } + + var numberOfBatteriesStringActive = boolList.Count(b => b); + + if (numberOfTotalStrings != 0) + { + maxBatteryDischargingCurrentLive = dischargingCurrentByString * numberOfBatteriesStringActive; + } + } + + // TODO The discharging current is well calculated but not communicated to live. But Written in S3 + + + inverters.ForEach(d => d.Control.Dc.MaxVoltage = devicesConfig.AcDc.MaxDcLinkVoltage); + inverters.ForEach(d => d.Control.Dc.MinVoltage = devicesConfig.AcDc.MinDcLinkVoltage); + inverters.ForEach(d => d.Control.Dc.ReferenceVoltage = devicesConfig.AcDc.ReferenceDcLinkVoltage); + + inverters.ForEach(d => d.Control.Dc.PrechargeConfig = DcPrechargeConfig.PrechargeDcWithInternal); + + dcDevices.ForEach(d => d.Control.DroopControl.UpperVoltage = devicesConfig.DcDc.UpperDcLinkVoltage); + dcDevices.ForEach(d => d.Control.DroopControl.LowerVoltage = devicesConfig.DcDc.LowerDcLinkVoltage); + dcDevices.ForEach(d => d.Control.DroopControl.ReferenceVoltage = devicesConfig.DcDc.ReferenceDcLinkVoltage); + + dcDevices.ForEach(d => d.Control.CurrentControl.MaxBatteryChargingCurrent = devicesConfig.DcDc.MaxBatteryChargingCurrent); + dcDevices.ForEach(d => d.Control.CurrentControl.MaxBatteryDischargingCurrent = maxBatteryDischargingCurrentLive); + dcDevices.ForEach(d => d.Control.MaxDcPower = devicesConfig.DcDc.MaxDcPower); + + dcDevices.ForEach(d => d.Control.VoltageLimits.MaxBatteryVoltage = devicesConfig.DcDc.MaxChargeBatteryVoltage); + dcDevices.ForEach(d => d.Control.VoltageLimits.MinBatteryVoltage = devicesConfig.DcDc.MinDischargeBatteryVoltage); + dcDevices.ForEach(d => d.Control.ControlMode = DcControlMode.VoltageDroop); + + r.DcDc.ResetAlarms(); + r.AcDc.ResetAlarms(); + } + + // This will be used for provider throttling, this example is only for either 100% or 0 % + private static void ControlPvPower(this StatusRecord r, UInt16 exportLimit = 0, UInt16 pvInstalledPower = 20) + { + // Maybe add a condition to do this only if we are in optimised Self consumption, this is not true + + if (r.GridMeter?.Ac.Power.Active == null) + { + Console.WriteLine(" No reading from Grid meter"); + return; + } + + if (pvInstalledPower == 0) + { + Console.WriteLine(" No curtailing, because Pv installed is equal to 0"); + return; + } + + const Int32 constantDeadBand = 5000; // magic number + const Double voltageRange = 100; // 100 Voltage configured rang for PV slope, if the configured slope change this must change also + var configFile = r.Config; + var inverters = r.AcDc.Devices; + var systemExportLimit = - exportLimit * 1000 ; // Conversion from Kw in W // the config file value is positive and limit should be negative from 0 to ... + var stepSize = ClampStepSize((UInt16)Math.Floor(voltageRange/ pvInstalledPower)); // in Voltage per 1 Kw + var deadBand = constantDeadBand/stepSize; + + // LINQ query to select distinct ActiveUpperVoltage + var result = r.AcDc.Devices + .Select(device => device?.Status?.DcVoltages?.Active?.ActiveUpperVoltage) + .Select(voltage => voltage.Value) // Extract the value since we've confirmed it's non-null + .Distinct() + .ToList(); + + Double upperVoltage; + + if (result.Count == 1) + { + upperVoltage = result[0]; + } + else + { + Console.WriteLine(" Different ActiveUpperVoltage between inverters "); // this should be reported to salimax Alarm + return; + } + + /************* For debugging purposes ********************/ + + systemExportLimit.WriteLine(" Export Limit in W"); + upperVoltage.WriteLine(" Upper Voltage"); + r.GridMeter.Ac.Power.Active.WriteLine(" Active Export"); + Console.WriteLine(" ****************** "); + + /*********************************************************/ + + if (r.GridMeter.Ac.Power.Active < systemExportLimit) + { + _curtailFlag = true; + upperVoltage = IncreaseInverterUpperLimit(upperVoltage, stepSize); + upperVoltage.WriteLine("Upper Voltage Increased: New Upper limit"); + } + else + { + if (_curtailFlag) + { + if (r.GridMeter.Ac.Power.Active > (systemExportLimit + deadBand)) + { + upperVoltage = DecreaseInverterUpperLimit(upperVoltage, stepSize); + + if (upperVoltage <= configFile.GridTie.AcDc.MaxDcLinkVoltage) + { + _curtailFlag = false; + upperVoltage = configFile.GridTie.AcDc.MaxDcLinkVoltage; + upperVoltage.WriteLine(" New Upper limit"); + Console.WriteLine("Upper Voltage decreased: Smaller than the default value, value clamped"); + } + else + { + Console.WriteLine("Upper Voltage decreased: New Upper limit"); + upperVoltage.WriteLine(" New Upper limit"); + } + } + else + { + deadBand.WriteLine("W :We are in Dead band area"); + upperVoltage.WriteLine(" same Upper limit from last cycle"); + } + } + else + { + Console.WriteLine("Curtail Flag is false , no need to curtail"); + upperVoltage.WriteLine(" same Upper limit from last cycle"); + } + } + inverters.ForEach(d => d.Control.Dc.MaxVoltage = upperVoltage); + Console.WriteLine(" ****************** "); + } + + // why this is not in Controller? + private static void DistributePower(StatusRecord record, EssControl essControl) + { + var nInverters = record.AcDc.Devices.Count; + + var powerPerInverterPhase = nInverters > 0 + ? essControl.PowerSetpoint / nInverters / 3 + : 0; + + record.AcDc.Devices.ForEach(d => + { + d.Control.Ac.PhaseControl = PhaseControl.Asymmetric; + d.Control.Ac.Power.L1 = powerPerInverterPhase; + d.Control.Ac.Power.L2 = powerPerInverterPhase; + d.Control.Ac.Power.L3 = powerPerInverterPhase; + }); + } + + // To test, most probably the curtailing flag will not work + private static void PerformLed(this StatusRecord record) + { + if (record.StateMachine.State == 23) + { + switch (record.EssControl.Mode) + { + case EssMode.CalibrationCharge: + record.Relays?.PerformSlowFlashingGreenLed(); + break; + case EssMode.OptimizeSelfConsumption when !_curtailFlag: + record.Relays?.PerformSolidGreenLed(); + break; + case EssMode.Off: + break; + case EssMode.OffGrid: + break; + case EssMode.HeatBatteries: + break; + case EssMode.ReachMinSoc: + break; + case EssMode.NoGridMeter: + break; + default: + { + if (_curtailFlag) + { + record.Relays?.PerformFastFlashingGreenLed(); + } + + break; + } + } + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc > 50) + { + record.Relays?.PerformSolidOrangeLed(); + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc < 50 && record.Battery.Soc > 20) + { + record.Relays?.PerformSlowFlashingOrangeLed(); + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc < 20) + { + record.Relays?.PerformFastFlashingOrangeLed(); + } + + var criticalAlarm = record.DetectAlarmStates(); + + if (criticalAlarm is not null) + { + record.Relays?.PerformFastFlashingRedLed(); + } + } + + private static Double IncreaseInverterUpperLimit(Double upperLimit, Double stepSize) + { + return upperLimit + stepSize; + } + + private static Double DecreaseInverterUpperLimit(Double upperLimit, Double stepSize) + { + return upperLimit - stepSize; + } + + private static UInt16 ClampStepSize(UInt16 stepSize) + { + return stepSize switch + { + > 5 => 5, + <= 1 => 1, + _ => stepSize + }; + } + + private static void ApplyAcDcDefaultSettings(this SystemControlRegisters? sc) + { + if (sc is null) + return; + + sc.ReferenceFrame = ReferenceFrame.Consumer; + sc.SystemConfig = AcDcAndDcDc; + + #if DEBUG + sc.CommunicationTimeout = TimeSpan.FromMinutes(2); + #else + sc.CommunicationTimeout = TimeSpan.FromSeconds(20); + #endif + + sc.PowerSetPointActivation = PowerSetPointActivation.Immediate; + sc.UseSlaveIdForAddressing = true; + sc.SlaveErrorHandling = SlaveErrorHandling.Relaxed; + sc.SubSlaveErrorHandling = SubSlaveErrorHandling.Off; + + sc.ResetAlarmsAndWarnings = true; + } + + private static void ApplyDcDcDefaultSettings(this SystemControlRegisters? sc) + { + + if (sc is null) + return; + + sc.SystemConfig = DcDcOnly; + #if DEBUG + sc.CommunicationTimeout = TimeSpan.FromMinutes(2); + #else + sc.CommunicationTimeout = TimeSpan.FromSeconds(20); + #endif + + sc.PowerSetPointActivation = PowerSetPointActivation.Immediate; + sc.UseSlaveIdForAddressing = true; + sc.SlaveErrorHandling = SlaveErrorHandling.Relaxed; + sc.SubSlaveErrorHandling = SubSlaveErrorHandling.Off; + + sc.ResetAlarmsAndWarnings = true; + } + + private static void InsertIntoJson(Dictionary jsonDict, String[] keys, string value) + { + + Dictionary currentDict = jsonDict; + for (int i = 1; i < keys.Length; i++) // Start at 1 to skip empty root + { + string key = keys[i]; + if (!currentDict.ContainsKey(key)) + { + currentDict[key] = new Dictionary(); + } + + + + if (i == keys.Length - 1) // Last key, store the value + { + + if (!value.Contains(",") && double.TryParse(value, out double doubleValue)) // Try to parse value as a number + { + currentDict[key] = Math.Round(doubleValue, 2); // Round to 2 decimal places + + } + else + { + currentDict[key] = value; // Store as string if not a number + } + + + } + else + { + currentDict = (Dictionary)currentDict[key]; + } + } + + } + + private static async Task UploadCsv(StatusRecord status, DateTime timeStamp) + { + + //status.ToJson(); + var csv = status.ToCsv(); + + + Dictionary jsonData = new Dictionary(); + //Console.WriteLine(csv); + + foreach (var line in csv.Split('\n')) + { + if (string.IsNullOrWhiteSpace(line)) continue; + + string[] parts = line.Split(';'); + //if (parts.Length < 2) continue; + + string keyPath = parts[0]; + string value = parts[1]; + string unit = parts.Length > 2 ? parts[2].Trim() : ""; + //Console.WriteLine(line); + // Console.WriteLine($"Key: {keyPath}, Value: {value}, Unit: {unit}"); + + InsertIntoJson(jsonData, keyPath.Split('/'), value); + + } + + string jsonOutput = JsonConvert.SerializeObject(jsonData, Formatting.None); + jsonOutput.LogInfo(); + + + await RestApiSavingFile(csv); + + var s3Config = status.Config.S3; + + if (s3Config is null) + return false; + + //Concatenating 15 files in one file + return await ConcatinatingAndCompressingFiles(timeStamp, s3Config); + } + + private static async Task ConcatinatingAndCompressingFiles(DateTime timeStamp, S3Config s3Config) + { + if (_counterOfFile >= NbrOfFileToConcatenate) + { + _counterOfFile = 0; + + var logFileConcatenator = new LogFileConcatenator(); + + var s3Path = timeStamp.ToUnixTime() + ".json"; + s3Path.WriteLine(""); + var csvToSend = logFileConcatenator.ConcatenateFiles(NbrOfFileToConcatenate); + + var request = s3Config.CreatePutRequest(s3Path); + + //Use this for no compression + //var response = await request.PutAsync(new StringContent(csv)); + var compressedBytes = CompresseBytes(csvToSend); + + // Encode the compressed byte array as a Base64 string + string base64String = Convert.ToBase64String(compressedBytes); + + // Create StringContent from Base64 string + var stringContent = new StringContent(base64String, Encoding.UTF8, "application/base64"); + + // Upload the compressed data (ZIP archive) to S3 + var response = await request.PutAsync(stringContent); + + if (response.StatusCode != 200) + { + Console.WriteLine("ERROR: PUT"); + var error = await response.GetStringAsync(); + Console.WriteLine(error); + Heartbit(new DateTime(0)); + return false; + } + + Console.WriteLine("----------------------------------------Sending Heartbit----------------------------------------"); + + Heartbit(timeStamp); + } + _counterOfFile++; + + return true; + } + + private static void Heartbit(DateTime timeStamp) + { + var s3Bucket = Config.Load().S3?.Bucket; + var tryParse = TryParse(s3Bucket?.Split("-")[0], out var installationId); + var parse = TryParse(timeStamp.ToUnixTime().ToString(), out var nameOfCsvFile); + + if (tryParse) + { + var returnedStatus = new StatusMessage + { + InstallationId = installationId, + Product = 0, // Salimax is always 0 + Status = _salimaxAlarmState, + Type = MessageType.Heartbit, + Timestamp = nameOfCsvFile + }; + if (s3Bucket != null) + RabbitMqManager.InformMiddleware(returnedStatus); + } + } + + private static Byte[] CompresseBytes(String csvToSend) + { + //Compress CSV data to a byte array + Byte[] compressedBytes; + using (var memoryStream = new MemoryStream()) + { + //Create a zip directory and put the compressed file inside + using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) + { + var entry = archive.CreateEntry("data.json", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive + using (var entryStream = entry.Open()) + using (var writer = new StreamWriter(entryStream)) + { + writer.Write(csvToSend); + } + } + + compressedBytes = memoryStream.ToArray(); + } + + return compressedBytes; + } + + private static async Task RestApiSavingFile(String csv) + { + // This is for the Rest API + // Check if the directory exists, and create it if it doesn't + const String directoryPath = "/var/www/html"; + + if (!Directory.Exists(directoryPath)) + { + Directory.CreateDirectory(directoryPath); + } + + string filePath = Path.Combine(directoryPath, "status.csv"); + + await File.WriteAllTextAsync(filePath, csv.SplitLines().Where(l => !l.Contains("Secret")).JoinLines()); + } + + private static Boolean IsPowerOfTwo(Int32 n) + { + return n > 0 && (n & (n - 1)) == 0; + } + + private static void ApplyConfigFile(this StatusRecord status, Configuration? config) + { + if (config == null) return; + + status.Config.MinSoc = config.MinimumSoC; + status.Config.GridSetPoint = config.GridSetPoint * 1000; // converted from kW to W + status.Config.ForceCalibrationChargeState = config.CalibrationChargeState; + + if (config.CalibrationChargeState == CalibrationChargeType.RepetitivelyEvery) + { + status.Config.DayAndTimeForRepetitiveCalibration = config.CalibrationChargeDate; + } + else if (config.CalibrationChargeState == CalibrationChargeType.AdditionallyOnce) + { + status.Config.DayAndTimeForAdditionalCalibration = config.CalibrationChargeDate; + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/S3Config.cs b/csharp/App_backup/SaliMax/src/S3Config.cs new file mode 100644 index 000000000..0555e3fbf --- /dev/null +++ b/csharp/App_backup/SaliMax/src/S3Config.cs @@ -0,0 +1,79 @@ +using System.Security.Cryptography; +using Flurl; +using Flurl.Http; +using InnovEnergy.Lib.Utils; +using static System.Text.Encoding; +using Convert = System.Convert; + +namespace InnovEnergy.App.SaliMax; + +public record S3Config +{ + public required String Bucket { get; init; } + public required String Region { get; init; } + public required String Provider { get; init; } + public required String Key { get; init; } + public required String Secret { get; init; } + public required String ContentType { get; init; } + + public String Host => $"{Bucket}.{Region}.{Provider}"; + public String Url => $"https://{Host}"; + + public IFlurlRequest CreatePutRequest(String s3Path) => CreateRequest("PUT", s3Path); + public IFlurlRequest CreateGetRequest(String s3Path) => CreateRequest("GET", s3Path); + + private IFlurlRequest CreateRequest(String method, String s3Path) + { + var date = DateTime.UtcNow.ToString("r"); + var auth = CreateAuthorization(method, s3Path, date); + + return Url + .AppendPathSegment(s3Path) + .WithHeader("Host", Host) + .WithHeader("Date", date) + .WithHeader("Authorization", auth) + .AllowAnyHttpStatus(); + } + + private String CreateAuthorization(String method, + String s3Path, + String date) + { + return CreateAuthorization + ( + method : method, + bucket : Bucket, + s3Path : s3Path, + date : date, + s3Key : Key, + s3Secret : Secret, + contentType: ContentType + ); + } + + + + private static String CreateAuthorization(String method, + String bucket, + String s3Path, + String date, + String s3Key, + String s3Secret, + String contentType = "application/base64", + String md5Hash = "") + { + + contentType = "application/base64; charset=utf-8"; + //contentType = "text/plain; charset=utf-8"; //this to use when sending plain csv to S3 + + var payload = $"{method}\n{md5Hash}\n{contentType}\n{date}\n/{bucket.Trim('/')}/{s3Path.Trim('/')}"; + using var hmacSha1 = new HMACSHA1(UTF8.GetBytes(s3Secret)); + + var signature = UTF8 + .GetBytes(payload) + .Apply(hmacSha1.ComputeHash) + .Apply(Convert.ToBase64String); + + return $"AWS {s3Key}:{signature}"; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs new file mode 100644 index 000000000..ef669c818 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/CombinedAdamRelaysRecord.cs @@ -0,0 +1,422 @@ +using System.Reflection.Metadata; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; +#pragma warning disable CS8602 // Dereference of a possibly null reference. + +public class CombinedAdamRelaysRecord : IRelaysRecord +{ + private const UInt16 SlowFreq = 3000; + private const UInt16 HighFreq = 1000; + + public CombinedAdamRelaysRecord(RelaysRecordAdam6060? relaysRecordAdam6060, RelaysRecordAdam6360D? relaysRecordAdam6360D) + { + _recordAdam6060 = relaysRecordAdam6060; + _recordAdam6360D = relaysRecordAdam6360D; + } + + private static RelaysRecordAdam6060? _recordAdam6060; + private static RelaysRecordAdam6360D? _recordAdam6360D; + + public static IRelaysRecord Instance { get; } = new CombinedAdamRelaysRecord(_recordAdam6060, _recordAdam6360D); + + + public Boolean K1GridBusIsConnectedToGrid => _recordAdam6360D.K1GridBusIsConnectedToGrid; + + public Boolean K2IslandBusIsConnectedToGridBus => _recordAdam6360D.K2IslandBusIsConnectedToGridBus; + public Boolean FiWarning => _recordAdam6360D.FiWarning; + public Boolean FiError => _recordAdam6360D.FiError; + public Boolean K2ConnectIslandBusToGridBus + { + get => _recordAdam6360D.K2ConnectIslandBusToGridBus; + set => _recordAdam6360D.K2ConnectIslandBusToGridBus = value; + } + + public Boolean Inverter1WagoStatus => _recordAdam6360D.Inverter1WagoStatus; + public Boolean Inverter2WagoStatus => _recordAdam6360D.Inverter2WagoStatus; + public Boolean Inverter3WagoStatus => _recordAdam6360D.Inverter3WagoStatus; + public Boolean Inverter4WagoStatus => _recordAdam6360D.Inverter4WagoStatus; + + public Boolean Dc1WagoStatus => _recordAdam6060.Dc1WagoStatus; + public Boolean Dc2WagoStatus => _recordAdam6060.Dc2WagoStatus; + public Boolean Dc3WagoStatus => _recordAdam6060.Dc3WagoStatus; + public Boolean Dc4WagoStatus => _recordAdam6060.Dc4WagoStatus; + public Boolean DcSystemControlWagoStatus => _recordAdam6060.DcSystemControlWagoStatus; + + public Boolean LedGreen { get => _recordAdam6360D.LedGreen; set => _recordAdam6360D.LedGreen = value;} + public Boolean LedRed { get => _recordAdam6360D.LedRed; set => _recordAdam6360D.LedRed = value;} + public Boolean Harvester1Step => _recordAdam6360D.Harvester1Step; + public Boolean Harvester2Step => _recordAdam6360D.Harvester2Step; + public Boolean Harvester3Step => _recordAdam6360D.Harvester3Step; + public Boolean Harvester4Step => _recordAdam6360D.Harvester4Step; + + public UInt16 DigitalOutput0Mode { get => _recordAdam6360D.DigitalOutput0Mode; set => _recordAdam6360D.DigitalOutput0Mode = value; } + + public UInt16 DigitalOutput1Mode + { + get => _recordAdam6360D.DigitalOutput1Mode; + set => _recordAdam6360D.DigitalOutput1Mode = value; + } + + public UInt16 DigitalOutput2Mode + { + get => _recordAdam6360D.DigitalOutput2Mode; + set => _recordAdam6360D.DigitalOutput2Mode = value; + } + + public UInt16 DigitalOutput3Mode + { + get => _recordAdam6360D.DigitalOutput3Mode; + set => _recordAdam6360D.DigitalOutput3Mode = value; + } + + public UInt16 DigitalOutput4Mode + { + get => _recordAdam6360D.DigitalOutput4Mode; + set => _recordAdam6360D.DigitalOutput4Mode = value; + } + + public UInt16 DigitalOutput5Mode + { + get => _recordAdam6360D.DigitalOutput5Mode; + set => _recordAdam6360D.DigitalOutput5Mode = value; + } + + public Boolean Do0StartPulse { get => _recordAdam6360D.Do0Pulse; set => _recordAdam6360D.Do0Pulse = value; } + public Boolean Do1StartPulse { get => _recordAdam6360D.Do1Pulse; set => _recordAdam6360D.Do1Pulse = value; } + public Boolean Do2StartPulse { get => _recordAdam6360D.Do2Pulse; set => _recordAdam6360D.Do2Pulse = value; } + public Boolean Do3StartPulse { get => _recordAdam6360D.Do3Pulse; set => _recordAdam6360D.Do3Pulse = value; } + public Boolean Do4StartPulse { get => _recordAdam6360D.Do4Pulse; set => _recordAdam6360D.Do4Pulse = value; } + public Boolean Do5StartPulse { get => _recordAdam6360D.Do5Pulse; set => _recordAdam6360D.Do5Pulse = value; } + + + public UInt16 PulseOut0LowTime { get => _recordAdam6360D.PulseOut0LowTime; set => _recordAdam6360D.PulseOut0LowTime = value; } + public UInt16 PulseOut1LowTime { get => _recordAdam6360D.PulseOut1LowTime; set => _recordAdam6360D.PulseOut1LowTime = value; } + public UInt16 PulseOut2LowTime { get => _recordAdam6360D.PulseOut2LowTime; set => _recordAdam6360D.PulseOut2LowTime = value; } + public UInt16 PulseOut3LowTime { get => _recordAdam6360D.PulseOut3LowTime; set => _recordAdam6360D.PulseOut3LowTime = value; } + public UInt16 PulseOut4LowTime { get => _recordAdam6360D.PulseOut4LowTime; set => _recordAdam6360D.PulseOut4LowTime = value; } + public UInt16 PulseOut5LowTime { get => _recordAdam6360D.PulseOut5LowTime; set => _recordAdam6360D.PulseOut5LowTime = value; } + + public UInt16 PulseOut0HighTime { get => _recordAdam6360D.PulseOut0HighTime; set => _recordAdam6360D.PulseOut0HighTime = value; } + public UInt16 PulseOut1HighTime { get => _recordAdam6360D.PulseOut1HighTime; set => _recordAdam6360D.PulseOut1HighTime = value; } + public UInt16 PulseOut2HighTime { get => _recordAdam6360D.PulseOut2HighTime; set => _recordAdam6360D.PulseOut2HighTime = value; } + public UInt16 PulseOut3HighTime { get => _recordAdam6360D.PulseOut3HighTime; set => _recordAdam6360D.PulseOut3HighTime = value; } + public UInt16 PulseOut4HighTime { get => _recordAdam6360D.PulseOut4HighTime; set => _recordAdam6360D.PulseOut4HighTime = value; } + public UInt16 PulseOut5HighTime { get => _recordAdam6360D.PulseOut5HighTime; set => _recordAdam6360D.PulseOut5HighTime = value; } + + /**************************** Green LED *********************************/ + + public void PerformSolidGreenLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = true; + LedRed = false; + } + + public void PerformSlowFlashingGreenLed() + { + PulseOut0HighTime = SlowFreq; + PulseOut0LowTime = SlowFreq; + DigitalOutput0Mode = 2; + Do0StartPulse = true; + Do1StartPulse = false; // make sure the red LED is off + + Console.WriteLine("Green Slow Flashing Starting"); + } + + public void PerformFastFlashingGreenLed() + { + PulseOut0HighTime = HighFreq; + PulseOut0LowTime = HighFreq; + DigitalOutput0Mode = 2; + Do0StartPulse = true; + Do1StartPulse = false;// make sure the red LED is off + + Console.WriteLine("Green Slow Flashing Starting"); + } + + /**************************** Orange LED *********************************/ + + public void PerformSolidOrangeLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = true; + LedRed = true; + } + + public void PerformSlowFlashingOrangeLed() + { + PerformSlowFlashingGreenLed(); + PerformSlowFlashingRedLed(); + Do0StartPulse = true; + Do1StartPulse = true; + + Console.WriteLine("Orange Slow Flashing Starting"); + } + + public void PerformFastFlashingOrangeLed() + { + PerformFastFlashingGreenLed(); + PerformFastFlashingRedLed(); + Do0StartPulse = true; + Do1StartPulse = true; + Console.WriteLine("Orange Fast Flashing Starting"); + } + + /**************************** RED LED *********************************/ + + public void PerformSolidRedLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = false; + LedRed = true; + } + + public void PerformSlowFlashingRedLed() + { + PulseOut1HighTime = SlowFreq; + PulseOut1LowTime = SlowFreq; + DigitalOutput1Mode = 2; + Do0StartPulse = false; // make sure the green LED is off + Do1StartPulse = true; + + Console.WriteLine("Red Slow Flashing Starting"); + } + + public void PerformFastFlashingRedLed() + { + PulseOut1HighTime = HighFreq; + PulseOut1LowTime = HighFreq; + DigitalOutput1Mode = 2; + Do0StartPulse = false; // make sure the green LED is off + Do1StartPulse = true; + + Console.WriteLine("Red Fast Flashing Starting"); + } + + public RelaysRecordAdam6360D? GetAdam6360DRecord() + { + return _recordAdam6360D; + } + + public RelaysRecordAdam6060? GetAdam6060Record() + { + return _recordAdam6060; + } + + public IEnumerable K3InverterIsConnectedToIslandBus => _recordAdam6360D.K3InverterIsConnectedToIslandBus; + +} +using System.Reflection.Metadata; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; +#pragma warning disable CS8602 // Dereference of a possibly null reference. + +public class CombinedAdamRelaysRecord : IRelaysRecord +{ + private const UInt16 SlowFreq = 3000; + private const UInt16 HighFreq = 1000; + + public CombinedAdamRelaysRecord(RelaysRecordAdam6060? relaysRecordAdam6060, RelaysRecordAdam6360D? relaysRecordAdam6360D) + { + _recordAdam6060 = relaysRecordAdam6060; + _recordAdam6360D = relaysRecordAdam6360D; + } + + private static RelaysRecordAdam6060? _recordAdam6060; + private static RelaysRecordAdam6360D? _recordAdam6360D; + + public static IRelaysRecord Instance { get; } = new CombinedAdamRelaysRecord(_recordAdam6060, _recordAdam6360D); + + + public Boolean K1GridBusIsConnectedToGrid => _recordAdam6360D.K1GridBusIsConnectedToGrid; + + public Boolean K2IslandBusIsConnectedToGridBus => _recordAdam6360D.K2IslandBusIsConnectedToGridBus; + public Boolean FiWarning => _recordAdam6360D.FiWarning; + public Boolean FiError => _recordAdam6360D.FiError; + public Boolean K2ConnectIslandBusToGridBus + { + get => _recordAdam6360D.K2ConnectIslandBusToGridBus; + set => _recordAdam6360D.K2ConnectIslandBusToGridBus = value; + } + + public Boolean Inverter1WagoStatus => _recordAdam6360D.Inverter1WagoStatus; + public Boolean Inverter2WagoStatus => _recordAdam6360D.Inverter2WagoStatus; + public Boolean Inverter3WagoStatus => _recordAdam6360D.Inverter3WagoStatus; + public Boolean Inverter4WagoStatus => _recordAdam6360D.Inverter4WagoStatus; + + public Boolean Dc1WagoStatus => _recordAdam6060.Dc1WagoStatus; + public Boolean Dc2WagoStatus => _recordAdam6060.Dc2WagoStatus; + public Boolean Dc3WagoStatus => _recordAdam6060.Dc3WagoStatus; + public Boolean Dc4WagoStatus => _recordAdam6060.Dc4WagoStatus; + public Boolean DcSystemControlWagoStatus => _recordAdam6060.DcSystemControlWagoStatus; + + public Boolean LedGreen { get => _recordAdam6360D.LedGreen; set => _recordAdam6360D.LedGreen = value;} + public Boolean LedRed { get => _recordAdam6360D.LedRed; set => _recordAdam6360D.LedRed = value;} + public Boolean Harvester1Step => _recordAdam6360D.Harvester1Step; + public Boolean Harvester2Step => _recordAdam6360D.Harvester2Step; + public Boolean Harvester3Step => _recordAdam6360D.Harvester3Step; + public Boolean Harvester4Step => _recordAdam6360D.Harvester4Step; + + public UInt16 DigitalOutput0Mode { get => _recordAdam6360D.DigitalOutput0Mode; set => _recordAdam6360D.DigitalOutput0Mode = value; } + + public UInt16 DigitalOutput1Mode + { + get => _recordAdam6360D.DigitalOutput1Mode; + set => _recordAdam6360D.DigitalOutput1Mode = value; + } + + public UInt16 DigitalOutput2Mode + { + get => _recordAdam6360D.DigitalOutput2Mode; + set => _recordAdam6360D.DigitalOutput2Mode = value; + } + + public UInt16 DigitalOutput3Mode + { + get => _recordAdam6360D.DigitalOutput3Mode; + set => _recordAdam6360D.DigitalOutput3Mode = value; + } + + public UInt16 DigitalOutput4Mode + { + get => _recordAdam6360D.DigitalOutput4Mode; + set => _recordAdam6360D.DigitalOutput4Mode = value; + } + + public UInt16 DigitalOutput5Mode + { + get => _recordAdam6360D.DigitalOutput5Mode; + set => _recordAdam6360D.DigitalOutput5Mode = value; + } + + public Boolean Do0StartPulse { get => _recordAdam6360D.Do0Pulse; set => _recordAdam6360D.Do0Pulse = value; } + public Boolean Do1StartPulse { get => _recordAdam6360D.Do1Pulse; set => _recordAdam6360D.Do1Pulse = value; } + public Boolean Do2StartPulse { get => _recordAdam6360D.Do2Pulse; set => _recordAdam6360D.Do2Pulse = value; } + public Boolean Do3StartPulse { get => _recordAdam6360D.Do3Pulse; set => _recordAdam6360D.Do3Pulse = value; } + public Boolean Do4StartPulse { get => _recordAdam6360D.Do4Pulse; set => _recordAdam6360D.Do4Pulse = value; } + public Boolean Do5StartPulse { get => _recordAdam6360D.Do5Pulse; set => _recordAdam6360D.Do5Pulse = value; } + + + public UInt16 PulseOut0LowTime { get => _recordAdam6360D.PulseOut0LowTime; set => _recordAdam6360D.PulseOut0LowTime = value; } + public UInt16 PulseOut1LowTime { get => _recordAdam6360D.PulseOut1LowTime; set => _recordAdam6360D.PulseOut1LowTime = value; } + public UInt16 PulseOut2LowTime { get => _recordAdam6360D.PulseOut2LowTime; set => _recordAdam6360D.PulseOut2LowTime = value; } + public UInt16 PulseOut3LowTime { get => _recordAdam6360D.PulseOut3LowTime; set => _recordAdam6360D.PulseOut3LowTime = value; } + public UInt16 PulseOut4LowTime { get => _recordAdam6360D.PulseOut4LowTime; set => _recordAdam6360D.PulseOut4LowTime = value; } + public UInt16 PulseOut5LowTime { get => _recordAdam6360D.PulseOut5LowTime; set => _recordAdam6360D.PulseOut5LowTime = value; } + + public UInt16 PulseOut0HighTime { get => _recordAdam6360D.PulseOut0HighTime; set => _recordAdam6360D.PulseOut0HighTime = value; } + public UInt16 PulseOut1HighTime { get => _recordAdam6360D.PulseOut1HighTime; set => _recordAdam6360D.PulseOut1HighTime = value; } + public UInt16 PulseOut2HighTime { get => _recordAdam6360D.PulseOut2HighTime; set => _recordAdam6360D.PulseOut2HighTime = value; } + public UInt16 PulseOut3HighTime { get => _recordAdam6360D.PulseOut3HighTime; set => _recordAdam6360D.PulseOut3HighTime = value; } + public UInt16 PulseOut4HighTime { get => _recordAdam6360D.PulseOut4HighTime; set => _recordAdam6360D.PulseOut4HighTime = value; } + public UInt16 PulseOut5HighTime { get => _recordAdam6360D.PulseOut5HighTime; set => _recordAdam6360D.PulseOut5HighTime = value; } + + /**************************** Green LED *********************************/ + + public void PerformSolidGreenLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = true; + LedRed = false; + } + + public void PerformSlowFlashingGreenLed() + { + PulseOut0HighTime = SlowFreq; + PulseOut0LowTime = SlowFreq; + DigitalOutput0Mode = 2; + Do0StartPulse = true; + Do1StartPulse = false; // make sure the red LED is off + + Console.WriteLine("Green Slow Flashing Starting"); + } + + public void PerformFastFlashingGreenLed() + { + PulseOut0HighTime = HighFreq; + PulseOut0LowTime = HighFreq; + DigitalOutput0Mode = 2; + Do0StartPulse = true; + Do1StartPulse = false;// make sure the red LED is off + + Console.WriteLine("Green Slow Flashing Starting"); + } + + /**************************** Orange LED *********************************/ + + public void PerformSolidOrangeLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = true; + LedRed = true; + } + + public void PerformSlowFlashingOrangeLed() + { + PerformSlowFlashingGreenLed(); + PerformSlowFlashingRedLed(); + Do0StartPulse = true; + Do1StartPulse = true; + + Console.WriteLine("Orange Slow Flashing Starting"); + } + + public void PerformFastFlashingOrangeLed() + { + PerformFastFlashingGreenLed(); + PerformFastFlashingRedLed(); + Do0StartPulse = true; + Do1StartPulse = true; + Console.WriteLine("Orange Fast Flashing Starting"); + } + + /**************************** RED LED *********************************/ + + public void PerformSolidRedLed() + { + DigitalOutput0Mode = 0; + DigitalOutput1Mode = 0; + LedGreen = false; + LedRed = true; + } + + public void PerformSlowFlashingRedLed() + { + PulseOut1HighTime = SlowFreq; + PulseOut1LowTime = SlowFreq; + DigitalOutput1Mode = 2; + Do0StartPulse = false; // make sure the green LED is off + Do1StartPulse = true; + + Console.WriteLine("Red Slow Flashing Starting"); + } + + public void PerformFastFlashingRedLed() + { + PulseOut1HighTime = HighFreq; + PulseOut1LowTime = HighFreq; + DigitalOutput1Mode = 2; + Do0StartPulse = false; // make sure the green LED is off + Do1StartPulse = true; + + Console.WriteLine("Red Fast Flashing Starting"); + } + + public RelaysRecordAdam6360D? GetAdam6360DRecord() + { + return _recordAdam6360D; + } + + public RelaysRecordAdam6060? GetAdam6060Record() + { + return _recordAdam6060; + } + + public IEnumerable K3InverterIsConnectedToIslandBus => _recordAdam6360D.K3InverterIsConnectedToIslandBus; + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs new file mode 100644 index 000000000..e06628c44 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/IRelaysRecord.cs @@ -0,0 +1,156 @@ +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + + +public interface IRelaysRecord +{ + Boolean K1GridBusIsConnectedToGrid { get; } + Boolean K2IslandBusIsConnectedToGridBus { get; } + IEnumerable K3InverterIsConnectedToIslandBus { get; } + Boolean FiWarning { get; } + Boolean FiError { get; } + Boolean K2ConnectIslandBusToGridBus { get; set; } + + // Boolean Inverter1WagoRelay { get; set; } // to add in the future + // Boolean Inverter2WagoRelay { get; set; } // to add in the future + // Boolean Inverter3WagoRelay { get; set; } // to add in the future + // Boolean Inverter4WagoRelay { get; set; } // to add in the future + + Boolean Inverter1WagoStatus { get; } + Boolean Inverter2WagoStatus { get; } + Boolean Inverter3WagoStatus { get; } + Boolean Inverter4WagoStatus { get; } + + Boolean Dc1WagoStatus { get; } // to test + Boolean Dc2WagoStatus { get; } // to test + Boolean Dc3WagoStatus { get; } // to test + Boolean Dc4WagoStatus { get; } // to test + + Boolean DcSystemControlWagoStatus { get; } // to test + + Boolean LedGreen { get; set; } + Boolean LedRed { get; } + Boolean Harvester1Step { get; } + Boolean Harvester2Step { get; } + Boolean Harvester3Step { get; } + Boolean Harvester4Step { get; } + + Boolean Do0StartPulse { get; set; } + Boolean Do1StartPulse { get; set; } + Boolean Do2StartPulse { get; set; } + Boolean Do3StartPulse { get; set; } + Boolean Do4StartPulse { get; set; } + Boolean Do5StartPulse { get; set; } + + UInt16 DigitalOutput0Mode { get; set; } + UInt16 DigitalOutput1Mode { get; set; } + UInt16 DigitalOutput2Mode { get; set; } + UInt16 DigitalOutput3Mode { get; set; } + UInt16 DigitalOutput4Mode { get; set; } + UInt16 DigitalOutput5Mode { get; set; } + + UInt16 PulseOut0LowTime { get; set; } + UInt16 PulseOut1LowTime { get; set; } + UInt16 PulseOut2LowTime { get; set; } + UInt16 PulseOut3LowTime { get; set; } + UInt16 PulseOut4LowTime { get; set; } + UInt16 PulseOut5LowTime { get; set; } + + UInt16 PulseOut0HighTime { get; set; } + UInt16 PulseOut1HighTime { get; set; } + UInt16 PulseOut2HighTime { get; set; } + UInt16 PulseOut3HighTime { get; set; } + UInt16 PulseOut4HighTime { get; set; } + UInt16 PulseOut5HighTime { get; set; } + + void PerformSolidGreenLed(); + void PerformSlowFlashingGreenLed(); + void PerformFastFlashingGreenLed(); + + + void PerformSolidOrangeLed(); + void PerformSlowFlashingOrangeLed(); + void PerformFastFlashingOrangeLed(); + + void PerformSolidRedLed(); + void PerformSlowFlashingRedLed(); + void PerformFastFlashingRedLed(); + +} +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + + +public interface IRelaysRecord +{ + Boolean K1GridBusIsConnectedToGrid { get; } + Boolean K2IslandBusIsConnectedToGridBus { get; } + IEnumerable K3InverterIsConnectedToIslandBus { get; } + Boolean FiWarning { get; } + Boolean FiError { get; } + Boolean K2ConnectIslandBusToGridBus { get; set; } + + // Boolean Inverter1WagoRelay { get; set; } // to add in the future + // Boolean Inverter2WagoRelay { get; set; } // to add in the future + // Boolean Inverter3WagoRelay { get; set; } // to add in the future + // Boolean Inverter4WagoRelay { get; set; } // to add in the future + + /* Boolean Inverter1WagoStatus { get; } + Boolean Inverter2WagoStatus { get; } + Boolean Inverter3WagoStatus { get; } + Boolean Inverter4WagoStatus { get; } + + Boolean Dc1WagoStatus { get; } // to test + Boolean Dc2WagoStatus { get; } // to test + Boolean Dc3WagoStatus { get; } // to test + Boolean Dc4WagoStatus { get; } // to test + + Boolean DcSystemControlWagoStatus { get; } // to test + + Boolean LedGreen { get; set; } + Boolean LedRed { get; } + Boolean Harvester1Step { get; } + Boolean Harvester2Step { get; } + Boolean Harvester3Step { get; } + Boolean Harvester4Step { get; } + + Boolean Do0StartPulse { get; set; } + Boolean Do1StartPulse { get; set; } + Boolean Do2StartPulse { get; set; } + Boolean Do3StartPulse { get; set; } + Boolean Do4StartPulse { get; set; } + Boolean Do5StartPulse { get; set; } + + UInt16 DigitalOutput0Mode { get; set; } + UInt16 DigitalOutput1Mode { get; set; } + UInt16 DigitalOutput2Mode { get; set; } + UInt16 DigitalOutput3Mode { get; set; } + UInt16 DigitalOutput4Mode { get; set; } + UInt16 DigitalOutput5Mode { get; set; } + + UInt16 PulseOut0LowTime { get; set; } + UInt16 PulseOut1LowTime { get; set; } + UInt16 PulseOut2LowTime { get; set; } + UInt16 PulseOut3LowTime { get; set; } + UInt16 PulseOut4LowTime { get; set; } + UInt16 PulseOut5LowTime { get; set; } + + UInt16 PulseOut0HighTime { get; set; } + UInt16 PulseOut1HighTime { get; set; } + UInt16 PulseOut2HighTime { get; set; } + UInt16 PulseOut3HighTime { get; set; } + UInt16 PulseOut4HighTime { get; set; } + UInt16 PulseOut5HighTime { get; set; } + + void PerformSolidGreenLed(); + void PerformSlowFlashingGreenLed(); + void PerformFastFlashingGreenLed(); + + + void PerformSolidOrangeLed(); + void PerformSlowFlashingOrangeLed(); + void PerformFastFlashingOrangeLed(); + + void PerformSolidRedLed(); + void PerformSlowFlashingRedLed(); + void PerformFastFlashingRedLed();*/ + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs new file mode 100644 index 000000000..50b9819d1 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceADAM6360.cs @@ -0,0 +1,78 @@ +using InnovEnergy.Lib.Devices.Adam6360D; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAdam6360 +{ + private Adam6360DDevice AdamDevice6360D { get; } + + public RelaysDeviceAdam6360(String hostname) => AdamDevice6360D = new Adam6360DDevice(hostname, 2); + public RelaysDeviceAdam6360(Channel channel) => AdamDevice6360D = new Adam6360DDevice(channel, 2); + + + public RelaysRecordAdam6360D? Read() + { + try + { + return AdamDevice6360D.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAdam6360)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAdam6360D r) + { + try + { + AdamDevice6360D.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAdam6360)}\n{e}".LogError(); + } + } +} + + +using InnovEnergy.Lib.Devices.Adam6360D; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAdam6360 +{ + private Adam6360DDevice AdamDevice6360D { get; } + + public RelaysDeviceAdam6360(String hostname) => AdamDevice6360D = new Adam6360DDevice(hostname, 2); + public RelaysDeviceAdam6360(Channel channel) => AdamDevice6360D = new Adam6360DDevice(channel, 2); + + + public RelaysRecordAdam6360D? Read() + { + try + { + return AdamDevice6360D.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAdam6360)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAdam6360D r) + { + try + { + AdamDevice6360D.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAdam6360)}\n{e}".LogError(); + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs new file mode 100644 index 000000000..1e509c5d4 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAdam6060.cs @@ -0,0 +1,76 @@ +using InnovEnergy.Lib.Devices.Adam6060; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAdam6060 +{ + private Adam6060Device AdamDevice6060 { get; } + + public RelaysDeviceAdam6060(String hostname) => AdamDevice6060 = new Adam6060Device(hostname, 2); + public RelaysDeviceAdam6060(Channel channel) => AdamDevice6060 = new Adam6060Device(channel, 2); + + + public RelaysRecordAdam6060? Read() + { + try + { + return AdamDevice6060.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAdam6060)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAdam6060 r) + { + try + { + AdamDevice6060.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAdam6060)}\n{e}".LogError(); + } + } +} +using InnovEnergy.Lib.Devices.Adam6060; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAdam6060 +{ + private Adam6060Device AdamDevice6060 { get; } + + public RelaysDeviceAdam6060(String hostname) => AdamDevice6060 = new Adam6060Device(hostname, 2); + public RelaysDeviceAdam6060(Channel channel) => AdamDevice6060 = new Adam6060Device(channel, 2); + + + public RelaysRecordAdam6060? Read() + { + try + { + return AdamDevice6060.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAdam6060)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAdam6060 r) + { + try + { + AdamDevice6060.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAdam6060)}\n{e}".LogError(); + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs new file mode 100644 index 000000000..0e3f86e0a --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysDeviceAmax.cs @@ -0,0 +1,75 @@ +using InnovEnergy.Lib.Devices.Amax5070; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAmax +{ + private Amax5070Device AmaxDevice { get; } + + public RelaysDeviceAmax(Channel channel) => AmaxDevice = new Amax5070Device(channel); + + public RelaysRecordAmax? Read() + { + try + { + return AmaxDevice.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAmax r) + { + try + { + AmaxDevice.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + } + } +} +using InnovEnergy.Lib.Devices.Amax5070; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysDeviceAmax +{ + private Amax5070Device AmaxDevice { get; } + + public RelaysDeviceAmax(String hostname) => AmaxDevice = new Amax5070Device(hostname); + public RelaysDeviceAmax(Channel channel) => AmaxDevice = new Amax5070Device(channel); + + public RelaysRecordAmax? Read() + { + try + { + return AmaxDevice.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAmax r) + { + try + { + AmaxDevice.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs new file mode 100644 index 000000000..77816f187 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6060.cs @@ -0,0 +1,48 @@ +using InnovEnergy.Lib.Devices.Adam6060; + + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysRecordAdam6060 +{ + private readonly Adam6060Registers _Regs; + + private RelaysRecordAdam6060(Adam6060Registers regs) => _Regs = regs; + + + public Boolean Dc1WagoStatus => _Regs.DigitalInput0; // to test + public Boolean Dc2WagoStatus => _Regs.DigitalInput1; // to test + public Boolean Dc3WagoStatus => _Regs.DigitalInput4; // to test + public Boolean Dc4WagoStatus => _Regs.DigitalInput5; // to test + + public Boolean DcSystemControlWagoStatus => _Regs.DigitalInput3; // to test + + + public static implicit operator Adam6060Registers(RelaysRecordAdam6060 d) => d._Regs; + public static implicit operator RelaysRecordAdam6060(Adam6060Registers d) => new RelaysRecordAdam6060(d); + +} +using InnovEnergy.Lib.Devices.Adam6060; + + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysRecordAdam6060 +{ + private readonly Adam6060Registers _Regs; + + private RelaysRecordAdam6060(Adam6060Registers regs) => _Regs = regs; + + + public Boolean Dc1WagoStatus => _Regs.DigitalInput0; // to test + public Boolean Dc2WagoStatus => _Regs.DigitalInput1; // to test + public Boolean Dc3WagoStatus => _Regs.DigitalInput4; // to test + public Boolean Dc4WagoStatus => _Regs.DigitalInput5; // to test + + public Boolean DcSystemControlWagoStatus => _Regs.DigitalInput3; // to test + + + public static implicit operator Adam6060Registers(RelaysRecordAdam6060 d) => d._Regs; + public static implicit operator RelaysRecordAdam6060(Adam6060Registers d) => new RelaysRecordAdam6060(d); + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs new file mode 100644 index 000000000..6377bc947 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAdam6360D.cs @@ -0,0 +1,160 @@ +using InnovEnergy.Lib.Devices.Adam6360D; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysRecordAdam6360D +{ + private readonly Adam6360DRegisters _Regs; + + private RelaysRecordAdam6360D(Adam6360DRegisters regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput6; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput4; + + public Boolean Inverter1WagoStatus => _Regs.DigitalInput8; + public Boolean Inverter2WagoStatus => _Regs.DigitalInput9; + public Boolean Inverter3WagoStatus => _Regs.DigitalInput10; + public Boolean Inverter4WagoStatus => _Regs.DigitalInput11; + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + private Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput0; // change it to private should be ok + private Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput1; + private Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput2; + private Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput3; + + public Boolean FiWarning => !_Regs.DigitalInput5; + public Boolean FiError => !_Regs.DigitalInput7; + + public Boolean Harvester1Step =>_Regs.DigitalOutput2; + public Boolean Harvester2Step =>_Regs.DigitalOutput3; + public Boolean Harvester3Step =>_Regs.DigitalOutput4; + public Boolean Harvester4Step =>_Regs.DigitalOutput5; + + public Boolean LedGreen { get =>_Regs.DigitalOutput0; set => _Regs.DigitalOutput0 = value;} + public Boolean LedRed { get =>_Regs.DigitalOutput1; set => _Regs.DigitalOutput1 = value;} + + public Boolean Do0Pulse { get => _Regs.Do0Pulse; set => _Regs.Do0Pulse = value;} + public Boolean Do1Pulse { get => _Regs.Do1Pulse; set => _Regs.Do1Pulse = value;} + public Boolean Do2Pulse { get => _Regs.Do2Pulse; set => _Regs.Do2Pulse = value;} + public Boolean Do3Pulse { get => _Regs.Do3Pulse; set => _Regs.Do3Pulse = value;} + public Boolean Do4Pulse { get => _Regs.Do4Pulse; set => _Regs.Do4Pulse = value;} + public Boolean Do5Pulse { get => _Regs.Do5Pulse; set => _Regs.Do5Pulse = value;} + + public UInt16 PulseOut0LowTime { get => _Regs.PulseOut0LowTime; set => _Regs.PulseOut0LowTime = value;} //in milleseconds + public UInt16 PulseOut1LowTime { get => _Regs.PulseOut1LowTime; set => _Regs.PulseOut1LowTime = value;} + public UInt16 PulseOut2LowTime { get => _Regs.PulseOut2LowTime; set => _Regs.PulseOut2LowTime = value;} + public UInt16 PulseOut3LowTime { get => _Regs.PulseOut3LowTime; set => _Regs.PulseOut3LowTime = value;} + public UInt16 PulseOut4LowTime { get => _Regs.PulseOut4LowTime; set => _Regs.PulseOut4LowTime = value;} + public UInt16 PulseOut5LowTime { get => _Regs.PulseOut5LowTime; set => _Regs.PulseOut5LowTime = value;} + + public UInt16 PulseOut0HighTime { get => _Regs.PulseOut0HighTime; set => _Regs.PulseOut0HighTime = value;} // in milleseconds + public UInt16 PulseOut1HighTime { get => _Regs.PulseOut1HighTime; set => _Regs.PulseOut1HighTime = value;} + public UInt16 PulseOut2HighTime { get => _Regs.PulseOut2HighTime; set => _Regs.PulseOut2HighTime = value;} + public UInt16 PulseOut3HighTime { get => _Regs.PulseOut3HighTime; set => _Regs.PulseOut3HighTime = value;} + public UInt16 PulseOut4HighTime { get => _Regs.PulseOut4HighTime; set => _Regs.PulseOut4HighTime = value;} + public UInt16 PulseOut5HighTime { get => _Regs.PulseOut5HighTime; set => _Regs.PulseOut5HighTime = value;} + + public UInt16 DigitalOutput0Mode { get => _Regs.DigitalOutput0Mode; set => _Regs.DigitalOutput0Mode = value;} // To test: 0, 1 or 2 + public UInt16 DigitalOutput1Mode { get => _Regs.DigitalOutput1Mode; set => _Regs.DigitalOutput1Mode = value;} + public UInt16 DigitalOutput2Mode { get => _Regs.DigitalOutput2Mode; set => _Regs.DigitalOutput2Mode = value;} + public UInt16 DigitalOutput3Mode { get => _Regs.DigitalOutput3Mode; set => _Regs.DigitalOutput3Mode = value;} + public UInt16 DigitalOutput4Mode { get => _Regs.DigitalOutput4Mode; set => _Regs.DigitalOutput4Mode = value;} + public UInt16 DigitalOutput5Mode { get => _Regs.DigitalOutput5Mode; set => _Regs.DigitalOutput5Mode = value;} + + public Boolean K2ConnectIslandBusToGridBus { get => _Regs.Relay0; set => _Regs.Relay0 = value;} + + public static implicit operator Adam6360DRegisters(RelaysRecordAdam6360D d) => d._Regs; + public static implicit operator RelaysRecordAdam6360D(Adam6360DRegisters d) => new RelaysRecordAdam6360D(d); + +} + + +using InnovEnergy.Lib.Devices.Adam6360D; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysRecordAdam6360D +{ + private readonly Adam6360DRegisters _Regs; + + private RelaysRecordAdam6360D(Adam6360DRegisters regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput6; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput4; + + public Boolean Inverter1WagoStatus => _Regs.DigitalInput8; + public Boolean Inverter2WagoStatus => _Regs.DigitalInput9; + public Boolean Inverter3WagoStatus => _Regs.DigitalInput10; + public Boolean Inverter4WagoStatus => _Regs.DigitalInput11; + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + private Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput0; // change it to private should be ok + private Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput1; + private Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput2; + private Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput3; + + public Boolean FiWarning => !_Regs.DigitalInput5; + public Boolean FiError => !_Regs.DigitalInput7; + + public Boolean Harvester1Step =>_Regs.DigitalOutput2; + public Boolean Harvester2Step =>_Regs.DigitalOutput3; + public Boolean Harvester3Step =>_Regs.DigitalOutput4; + public Boolean Harvester4Step =>_Regs.DigitalOutput5; + + public Boolean LedGreen { get =>_Regs.DigitalOutput0; set => _Regs.DigitalOutput0 = value;} + public Boolean LedRed { get =>_Regs.DigitalOutput1; set => _Regs.DigitalOutput1 = value;} + + public Boolean Do0Pulse { get => _Regs.Do0Pulse; set => _Regs.Do0Pulse = value;} + public Boolean Do1Pulse { get => _Regs.Do1Pulse; set => _Regs.Do1Pulse = value;} + public Boolean Do2Pulse { get => _Regs.Do2Pulse; set => _Regs.Do2Pulse = value;} + public Boolean Do3Pulse { get => _Regs.Do3Pulse; set => _Regs.Do3Pulse = value;} + public Boolean Do4Pulse { get => _Regs.Do4Pulse; set => _Regs.Do4Pulse = value;} + public Boolean Do5Pulse { get => _Regs.Do5Pulse; set => _Regs.Do5Pulse = value;} + + public UInt16 PulseOut0LowTime { get => _Regs.PulseOut0LowTime; set => _Regs.PulseOut0LowTime = value;} //in milleseconds + public UInt16 PulseOut1LowTime { get => _Regs.PulseOut1LowTime; set => _Regs.PulseOut1LowTime = value;} + public UInt16 PulseOut2LowTime { get => _Regs.PulseOut2LowTime; set => _Regs.PulseOut2LowTime = value;} + public UInt16 PulseOut3LowTime { get => _Regs.PulseOut3LowTime; set => _Regs.PulseOut3LowTime = value;} + public UInt16 PulseOut4LowTime { get => _Regs.PulseOut4LowTime; set => _Regs.PulseOut4LowTime = value;} + public UInt16 PulseOut5LowTime { get => _Regs.PulseOut5LowTime; set => _Regs.PulseOut5LowTime = value;} + + public UInt16 PulseOut0HighTime { get => _Regs.PulseOut0HighTime; set => _Regs.PulseOut0HighTime = value;} // in milleseconds + public UInt16 PulseOut1HighTime { get => _Regs.PulseOut1HighTime; set => _Regs.PulseOut1HighTime = value;} + public UInt16 PulseOut2HighTime { get => _Regs.PulseOut2HighTime; set => _Regs.PulseOut2HighTime = value;} + public UInt16 PulseOut3HighTime { get => _Regs.PulseOut3HighTime; set => _Regs.PulseOut3HighTime = value;} + public UInt16 PulseOut4HighTime { get => _Regs.PulseOut4HighTime; set => _Regs.PulseOut4HighTime = value;} + public UInt16 PulseOut5HighTime { get => _Regs.PulseOut5HighTime; set => _Regs.PulseOut5HighTime = value;} + + public UInt16 DigitalOutput0Mode { get => _Regs.DigitalOutput0Mode; set => _Regs.DigitalOutput0Mode = value;} // To test: 0, 1 or 2 + public UInt16 DigitalOutput1Mode { get => _Regs.DigitalOutput1Mode; set => _Regs.DigitalOutput1Mode = value;} + public UInt16 DigitalOutput2Mode { get => _Regs.DigitalOutput2Mode; set => _Regs.DigitalOutput2Mode = value;} + public UInt16 DigitalOutput3Mode { get => _Regs.DigitalOutput3Mode; set => _Regs.DigitalOutput3Mode = value;} + public UInt16 DigitalOutput4Mode { get => _Regs.DigitalOutput4Mode; set => _Regs.DigitalOutput4Mode = value;} + public UInt16 DigitalOutput5Mode { get => _Regs.DigitalOutput5Mode; set => _Regs.DigitalOutput5Mode = value;} + + public Boolean K2ConnectIslandBusToGridBus { get => _Regs.Relay0; set => _Regs.Relay0 = value;} + + public static implicit operator Adam6360DRegisters(RelaysRecordAdam6360D d) => d._Regs; + public static implicit operator RelaysRecordAdam6360D(Adam6360DRegisters d) => new RelaysRecordAdam6360D(d); + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs new file mode 100644 index 000000000..13c71d1df --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SaliMaxRelays/RelaysRecordAmax.cs @@ -0,0 +1,268 @@ +using InnovEnergy.Lib.Devices.Amax5070; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysRecordAmax : IRelaysRecord +{ + private readonly Amax5070Registers _Regs; + + private RelaysRecordAmax(Amax5070Registers regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput22; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput20; + + public Boolean Inverter1WagoStatus => _Regs.DigitalInput0; + public Boolean Inverter2WagoStatus => _Regs.DigitalInput1; + public Boolean Inverter3WagoStatus => _Regs.DigitalInput2; + public Boolean Inverter4WagoStatus => _Regs.DigitalInput3; + + public Boolean Dc1WagoStatus => _Regs.DigitalInput6; + public Boolean Dc2WagoStatus => _Regs.DigitalInput7; + public Boolean Dc3WagoStatus => _Regs.DigitalInput10; + public Boolean Dc4WagoStatus => _Regs.DigitalInput11; + public Boolean DcSystemControlWagoStatus => _Regs.DigitalInput9; + + public Boolean LedGreen + { + get => _Regs.DigitalOutput0; + set => _Regs.DigitalOutput0 = value; + } + + public Boolean LedRed => _Regs.DigitalOutput1; + public Boolean Harvester1Step => _Regs.DigitalOutput2; + public Boolean Harvester2Step => _Regs.DigitalOutput3; + public Boolean Harvester3Step => _Regs.DigitalOutput4; + public Boolean Harvester4Step => _Regs.DigitalOutput5; + public Boolean Do0StartPulse { get; set; } + public Boolean Do1StartPulse { get; set; } + public Boolean Do2StartPulse { get; set; } + public Boolean Do3StartPulse { get; set; } + public Boolean Do4StartPulse { get; set; } + public Boolean Do5StartPulse { get; set; } + public UInt16 DigitalOutput0Mode { get; set; } + public UInt16 DigitalOutput1Mode { get; set; } + public UInt16 DigitalOutput2Mode { get; set; } + public UInt16 DigitalOutput3Mode { get; set; } + public UInt16 DigitalOutput4Mode { get; set; } + public UInt16 DigitalOutput5Mode { get; set; } + public UInt16 PulseOut0LowTime { get; set; } + public UInt16 PulseOut1LowTime { get; set; } + public UInt16 PulseOut2LowTime { get; set; } + public UInt16 PulseOut3LowTime { get; set; } + public UInt16 PulseOut4LowTime { get; set; } + public UInt16 PulseOut5LowTime { get; set; } + public UInt16 PulseOut0HighTime { get; set; } + public UInt16 PulseOut1HighTime { get; set; } + public UInt16 PulseOut2HighTime { get; set; } + public UInt16 PulseOut3HighTime { get; set; } + public UInt16 PulseOut4HighTime { get; set; } + public UInt16 PulseOut5HighTime { get; set; } + + public void PerformSolidGreenLed() + { + Console.WriteLine("Solid Green: This is not yet implemented "); + } + + public void PerformSlowFlashingGreenLed() + { + Console.WriteLine("Slow Flashing Green: This is not yet implemented "); + } + + public void PerformFastFlashingGreenLed() + { + Console.WriteLine("Fast Flashing Green: This is not yet implemented "); + } + + public void PerformSolidOrangeLed() + { + Console.WriteLine("Solid Orange: This is not yet implemented "); + } + + public void PerformSlowFlashingOrangeLed() + { + Console.WriteLine("Slow Flashing Orange: This is not yet implemented "); + } + + public void PerformFastFlashingOrangeLed() + { + Console.WriteLine("Fast Flashing Orange: This is not yet implemented "); + } + + public void PerformSolidRedLed() + { + Console.WriteLine("Solid Red: This is not yet implemented "); + } + + public void PerformSlowFlashingRedLed() + { + Console.WriteLine("Slow Flashing Red: This is not yet implemented "); + } + + public void PerformFastFlashingRedLed() + { + Console.WriteLine("Fast Flashing Red: This is not yet implemented "); + } + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + private Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput16; + private Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput17; + private Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput18; + private Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput19; + + public Boolean FiWarning => !_Regs.DigitalInput21; + public Boolean FiError => !_Regs.DigitalInput23; + + public Boolean K2ConnectIslandBusToGridBus + { + get => _Regs.Relay23; + set => _Regs.Relay23 = value; + } + + public static implicit operator Amax5070Registers(RelaysRecordAmax d) => d._Regs; + public static implicit operator RelaysRecordAmax(Amax5070Registers d) => new RelaysRecordAmax(d); + +} +using InnovEnergy.Lib.Devices.Amax5070; + +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; + +public class RelaysRecordAmax : IRelaysRecord +{ + private readonly Amax5070Registers _Regs; + + private RelaysRecordAmax(Amax5070Registers regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput22; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput20; + + public Boolean Inverter1WagoStatus => _Regs.DigitalInput0; + public Boolean Inverter2WagoStatus => _Regs.DigitalInput1; + public Boolean Inverter3WagoStatus => _Regs.DigitalInput2; + public Boolean Inverter4WagoStatus => _Regs.DigitalInput3; + + public Boolean Dc1WagoStatus => _Regs.DigitalInput6; + public Boolean Dc2WagoStatus => _Regs.DigitalInput7; + public Boolean Dc3WagoStatus => _Regs.DigitalInput10; + public Boolean Dc4WagoStatus => _Regs.DigitalInput11; + public Boolean DcSystemControlWagoStatus => _Regs.DigitalInput9; + + public Boolean LedGreen + { + get => _Regs.DigitalOutput0; + set => _Regs.DigitalOutput0 = value; + } + + public Boolean LedRed => _Regs.DigitalOutput1; + public Boolean Harvester1Step => _Regs.DigitalOutput2; + public Boolean Harvester2Step => _Regs.DigitalOutput3; + public Boolean Harvester3Step => _Regs.DigitalOutput4; + public Boolean Harvester4Step => _Regs.DigitalOutput5; + /* public Boolean Do0StartPulse { get; set; } + public Boolean Do1StartPulse { get; set; } + public Boolean Do2StartPulse { get; set; } + public Boolean Do3StartPulse { get; set; } + public Boolean Do4StartPulse { get; set; } + public Boolean Do5StartPulse { get; set; } + public UInt16 DigitalOutput0Mode { get; set; } + public UInt16 DigitalOutput1Mode { get; set; } + public UInt16 DigitalOutput2Mode { get; set; } + public UInt16 DigitalOutput3Mode { get; set; } + public UInt16 DigitalOutput4Mode { get; set; } + public UInt16 DigitalOutput5Mode { get; set; } + public UInt16 PulseOut0LowTime { get; set; } + public UInt16 PulseOut1LowTime { get; set; } + public UInt16 PulseOut2LowTime { get; set; } + public UInt16 PulseOut3LowTime { get; set; } + public UInt16 PulseOut4LowTime { get; set; } + public UInt16 PulseOut5LowTime { get; set; } + public UInt16 PulseOut0HighTime { get; set; } + public UInt16 PulseOut1HighTime { get; set; } + public UInt16 PulseOut2HighTime { get; set; } + public UInt16 PulseOut3HighTime { get; set; } + public UInt16 PulseOut4HighTime { get; set; } + public UInt16 PulseOut5HighTime { get; set; }*/ + /* + public void PerformSolidGreenLed() + { + Console.WriteLine("Solid Green: This is not yet implemented "); + } + + public void PerformSlowFlashingGreenLed() + { + Console.WriteLine("Slow Flashing Green: This is not yet implemented "); + } + + public void PerformFastFlashingGreenLed() + { + Console.WriteLine("Fast Flashing Green: This is not yet implemented "); + } + + public void PerformSolidOrangeLed() + { + Console.WriteLine("Solid Orange: This is not yet implemented "); + } + + public void PerformSlowFlashingOrangeLed() + { + Console.WriteLine("Slow Flashing Orange: This is not yet implemented "); + } + + public void PerformFastFlashingOrangeLed() + { + Console.WriteLine("Fast Flashing Orange: This is not yet implemented "); + } + + public void PerformSolidRedLed() + { + Console.WriteLine("Solid Red: This is not yet implemented "); + } + + public void PerformSlowFlashingRedLed() + { + Console.WriteLine("Slow Flashing Red: This is not yet implemented "); + } + + public void PerformFastFlashingRedLed() + { + Console.WriteLine("Fast Flashing Red: This is not yet implemented "); + }*/ + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + public Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput16; + public Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput17; + public Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput18; + public Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput19; + + public Boolean FiWarning => !_Regs.DigitalInput21; + public Boolean FiError => !_Regs.DigitalInput23; + + public Boolean K2ConnectIslandBusToGridBus + { + get => _Regs.Relay23; + set => _Regs.Relay23 = value; + } + + public static implicit operator Amax5070Registers(RelaysRecordAmax d) => d._Regs; + public static implicit operator RelaysRecordAmax(Amax5070Registers d) => new RelaysRecordAmax(d); + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Switch.cs b/csharp/App_backup/SaliMax/src/Switch.cs new file mode 100644 index 000000000..5011d75ee --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Switch.cs @@ -0,0 +1,15 @@ +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.SaliMax; + +public static class Switch +{ + public static TextBlock Open(String name) + { + return TextBlock.AlignCenterHorizontal + ( + " __╱ __ ", + name + ); + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/System/Controller.cs b/csharp/App_backup/SaliMax/src/System/Controller.cs new file mode 100644 index 000000000..e83f23ada --- /dev/null +++ b/csharp/App_backup/SaliMax/src/System/Controller.cs @@ -0,0 +1,726 @@ +using InnovEnergy.App.SaliMax.Ess; +using InnovEnergy.App.SaliMax.SaliMaxRelays; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; +using static InnovEnergy.Lib.Devices.Trumpf.SystemControl.DataTypes.GridType; + +namespace InnovEnergy.App.SaliMax.System; + +public static class Controller +{ + private static Int32 GetSystemState(this StatusRecord r) + { + var relays = r.Relays; + + if (relays is null) + return 101; // Message = "Panic: relay device is not available!", + + var acDcs = r.AcDc; + + if (acDcs.NotAvailable()) + return 102; + + var k4 = acDcs.AllGridTied() ? 0 + : acDcs.AllIsland() ? 1 + : 4; + + var k5 = acDcs.AllDisabled() ? 0 + : acDcs.AllEnabled() ? 1 + : 4; + + if (k4 == 4 || k5 == 4) + return 103; //Message = "Panic: ACDCs have unequal grid types or power stage", + + var nInverters = r.AcDc.Devices.Count; + + var k1 = relays.K1GridBusIsConnectedToGrid ? 1 : 0; + var k2 = relays.K2IslandBusIsConnectedToGridBus ? 1 : 0; + var k3 = relays.K3InverterIsConnectedToIslandBus.Take(nInverters).Any(c => c) ? 1 : 0; + + + // states as defined in states excel sheet + return 1 * k1 + + 2 * k2 + + 4 * k3 + + 8 * k4 + + 16 * k5; + } + + public static Boolean ControlSystemState(this StatusRecord s) + { + s.StateMachine.State = s.GetSystemState(); + + return s.StateMachine.State switch + { + 0 => State0(s), + 1 => State1(s), + 2 => State2(s), + 3 => State3(s), + 4 => State4(s), + 5 => State5(s), + 6 => State6(s), + 7 => State7(s), + 8 => State8(s), + 9 => State9(s), + 10 => State10(s), + 11 => State11(s), + 12 => State12(s), + 13 => State13(s), + 14 => State14(s), + 15 => State15(s), + 16 => State16(s), + 17 => State17(s), + 18 => State18(s), + 19 => State19(s), + 20 => State20(s), + 21 => State21(s), + 22 => State22(s), + 23 => State23(s), + 24 => State24(s), + 25 => State25(s), + 26 => State26(s), + 27 => State27(s), + 28 => State28(s), + 29 => State29(s), + 30 => State30(s), + 31 => State31(s), + + + 101 => State101(s), + 102 => State102(s), + 103 => State103(s), + _ => UnknownState(s) + }; + + } + + private static Boolean NotAvailable(this AcDcDevicesRecord acDcs) + { + return acDcs.SystemControl == null || acDcs.Devices.Count == 0; + } + + private static Boolean State0(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are off. Switching to Island Mode."; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 8 + } + + + private static Boolean State1(StatusRecord s) + { + s.StateMachine.Message = "Grid Tied mode active, closing k2"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return false; + + // => 3 + } + + private static Boolean State2(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 0 + } + + private static Boolean State3(StatusRecord s) + { + s.StateMachine.Message = "K2 closed, Turning on Ac/Dc"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return false; + + // => 19 + } + + + private static Boolean State4(StatusRecord s) + { + s.StateMachine.Message = "K2 is open, waiting K3 to open"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + + // => 0 + } + + private static Boolean State5(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => ? + } + + private static Boolean State6(StatusRecord s) + { + s.StateMachine.Message = "Inverters are off, opening K2"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + + // => 4 + } + + private static Boolean State7(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return false; + + // => ? + } + + private static Boolean State8(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are off and in Island Mode."; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + // => 24 + } + + private static Boolean State9(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are disconnected from Island Bus. Switching to GridTie Mode."; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 1 + } + + private static Boolean State10(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 8 + } + + private static Boolean State11(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.ConnectIslandBusToGrid(); + + return false; + + // => 9 + } + + private static Boolean State12(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 8 + } + + private static Boolean State13(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are off. Waiting for them to disconnect from Island Bus."; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + + // => 9 + } + + private static Boolean State14(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 12 + } + + + private static Boolean State15(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 13 + } + + + private static Boolean State16(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 0 + } + + + private static Boolean State17(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 1 + } + + + private static Boolean State18(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 0 + } + + private static Boolean State19(StatusRecord s) + { + s.StateMachine.Message = "Waiting for Ac/Dc to connect to Island Bus"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return true; + + // => 23 + } + + + private static Boolean State20(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 4 + } + + private static Boolean State21(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 5 + } + + private static Boolean State22(StatusRecord s) + { + s.StateMachine.Message = "K1 opened, switching inverters off"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return true; + + // => 6 + } + + private static Boolean State23(StatusRecord s) + { + s.StateMachine.Message = "ESS"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return true; + + // => 22 + } + + + private static Boolean State24(StatusRecord s) + { + s.StateMachine.Message = "Inverter are on waiting for k3 to close"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 28 + } + + private static Boolean State25(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 9 + } + + private static Boolean State26(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 10 + } + + private static Boolean State27(StatusRecord s) + { + s.StateMachine.Message = "K2 open and enable island mode"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 9 + } + + private static Boolean State28(StatusRecord s) + { + s.StateMachine.Message = "Island Mode"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 29 + } + + private static Boolean State29(StatusRecord s) + { + s.StateMachine.Message = "K1 closed, Switching off Inverters and moving to grid tie"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 13 + } + + private static Boolean State30(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 14 + } + + private static Boolean State31(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 13 + } + + private static Boolean State101(StatusRecord s) + { + s.StateMachine.Message = "Relay device is not available"; + return s.EnableSafeDefaults(); + } + + private static Boolean State102(StatusRecord s) + { + s.StateMachine.Message = "ACDCs not available"; + return s.EnableSafeDefaults(); + } + + private static Boolean State103(StatusRecord s) + { + s.StateMachine.Message = "Panic: ACDCs have unequal grid types or PowerStage"; + return s.EnableSafeDefaults(); + } + + // private static Boolean State104(StatusRecord s) + // { + // s.StateMachine.Message = "Panic: DCDCs not available"; + // return s.EnableSafeDefaults(); + // } + + + private static Boolean UnknownState(StatusRecord s) + { + // "Unknown System State" + return s.EnableSafeDefaults(); + } + + + + private static Boolean AllDisabled(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => !d.Control.PowerStageEnable); + } + + private static Boolean AllEnabled(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => d.Control.PowerStageEnable); + } + + + private static Boolean AllTheSame(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices + .Select(d => d.Control.PowerStageEnable) + .Distinct() + .Count() == 1; + } + + private static Boolean AllGridTied(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => d.Status.ActiveGridType is GridTied380V60Hz) + || acDcs.Devices.All(d => d.Status.ActiveGridType is GridTied400V50Hz) + || acDcs.Devices.All(d => d.Status.ActiveGridType is GridTied480V60Hz); + } + + private static Boolean AllIsland(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => d.Status.ActiveGridType is Island400V50Hz) + || acDcs.Devices.All(d => d.Status.ActiveGridType is Island480V60Hz); + } + + private static void ForAll(this IEnumerable ts, Action action) + { + foreach (var t in ts) + action(t); + } + + private static void Disable(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.PowerStageEnable = false); + } + + //this is must be deleted + private static void Disable(this DcDcDevicesRecord dcDc) + { + // For Test purpose, The transition from island mode to grid tier and vis versa , may not need to disable Dc/Dc. + // This will keep the Dc link powered. + + // dcDc.Devices + // .Select(d => d.Control) + // .ForAll(c => c.PowerStageEnable = false); + } + + private static void Enable(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.PowerStageEnable = true); + } + + private static void Enable(this DcDcDevicesRecord dcDc) + { + dcDc.Devices + .Select(d => d.Control) + .ForAll(c => c.PowerStageEnable = true); + } + + + private static void EnableGridTieMode(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.Ac.GridType = GridTied400V50Hz); // TODO: config grid type + } + + + private static void EnableIslandMode(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.Ac.GridType = Island400V50Hz); // TODO: config grid type + } + + private static void DisconnectIslandBusFromGrid(this IRelaysRecord? relays) + { + if (relays is not null) + relays.K2ConnectIslandBusToGridBus = false; + } + + private static void ConnectIslandBusToGrid(this IRelaysRecord? relays) + { + if (relays is not null) + relays.K2ConnectIslandBusToGridBus = true; + } + + + private static Boolean EnableSafeDefaults(this StatusRecord s) + { + // After some tests, the safe state is switch off inverter and keep the last state of K2 , Dc/Dc and Grid type to avoid conflict. + + // s.DcDc.Disable(); + s.AcDc.Disable(); + // s.AcDc.EnableGridTieMode(); + // s.Relays.DisconnectIslandBusFromGrid(); + return false; + } + + public static DcDcDevicesRecord ResetAlarms(this DcDcDevicesRecord dcDcStatus) + { + var sc = dcDcStatus.SystemControl; + + if (sc is not null) + sc.ResetAlarmsAndWarnings = sc.Alarms.Any(); + + foreach (var d in dcDcStatus.Devices) + d.Control.ResetAlarmsAndWarnings = d.Status.Alarms.Any() || d.Status.Warnings.Any(); + + return dcDcStatus; + } + + public static AcDcDevicesRecord ResetAlarms(this AcDcDevicesRecord acDcStatus) + { + var sc = acDcStatus.SystemControl; + + if (sc is not null) + sc.ResetAlarmsAndWarnings = sc.Alarms.Any() || sc.Warnings.Any(); + + foreach (var d in acDcStatus.Devices) + d.Control.ResetAlarmsAndWarnings = d.Status.Alarms.Any() || d.Status.Warnings.Any(); + + return acDcStatus; + } + +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/System/StateMachine.cs b/csharp/App_backup/SaliMax/src/System/StateMachine.cs new file mode 100644 index 000000000..a22afb483 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/System/StateMachine.cs @@ -0,0 +1,9 @@ +namespace InnovEnergy.App.SaliMax.System; + +public record StateMachine +{ + public required String Message { get; set; } // TODO: init only + public required Int32 State { get; set; } // TODO: init only + + public static StateMachine Default { get; } = new StateMachine { State = 100, Message = "Unknown State" }; +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SystemConfig/AcDcConfig.cs b/csharp/App_backup/SaliMax/src/SystemConfig/AcDcConfig.cs new file mode 100644 index 000000000..20a755151 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SystemConfig/AcDcConfig.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SaliMax.SystemConfig; + +public class AcDcConfig +{ + public required Double MaxDcLinkVoltage { get; set; } + public required Double MinDcLinkVoltage { get; set; } + public required Double ReferenceDcLinkVoltage { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SystemConfig/CalibrationChargeType.cs b/csharp/App_backup/SaliMax/src/SystemConfig/CalibrationChargeType.cs new file mode 100644 index 000000000..91cc45ff3 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SystemConfig/CalibrationChargeType.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SaliMax.SystemConfig; + +public enum CalibrationChargeType +{ + RepetitivelyEvery, + AdditionallyOnce, + ChargePermanently +} diff --git a/csharp/App_backup/SaliMax/src/SystemConfig/Config.cs b/csharp/App_backup/SaliMax/src/SystemConfig/Config.cs new file mode 100644 index 000000000..0f3a55125 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SystemConfig/Config.cs @@ -0,0 +1,279 @@ +using System.Text.Json; +using InnovEnergy.App.SaliMax.Devices; +using InnovEnergy.Lib.Utils; +using static System.Text.Json.JsonSerializer; + +namespace InnovEnergy.App.SaliMax.SystemConfig; + +// shut up trim warnings +#pragma warning disable IL2026 + +public class Config //TODO: let IE choose from config files (Json) and connect to GUI +{ + private static String DefaultConfigFilePath => Path.Combine(Environment.CurrentDirectory, "config.json"); + private static DateTime DefaultDatetime => new(2024, 03, 11, 09, 00, 00); + + private static readonly JsonSerializerOptions JsonOptions = new() { WriteIndented = true }; + + public required Double MinSoc { get; set; } + public required UInt16 CurtailP { get; set; }// in Kw + public required UInt16 PvInstalledPower { get; set; }// in Kw + public required CalibrationChargeType ForceCalibrationChargeState { get; set; } + public required DateTime DayAndTimeForRepetitiveCalibration { get; set; } + public required DateTime DayAndTimeForAdditionalCalibration { get; set; } + public required Boolean DisplayIndividualBatteries { get; set; } + public required Double PConstant { get; set; } + public required Double GridSetPoint { get; set; } + public required Double BatterySelfDischargePower { get; set; } + public required Double HoldSocZone { get; set; } + public required DevicesConfig IslandMode { get; set; } + public required DevicesConfig GridTie { get; set; } + + public required DeviceConfig Devices { get; set; } + public required S3Config? S3 { get; set; } + + private static String? LastSavedData { get; set; } + + #if DEBUG + public static Config Default => new() + { + MinSoc = 20, + CurtailP = 0, + PvInstalledPower = 20, + ForceCalibrationChargeState = CalibrationChargeType.RepetitivelyEvery, + DayAndTimeForRepetitiveCalibration = DefaultDatetime, + DayAndTimeForAdditionalCalibration = DefaultDatetime, + DisplayIndividualBatteries = false, + PConstant = .5, + GridSetPoint = 0, + BatterySelfDischargePower = 200, + HoldSocZone = 1, // TODO: find better name, + IslandMode = new() + { + AcDc = new () + { + MinDcLinkVoltage = 690, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 810, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 50, + LowerDcLinkVoltage = 50, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + GridTie = new() + { + AcDc = new () + { + MinDcLinkVoltage = 720, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 810, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 50, + LowerDcLinkVoltage = 50, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + + Devices = new () + { + RelaysIp = new() { Host = "localhost", Port = 5006, DeviceState = DeviceState.Measured}, + TsRelaysIp = new() { Host = "localhost", Port = 5006, DeviceState = DeviceState.Measured}, + GridMeterIp = new() { Host = "localhost", Port = 5003, DeviceState = DeviceState.Measured}, + PvOnAcGrid = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + LoadOnAcGrid = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + PvOnAcIsland = new() { Host = "true" , Port = 0 , DeviceState = DeviceState.Measured}, + IslandBusLoadMeterIp = new() { Host = "localhost", Port = 5004, DeviceState = DeviceState.Measured}, + TruConvertAcIp = new() { Host = "localhost", Port = 5001, DeviceState = DeviceState.Measured}, + PvOnDc = new() { Host = "localhost", Port = 5005, DeviceState = DeviceState.Measured}, + LoadOnDc = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + TruConvertDcIp = new() { Host = "localhost", Port = 5002, DeviceState = DeviceState.Measured}, + BatteryIp = new() { Host = "localhost", Port = 5007, DeviceState = DeviceState.Measured}, + BatteryNodes = new []{ 2, 3, 4, 5, 6 } + }, + + S3 = new() + { + Bucket = "1-3e5b3069-214a-43ee-8d85-57d72000c19d", + Region = "sos-ch-dk-2", + Provider = "exo.io", + ContentType = "text/plain; charset=utf-8", + Key = "EXO4ec5faf1a7650b79b5722fb5", + Secret = "LUxu1PGEA-POEIckoEyq6bYyz0RnenW6tmqccMKgkHQ" + }, + }; + #else + public static Config Default => new() + { + MinSoc = 20, + CurtailP = 0, + PvInstalledPower = 20, + ForceCalibrationChargeState = CalibrationChargeType.RepetitivelyEvery, + DayAndTimeForRepetitiveCalibration = DefaultDatetime, + DayAndTimeForAdditionalCalibration = DefaultDatetime, + DisplayIndividualBatteries = false, + PConstant = .5, + GridSetPoint = 0, + BatterySelfDischargePower = 200, + HoldSocZone = 1, // TODO: find better name, + IslandMode = new() + { + AcDc = new () + { + MinDcLinkVoltage = 690, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 810, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 50, + LowerDcLinkVoltage = 50, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + GridTie = new() + { + AcDc = new () + { + MinDcLinkVoltage = 720, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 780, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 20, + LowerDcLinkVoltage = 20, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + + S3 = new() + { + Bucket = "1-3e5b3069-214a-43ee-8d85-57d72000c19d", + Region = "sos-ch-dk-2", + Provider = "exo.io", + Key = "EXObb5a49acb1061781761895e7", + Secret = "sKhln0w8ii3ezZ1SJFF33yeDo8NWR1V4w2H0D4-350I", + ContentType = "text/plain; charset=utf-8" + }, + + Devices = new () + { + RelaysIp = new() { Host = "10.0.1.1", Port = 502, DeviceState = DeviceState.Measured}, + TsRelaysIp = new() { Host = "10.0.1.2", Port = 502, DeviceState = DeviceState.Measured}, + GridMeterIp = new() { Host = "10.0.4.1", Port = 502, DeviceState = DeviceState.Measured}, + PvOnAcGrid = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + LoadOnAcGrid = new() { Host = "true" , Port = 0 , DeviceState = DeviceState.Measured}, + PvOnAcIsland = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + IslandBusLoadMeterIp = new() { Host = "10.0.4.2", Port = 502, DeviceState = DeviceState.Measured}, + TruConvertAcIp = new() { Host = "10.0.2.1", Port = 502, DeviceState = DeviceState.Measured}, + PvOnDc = new() { Host = "10.0.5.1", Port = 502, DeviceState = DeviceState.Measured}, + LoadOnDc = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + TruConvertDcIp = new() { Host = "10.0.3.1", Port = 502, DeviceState = DeviceState.Measured}, + BatteryIp = new() { Host = "localhost", Port = 6855, DeviceState = DeviceState.Measured }, + BatteryNodes = new []{ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, + }, + }; + #endif + + public void Save(String? path = null) + { + var configFilePath = path ?? DefaultConfigFilePath; + + try + { + var jsonString = Serialize(this, JsonOptions); + + if (LastSavedData == jsonString) + return; + + LastSavedData = jsonString; + + File.WriteAllText(configFilePath, jsonString); + } + catch (Exception e) + { + $"Failed to write config file {configFilePath}\n{e}".WriteLine(); + throw; + } + } + + + public static Config Load(String? path = null) + { + var configFilePath = path ?? DefaultConfigFilePath; + try + { + var jsonString = File.ReadAllText(configFilePath); + return Deserialize(jsonString)!; + } + catch (Exception e) + { + $"Failed to read config file {configFilePath}, using default config\n{e}".WriteLine(); + return Default; + } + } + + + public static async Task LoadAsync(String? path = null) + { + var configFilePath = path ?? DefaultConfigFilePath; + try + { + var jsonString = await File.ReadAllTextAsync(configFilePath); + return Deserialize(jsonString)!; + } + catch (Exception e) + { + Console.WriteLine($"Couldn't read config file {configFilePath}, using default config"); + e.Message.WriteLine(); + return Default; + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SystemConfig/DcDcConfig.cs b/csharp/App_backup/SaliMax/src/SystemConfig/DcDcConfig.cs new file mode 100644 index 000000000..daf6a9a43 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SystemConfig/DcDcConfig.cs @@ -0,0 +1,15 @@ +namespace InnovEnergy.App.SaliMax.SystemConfig; + +public class DcDcConfig +{ + public required Double LowerDcLinkVoltage { get; set; } + public required Double ReferenceDcLinkVoltage { get; init; } + public required Double UpperDcLinkVoltage { get; set; } + + public required Double MaxBatteryChargingCurrent { get; set; } + public required Double MaxBatteryDischargingCurrent { get; set; } + public required Double MaxDcPower { get; set; } + + public required Double MaxChargeBatteryVoltage { get; set; } + public required Double MinDischargeBatteryVoltage { get; set; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/SystemConfig/DeviceConfig.cs b/csharp/App_backup/SaliMax/src/SystemConfig/DeviceConfig.cs new file mode 100644 index 000000000..5e23037ef --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SystemConfig/DeviceConfig.cs @@ -0,0 +1,21 @@ +using InnovEnergy.App.SaliMax.Devices; +using InnovEnergy.Lib.Utils.Net; + +namespace InnovEnergy.App.SaliMax.SystemConfig; + +public class DeviceConfig +{ + public required SalimaxDevice RelaysIp { get; init; } + public required SalimaxDevice TsRelaysIp { get; init; } + public required SalimaxDevice GridMeterIp { get; init; } + public required SalimaxDevice PvOnAcGrid { get; init; } + public required SalimaxDevice LoadOnAcGrid { get; init; } + public required SalimaxDevice PvOnAcIsland { get; init; } + public required SalimaxDevice IslandBusLoadMeterIp { get; init; } + public required SalimaxDevice TruConvertAcIp { get; init; } + public required SalimaxDevice PvOnDc { get; init; } + public required SalimaxDevice LoadOnDc { get; init; } + public required SalimaxDevice TruConvertDcIp { get; init; } + public required SalimaxDevice BatteryIp { get; init; } + public required Int32[] BatteryNodes { get; init; } +} diff --git a/csharp/App_backup/SaliMax/src/SystemConfig/DevicesConfig.cs b/csharp/App_backup/SaliMax/src/SystemConfig/DevicesConfig.cs new file mode 100644 index 000000000..4ae202e32 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/SystemConfig/DevicesConfig.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.App.SaliMax.SystemConfig; + +public class DevicesConfig +{ + public required AcDcConfig AcDc { get; init; } + public required DcDcConfig DcDc { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SaliMax/src/Topology.cs b/csharp/App_backup/SaliMax/src/Topology.cs new file mode 100644 index 000000000..73a0960d2 --- /dev/null +++ b/csharp/App_backup/SaliMax/src/Topology.cs @@ -0,0 +1,534 @@ +using System.Diagnostics.CodeAnalysis; +using InnovEnergy.App.SaliMax.Devices; +using InnovEnergy.App.SaliMax.Ess; +using InnovEnergy.Lib.Devices.AMPT; +using InnovEnergy.Lib.Devices.Battery48TL; +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Units.Power; +using InnovEnergy.Lib.Utils; +using Ac3Bus = InnovEnergy.Lib.Units.Composite.Ac3Bus; + +namespace InnovEnergy.App.SaliMax; + +// ┌────┐ ┌────┐ +// │ Pv │ │ Pv │ ┌────┐ +// └────┘ └────┘ │ Pv │ +// V V └────┘ +// V V V +// (b) 0 W (e) 0 W V +// V V (i) 13.2 kW ┌────────────┐ +// V V V │ Battery │ +// ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌─────────┐ V ├────────────┤ +// │ Grid │ │ Grid Bus │ │ Island Bus │ │ AC/DC │ ┌────────┐ ┌───────┐ │ 52.3 V │ +// ├─────────┤ -10.3 kW ├──────────┤ -11.7 kW ├────────────┤ -11.7 kW ├─────────┤ -11.7 kW │ Dc Bus │ 1008 W │ DC/DC │ 1008 W │ 99.1 % │ +// │ -3205 W │<<<<<<<<<<│ 244 V │<<<<<<<<<<│ 244 V │<<<<<<<<<<│ -6646 W │<<<<<<<<<<├────────┤>>>>>>>>>>├───────┤>>>>>>>>>>│ 490 mA │ +// │ -3507 W │ (a) │ 244 V │ (d) │ 244 V │ (g) │ -5071 W │ (h) │ 776 V │ (k) │ 56 V │ (l) │ 250 °C │ +// │ -3605 W │ K1 │ 246 V │ K2 │ 246 V │ K3 └─────────┘ └────────┘ └───────┘ │ 445 A │ +// └─────────┘ └──────────┘ └────────────┘ V │ 0 Warnings │ +// V V V │ 0 Alarms │ +// V V (j) 0 W └────────────┘ +// (c) 1400 W (f) 0 W V +// V V V +// V V ┌──────┐ +// ┌──────┐ ┌──────┐ │ Load │ +// │ Load │ │ Load │ └──────┘ +// └──────┘ └──────┘ + + +// Calculated values: c,d & h +// ========================== +// +// +// AC side +// a + b - c - d = 0 [eq1] +// d + e - f - g = 0 [eq2] +// +// c & d are not measured! +// +// d = f + g - e [eq2] +// c = a + b - d [eq1] +// +// DC side +// h + i - j - k = 0 [eq3] +// +// if Dc load not existing, h = i - k [eq4] + +// k = l assuming no losses in DCDC // this is changed now l is equal total battery power +// j = h + i - k [eq3] + + +public static class Topology +{ + + public static TextBlock CreateTopologyTextBlock(this StatusRecord status) + { + var a = status.GridMeter?.Ac.Power.Active; + var b = status.PvOnAcGrid?.Dc.Power.Value; + var e = status.PvOnAcIsland?.Dc.Power.Value; + var f = status.LoadOnAcIsland?.Ac.Power.Active; + var g = status.AcDc.Dc.Power.Value; + var h = status.AcDcToDcLink?.Power.Value; + var i = status.PvOnDc?.Dc.Power.Value; + var k = status.DcDc.Dc.Link.Power.Value; + var l = status.Battery is not null ? status.Battery.Dc.Power.Value : 0; + var j = status.LoadOnDc?.Power.Value; + var d = status.AcGridToAcIsland?.Power.Active; + var c = status.LoadOnAcGrid?.Power.Active; + + ///////////////////////////// + + var grid = status.CreateGridColumn(a); + var gridBus = status.CreateGridBusColumn(b, c, d); + var islandBus = status.CreateIslandBusColumn(e, f, g); + var inverter = status.CreateInverterColumn(h); + var dcBus = status.CreateDcBusColumn(i, j, k); + var dcDc = status.CreateDcDcColumn(l); + var batteries = status.CreateBatteryColumn(); + + return TextBlock.AlignCenterVertical + ( + grid, + gridBus, + islandBus, + inverter, + dcBus, + dcDc, + batteries + ); + } + + private static TextBlock CreateGridColumn(this StatusRecord status, ActivePower? a) + { + // ┌─────────┐ + // │ Grid │ + // ├─────────┤ -10.3 kW + // │ -3205 W │<<<<<<<<<< + // │ -3507 W │ (a) + // │ -3605 W │ K1 + // └─────────┘ + + var gridMeterAc = status.GridMeter?.Ac; + var k1 = status.Relays?.K1GridBusIsConnectedToGrid; + + var gridBox = PhasePowersActive(gridMeterAc).TitleBox("Grid"); + var gridFlow = SwitchedFlow(k1, a, "K1"); + + return TextBlock.AlignCenterVertical(gridBox, gridFlow); + } + + + private static TextBlock CreateGridBusColumn(this StatusRecord status, + ActivePower? b, + ActivePower? c, + ActivePower? d) + { + + // ┌────┐ + // │ Pv │ + // └────┘ + // V + // V + // (b) 0 W + // V + // V + // ┌──────────┐ + // │ Grid Bus │ + // ├──────────┤ -11.7 kW + // │ 244 V │<<<<<<<<<< + // │ 244 V │ (d) + // │ 246 V │ K2 + // └──────────┘ + // V + // V + // (c) 1400 W + // V + // V + // ┌──────┐ + // │ Load │ + // └──────┘ + + + ////////////// top ////////////// + + var pvBox = TextBlock.FromString("PV").Box(); + var pvFlow = Flow.Vertical(b); + + ////////////// center ////////////// + + // on IslandBus show voltages measured by inverter + // on GridBus show voltages measured by grid meter + // ought to be approx the same + + var gridMeterAc = status.GridMeter?.Ac; + var k2 = status.Relays?.K2IslandBusIsConnectedToGridBus; + + var busBox = PhaseVoltages(gridMeterAc).TitleBox("Grid Bus"); + var busFlow = SwitchedFlow(k2, d, "K2"); + + ////////////// bottom ////////////// + + var loadFlow = Flow.Vertical(c); + var loadBox = TextBlock.FromString("Load").Box(); + + ////////////// assemble ////////////// + + return TextBlock.AlignCenterVertical + ( + TextBlock.AlignCenterHorizontal(pvBox, pvFlow, busBox, loadFlow, loadBox), + busFlow + ); + } + + + private static TextBlock CreateIslandBusColumn(this StatusRecord status, + ActivePower? e, + ActivePower? f, + ActivePower? g) + { + + // ┌────┐ + // │ Pv │ + // └────┘ + // V + // V + // (e) 0 W + // V + // V + // ┌────────────┐ + // │ Island Bus │ + // ├────────────┤ -11.7 kW + // │ 244 V │<<<<<<<<<< + // │ 244 V │ (g) + // │ 246 V │ K3 + // └────────────┘ + // V + // V + // (f) 0 W + // V + // V + // ┌──────┐ + // │ Load │ + // └──────┘ + + + ////////////// top ////////////// + + var pvBox = TextBlock.FromString("PV").Box(); + var pvFlow = Flow.Vertical(e); + + ////////////// center ////////////// + + // on IslandBus show voltages measured by inverter + // on GridBus show voltages measured by grid meter + // ought to be approx the same + + var inverterAc = status.AcDc.Ac; + var busBox = PhaseVoltages(inverterAc).TitleBox("Island Bus"); + var busFlow = status.IslandBusToInverterConnection(g); + + ////////////// bottom ////////////// + + var loadFlow = Flow.Vertical(f); + var loadBox = TextBlock.FromString("Load").Box(); + + ////////////// assemble ////////////// + + return TextBlock.AlignCenterVertical + ( + TextBlock.AlignCenterHorizontal(pvBox, pvFlow, busBox, loadFlow, loadBox), + busFlow + ); + } + + + + private static TextBlock CreateInverterColumn(this StatusRecord status, ActivePower? h) + { + // ┌─────────┐ + // │ AC/DC │ + // ├─────────┤ -11.7 kW + // │ -6646 W │<<<<<<<<<< + // │ -5071 W │ (h) + // └─────────┘ + + var inverterBox = status + .AcDc + .Devices + .Select(d => d.Status.Ac.Power.Active) + .Apply(TextBlock.AlignLeft) + .TitleBox("AC/DC"); + + var dcFlow = Flow.Horizontal(h); + + return TextBlock.AlignCenterVertical(inverterBox, dcFlow); + } + + + [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")] + private static TextBlock IslandBusToInverterConnection(this StatusRecord status, ActivePower? g) + { + if (status.Relays is null) + return TextBlock.FromString("????????"); + + var nInverters = status.AcDc.Devices.Count; + + var k3S = status + .Relays + .K3InverterIsConnectedToIslandBus + .Take(nInverters); + + if (k3S.Prepend(true).All(s => s)) // TODO: display when no ACDC present + return Flow.Horizontal(g); + + return Switch.Open("K3"); + } + + private static TextBlock CreateDcDcColumn(this StatusRecord status, ActivePower? p) + { + var dc48Voltage = status.DcDc.Dc.Battery.Voltage.ToDisplayString(); + + var busBox = TextBlock + .AlignLeft(dc48Voltage) + .TitleBox("DC/DC"); + + var busFlow = Flow.Horizontal(p); + + return TextBlock.AlignCenterVertical(busBox, busFlow); + } + + private static TextBlock CreateDcBusColumn(this StatusRecord status, + ActivePower? i, + ActivePower? j, + ActivePower? k) + { + // ┌────┐ + // │ Pv │ + // └────┘ + // V + // V + // (i) 13.2 kW + // V + // V + // ┌────────┐ + // │ Dc Bus │ 1008 W + // ├────────┤>>>>>>>>>> + // │ 776 V │ (k) + // └────────┘ + // V + // V + // (j) 0 W + // V + // V + // ┌──────┐ + // │ Load │ + // └──────┘ + // + + + /////////////////// top /////////////////// + + var mppt = status.PvOnDc; + + var nStrings = mppt is not null + ? "x" + mppt.Strings.Count + : "?"; + + var pvBox = TextBlock.FromString($"PV {nStrings}").Box(); + var pvToBus = Flow.Vertical(i); + + /////////////////// center /////////////////// + + var dcBusVoltage = status.DcDc.Dc.Link.Voltage; + + var dcBusBox = dcBusVoltage + .ToDisplayString() + .Apply(TextBlock.FromString) + .TitleBox("DC Bus "); + + var busFlow = Flow.Horizontal(k); + + /////////////////// bottom /////////////////// + + var busToLoad = Flow.Vertical(j); + var loadBox = TextBlock.FromString("DC Load").Box(); + + ////////////// assemble ////////////// + + return TextBlock.AlignCenterVertical + ( + TextBlock.AlignCenterHorizontal(pvBox, pvToBus, dcBusBox, busToLoad, loadBox), + busFlow + ); + } + + private static TextBlock CreateBatteryColumn(this StatusRecord status) + { + var bat = status.Battery; + if (bat is null) + return TextBlock.AlignLeft("no battery").Box(); + + + var batteryAvgBox = CreateAveragedBatteryBox(bat); + + var batteryBoxes = bat + .Devices + .Select(CreateBatteryBox) + .ToReadOnlyList(); + + + var individualWithAvgBox = TextBlock + .AlignCenterVertical + ( + batteryAvgBox , + batteryBoxes.Any() + ? TextBlock.AlignLeft(batteryBoxes) + : TextBlock.Empty + ); + + return status.Config.DisplayIndividualBatteries ? individualWithAvgBox : batteryAvgBox; + } + + private static TextBlock CreateAveragedBatteryBox(Battery48TlRecords bat) + { + var voltage = bat.Dc.Voltage.ToDisplayString(); + var soc = bat.Devices.Any() ? bat.Devices.Average(b => b.Soc).Percent().ToDisplayString() : "0"; // TODO + var current = bat.Dc.Current.ToDisplayString(); + var busCurrent = bat.Devices.Any() ? bat.Devices.Sum(b => b.BusCurrent).A().ToDisplayString() : "0"; + var temp = bat.Temperature.ToDisplayString(); + var heatingPower = bat.HeatingPower.ToDisplayString(); + var alarms = bat.Alarms.Count + " Alarms"; + var warnings = bat.Warnings.Count + " Warnings"; + var nBatteries = bat.Devices.Count; + + return TextBlock + .AlignLeft + ( + voltage, + soc, + current, + busCurrent, + temp, + heatingPower, + warnings, + alarms + ) + .TitleBox($"Battery x{nBatteries}"); + } + + private static TextBlock PhaseVoltages(Ac3Bus? ac) + { + return TextBlock.AlignLeft + ( + ac?.L1.Voltage.ToDisplayString() ?? "???", + ac?.L2.Voltage.ToDisplayString() ?? "???", + ac?.L3.Voltage.ToDisplayString() ?? "???" + ); + } + + private static TextBlock PhasePowersActive(Ac3Bus? ac) + { + return TextBlock.AlignLeft + ( + ac?.L1.Power.Active.ToDisplayString() ?? "???", + ac?.L2.Power.Active.ToDisplayString() ?? "???", + ac?.L3.Power.Active.ToDisplayString() ?? "???" + ); + } + + private static TextBlock CreateBatteryBox(Battery48TlRecord battery, Int32 i) + { + var batteryWarnings = battery.Warnings.Any(); + var batteryAlarms = battery.Alarms.Any(); + + var content = TextBlock.AlignLeft + ( + battery.Dc.Voltage.ToDisplayString(), + battery.Soc.ToDisplayString(), + battery.Dc.Current.ToDisplayString() + " C/D", + battery.Temperatures.Cells.Average.ToDisplayString(), + battery.BusCurrent.ToDisplayString() , + batteryWarnings, + batteryAlarms, + battery.HeatingCurrent.ToDisplayString() + " HEAT" + ); + + var box = content.TitleBox($"Battery {i + 1}"); + var flow = Flow.Horizontal(battery.Dc.Power); + + return TextBlock.AlignCenterVertical(flow, box); + } + + + private static TextBlock SwitchedFlow(Boolean? switchClosed, ActivePower? power, String kx) + { + return switchClosed is null ? TextBlock.FromString("??????????") + : !switchClosed.Value ? Switch.Open(kx) + : power is null ? TextBlock.FromString("??????????") + : Flow.Horizontal(power); + } + + //We are fake using the ampt instead of PvOnAc, We dont have a Pv on Ac at the moment and we don't have it classes :TODO + public static AcPowerDevice? CalculateGridBusLoad(EmuMeterRegisters? gridMeter, AmptStatus? pvOnAcGrid, AcPowerDevice? gridBusToIslandBusPower) + { + var a = gridMeter ?.Ac.Power; + var b = pvOnAcGrid is not null? pvOnAcGrid?.Dc.Power.Value: 0; + var d = gridBusToIslandBusPower?.Power; + + if (a is null || b is null || d is null) + return null; + + var c = a + b - d; // [eq1] + + return new AcPowerDevice { Power = c }; + } + + //We are fake using the ampt instead of PvOnAc, We dont have a Pv on Ac at the moment and we don't have it classes :TODO + public static DcPowerDevice? CalculateAcDcToDcLink(AmptStatus? pvOnDc, DcDcDevicesRecord? dcDc, AcDcDevicesRecord acDc) + { + var i = pvOnDc?.Dc.Power; + var k = dcDc?.Dc.Link.Power; // We don't check on the DcDc because this device is mandatory + var g = acDc?.Dc.Power; + + if (i is null || k is null ) + { + return new DcPowerDevice { Power = g }; + } + + var h = -(i - k); // [eq4] + + return new DcPowerDevice { Power = h }; + } + + //We are fake using the ampt instead of PvOnAc, We dont have a Pv on Ac at the moment and we don't have it classes :TODO + public static AcPowerDevice? CalculateGridBusToIslandBusPower(AmptStatus? pvOnAcIsland, EmuMeterRegisters? loadOnAcIsland, AcDcDevicesRecord? acDc) + { + var e = pvOnAcIsland is not null? pvOnAcIsland?.Dc.Power.Value: 0; + var f = loadOnAcIsland is not null? loadOnAcIsland?.Ac.Power : 0; + var g = acDc ?.Ac.Power; // We don't check on the AcDc because this device is mandatory, if this does not exist the system will not start + + if (e is null || f is null || g is null) + return null; + + var d = f + g - e; // [eq2] + + return new AcPowerDevice { Power = d }; + } + + public static DcPowerDevice? CalculateDcLoad(AcDcDevicesRecord? acDc, AmptStatus? pvOnDc, DcDcDevicesRecord? dcDc) + { + var h = acDc?.Dc.Power; // We don't check on the AcDc because this device is mandatory + var i = pvOnDc is not null? pvOnDc?.Dc.Power: 0; + var k = dcDc?.Dc.Link.Power; // We don't check on the DcDc because this device is mandatory + + if (h is null || i is null || k is null) + return null; + + var j = h + i - k; // [eq3] + + return new DcPowerDevice { Power = j}; + } + +} diff --git a/csharp/App_backup/SaliMax/tunnelstoSalimaxX.sh b/csharp/App_backup/SaliMax/tunnelstoSalimaxX.sh new file mode 100755 index 000000000..03b256195 --- /dev/null +++ b/csharp/App_backup/SaliMax/tunnelstoSalimaxX.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +host="ie-entwicklung@$1" + +tunnel() { + name=$1 + ip=$2 + rPort=$3 + lPort=$4 + + echo -n "$name @ $ip mapped to localhost:$lPort " + ssh -nNTL "$lPort:$ip:$rPort" "$host" 2> /dev/null & + + until nc -vz 127.0.0.1 $lPort 2> /dev/null + do + echo -n . + sleep 0.3 + done + + echo "ok" +} + +echo "" + +tunnel "Trumpf Inverter (http) " 10.0.2.1 80 8001 +tunnel "Trumpf DCDC (http) " 10.0.3.1 80 8002 +tunnel "Ext Emu Meter (http) " 10.0.4.1 80 8003 +tunnel "Int Emu Meter (http) " 10.0.4.2 80 8004 +tunnel "AMPT (http) " 10.0.5.1 8080 8005 + +tunnel "Trumpf Inverter (modbus)" 10.0.2.1 502 5001 +tunnel "Trumpf DCDC (modbus) " 10.0.3.1 502 5002 +tunnel "Ext Emu Meter (modbus) " 10.0.4.1 502 5003 +tunnel "Int Emu Meter " 10.0.4.2 502 5004 +tunnel "AMPT (modbus) " 10.0.5.1 502 5005 +tunnel "Adam " 10.0.1.1 502 5006 #for AMAX is 10.0.1.3 +tunnel "Batteries " 127.0.0.1 6855 5007 + +echo +echo "press any key to close the tunnels ..." +read -r -n 1 -s +kill $(jobs -p) +echo "done" + diff --git a/csharp/App_backup/SaliMax/uploadBatteryFw/AF0A.bin b/csharp/App_backup/SaliMax/uploadBatteryFw/AF0A.bin new file mode 100644 index 0000000000000000000000000000000000000000..e5b7b9aba4bd3faaa32acad19314bfac5a4307da GIT binary patch literal 589824 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 J@c);A{{wk90$Bh6 literal 0 HcmV?d00001 diff --git a/csharp/App_backup/SaliMax/uploadBatteryFw/update_firmware.sh b/csharp/App_backup/SaliMax/uploadBatteryFw/update_firmware.sh new file mode 100755 index 000000000..fab8d1174 --- /dev/null +++ b/csharp/App_backup/SaliMax/uploadBatteryFw/update_firmware.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +dotnet_version='net6.0' +salimax_ip="$1" +username='ie-entwicklung' +root_password='Salimax4x25' + +set -e + +ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" "10.2.4.113" "10.2.4.29") +battery_ids=("2" "3" "4" "5" "6" "7" "8" "9" "10" "11") + + +for ip_address in "${ip_addresses[@]}"; do + scp upload-bms-firmware AF0A.bin "$username"@"$ip_address":/home/"$username" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl stop battery.service" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S apt install python3-pip -y" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S pip3 install pymodbus" + + for battery in "${battery_ids[@]}"; do + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S python3 upload-bms-firmware ttyUSB0 " "$battery" " AF0A.bin" + done + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl start battery.service" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl rm upload-bms-firmware AF0A.bin" + +echo "Deployed and ran commands on $ip_address" +done + + diff --git a/csharp/App_backup/SaliMax/uploadBatteryFw/upload-bms-firmware b/csharp/App_backup/SaliMax/uploadBatteryFw/upload-bms-firmware new file mode 100755 index 000000000..58d2c804d --- /dev/null +++ b/csharp/App_backup/SaliMax/uploadBatteryFw/upload-bms-firmware @@ -0,0 +1,288 @@ +#!/usr/bin/python2 -u +# coding=utf-8 + +import os +import struct +from time import sleep + +import serial +from os import system +import logging + +from pymodbus.client import ModbusSerialClient as Modbus +from pymodbus.exceptions import ModbusIOException +from pymodbus.pdu import ModbusResponse +from os.path import dirname, abspath +from sys import path, argv, exit + +path.append(dirname(dirname(abspath(__file__)))) + +PAGE_SIZE = 0x100 +HALF_PAGE =int( PAGE_SIZE / 2) +WRITE_ENABLE = [1] +FIRMWARE_VERSION_REGISTER = 1054 + +ERASE_FLASH_REGISTER = 0x2084 +RESET_REGISTER = 0x2087 +logging.basicConfig(level=logging.INFO) + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import List, NoReturn, Iterable, Optional + +def calc_stm32_crc_round(crc, data): + # type: (int, int) -> int + crc = crc ^ data + for _ in range(32): + xor = (crc & 0x80000000) != 0 + crc = (crc & 0x7FFFFFFF) << 1 # clear bit 31 because python ints have "infinite" bits + if xor: + crc = crc ^ 0x04C11DB7 + + return crc + + +def calc_stm32_crc(data): + # type: (Iterable[int]) -> int + crc = 0xFFFFFFFF + + for dw in data: + crc = calc_stm32_crc_round(crc, dw) + + return crc + + +def init_modbus(tty): + # type: (str) -> Modbus + + return Modbus( + port='/dev/' + tty, + method='rtu', + baudrate=115200, + stopbits=1, + bytesize=8, + timeout=0.5, # seconds + parity=serial.PARITY_ODD) + + +def failed(response): + # type: (ModbusResponse) -> bool + + # Todo 'ModbusIOException' object has no attribute 'function_code' + return response.function_code > 0x80 + + +def clear_flash(modbus, slave_address): + # type: (Modbus, int) -> bool + + print ('erasing flash...') + + write_response = modbus.write_registers(address=0x2084, values=[1], slave=slave_address) + + if failed(write_response): + print('erasing flash FAILED') + return False + + flash_countdown = 17 + while flash_countdown > 0: + read_response = modbus.read_holding_registers(address=0x2085, count=1, slave=slave_address) + + if failed(read_response): + print('erasing flash FAILED') + return False + + if read_response.registers[0] != flash_countdown: + flash_countdown = read_response.registers[0] + + msg = str(100 * (16 - flash_countdown) / 16) + '%' + print('\r{0} '.format(msg), end=' ') + + print('done!') + + return True + + +# noinspection PyShadowingBuiltins +def bytes_to_words(bytes): + # type: (str) -> List[int] + return list(struct.unpack('>' + int(len(bytes)/2) * 'H', bytes)) + + +def send_half_page_1(modbus, slave_address, data, page): + # type: (Modbus, int, str, int) -> NoReturn + + first_half = [page] + bytes_to_words(data[:HALF_PAGE]) + write_first_half = modbus.write_registers(0x2000, first_half, slave=slave_address) + + if failed(write_first_half): + raise Exception("Failed to write page " + str(page)) + + +def send_half_page_2(modbus, slave_address, data, page): + # type: (Modbus, int, str, int) -> NoReturn + + registers = bytes_to_words(data[HALF_PAGE:]) + calc_crc(page, data) + WRITE_ENABLE + result = modbus.write_registers(0x2041, registers, slave=slave_address) + + if failed(result): + raise Exception("Failed to write page " + str(page)) + + +def get_fw_name(fw_path): + # type: (str) -> str + return fw_path.split('/')[-1].split('.')[0] + + +def upload_fw(modbus, slave_id, fw_path, fw_name): + # type: (Modbus, int, str, str) -> NoReturn + + with open(fw_path, "rb") as f: + + size = os.fstat(f.fileno()).st_size + n_pages = int(size / PAGE_SIZE) + + print('uploading firmware ' + fw_name + ' to BMS ...') + + for page in range(0, n_pages): + page_data = f.read(PAGE_SIZE) + + msg = "page " + str(page + 1) + '/' + str(n_pages) + ' ' + str(100 * page / n_pages + 1) + '%' + print('\r{0} '.format(msg), end=' ') + + if is_page_empty(page_data): + continue + sleep(0.01) + send_half_page_1(modbus, slave_id, page_data, page) + sleep(0.01) + send_half_page_2(modbus, slave_id, page_data, page) + + +def is_page_empty(page): + # type: (str) -> bool + return page.count(b'\xff') == len(page) + + +def reset_bms(modbus, slave_id): + # type: (Modbus, int) -> bool + + print ('resetting BMS...') + + result = modbus.write_registers(RESET_REGISTER, [1], slave=slave_id) + + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) + + if success: + print('done') + else: + print('FAILED to reset battery!') + + return success + + +def calc_crc(page, data): + # type: (int, str) -> List[int] + + crc = calc_stm32_crc([page] + bytes_to_words(data)) + crc_bytes = struct.pack('>L', crc) + + return bytes_to_words(crc_bytes) + + +def identify_battery(modbus, slave_id): + # type: (Modbus, int) -> Optional[str] + print("slave id=",slave_id) + target = 'battery ' + str(slave_id) + ' at ' + '502' + + try: + + print(('contacting ...')) + + response = modbus.read_input_registers(address=FIRMWARE_VERSION_REGISTER, count=1, slave=slave_id) + fw = '{0:0>4X}'.format(response.registers[0]) + + print(('found battery with firmware ' + fw)) + + return fw + + except: + print(('failed to communicate with ')) + return None + + +def print_usage(): + print(('Usage: ' + __file__ + ' ')) + print(('Example: ' + __file__ + ' ttyUSB0 2 A08C.bin')) + + +def parse_cmdline_args(argv): + # type: (List[str]) -> (str, str, str, str) + + def fail_with(msg): + print(msg) + print_usage() + exit(1) + + if len(argv) < 1: + fail_with('missing argument for tty device') + + if len(argv) < 2: + fail_with('missing argument for battery ID') + + if len(argv) < 3: + fail_with('missing argument for firmware') + + return argv[0], int(argv[1]), argv[2], get_fw_name(argv[2]) + + +def verify_firmware(modbus, battery_id, fw_name): + # type: (Modbus, int, str) -> NoReturn + + fw_verify = identify_battery(modbus, battery_id) + + if fw_verify == fw_name: + print('SUCCESS') + else: + print('FAILED to verify uploaded firmware!') + if fw_verify is not None: + print('expected firmware version ' + fw_name + ' but got ' + fw_verify) + + +def wait_for_bms_reboot(): + # type: () -> NoReturn + + # wait 20s for the battery to reboot + + print('waiting for BMS to reboot...') + + for t in range(20, 0, -1): + print('\r{0} '.format(t), end=' ') + sleep(1) + + print('0') + + +def main(argv): + # type: (List[str]) -> NoReturn + + tty, battery_id, fw_path, fw_name = parse_cmdline_args(argv) + with init_modbus(tty) as modbus: + + if identify_battery(modbus, battery_id) is None: + return + + clear_flash(modbus, battery_id) + upload_fw(modbus, battery_id, fw_path, fw_name) + + if not reset_bms(modbus, battery_id): + return + + wait_for_bms_reboot() + + verify_firmware(modbus, battery_id, fw_name) + + +main(argv[1:]) diff --git a/csharp/App_backup/SchneiderMeterDriver/Config.cs b/csharp/App_backup/SchneiderMeterDriver/Config.cs new file mode 100644 index 000000000..27cdcfeda --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/Config.cs @@ -0,0 +1,66 @@ +using System.Reflection; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.SchneiderDriver; + +public static class Config +{ + public const String Version = "1.0"; + public const String BusName = "com.victronenergy.grid.Schneider"; + public const Byte ModbusNodeId = 1; + public const String OwnAddress = "192.168.3.147"; + public const String PeerAddress = "192.168.3.63"; + //public const String PeerAddress = "127.0.0.1"; + public const UInt16 PeerPort = 502; + + public static TimeSpan TcpTimeout { get; } = TimeSpan.FromSeconds(2); + + private const UInt16 FactorKwToW = 1000; + + public static readonly TimeSpan UpdatePeriod = TimeSpan.FromSeconds(1); + + public static readonly IReadOnlyList Signals = new List + { + new Signal(s => s.CurrentL1, "/Ac/L1/Current", "0.0 A"), + new Signal(s => s.CurrentL2, "/Ac/L2/Current", "0.0 A"), + new Signal(s => s.CurrentL3, "/Ac/L3/Current", "0.0 A"), + new Signal(s => s.CurrentL1 + s.CurrentL2 + s.CurrentL3, "/Ac/Current", "0.0 A"), + + new Signal(s => s.VoltageL1N, "/Ac/L1/Voltage", "0.0 V"), + new Signal(s => s.VoltageL2N, "/Ac/L2/Voltage", "0.0 V"), + new Signal(s => s.VoltageL3N, "/Ac/L3/Voltage", "0.0 V"), + new Signal(s => (s.VoltageL1N + s.VoltageL2N + s.VoltageL3N) / 3.0f, "/Ac/Voltage", "0.0 V"), + + new Signal(s => s.ActivePowerL1 * FactorKwToW, "/Ac/L1/Power", "0 W"), + new Signal(s => s.ActivePowerL2 * FactorKwToW, "/Ac/L2/Power", "0 W"), + new Signal(s => s.ActivePowerL3 * FactorKwToW, "/Ac/L3/Power", "0 W"), + new Signal(s => s.TotalActivePower * FactorKwToW, "/Ac/Power", "0 W"), + + + new Signal(s => s.TotalActiveImport, "Ac/Energy/Forward", "0.00 kWh"), + new Signal(s => s.TotalActiveExport, "Ac/Energy/Reverse", "0.00 kWh"), + new Signal(s => s.ActiveEnergyImportL1, "Ac/L1/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL1, "Ac/L1/Energy/Reverse", "0.00 kWh"), + // + new Signal(s => s.ActiveEnergyImportL2, "Ac/L2/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL2, "Ac/L2/Energy/Reverse", "0.00 kWh"), + // + new Signal(s => s.ActiveEnergyImportL3, "Ac/L3/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL3, "Ac/L3/Energy/Reverse", "0.00 kWh"), + }; + + public static VeProperties DefaultProperties => new VeProperties + { + new("/ProductName" , "Grid meter" ), + new("/CustomName" , "Schneider Professional"), + new("/DeviceInstance" , 50), + new("/DeviceType" , 73), + new("/Mgmt/Connection" , "Modbus TCP"), + new("/Mgmt/ProcessName" , Assembly.GetEntryAssembly()?.Location ?? "unknown"), + new("/Mgmt/ProcessVersion", Version), + new("/Connected" , 1), + new("/ProductId" , 45139, "b002"), + new("/Role" , "grid"), + }; + +} \ No newline at end of file diff --git a/csharp/App_backup/SchneiderMeterDriver/Nic.cs b/csharp/App_backup/SchneiderMeterDriver/Nic.cs new file mode 100644 index 000000000..a580f6fd3 --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/Nic.cs @@ -0,0 +1,149 @@ +using System.Text.Json.Nodes; +using CliWrap; +using CliWrap.Buffered; + +namespace InnovEnergy.App.SchneiderDriver; + +public readonly struct Nic +{ + private static Command IpCommand { get; } = Cli + .Wrap("/sbin/ip") + .WithValidation(CommandResultValidation.None); + + private readonly JsonNode _Node; + + private Nic(JsonNode node) + { + _Node = node; + } + + public Boolean IsEthernet + { + get + { + try + { + return _Node["link_type"]!.GetValue() == "ether"; + } + catch + { + return false; + } + } + } + + public Boolean IsUp + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["operstate"]!.GetValue() == "UP"; + } + catch + { + return false; + } + } + } + + public IReadOnlyList Ip4Addresses + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["addr_info"]! + .AsArray() + .TryWhere(n => n!["family"]!.GetValue() == "inet") + .TrySelect(n => n!["local"]!.GetValue()) + .ToList(); + } + catch + { + return Array.Empty(); + } + } + } + + public String Name + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["ifname"]!.GetValue(); + } + catch + { + return ""; + } + } + } + + + + public async Task AddPointToPoint(String sourceAddress, String destinationAddress) + { + var result = await IpCommand + .WithArguments($"address add local {sourceAddress} peer {destinationAddress} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + public async Task RemoveAddress(String address) + { + var result = await IpCommand + .WithArguments($"address del {address} dev {Name}") + .ExecuteBufferedAsync(); + + return result.ExitCode == 0; + } + + + public async Task AddRoute(String route) + { + var result = await IpCommand + .WithArguments($"route add {route} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + public async Task RemoveRoute(String route) + { + var result = await IpCommand + .WithArguments($"route del {route} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + + public static async Task> GetNetworkInterfaces() + { + + try + { + var result = await IpCommand + .WithArguments("-details -pretty -json address") + .ExecuteBufferedAsync(); + + return JsonNode + .Parse(result.StandardOutput)! + .AsArray() + .Where(n => n != null) + .Select(n => new Nic(n!)) + .ToList(); + } + catch + { + return Array.Empty(); + } + } + +} \ No newline at end of file diff --git a/csharp/App_backup/SchneiderMeterDriver/Program.cs b/csharp/App_backup/SchneiderMeterDriver/Program.cs new file mode 100644 index 000000000..404068d21 --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/Program.cs @@ -0,0 +1,79 @@ +using InnovEnergy.App.SchneiderDriver; +using InnovEnergy.Lib.Protocols.DBus; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Utils.Net; + + +// dotnet publish EmuMeter.csproj -c Release -r linux-arm -p:PublishSingleFile=true --self-contained true && \ +// rsync -av bin/Release/net6.0/linux-arm/publish/ root@10.2.1.6:/home/root/emu && clear && \ +// ssh root@10.2.1.6 /home/root/emu/EmuMeter + + +Console.WriteLine("Starting Schneider Driver " + Config.Version); + +var networkInterfaces = await Nic.GetNetworkInterfaces(); + +Console.WriteLine("Retrieved network interfaces"); + +// Log all network interfaces and their properties +foreach (var nic in networkInterfaces) +{ + Console.WriteLine($"Interface: {nic.Name}"); + Console.WriteLine($" IsUp: {nic.IsUp}"); + Console.WriteLine($" IsEthernet: {nic.IsEthernet}"); + Console.WriteLine($" IP4 Addresses: {string.Join(", ", nic.Ip4Addresses)}"); +} + +var candidates = networkInterfaces.Where(n => n.IsUp && + n.IsEthernet && + (!n.Ip4Addresses.Any() || n.Ip4Addresses.Contains(Config.OwnAddress))); + +if (!candidates.Any()) +{ + Console.WriteLine("No suitable network interfaces found."); +} + +foreach (var nic in candidates) +{ + Console.WriteLine($"Found new network interface: {nic.Name}"); + + if (!nic.Ip4Addresses.Contains(Config.OwnAddress)) + { + Console.WriteLine($"Configuring Point-to-Point connection on {nic.Name}"); + Console.WriteLine($" own address: {Config.OwnAddress}"); + Console.WriteLine($" peer address: {Config.PeerAddress}"); + + var success = await nic.AddPointToPoint($"{Config.OwnAddress}/16", $"{Config.PeerAddress}/16"); + + if (!success) + { + Console.WriteLine($"Failed to configure network interface: {nic.Name}"); + continue; + } + } + + Console.WriteLine($"Pinging peer @ {Config.PeerAddress}"); + + var ping = await Config.PeerAddress.Ping(); + + if (ping) + { + Console.WriteLine($"Got answer from {Config.PeerAddress}"); + //SchneiderMeterDriver.Run(Config.PeerAddress, Config.PeerPort, Bus.System); + + //Console.WriteLine($"{nameof(SchneiderMeterDriver)} FAILED with\n"); + var ex = await SchneiderMeterDriver.Run(Config.PeerAddress, Config.PeerPort, Bus.System); + + Console.WriteLine($"{nameof(SchneiderMeterDriver)} FAILED with\n{ex}"); + } + else + { + Console.WriteLine($"No answer from {Config.PeerAddress}"); + } + + Console.Write($"Removing Point-to-Point connection on {nic.Name} ..."); + var removed = await nic.RemoveAddress($"{Config.OwnAddress}/16"); + Console.WriteLine(removed ? "done" : "failed"); +} + +Console.WriteLine("Stopping SchneiderMeter Driver"); \ No newline at end of file diff --git a/csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.cs b/csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.cs new file mode 100644 index 000000000..29de8e36d --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.cs @@ -0,0 +1,91 @@ +using System.Reactive.Linq; +using InnovEnergy.Lib.Devices.IEM3kGridMeter; +using InnovEnergy.Lib.Protocols.DBus; +using InnovEnergy.Lib.Protocols.Modbus.Clients; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.SchneiderDriver; + +public static class SchneiderMeterDriver +{ + + public static Task Run(String hostName, Bus dbusAddress) + { + return Run(hostName, ModbusTcpClient.DefaultPort, dbusAddress); + } + + public static async Task Run(String hostName, UInt16 port, Bus dbusAddress) + { + // var ep = new UnixDomainSocketEndPoint("/home/eef/graber_dbus.sock"); + // var auth = AuthenticationMethod.ExternalAsRoot(); + // dbusAddress = new Bus(ep, auth); + + var schneider = new Iem3KGridMeterDevice(hostName, port, Config.ModbusNodeId); + + + var schneiderStatus = Observable + .Interval(Config.UpdatePeriod) + .Select(_ => schneider.Read()) + .Where(reading => reading != null) + .Publish(); + + var poller = schneiderStatus.Connect(); + + var properties = Config.DefaultProperties; + + var signals = Config + .Signals + .Select(signal => schneiderStatus + .Select(reading => + { + var property = signal.ToVeProperty(reading); + if (property == null) + { + // Console.WriteLine($"Warning: Signal {signal} produced a null property."); + } + else + { + //Console.WriteLine($"Transformed Signal to Property: {property}"); + } + return property; + }) + .Where(property => property != null)) + .Merge() + .Do(p => + { + // Console.WriteLine($"Setting property: {p}"); + properties.Set(p); + }); + + // TODO: remove when possible + // Apparently some VE services need to be periodically reminded that + // this service is /Connected + Console.WriteLine("Goes to subscribe"); + schneiderStatus.Subscribe(_ => properties.Set("/Connected", 1)); + Console.WriteLine("Subscribed successfully"); + // Wait until status is read once to make sure all + // properties are set when we go onto the bus. + + var dbus = schneiderStatus + .Skip(1) + .Take(1) + .SelectMany(_ => PublishPropertiesOnDBus(properties, dbusAddress)); + + return await signals + .MergeErrors(dbus) + .Finally(poller.Dispose) + .SelectErrors(); + } + + + private static Task PublishPropertiesOnDBus(VeProperties properties, Bus bus) + { + Console.WriteLine($"Connecting to DBus {bus}"); + return properties.PublishOnDBus(bus, Config.BusName); + } +} + + + + diff --git a/csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.csproj b/csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.csproj new file mode 100644 index 000000000..ac5b87bcd --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/SchneiderMeterDriver.csproj @@ -0,0 +1,26 @@ + + + + + InnovEnergy.App.SchneiderDriver + SchniederDriver + + + + + + + + + + + + + + + + + + + + diff --git a/csharp/App_backup/SchneiderMeterDriver/Signal.cs b/csharp/App_backup/SchneiderMeterDriver/Signal.cs new file mode 100644 index 000000000..b1a0d55ef --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/Signal.cs @@ -0,0 +1,42 @@ + +using InnovEnergy.Lib.Devices.IEM3kGridMeter; +using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.SchneiderDriver +{ + public record Signal(Func Source, ObjectPath Path, String Format = "") + { + // Converts the status object to a VeProperty, handling null status gracefully + public VeProperty ToVeProperty(Iem3KGridMeterRegisters status) + { + // Check if status is null and log a message + // if (status == null) + // { + // Console.WriteLine($"Status is null for path: {Path}"); + // // Return a default VeProperty if status is null + // return new VeProperty(Path, default(double), string.Format($"{{0:{Format}}}", default(double))); + // } +// + // // Retrieve the value using the provided source function + var value = Source(status); + // + // // Handle the case where the value itself might be null + // if (value == null) + // { + // Console.WriteLine($"Value is null for path: {Path}"); + // // Return a default VeProperty if value is null + // return new VeProperty(Path, default(double), string.Format($"{{0:{Format}}}", default(double))); + // } + + if (value is Single floatValue) + { + value = (Double)floatValue; + } + + // Create and return the VeProperty with the actual value and format + return new VeProperty(Path, value, string.Format($"{{0:{Format}}}", value)); + } + } +} + diff --git a/csharp/App_backup/SchneiderMeterDriver/Utils.cs b/csharp/App_backup/SchneiderMeterDriver/Utils.cs new file mode 100644 index 000000000..4b5735a35 --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/Utils.cs @@ -0,0 +1,49 @@ +namespace InnovEnergy.App.SchneiderDriver; + +public static class Utils +{ + public static IEnumerable TryWhere(this IEnumerable src, Func predicate) + { + foreach (var e in src) + { + var ok = false; + + try + { + ok = predicate(e); + } + catch + { + // ignored + } + + if (ok) + yield return e; + } + } + + public static IEnumerable TrySelect(this IEnumerable src, Func map) + { + foreach (var e in src) + { + var ok = false; + var result = default(R); + + try + { + result = map(e); + ok = true; + } + catch + { + // ignored + } + + if (ok) + yield return result!; + } + } + + + +} \ No newline at end of file diff --git a/csharp/App_backup/SchneiderMeterDriver/debug.sh b/csharp/App_backup/SchneiderMeterDriver/debug.sh new file mode 100755 index 000000000..9f7657b01 --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/debug.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +csproj="SchneiderMeterDriver.csproj" +exe="SchneiderMeterDriver" +#remote="10.2.1.6" +remote="10.2.4.155" +platform="linux-arm" +netVersion="net6.0" +config="Release" +host="root@$remote" +dir="/opt/victronenergy/$exe" + +set -e + +# Detect the current platform +#if uname -m | grep -i 'arm' > /dev/null; then + +#else + # platform="linux-x64" +#fi + +dotnet publish "$csproj" -c $config -r $platform -p:SuppressTrimmAnalysisWarnings=true -p:PublishSingleFile=true -p:PublishTrimmed=true -p:DebugType=None -p:DebugSymbols=false --self-contained true +rsync -av "bin/$config/$netVersion/$platform/publish/" "$host:$dir" +#clear +#ssh "$host" "$dir/$exe" + \ No newline at end of file diff --git a/csharp/App_backup/SchneiderMeterDriver/deploy.sh b/csharp/App_backup/SchneiderMeterDriver/deploy.sh new file mode 100755 index 000000000..eacfec15f --- /dev/null +++ b/csharp/App_backup/SchneiderMeterDriver/deploy.sh @@ -0,0 +1,61 @@ +#!/bin/bash + + +csproj="SchneiderMeterDriver.csproj" +exe="SchneiderMeterDriver" +remote="10.2.4.114" +platform="linux-arm" +netVersion="net6.0" +config="Release" +host="root@$remote" +dir="/opt/innovenergy/$exe" +log_dir="/var/log/SchneiderMeterDriver" + +set -e + +# Publish the project locally +dotnet publish "$csproj" -c $config -r $platform -p:SuppressTrimmAnalysisWarnings=true -p:PublishSingleFile=true -p:PublishTrimmed=true -p:DebugType=None -p:DebugSymbols=false --self-contained true + +# Sync the published files to the remote server +rsync -av "bin/$config/$netVersion/$platform/publish/" "$host:$dir" + +# Execute commands on the remote server +ssh "$host" << 'EOF' +set -e + +# Remount the root filesystem with read and write permissions +mount -o remount,rw / + +# Create service and log directories +mkdir -p /opt/innovenergy/SchneiderMeterDriver/service +mkdir -p /opt/innovenergy/SchneiderMeterDriver/service/log +mkdir -p /var/log/SchneiderMeterDriver + +# Create the service run script +cat << 'EOL' > /opt/innovenergy/SchneiderMeterDriver/service/run +#!/bin/sh +exec 2>&1 +exec softlimit -d 200000000 -s 2000000 -a 200000000 /opt/innovenergy/SchneiderMeterDriver/SchniederDriver +EOL +chmod +x /opt/innovenergy/SchneiderMeterDriver/service/run + +# Create the log run script +cat << 'EOL' > /opt/innovenergy/SchneiderMeterDriver/service/log/run +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/SchneiderMeterDriver +EOL +chmod +x /opt/innovenergy/SchneiderMeterDriver/service/log/run + +# Create the symbolic link for the service +ln -sf /opt/innovenergy/SchneiderMeterDriver/service /service/SchneiderMeterDriver + +# Wait a bit for the symlink to be recognized + +sleep 2 + +# Start the service +start SchneiderMeterDriver +EOF + +echo "Deployment and service setup completed successfully." diff --git a/csharp/App_backup/SodiStoreMax/Doc/AllStates.graphml b/csharp/App_backup/SodiStoreMax/Doc/AllStates.graphml new file mode 100644 index 000000000..5877679af --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/Doc/AllStates.graphml @@ -0,0 +1,934 @@ + + + + + + + + + + + + + + + + + + + + + + + 23 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 19 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 3 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 9 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 1 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 13 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 29 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 5 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 7 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 11 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 15 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 21 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 17 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 25 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 27 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 31 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 28 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 24 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 8 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 6 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 0 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 4 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 22 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 16 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + 20 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 18 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 2 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 10 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 12 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + 14 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + 26 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + 30 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + switch to +grid tie + + + + + + + + + + + K3's open + + + + + + + + + + + close K2 + + + + + + + + + + + turn on +Inverters + + + + + + + + + + + K3's close + + + + + + + + + + + + + + open K2 + + + + + + + + + + + open K2 + + + + + + + + + + + + + + turn off +inverter + + + + + + + + + + + turn off +inverters and open K2 + + + + + + + + + + + turn off +inverters + + + + + + + + + + + turn off +inverters and open K2 + + + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + K3's close + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + switch to +island mode + + + + + + + + + + + turn on +inverters + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + K3 opens + + + + + + + + + + + open K2 + + + + + + + + + + + + + turn off +inverters and Open K2 + + + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + open K2 + + + + + + + + + + + K3 opens + + + + + + + + + + + open K2 + + + + + + + + + + + + + turn off +inverters and open K2 + + + + + + + + + + + turn off +inverters + + + + + + + + + + + K1 closes + + + + + + + + + + + K1 opens + + + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + + + K3's open + + + + + + + + + + + + + + K3's open + + + + + + + + + diff --git a/csharp/App_backup/SodiStoreMax/Doc/SalimaxConfigReadme.txt b/csharp/App_backup/SodiStoreMax/Doc/SalimaxConfigReadme.txt new file mode 100644 index 000000000..559eb6ca8 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/Doc/SalimaxConfigReadme.txt @@ -0,0 +1,110 @@ +"MinSoc": Number, 0 - 100 this is the minimum State of Charge that the batteries must not go below, + "ForceCalibrationCharge": Boolean (true or false), A flag to force a calibration charge, + "DisplayIndividualBatteries": Boolean (true or false), To display the indvidual batteries + "PConstant": Number 0 - 1, P value of our controller. + "GridSetPoint": Number in Watts, The set point of our controller. + "BatterySelfDischargePower": Number, 200, this a physical measurement of the self discharging power. + "HoldSocZone": Number, 1, This is magic number for the soft landing factor. + "IslandMode": { // Dc Link Voltage in Island mode + "AcDc": { + "MaxDcLinkVoltage": Number, 810, Max Dc Link Voltage, + "MinDcLinkVoltage": Number, 690, Min Dc Link Voltage, + "ReferenceDcLinkVoltage": Number, 750, Reference Dc Link + }, + "DcDc": { + "LowerDcLinkVoltage": Number, 50, Lower Dc Link Window , + "ReferenceDcLinkVoltage": 750, reference Dc Link + "UpperDcLinkVoltage": Number, 50, Upper Dc Link Window , + } + }, + "GridTie": {// Dc Link Voltage in GrieTie mode + "AcDc": { + "MaxDcLinkVoltage":Number, 780, Max Dc Link Voltage, + "MinDcLinkVoltage": Number, 690, Min Dc Link Voltage, + "ReferenceDcLinkVoltage": Number, 750, Reference Dc Link + }, + "DcDc": { + "LowerDcLinkVoltage": Number, 20, Lower Dc Link Window , + "ReferenceDcLinkVoltage": 750, reference Dc Link + "UpperDcLinkVoltage": Number, 20, Upper Dc Link Window , + } + }, + "MaxBatteryChargingCurrent":Number, 0 - 210, Max Charging current by DcDc + "MaxBatteryDischargingCurrent":Number, 0 - 210, Max Discharging current by DcDc + "MaxDcPower": Number, 0 - 10000, Max Power exported/imported by DcDc (10000 is the maximum) + "MaxChargeBatteryVoltage": Number, 57, Max Charging battery Voltage + "MinDischargeBatteryVoltage": Number, 0, Min Charging Battery Voltage + "Devices": { This is All Salimax devices (including offline ones) + "RelaysIp": { + "DeviceState": 1, // 0: is not present, 1: Present and Can be mesured, 2: Present but must be computed/calculted + "Host": "10.0.1.1", // Ip @ of the device in the local network + "Port": 502 // port + }, + "GridMeterIp": { + "DeviceState": 1, + "Host": "10.0.4.1", + "Port": 502 + }, + "PvOnAcGrid": { + "DeviceState": 0, // If a device is not present + "Host": "false", // this is not important + "Port": 0 // this is not important + }, + "LoadOnAcGrid": { + "DeviceState": 2, // this is a computed device + "Host": "true", + "Port": 0 + }, + "PvOnAcIsland": { + "DeviceState": 0, + "Host": "false", + "Port": 0 + }, + "IslandBusLoadMeterIp": { + "DeviceState": 1, + "Host": "10.0.4.2", + "Port": 502 + }, + "TruConvertAcIp": { + "DeviceState": 1, + "Host": "10.0.2.1", + "Port": 502 + }, + "PvOnDc": { + "DeviceState": 1, + "Host": "10.0.5.1", + "Port": 502 + }, + "LoadOnDc": { + "DeviceState": 0, + "Host": "false", + "Port": 0 + }, + "TruConvertDcIp": { + "DeviceState": 1, + "Host": "10.0.3.1", + "Port": 502 + }, + "BatteryIp": { + "DeviceState": 1, + "Host": "localhost", + "Port": 6855 + }, + "BatteryNodes": [ // this is a list of nodes + 2, + 3, + 4, + 5, + 6 + ] + }, + "S3": { // this is parameters of S3 Buckets and co + "Bucket": "8-3e5b3069-214a-43ee-8d85-57d72000c19d", + "Region": "sos-ch-dk-2", + "Provider": "exo.io", + "Key": "EXO502627299197f83e8b090f63", + "Secret": "jUNYJL6B23WjndJnJlgJj4rc1i7uh981u5Aba5xdA5s", + "ContentType": "text/plain; charset=utf-8", + "Host": "8-3e5b3069-214a-43ee-8d85-57d72000c19d.sos-ch-dk-2.exo.io", + "Url": "https://8-3e5b3069-214a-43ee-8d85-57d72000c19d.sos-ch-dk-2.exo.io" + } diff --git a/csharp/App_backup/SodiStoreMax/Doc/States_Table.xlsx b/csharp/App_backup/SodiStoreMax/Doc/States_Table.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..776df481c302db83a3432e19368da995773906b0 GIT binary patch literal 13885 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 + + + + + + + + + + + + + + + + + + + + + + + 19 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 3 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 9 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 1 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 13 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 29 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 23 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 5 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 7 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + + 11 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + + 15 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 21 + K1 ✓ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 17 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + + 25 + K1 ✓ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + + 27 + K1 ✓ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + + 31 + K1 ✓ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + + switch to +grid tie + + + + + + + + + + + + + + + K3's open + + + + + + + + + + + + close K2 + + + + + + + + + + + + turn on +Inverters + + + + + + + + + + + + K3's close + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + + turn on +Inverters + + + + + + + + + + + + close K2 + + + + + + + + + + + + + + + turn off +inverter + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + + + + turn off +inverters + + + + + + + + + diff --git a/csharp/App_backup/SodiStoreMax/Doc/TransitionToIsland.graphml b/csharp/App_backup/SodiStoreMax/Doc/TransitionToIsland.graphml new file mode 100644 index 000000000..800dffa96 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/Doc/TransitionToIsland.graphml @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + 28 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 24 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 8 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 6 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 0 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 4 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 22 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 16 + K1 ✘ +K2 ✘ +K3 ✘ + + + + + + + + + + + + + + 20 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 18 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 2 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 10 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 12 + K1 ✘ +K2 ✘ +K3 ✓ + + + + + + + + + + + + + + 14 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + + 26 + K1 ✘ +K2 ✓ +K3 ✘ + + + + + + + + + + + + + + 30 + K1 ✘ +K2 ✓ +K3 ✓ + + + + + + + + + + + + + K3's open + + + + + + + + + + + K3's close + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + + + + + switch to +island mode + + + + + + + + + + + + turn on +inverters + + + + + + + + + + + turn off +Inverters + + + + + + + + + + + + + + K3 opens + + + + + + + + + + + + open K2 + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + + + + open K2 + + + + + + + + + + + + open K2 + + + + + + + + + + + + + + + K3 opens + + + + + + + + + + + + open K2 + + + + + + + + + + + + turn off +inverters + + + + + + + + + + + + turn off +inverters + + + + + + + + + diff --git a/csharp/App_backup/SodiStoreMax/HostList.txt b/csharp/App_backup/SodiStoreMax/HostList.txt new file mode 100755 index 000000000..9a03162c9 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/HostList.txt @@ -0,0 +1,14 @@ + +Prototype ie-entwicklung@10.2.3.115 Prototype +Salimax0001 ie-entwicklung@10.2.3.104 Marti Technik (Bern) +Salimax0002 ie-entwicklung@10.2.4.29 Weidmann d (ZG) +Salimax0003 ie-entwicklung@10.2.4.33 Elektrotechnik Stefan GmbH +Salimax0004 ie-entwicklung@10.2.4.32 Biohof Gubelmann (Walde) +Salimax0004A ie-entwicklung@10.2.4.153 +Salimax0005 ie-entwicklung@10.2.4.36 Schreinerei Schönthal (Thun) +Salimax0006 ie-entwicklung@10.2.4.35 Steakhouse Mettmenstetten +Salimax0007 ie-entwicklung@10.2.4.154 LerchenhofHerr Twannberg +Salimax0008 ie-entwicklung@10.2.4.113 Wittmann Kottingbrunn +Salimax0010 ie-entwicklung@10.2.4.211 Mohatech 1 (Beat Moser) +Salimax0011 ie-entwicklung@10.2.4.239 Thomas Tschirren (Enggistein) +SalidomoServer ig@134.209.238.170 \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/SodiStoreMax.csproj b/csharp/App_backup/SodiStoreMax/SodiStoreMax.csproj new file mode 100644 index 000000000..c40ce5aa8 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/SodiStoreMax.csproj @@ -0,0 +1,32 @@ + + + + + InnovEnergy.App.SodiStoreMax + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csharp/App_backup/SodiStoreMax/deploy.sh b/csharp/App_backup/SodiStoreMax/deploy.sh new file mode 100755 index 000000000..941647e33 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/deploy.sh @@ -0,0 +1,21 @@ +#!/bin/bash +dotnet_version='net6.0' +salimax_ip="$1" +username='ie-entwicklung' +root_password='Salimax4x25' +set -e + +echo -e "\n============================ Build ============================\n" + +dotnet publish \ + ./SodiStoreMax.csproj \ + -p:PublishTrimmed=false \ + -c Release \ + -r linux-x64 + +echo -e "\n============================ Deploy ============================\n" + +rsync -v \ + --exclude '*.pdb' \ + ./bin/Release/$dotnet_version/linux-x64/publish/* \ + $username@"$salimax_ip":~/salimax \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/deploy_all_installations.sh b/csharp/App_backup/SodiStoreMax/deploy_all_installations.sh new file mode 100755 index 000000000..533946856 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/deploy_all_installations.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +dotnet_version='net6.0' +salimax_ip="$1" +username='ie-entwicklung' +root_password='Salimax4x25' + +set -e + +echo -e "\n============================ Build ============================\n" + +dotnet publish \ + ./SaliMax.csproj \ + -p:PublishTrimmed=false \ + -c Release \ + -r linux-x64 + +echo -e "\n============================ Deploy ============================\n" +#ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.29" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" "10.2.4.113" "10.2.4.211") +#ip_addresses=("10.2.4.154" "10.2.4.29") +ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.29" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" ) + + + +for ip_address in "${ip_addresses[@]}"; do + rsync -v \ + --exclude '*.pdb' \ + ./bin/Release/$dotnet_version/linux-x64/publish/* \ + $username@"$ip_address":~/salimax + + ssh "$username"@"$ip_address" "cd salimax && echo '$root_password' | sudo -S ./restart" + + echo "Deployed and ran commands on $ip_address" +done + + + diff --git a/csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download-bms-log b/csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download-bms-log new file mode 100644 index 000000000..b9c2e8f23 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download-bms-log @@ -0,0 +1,284 @@ +#!/usr/bin/python2 -u +# coding=utf-8 +import os +import re +import struct +import serial +import logging +from sys import argv, exit +from datetime import datetime +from pymodbus.pdu import ModbusRequest, ModbusResponse, ExceptionResponse +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.exceptions import ModbusException +from pymodbus.pdu import ExceptionResponse +from pymodbus.factory import ClientDecoder +from pymodbus.client import ModbusSerialClient as Modbus +logging.basicConfig(level=logging.INFO) + + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import List, Optional, NoReturn + +RESET_REGISTER = 0x2087 +FIRMWARE_VERSION_REGISTER = 1054 +SERIAL_STARTER_DIR = '/opt/victronenergy/serial-starter/' +INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' +OUTPUT_DIR = '/data/innovenergy' + + +class ReadLogRequest(ModbusRequest): + + function_code = 0x42 + _rtu_frame_size = 5 # not used + + def __init__(self, address = None, **kwargs): + + ModbusRequest.__init__(self, **kwargs) + self.sub_function = 0 if address is None else 1 + self.address = address + + # FUGLY as hell, but necessary bcs PyModbus cannot deal + # with responses that have lengths depending on the sub_function. + # it goes without saying that this isn't thread-safe + ReadLogResponse._rtu_frame_size = 9 if self.sub_function == 0 else 9+128 + + def encode(self): + + if self.sub_function == 0: + return struct.pack('>B', self.sub_function) + else: + return struct.pack('>BI', self.sub_function, self.address) + + def decode(self, data): + self.sub_function = struct.unpack('>B', data) + + def execute(self, context): + print("EXECUTE1") + + def get_response_pdu_size(self): + return ReadLogResponse._rtu_frame_size - 3 + + def __str__(self): + return "ReadLogAddressRequest" + + +class ReadLogResponse(ModbusResponse): + + function_code = 0x42 + _rtu_frame_size = 9 # the WHOLE frame incl crc + + def __init__(self, sub_function=0, address=b'\x00', data=None, **kwargs): + ModbusResponse.__init__(self, **kwargs) + self.sub_function = sub_function + self.address = address + self.data = data + + def encode(self): + pass + + def decode(self, data): + self.address, self.address = struct.unpack_from(">BI", data) + self.data = data[5:] + + def __str__(self): + arguments = (self.function_code, self.address) + return "ReadLogAddressResponse(%s, %s)" % arguments + +# unfortunately we have to monkey-patch this global table because +# the current (victron) version of PyModbus does not have a +# way to "register" new function-codes yet +ClientDecoder.function_table.append(ReadLogResponse) + + +class LockTTY(object): + + def __init__(self, tty): + # type: (str) -> None + self.tty = tty + + def __enter__(self): + os.system(SERIAL_STARTER_DIR + 'stop-tty.sh ' + self.tty) + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + os.system(SERIAL_STARTER_DIR + 'start-tty.sh ' + self.tty) + + +def wrap_try_except(error_msg): + def decorate(f): + def applicator(*args, **kwargs): + try: + return f(*args, **kwargs) + except: + print(error_msg) + exit(1) + return applicator + return decorate + + +def init_modbus(tty): + # type: (str) -> Modbus + + return Modbus( + port='/dev/' + tty, + method='rtu', + baudrate=115200, + stopbits=1, + bytesize=8, + timeout=0.5, # seconds + parity=serial.PARITY_ODD) + + +@wrap_try_except("Failed to download BMS log!") +def download_log(modbus, node_id, battery_id): + # type: (Modbus, int, str) -> NoReturn + + # Get address of latest log entry + # request = ReadLogRequest(unit=slave_id) + + print ('downloading BMS log from node ' + str(node_id) + ' ...') + + progress = -1 + log_file = battery_id + "-node" + str(node_id) + "-" + datetime.now().strftime('%d-%m-%Y') + ".bin" + print(log_file) + + with open(log_file, 'w') as f: + + eof = 0x200000 + record = 0x40 + for address in range(0, eof, 2*record): + + percent = int(100*address/eof) + + if percent != progress: + progress = percent + print('\r{}% '.format(progress),end='') + + request = ReadLogRequest(address, slave=node_id) + result = modbus.execute(request) # type: ReadLogResponse + + address1 = "{:06X}".format(address) + address2 = "{:06X}".format(address+record) + + data1 = result.data[:record] + data2 = result.data[record:] + + line1 = address1 + ":" + ''.join('{:02X}'.format(byte) for byte in data1) + line2 = address2 + ":" + ''.join('{:02X}'.format(byte) for byte in data2) + + lines = line1 + "\n" + line2 + "\n" + f.write(lines) + + print("\r100%") + print("done") + print("wrote log to " + log_file) + + return True + + +@wrap_try_except("Failed to contact battery!") +def identify_battery(modbus, node_id): + # type: (Modbus, int) -> str + + target = 'battery #' + str(node_id) + print('contacting ' + target + ' ...') + + request = ReportSlaveIdRequest(slave=node_id) + response = modbus.execute(request) + + index_of_ff = response.identifier.find(b'\xff') + sid_response = response.identifier[index_of_ff + 1:].decode('utf-8').split(' ') + + response = modbus.read_input_registers(address=FIRMWARE_VERSION_REGISTER, count=1, slave=node_id) + + fw = '{0:0>4X}'.format(response.registers[0]) + print("log string is",sid_response[0]+"-"+sid_response[1]+"-"+fw) + + #return re.sub(" +", "-", sid + " " + fw) + return sid_response[0]+"-"+sid_response[1]+"-"+fw + + +def is_int(value): + # type: (str) -> bool + try: + _ = int(value) + return True + except ValueError: + return False + + +def print_usage(): + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' 2 ttyUSB0') + print ('') + print ('You can omit the "ttyUSB" prefix of the serial device:') + print (' ' + __file__ + ' 2 0') + print ('') + print ('You can omit the serial device entirely when the "com.victronenergy.battery." service is running:') + print (' ' + __file__ + ' 2') + print ('') + + +def get_tty_from_battery_service_name(): + # type: () -> Optional[str] + + import dbus + bus = dbus.SystemBus() + + tty = ( + name.split('.')[-1] + for name in bus.list_names() + if name.startswith('com.victronenergy.battery.') + ) + + return next(tty, None) + + +def parse_tty(tty): + # type: (Optional[str]) -> str + + if tty is None: + return get_tty_from_battery_service_name() + + if is_int(tty): + return 'ttyUSB' + argv[1] + else: + return tty + + +def parse_cmdline_args(argv): + # type: (List[str]) -> (str, int) + + slave_id = element_at_or_none(argv, 0) + tty = parse_tty(element_at_or_none(argv, 1)) + + if slave_id is None or tty is None: + print_usage() + exit(2) + + print("tty=",tty) + print("slave id= ",slave_id) + + return tty, int(slave_id) + + +def element_at_or_none(lst, index): + return next(iter(lst[index:]), None) + + +def main(argv): + # type: (List[str]) -> () + + tty, node_id = parse_cmdline_args(argv) + + with init_modbus(tty) as modbus: + battery_id = identify_battery(modbus, node_id) + download_log(modbus, node_id, battery_id) + + exit(0) + + +main(argv[1:]) diff --git a/csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download_battery_logs.sh b/csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download_battery_logs.sh new file mode 100755 index 000000000..20c3f05b4 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/downloadBatteryLogs/download_battery_logs.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +#Prototype 10.2.3.115 Prototype +#Salimax0001 10.2.3.104 Marti Technik (Bern) +#Salimax0002 10.2.4.29 Weidmann d (ZG) +#Salimax0003 10.2.4.33 Elektrotechnik Stefan GmbH +#Salimax0004 10.2.4.32 Biohof Gubelmann (Walde) +#Salimax0005 10.2.4.36 Schreinerei Schönthal (Thun) +#Salimax0006 10.2.4.35 Steakhouse Mettmenstetten +#Salimax0007 10.2.4.154 LerchenhofHerr Twannberg +#Salimax0008 10.2.4.113 Wittmann Kottingbrunn + +dotnet_version='net6.0' +ip_address="$1" +battery_ids="$2" +username='ie-entwicklung' +root_password='Salimax4x25' + +if [ "$#" -lt 2 ]; then + echo "Error: Insufficient arguments. Usage: $0 " + exit 1 +fi + +# Function to expand battery ids from a range +expand_battery_ids() { + local range="$1" + local expanded_ids=() + + IFS='-' read -r start end <<< "$range" + for ((i = start; i <= end; i++)); do + expanded_ids+=("$i") + done + + echo "${expanded_ids[@]}" +} + +# Check if battery_ids_arg contains a hyphen indicating a range +if [[ "$battery_ids" == *-* ]]; then + # Expand battery ids from the range + battery_ids=$(expand_battery_ids "$battery_ids") +else + # Use the provided battery ids + battery_ids=("$battery_ids") +fi + +echo "ip_address: $ip_address" +echo "Battery_ids: ${battery_ids[@]}" + +#ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" "10.2.4.113" "10.2.4.29") +#battery_ids=("2" "3" "4" "5" "6" "7" "8" "9" "10" "11") + +set -e + +scp download-bms-log "$username"@"$ip_address":/home/"$username" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl stop battery.service" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S apt install python3-pip -y" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S pip3 install pymodbus" + +for battery in "${battery_ids[@]}"; do + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S python3 download-bms-log " "$battery" " ttyUSB0" +done +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl start battery.service" +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S rm download-bms-log" +scp "$username"@"$ip_address":/home/"$username/*.bin" . +ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S rm *.bin" + +echo "Deployed and ran commands on $ip_address" +done + + diff --git a/csharp/App_backup/SodiStoreMax/resources/Battery.Service b/csharp/App_backup/SodiStoreMax/resources/Battery.Service new file mode 100644 index 000000000..ebead9a53 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/resources/Battery.Service @@ -0,0 +1,12 @@ +[Unit] +Description=Battery48TL_TCP_Bridge + +[Service] +Type=simple +ExecStart=socat -x -d -d TCP-LISTEN:6855 GOPEN:/dev/ttyUSB0,rawer,b115200,cs8,parenb=1,parodd=1 +Restart=always +RestartSec=500ms +StartLimitInterval=0 + +[Install] +WantedBy=multi-user.target diff --git a/csharp/App_backup/SodiStoreMax/resources/PublicKey b/csharp/App_backup/SodiStoreMax/resources/PublicKey new file mode 100644 index 000000000..ae41b2935 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/resources/PublicKey @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCed5ANekhbdV/8nEwFyaqxbPGON+NZKAkZXKx2aMAbX6jYQpusXSf4lKxEp4vHX9q2ScWycluUEhlzwe9vaWIK6mxEG9gjtU0/tKIavqZ6qpcuiglal750e8tlDh+lAgg5K3v4tvV4uVEfFc42UzSC9cIBBKPBC41dc0xQKyFIDsSH6Qha1nyncKRC3OXUkOiiRvmbd4PVc9A5ah2vt+661pghZE19Qeh5ROn/Sma9C+9QIyUDCylezqptnT+Jdvs+JMCHk8nKK2A0bz1w0a8zzO7M1RLHfBLQ6o1SQAdV/Pmon8uQ9vLHc86l5r7WSTMEcjAqY3lGE9mdxsSZWNmp InnovEnergy \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/resources/Salimax.Service b/csharp/App_backup/SodiStoreMax/resources/Salimax.Service new file mode 100644 index 000000000..d823b591f --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/resources/Salimax.Service @@ -0,0 +1,13 @@ +[Unit] +Description=Salimax Controller +Wants=battery.service + +[Service] +WorkingDirectory=/home/ie-entwicklung/salimax +ExecStart=/home/ie-entwicklung/salimax/SaliMax +WatchdogSec=30s +Restart=always +RestartSec=500ms + +[Install] +WantedBy=multi-user.target diff --git a/csharp/App_backup/SodiStoreMax/src/AggregationService/Aggregator.cs b/csharp/App_backup/SodiStoreMax/src/AggregationService/Aggregator.cs new file mode 100644 index 000000000..3fe1d40ed --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/AggregationService/Aggregator.cs @@ -0,0 +1,356 @@ +using InnovEnergy.App.SodiStoreMax.Ess; +using InnovEnergy.Lib.Utils; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using static System.Double; + +namespace InnovEnergy.App.SodiStoreMax.AggregationService; + + +public static class Aggregator +{ + + public static async Task HourlyDataAggregationManager() + { + var currentDateTime = DateTime.Now; + var nextRoundedHour = currentDateTime.AddHours(1).AddMinutes(-currentDateTime.Minute).AddSeconds(-currentDateTime.Second); + + // Calculate the time until the next rounded hour + var timeUntilNextHour = nextRoundedHour - currentDateTime; + + // Output the current and next rounded hour times + Console.WriteLine("------------------------------------------HourlyDataAggregationManager-------------------------------------------"); + Console.WriteLine("Current Date and Time: " + currentDateTime); + Console.WriteLine("Next Rounded Hour: " + nextRoundedHour); + // Output the time until the next rounded hour + Console.WriteLine("Waiting for " + timeUntilNextHour.TotalMinutes + " minutes..."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + // Wait until the next rounded hour + await Task.Delay(timeUntilNextHour); + + while (true) + { + try + { + AggregatedData hourlyAggregatedData = CreateHourlyData("JsonLogDirectory",DateTime.Now.AddHours(-1).ToUnixTime(),DateTime.Now.ToUnixTime()); + hourlyAggregatedData.Save("HourlyData"); + } + catch (Exception e) + { + Console.WriteLine("An error has occured when calculating hourly aggregated data, exception is:\n" + e); + } + await Task.Delay(TimeSpan.FromHours(1)); + } + } + + public static async Task DailyDataAggregationManager() + { + var currentDateTime = DateTime.Now; + var nextRoundedHour = currentDateTime.AddDays(1).AddHours(-currentDateTime.Hour).AddMinutes(-currentDateTime.Minute).AddSeconds(-currentDateTime.Second); + + // Calculate the time until the next rounded hour + var timeUntilNextDay = nextRoundedHour - currentDateTime; + Console.WriteLine("------------------------------------------DailyDataAggregationManager-------------------------------------------"); + // Output the current and next rounded hour times + Console.WriteLine("Current Date and Time: " + currentDateTime); + Console.WriteLine("Next Rounded Hour: " + nextRoundedHour); + // Output the time until the next rounded hour + Console.WriteLine("Waiting for " + timeUntilNextDay.TotalHours + " hours..."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + // Wait until the next rounded hour + await Task.Delay(timeUntilNextDay); + + while (true) + { + try + { + var currentTime = DateTime.Now; + AggregatedData dailyAggregatedData = CreateDailyData("HourlyData",currentTime.AddDays(-1).ToUnixTime(),currentTime.ToUnixTime()); + dailyAggregatedData.Save("DailyData"); + if (await dailyAggregatedData.PushToS3()) + { + //DeleteHourlyData("HourlyData",currentTime.ToUnixTime()); + //AggregatedData.DeleteDailyData("DailyData"); + } + + } + catch (Exception e) + { + Console.WriteLine("An error has occured when calculating daily aggregated data, exception is:\n" + e); + } + await Task.Delay(TimeSpan.FromDays(1)); + } + } + + private static void DeleteHourlyData(String myDirectory, Int64 beforeTimestamp) + { + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); + Console.WriteLine("Delete data before"+beforeTimestamp); + foreach (var jsonFile in jsonFiles) + { + if (IsFileWithinTimeRange(jsonFile, 0, beforeTimestamp)) + { + File.Delete(jsonFile); + Console.WriteLine($"Deleted hourly data file: {jsonFile}"); + } + } + } + + // this for test + private static AggregatedData CreateHourlyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) + { + // Get all CSV files in the specified directory + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); + var batterySoc = new List(); + var pvPowerSum = new List(); + var heatingPower = new List(); + var gridPowerImport = new List(); + var gridPowerExport = new List(); + var batteryDischargePower = new List(); + var batteryChargePower = new List(); + + + Console.WriteLine("File timestamp should start after "+ afterTimestamp); + + foreach (var jsonFile in jsonFiles) + { + if (jsonFile == "LogDirectory/log.json") + { + continue; + } + + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) + { + try + { + // Read and parse JSON + + var jsonData = File.ReadAllText(jsonFile); + + // Step 2: Find the first '{' character and trim everything before it + int startIndex = jsonData.IndexOf('{'); + if (startIndex != -1) + { + jsonData = jsonData.Substring(startIndex); // Trim everything before '{' + } + + var jsonObject = JObject.Parse(jsonData); + + + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Soc"] != null) + { + batterySoc.Add((double)jsonObject["Battery"]["Soc"]); + } + if (jsonObject["PvOnDc"] != null && jsonObject["PvOnDc"]["DcWh"] != null) + { + pvPowerSum.Add((double)jsonObject["PvOnDc"]["DcWh"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["Dc"]["Power"] != null) + { + double batteryPower = (double)jsonObject["Battery"]["Dc"]["Power"]; + if (batteryPower < 0) + batteryDischargePower.Add(batteryPower); + else + batteryChargePower.Add(batteryPower); + } + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerExportT3"] != null) + { + gridPowerExport.Add((double)jsonObject["GridMeter"]["ActivePowerExportT3"]); + } + if (jsonObject["GridMeter"] != null && jsonObject["GridMeter"]["ActivePowerImportT3"] != null) + { + gridPowerImport.Add((double)jsonObject["GridMeter"]["ActivePowerImportT3"]); + } + if (jsonObject["Battery"] != null && jsonObject["Battery"]["HeatingPower"] != null) + { + heatingPower.Add((double)jsonObject["Battery"]["HeatingPower"]); + } + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); + } + } + } + + //Average Power (Watts)= Sum of Power Readings/Number of Readings + + //Then, you can use the average power in the energy formula: + // + //Energy (kWh)= (Average Power / 3600) × Time (1 seconds) + // + // Dividing the Average power readings by 3600 converts the result from watt-seconds to kilowatt-hours. + + var dischargingEnergy = (batteryDischargePower.Any() ? batteryDischargePower.Average() : 0.0) / 3600; + var chargingEnergy = (batteryChargePower.Any() ? batteryChargePower.Average() : 0.0) / 3600; + var heatingPowerAvg = (heatingPower.Any() ? heatingPower.Average() : 0.0) / 3600; + + var dMaxSoc = batterySoc.Any() ? batterySoc.Max() : 0.0; + var dMinSoc = batterySoc.Any() ? batterySoc.Min() : 0.0; + var dSumGridExportPower = gridPowerExport.Any() ? gridPowerExport.Max() - gridPowerExport.Min(): 0.0; + var dSumGridImportPower = gridPowerImport.Any() ? gridPowerImport.Max() - gridPowerImport.Min(): 0.0; + var dSumPvPower = pvPowerSum.Any() ? pvPowerSum.Max() : 0.0; + + + AggregatedData aggregatedData = new AggregatedData + { + MaxSoc = Math.Round(dMaxSoc, 2), + MinSoc = Math.Round(dMinSoc, 2) , + DischargingBatteryPower = Math.Round(dischargingEnergy, 2) , + ChargingBatteryPower = Math.Round(chargingEnergy, 2) , + GridExportPower = Math.Round(dSumGridExportPower, 2) , + GridImportPower = Math.Round(dSumGridImportPower, 2) , + PvPower = Math.Round(dSumPvPower, 2) , + HeatingPower = Math.Round(heatingPowerAvg, 2) + }; + + // Print the stored CSV data for verification + Console.WriteLine($"Max SOC: {aggregatedData.MaxSoc}"); + Console.WriteLine($"Min SOC: {aggregatedData.MinSoc}"); + + Console.WriteLine($"DischargingBatteryBattery: {aggregatedData.DischargingBatteryPower}"); + Console.WriteLine($"ChargingBatteryPower: {aggregatedData.ChargingBatteryPower}"); + + Console.WriteLine($"SumGridExportPower: {aggregatedData.GridExportPower}"); + Console.WriteLine($"SumGridImportPower: {aggregatedData.GridImportPower}"); + + Console.WriteLine($"Min SOC: {aggregatedData.MinSoc}"); + + + Console.WriteLine("CSV data reading and storage completed."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + return aggregatedData; + } + + private static AggregatedData CreateDailyData(String myDirectory, Int64 afterTimestamp, Int64 beforeTimestamp) + { + // Get all CSV files in the specified directory + var jsonFiles = Directory.GetFiles(myDirectory, "*.json"); + var batterySoc = new List(); + var pvPower = new List(); + var gridPowerImport = new List(); + var gridPowerExport = new List(); + var batteryDischargePower = new List(); + var batteryChargePower = new List(); + var heatingPowerAvg = new List(); + + + + Console.WriteLine("File timestamp should start after "+ afterTimestamp); + + foreach (var jsonFile in jsonFiles) + { + if (jsonFile == "LogDirectory/log.json") + { + continue; + } + + if (IsFileWithinTimeRange(jsonFile, afterTimestamp, beforeTimestamp)) + { + + try + { + var jsonData = File.ReadAllText(jsonFile); + //Console.WriteLine("Parse file "+jsonFile); + + // Parse JSON into a Dictionary + var jsonDict = JsonConvert.DeserializeObject>(jsonData); + + // Process values + foreach (var (variableName, value) in jsonDict) + { + switch (variableName) + { + case "MinSoc": + case "MaxSoc": + batterySoc.Add(value); + break; + + case "PvPower": + pvPower.Add(value); + break; + + case "DischargingBatteryPower": + batteryDischargePower.Add(value); + break; + + case "ChargingBatteryPower": + batteryChargePower.Add(value); + break; + + case "GridExportPower": + gridPowerExport.Add(value); + break; + + case "GridImportPower": + gridPowerImport.Add(value); + break; + + case "HeatingPower": + heatingPowerAvg.Add(value); + break; + + default: + // Ignore unknown variables + break; + } + } + + } + catch (Exception e) + { + Console.WriteLine($"Failed to parse JSON file {jsonFile}: {e.Message}"); + } + + + } + } + + AggregatedData aggregatedData = new AggregatedData + { + MaxSoc = batterySoc.Any() ? batterySoc.Max() : 0.0, + MinSoc = batterySoc.Any() ? batterySoc.Min() : 0.0, + DischargingBatteryPower = batteryDischargePower.Any() ? batteryDischargePower.Average(): 0.0, + ChargingBatteryPower = batteryChargePower.Any() ? batteryChargePower.Average() : 0.0, + GridExportPower = gridPowerExport.Any() ? gridPowerExport.Sum() : 0.0, + GridImportPower = gridPowerImport.Any() ? gridPowerImport.Sum() : 0.0, + PvPower = pvPower.Any() ? pvPower.Last() : 0.0, + HeatingPower = heatingPowerAvg.Any() ? heatingPowerAvg.Average() : 0.0, + }; + + // Print the stored CSV data for verification + Console.WriteLine($"Pv Power: {aggregatedData.PvPower}"); + Console.WriteLine($"Heating Power: {aggregatedData.HeatingPower}"); + Console.WriteLine($"Max SOC: {aggregatedData.MaxSoc}"); + Console.WriteLine($"Min SOC: {aggregatedData.MinSoc}"); + + Console.WriteLine($"ChargingBatteryPower: {aggregatedData.DischargingBatteryPower}"); + Console.WriteLine($"DischargingBatteryBattery: {aggregatedData.ChargingBatteryPower}"); + + Console.WriteLine($"SumGridExportPower: {aggregatedData.GridExportPower}"); + Console.WriteLine($"SumGridImportPower: {aggregatedData.GridImportPower}"); + + + + Console.WriteLine("CSV data reading and storage completed."); + Console.WriteLine("-----------------------------------------------------------------------------------------------------------------"); + + return aggregatedData; + } + + // Custom method to check if a string is numeric + private static Boolean GetVariable(String value, String path) + { + return value == path; + } + + private static Boolean IsFileWithinTimeRange(string filePath, long startTime, long endTime) + { + var fileTimestamp = long.TryParse(Path.GetFileNameWithoutExtension(filePath).Replace("log_", ""), out var fileTimestamp1) ? fileTimestamp1 : -1; + + return fileTimestamp >= startTime && fileTimestamp < endTime; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/AggregationService/HourlyData.cs b/csharp/App_backup/SodiStoreMax/src/AggregationService/HourlyData.cs new file mode 100644 index 000000000..79ca6349e --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/AggregationService/HourlyData.cs @@ -0,0 +1,118 @@ +using System.IO.Compression; +using System.Text; +using System.Text.Json; +using Flurl.Http; +using InnovEnergy.App.SodiStoreMax.Devices; +using InnovEnergy.App.SodiStoreMax.SystemConfig; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; +using Newtonsoft.Json; +using static System.Text.Json.JsonSerializer; + +namespace InnovEnergy.App.SodiStoreMax.AggregationService; +// shut up trim warnings +#pragma warning disable IL2026 + +public class AggregatedData +{ + public required Double MinSoc { get; set; } + public required Double MaxSoc { get; set; } + public required Double PvPower { get; set; } + public required Double DischargingBatteryPower { get; set; } + public required Double ChargingBatteryPower { get; set; } + public required Double GridExportPower { get; set; } + public required Double GridImportPower { get; set; } + public required Double HeatingPower { get; set; } + + + private readonly S3Config? _S3Config = Config.Load().S3; + + public void Save(String directory) + { + var date = DateTime.Now.ToUnixTime(); + var defaultHDataPath = Environment.CurrentDirectory + "/" + directory + "/"; + var dataFilePath = defaultHDataPath + date + ".json"; + + if (!Directory.Exists(defaultHDataPath)) + { + Directory.CreateDirectory(defaultHDataPath); + Console.WriteLine("Directory created successfully."); + } + Console.WriteLine("data file path is " + dataFilePath); + + try + { + // Convert the object to a JSON string + var jsonString = JsonConvert.SerializeObject(this, Formatting.None); + + // Write JSON to file + File.WriteAllText(dataFilePath, jsonString); + } + catch (Exception e) + { + $"Failed to write config file {dataFilePath}\n{e}".WriteLine(); + throw; + } + } + + public static void DeleteDailyData(String directory) + { + + var jsonFiles = Directory.GetFiles(directory, "*.json"); + foreach (var jsonFile in jsonFiles) + { + File.Delete(jsonFile); + Console.WriteLine($"Deleted daily data file: {jsonFile}"); + } + } + + public async Task PushToS3() + { + var jsonString = JsonConvert.SerializeObject(this, Formatting.None); + if (_S3Config is null) + return false; + + var s3Path = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + ".json"; + var request = _S3Config.CreatePutRequest(s3Path); + + // Compress CSV data to a byte array + byte[] compressedBytes; + using (var memoryStream = new MemoryStream()) + { + //Create a zip directory and put the compressed file inside + using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) + { + var entry = archive.CreateEntry("data.json", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive + using (var entryStream = entry.Open()) + using (var writer = new StreamWriter(entryStream)) + { + writer.Write(jsonString); + } + } + + compressedBytes = memoryStream.ToArray(); + } + + // Encode the compressed byte array as a Base64 string + string base64String = Convert.ToBase64String(compressedBytes); + + // Create StringContent from Base64 string + var stringContent = new StringContent(base64String, Encoding.UTF8, "application/base64"); + + // Upload the compressed data (ZIP archive) to S3 + var response = await request.PutAsync(stringContent); + + + if (response.StatusCode != 200) + { + Console.WriteLine("ERROR: PUT"); + var error = await response.GetStringAsync(); + Console.WriteLine(error); + return false; + } + + return true; + } + + +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/DataTypes/AlarmOrWarning.cs b/csharp/App_backup/SodiStoreMax/src/DataTypes/AlarmOrWarning.cs new file mode 100644 index 000000000..762caad37 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/DataTypes/AlarmOrWarning.cs @@ -0,0 +1,9 @@ +namespace InnovEnergy.App.SodiStoreMax.DataTypes; + +public class AlarmOrWarning +{ + public String? Date { get; set; } + public String? Time { get; set; } + public String? Description { get; set; } + public String? CreatedBy { get; set; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/DataTypes/Configuration.cs b/csharp/App_backup/SodiStoreMax/src/DataTypes/Configuration.cs new file mode 100644 index 000000000..8610e2601 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/DataTypes/Configuration.cs @@ -0,0 +1,12 @@ +using InnovEnergy.App.SodiStoreMax.SystemConfig; + +namespace InnovEnergy.App.SodiStoreMax.DataTypes; + +public class Configuration +{ + public Double MinimumSoC { get; set; } + public Double GridSetPoint { get; set; } + public CalibrationChargeType CalibrationChargeState { get; set; } + public DateTime CalibrationChargeDate { get; set; } +} + diff --git a/csharp/App_backup/SodiStoreMax/src/DataTypes/StatusMessage.cs b/csharp/App_backup/SodiStoreMax/src/DataTypes/StatusMessage.cs new file mode 100644 index 000000000..d54d1f586 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/DataTypes/StatusMessage.cs @@ -0,0 +1,20 @@ +using InnovEnergy.App.SodiStoreMax.Ess; + +namespace InnovEnergy.App.SodiStoreMax.DataTypes; + +public class StatusMessage +{ + public required Int32 InstallationId { get; set; } + public required Int32 Product { get; set; } + public required SalimaxAlarmState Status { get; set; } + public required MessageType Type { get; set; } + public List? Warnings { get; set; } + public List? Alarms { get; set; } + public Int32 Timestamp { get; set; } +} + +public enum MessageType +{ + AlarmOrWarning, + Heartbit +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Devices/AcPowerDevice.cs b/csharp/App_backup/SodiStoreMax/src/Devices/AcPowerDevice.cs new file mode 100644 index 000000000..0b1033a05 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Devices/AcPowerDevice.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.App.SodiStoreMax.Devices; + +public class AcPowerDevice +{ + public required AcPower Power { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Devices/DcPowerDevice.cs b/csharp/App_backup/SodiStoreMax/src/Devices/DcPowerDevice.cs new file mode 100644 index 000000000..5579c5f12 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Devices/DcPowerDevice.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Power; + +namespace InnovEnergy.App.SodiStoreMax.Devices; + +public class DcPowerDevice +{ + public required DcPower Power { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Devices/DeviceState.cs b/csharp/App_backup/SodiStoreMax/src/Devices/DeviceState.cs new file mode 100644 index 000000000..6814e10ec --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Devices/DeviceState.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SodiStoreMax.Devices; + +public enum DeviceState +{ + Disabled, + Measured, + Computed +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Devices/SalimaxDevice.cs b/csharp/App_backup/SodiStoreMax/src/Devices/SalimaxDevice.cs new file mode 100644 index 000000000..61281bb24 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Devices/SalimaxDevice.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Utils.Net; + +namespace InnovEnergy.App.SodiStoreMax.Devices; + +public class SalimaxDevice : Ip4Address +{ + public required DeviceState DeviceState { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Ess/Controller.cs b/csharp/App_backup/SodiStoreMax/src/Ess/Controller.cs new file mode 100644 index 000000000..8e62b431a --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Ess/Controller.cs @@ -0,0 +1,269 @@ +using InnovEnergy.App.SodiStoreMax.SystemConfig; +using InnovEnergy.Lib.Devices.BatteryDeligreen; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc.DataTypes; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.SodiStoreMax.Ess; + +public static class Controller +{ + private static readonly Double MaxDischargePower = -4000; // By battery TODO: move to config + private static readonly Double MaxChargePower = 3500; // By battery TODO: move to config + + public static EssMode SelectControlMode(this StatusRecord s) + { + //return EssMode.OptimizeSelfConsumption; + + return s.StateMachine.State != 23 ? EssMode.Off + : s.MustReachMinSoc() ? EssMode.ReachMinSoc + : s.GridMeter is null ? EssMode.NoGridMeter + : EssMode.OptimizeSelfConsumption; + } + + + public static EssControl ControlEss(this StatusRecord s) + { + var mode = s.SelectControlMode().WriteLine(); + + if (mode is EssMode.Off) // to test on prototype + { + if (s.StateMachine.State == 28 ) + { + return new EssControl + { + LimitedBy = EssLimit.NoLimit, + Mode = EssMode.OffGrid, + PowerCorrection = 0, + PowerSetpoint = 0 + }; + } + return EssControl.Default; + } + + // if we have no reading from the Grid meter, but we have a grid power (K1 is close), + // then we do only heat the battery to avoid discharging the battery and the oscillation between reach min soc and off mode + if (mode is EssMode.NoGridMeter) + return new EssControl + { + LimitedBy = EssLimit.NoLimit, + Mode = EssMode.NoGridMeter, + PowerCorrection = 0, + PowerSetpoint = 0, //s.Battery == null ? 1000 : s.Battery.Devices.Count * s.Config.BatterySelfDischargePower // 1000 default value for heating the battery + }; + + var essDelta = s.ComputePowerDelta(mode); + + var unlimitedControl = new EssControl + { + Mode = mode, + LimitedBy = EssLimit.NoLimit, + PowerCorrection = essDelta, + PowerSetpoint = 0 + }; + + var limitedControl = unlimitedControl + .LimitChargePower(s) + .LimitDischargePower(s) + .LimitInverterPower(s); + + var currentPowerSetPoint = s.CurrentPowerSetPoint(); + + return limitedControl with { PowerSetpoint = currentPowerSetPoint + limitedControl.PowerCorrection }; + } + + private static EssControl LimitInverterPower(this EssControl control, StatusRecord s) + { + var powerDelta = control.PowerCorrection.Value; + + var acDcs = s.AcDc.Devices; + + var nInverters = acDcs.Count; + + if (nInverters < 2) + return control; // current loop cannot happen + + var nominalPower = acDcs.Average(d => d.Status.Nominal.Power); + var maxStep = nominalPower / 25; //TODO magic number to config + + var clampedPowerDelta = powerDelta.Clamp(-maxStep, maxStep); + + var dcLimited = acDcs.Any(d => d.Status.PowerLimitedBy == PowerLimit.DcLink); + + if (!dcLimited) + return control with { PowerCorrection = clampedPowerDelta }; + + var maxPower = acDcs.Max(d => d.Status.Ac.Power.Active.Value); + var minPower = acDcs.Min(d => d.Status.Ac.Power.Active.Value); + + var powerDifference = maxPower - minPower; + + if (powerDifference < maxStep) + return control with { PowerCorrection = clampedPowerDelta }; + + var correction = powerDifference / 4; //TODO magic number to config + + + // find out if we reach the lower or upper Dc limit by comparing the current Dc voltage to the reference voltage + return s.AcDc.Dc.Voltage > s.Config.GridTie.AcDc.ReferenceDcLinkVoltage + ? control with { PowerCorrection = clampedPowerDelta.ClampMax(-correction), LimitedBy = EssLimit.ChargeLimitedByMaxDcBusVoltage } + : control with { PowerCorrection = clampedPowerDelta.ClampMin(correction), LimitedBy = EssLimit.DischargeLimitedByMinDcBusVoltage }; + } + + + private static EssControl LimitChargePower(this EssControl control, StatusRecord s) + { + + //var maxInverterChargePower = s.ControlInverterPower(s.Config.MaxInverterPower); + var maxBatteryChargePower = s.MaxBatteryChargePower(); + maxBatteryChargePower.WriteLine(" Max Battery Charge Power"); + + return control + //.LimitChargePower(, EssLimit.ChargeLimitedByInverterPower) + .LimitChargePower(maxBatteryChargePower, EssLimit.ChargeLimitedByBatteryPower); + + } + + private static EssControl LimitDischargePower(this EssControl control, StatusRecord s) + { + var maxBatteryDischargeDelta = s.Battery?.Devices.Count * MaxDischargePower ?? 0; + var keepMinSocLimitDelta = s.ControlBatteryPower(s.HoldMinSocPower()); + maxBatteryDischargeDelta.WriteLine(" Max Battery Discharge Power"); + + + return control + .LimitDischargePower(maxBatteryDischargeDelta , EssLimit.DischargeLimitedByBatteryPower) + .LimitDischargePower(keepMinSocLimitDelta , EssLimit.DischargeLimitedByMinSoc); + } + + private static Double ComputePowerDelta(this StatusRecord s, EssMode mode) + { + var chargePower = s.AcDc.Devices.Sum(d => d.Status.Nominal.Power.Value); + + return mode switch + { + EssMode.ReachMinSoc => s.ControlInverterPower(chargePower), + EssMode.OptimizeSelfConsumption => s.ControlGridPower(s.Config.GridSetPoint), + EssMode.Off => 0, + EssMode.OffGrid => 0, + EssMode.NoGridMeter => 0, + _ => throw new ArgumentException(null, nameof(mode)) + }; + } + + // private static Boolean MustHeatBatteries(this StatusRecord s) + // { + // var batteries = s.GetBatteries(); +// + // if (batteries.Count <= 0) + // return true; // batteries might be there but BMS is without power +// + // return batteries + // .Select(b => b.Temperatures.State) + // .Contains(TemperatureState.Cold); + // } + + private static Double MaxBatteryChargePower(this StatusRecord s) + { + // This introduces a limit when we don't have communication with batteries + // Otherwise the limit will be 0 and the batteries will be not heated + + var batteries = s.GetBatteries(); + + var maxChargePower = batteries.Count == 0 + ? 0 + : batteries.Count * MaxChargePower; + + return maxChargePower; + } + + private static Double CurrentPowerSetPoint(this StatusRecord s) + { + return s + .AcDc + .Devices + .Select(d => + { + var acPowerControl = d.Control.Ac.Power; + + return acPowerControl.L1.Active + + acPowerControl.L2.Active + + acPowerControl.L3.Active; + }) + .Sum(p => p); + } + + private static Boolean MustReachMinSoc(this StatusRecord s) + { + var batteries = s.GetBatteries(); + + return batteries.Count > 0 + && batteries.Any(b => b.BatteryDeligreenDataRecord.Soc < s.Config.MinSoc); + } + + private static IReadOnlyList GetBatteries(this StatusRecord s) + { + return s.Battery?.Devices ?? Array.Empty(); + } + + private static Double ControlGridPower(this StatusRecord status, Double targetPower) + { + return ControlPower + ( + measurement : status.GridMeter!.Ac.Power.Active, + target : targetPower, + pConstant : status.Config.PConstant + ); + } + + private static Double ControlInverterPower(this StatusRecord status, Double targetInverterPower) + { + return ControlPower + ( + measurement : status.AcDc.Ac.Power.Active, + target : targetInverterPower, + pConstant : status.Config.PConstant + ); + } + + private static Double ControlBatteryPower(this StatusRecord status, Double targetBatteryPower) + { + return ControlPower + ( + measurement: status.GetBatteries().Sum(b => b.BatteryDeligreenDataRecord.Power), + target: targetBatteryPower, + pConstant: status.Config.PConstant + ); + } + + private static Double HoldMinSocPower(this StatusRecord s) + { + // TODO: explain LowSOC curve + + var batteries = s.GetBatteries(); + + if (batteries.Count == 0) + return Double.NegativeInfinity; + + var a = -2 * s.Config.BatterySelfDischargePower * batteries.Count / s.Config.HoldSocZone; + var b = -a * (s.Config.MinSoc + s.Config.HoldSocZone); + + return batteries.Min(d => d.BatteryDeligreenDataRecord.Soc.Value) * a + b; + } + + private static Double ControlPower(Double measurement, Double target, Double pConstant) + { + var error = target - measurement; + return error * pConstant; + } + + // ReSharper disable once UnusedMember.Local, TODO + private static Double ControlPowerWithIntegral(Double measurement, Double target, Double p, Double i) + { + var errorSum = 0; // this is must be sum of error + var error = target - measurement; + var kp = p * error; + var ki = i * errorSum; + return ki + kp; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Ess/EssControl.cs b/csharp/App_backup/SodiStoreMax/src/Ess/EssControl.cs new file mode 100644 index 000000000..66c3b3681 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Ess/EssControl.cs @@ -0,0 +1,53 @@ +using InnovEnergy.Lib.Units.Power; + +namespace InnovEnergy.App.SodiStoreMax.Ess; + +public record EssControl +{ + public required EssMode Mode { get; init; } + public required EssLimit LimitedBy { get; init; } + public required ActivePower PowerCorrection { get; init; } + public required ActivePower PowerSetpoint { get; init; } + + public static EssControl Default { get; } = new() + { + Mode = EssMode.Off, + LimitedBy = EssLimit.NoLimit, + PowerCorrection = 0, + PowerSetpoint = 0 + }; + + + public EssControl LimitChargePower(Double controlDelta, EssLimit reason) + { + var overload = PowerCorrection - controlDelta; + + if (overload <= 0) + return this; + + return this with + { + LimitedBy = reason, + PowerCorrection = controlDelta, + PowerSetpoint = PowerSetpoint - overload + }; + } + + public EssControl LimitDischargePower(Double controlDelta, EssLimit reason) + { + var overload = PowerCorrection - controlDelta; + + if (overload >= 0) + return this; + + return this with + { + LimitedBy = reason, + PowerCorrection = controlDelta, + PowerSetpoint = PowerSetpoint - overload + }; + } +} + + + diff --git a/csharp/App_backup/SodiStoreMax/src/Ess/EssLimit.cs b/csharp/App_backup/SodiStoreMax/src/Ess/EssLimit.cs new file mode 100644 index 000000000..4a814a790 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Ess/EssLimit.cs @@ -0,0 +1,20 @@ +namespace InnovEnergy.App.SodiStoreMax.Ess; + +public enum EssLimit +{ + NoLimit, + DischargeLimitedByMinSoc, + DischargeLimitedByBatteryPower, + DischargeLimitedByInverterPower, + ChargeLimitedByInverterPower, + ChargeLimitedByBatteryPower, + ChargeLimitedByMaxDcBusVoltage, + DischargeLimitedByMinDcBusVoltage, +} + + +// limitedBy = $"limiting discharging power in order to stay above min SOC: {s.Config.MinSoc}%"; +// limitedBy = $"limited by max battery discharging power: {maxDischargePower}"; +// limitedBy = $"limited by max inverter Dc to Ac power: {-s.Config.MaxInverterPower}W"; +// limitedBy = $"limited by max battery charging power: {maxChargePower}"; +// limitedBy = "limited by max inverter Ac to Dc power"; \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Ess/EssMode.cs b/csharp/App_backup/SodiStoreMax/src/Ess/EssMode.cs new file mode 100644 index 000000000..c81c5953c --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Ess/EssMode.cs @@ -0,0 +1,12 @@ +namespace InnovEnergy.App.SodiStoreMax.Ess; + +public enum EssMode +{ + Off, + OffGrid, + HeatBatteries, + CalibrationCharge, + ReachMinSoc, + NoGridMeter, + OptimizeSelfConsumption +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Ess/SalimaxAlarmState.cs b/csharp/App_backup/SodiStoreMax/src/Ess/SalimaxAlarmState.cs new file mode 100644 index 000000000..1cd7b3bd6 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Ess/SalimaxAlarmState.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SodiStoreMax.Ess; + +public enum SalimaxAlarmState +{ + Green, + Orange, + Red +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Ess/StatusRecord.cs b/csharp/App_backup/SodiStoreMax/src/Ess/StatusRecord.cs new file mode 100644 index 000000000..151ee0ff4 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Ess/StatusRecord.cs @@ -0,0 +1,33 @@ +using InnovEnergy.App.SodiStoreMax.Devices; +using InnovEnergy.App.SodiStoreMax.SaliMaxRelays; +using InnovEnergy.App.SodiStoreMax.System; +using InnovEnergy.App.SodiStoreMax.SystemConfig; +using InnovEnergy.Lib.Devices.AMPT; +using InnovEnergy.Lib.Devices.BatteryDeligreen; +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; + +namespace InnovEnergy.App.SodiStoreMax.Ess; + +public record StatusRecord +{ + public required AcDcDevicesRecord AcDc { get; init; } + public required DcDcDevicesRecord DcDc { get; init; } + public required BatteryDeligreenRecords? Battery { get; init; } + public required EmuMeterRegisters? GridMeter { get; init; } + public required EmuMeterRegisters? LoadOnAcIsland { get; init; } + public required AcPowerDevice? LoadOnAcGrid { get; init; } + public required AmptStatus? PvOnAcGrid { get; init; } + public required AmptStatus? PvOnAcIsland { get; init; } + public required AcPowerDevice? AcGridToAcIsland { get; init; } + public required DcPowerDevice? AcDcToDcLink { get; init; } + public required DcPowerDevice? LoadOnDc { get; init; } + public required IRelaysRecord? Relays { get; init; } + public required AmptStatus? PvOnDc { get; init; } + public required Config Config { get; set; } + public required SystemLog Log { get; init; } // TODO: init only + + public required EssControl EssControl { get; set; } // TODO: init only + public required StateMachine StateMachine { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Ess/SystemLog.cs b/csharp/App_backup/SodiStoreMax/src/Ess/SystemLog.cs new file mode 100644 index 000000000..71b58a9af --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Ess/SystemLog.cs @@ -0,0 +1,11 @@ +using InnovEnergy.App.SodiStoreMax.DataTypes; + +namespace InnovEnergy.App.SodiStoreMax.Ess; + +public record SystemLog +{ + public required String? Message { get; init; } + public required SalimaxAlarmState SalimaxAlarmState { get; init; } + public required List? SalimaxAlarms { get; set; } + public required List? SalimaxWarnings { get; set; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Flow.cs b/csharp/App_backup/SodiStoreMax/src/Flow.cs new file mode 100644 index 000000000..99e0ff452 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Flow.cs @@ -0,0 +1,56 @@ +using System.Diagnostics.CodeAnalysis; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; + + +namespace InnovEnergy.App.SodiStoreMax; + +public static class Flow +{ + private static readonly String RightArrowChar = ">"; + private static readonly String LeftArrowChar = "<"; + private static readonly String DownArrowChar = "V"; + private static readonly String UpArrowChar = "^"; + private static readonly String UnknownArrowChar = "?"; + + public static TextBlock Horizontal(Unit? amount) => Horizontal(amount, 10); + + public static TextBlock Horizontal(Unit? amount, Int32 width) + { + var label = amount?.ToDisplayString() ?? ""; + + var arrowChar = amount switch + { + { Value: < 0 } => LeftArrowChar, + { Value: >= 0 } => RightArrowChar, + _ => UnknownArrowChar, + }; + + //var arrowChar = amount.Value < 0 ? LeftArrowChar : RightArrowChar; + var arrow = Enumerable.Repeat(arrowChar, width).Join(); + + // note : appending "fake label" below to make it vertically symmetric + return TextBlock.AlignCenterHorizontal(label, arrow, ""); + } + + public static TextBlock Vertical(Unit? amount) => Vertical(amount, 4); + + [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")] + [SuppressMessage("ReSharper", "CoVariantArrayConversion")] + public static TextBlock Vertical(Unit? amount, Int32 height) + { + var label = amount?.ToDisplayString() ?? UnknownArrowChar; + var arrowChar = amount switch + { + { Value: < 0 } => UpArrowChar, + { Value: >= 0 } => DownArrowChar, + _ => UnknownArrowChar, + }; + + // var arrowChar = amount is null ? UnknownArrowChar + // : amount.Value < 0 ? UpArrowChar + // : DownArrowChar; + + return TextBlock.AlignCenterHorizontal(arrowChar, arrowChar, label, arrowChar, arrowChar); + } +} diff --git a/csharp/App_backup/SodiStoreMax/src/LogFileConcatenator.cs b/csharp/App_backup/SodiStoreMax/src/LogFileConcatenator.cs new file mode 100644 index 000000000..c5e63f6f4 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/LogFileConcatenator.cs @@ -0,0 +1,34 @@ +using System.Text; + +namespace InnovEnergy.App.SodiStoreMax; + +public class LogFileConcatenator +{ + private readonly string _logDirectory; + + public LogFileConcatenator(String logDirectory = "JsonLogDirectory/") + { + _logDirectory = logDirectory; + } + + public String ConcatenateFiles(int numberOfFiles) + { + var logFiles = Directory + .GetFiles(_logDirectory, "log_*.json") + .OrderByDescending(file => file) + .Take(numberOfFiles) + .OrderBy(file => file) + .ToList(); + + var concatenatedContent = new StringBuilder(); + + foreach (var fileContent in logFiles.Select(File.ReadAllText)) + { + concatenatedContent.AppendLine(fileContent); + //concatenatedContent.AppendLine(); // Append an empty line to separate the files // maybe we don't need this + } + + return concatenatedContent.ToString(); + } +} + diff --git a/csharp/App_backup/SodiStoreMax/src/Logfile.cs b/csharp/App_backup/SodiStoreMax/src/Logfile.cs new file mode 100644 index 000000000..75739b56d --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Logfile.cs @@ -0,0 +1,49 @@ +using InnovEnergy.Lib.Utils; +using Microsoft.Extensions.Logging; + +namespace InnovEnergy.App.SodiStoreMax; + +public class CustomLogger : ILogger +{ + private readonly String _logFilePath; + //private readonly Int64 _maxFileSizeBytes; + private readonly Int32 _maxLogFileCount; + private Int64 _currentFileSizeBytes; + + public CustomLogger(String logFilePath, Int32 maxLogFileCount) + { + _logFilePath = logFilePath; + _maxLogFileCount = maxLogFileCount; + _currentFileSizeBytes = File.Exists(logFilePath) ? new FileInfo(logFilePath).Length : 0; + } + + public IDisposable? BeginScope(TState state) where TState : notnull => throw new NotImplementedException(); + + public Boolean IsEnabled(LogLevel logLevel) => true; // Enable logging for all levels + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) + { + var logMessage = formatter(state, exception!); + + // Check the log file count and delete the oldest file if necessary + var logFileDir = Path.GetDirectoryName(_logFilePath)!; + var logFileExt = Path.GetExtension(_logFilePath); + var logFileBaseName = Path.GetFileNameWithoutExtension(_logFilePath); + + var logFiles = Directory + .GetFiles(logFileDir, $"{logFileBaseName}_*{logFileExt}") + .OrderBy(file => file) + .ToList(); + + if (logFiles.Count >= _maxLogFileCount) + { + File.Delete(logFiles.First()); + } + + var roundedUnixTimestamp = DateTime.Now.ToUnixTime() % 2 == 0 ? DateTime.Now.ToUnixTime() : DateTime.Now.ToUnixTime() + 1; + var timestamp = "Timestamp;" + roundedUnixTimestamp + Environment.NewLine; + + var logFileBackupPath = Path.Combine(logFileDir, $"{logFileBaseName}_{DateTime.Now.ToUnixTime()}{logFileExt}"); + File.AppendAllText(logFileBackupPath, timestamp + logMessage + Environment.NewLine); + } +} diff --git a/csharp/App_backup/SodiStoreMax/src/Logger.cs b/csharp/App_backup/SodiStoreMax/src/Logger.cs new file mode 100644 index 000000000..8b6a74252 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Logger.cs @@ -0,0 +1,40 @@ +using InnovEnergy.App.SodiStoreMax; +using Microsoft.Extensions.Logging; + +namespace InnovEnergy.App.SodiStoreMax; + +public static class Logger +{ + // Specify the maximum log file size in bytes (e.g., 1 MB) + + //private const Int32 MaxFileSizeBytes = 2024 * 30; // TODO: move to settings + private const Int32 MaxLogFileCount = 5000; // TODO: move to settings + private const String LogFilePath = "JsonLogDirectory/log.json"; // TODO: move to settings + + // ReSharper disable once InconsistentNaming + private static readonly ILogger _logger = new CustomLogger(LogFilePath, MaxLogFileCount); + + public static T LogInfo(this T t) where T : notnull + { + _logger.LogInformation(t.ToString()); // TODO: check warning + return t; + } + + public static T LogDebug(this T t) where T : notnull + { + _logger.LogDebug(t.ToString()); // TODO: check warning + return t; + } + + public static T LogError(this T t) where T : notnull + { + _logger.LogError(t.ToString()); // TODO: check warning + return t; + } + + public static T LogWarning(this T t) where T : notnull + { + _logger.LogWarning(t.ToString()); // TODO: check warning + return t; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/MiddlewareAgent.cs b/csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/MiddlewareAgent.cs new file mode 100644 index 000000000..6e1bd8c36 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/MiddlewareAgent.cs @@ -0,0 +1,93 @@ +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Text; +using System.Text.Json; +using InnovEnergy.App.SodiStoreMax.DataTypes; + +namespace InnovEnergy.App.SodiStoreMax.MiddlewareClasses; + +public static class MiddlewareAgent +{ + private static UdpClient _udpListener = null!; + private static IPAddress? _controllerIpAddress; + private static EndPoint? _endPoint; + + public static void InitializeCommunicationToMiddleware() + { + _controllerIpAddress = FindVpnIp(); + if (Equals(IPAddress.None, _controllerIpAddress)) + { + Console.WriteLine("There is no VPN interface, exiting..."); + } + + const Int32 udpPort = 9000; + _endPoint = new IPEndPoint(_controllerIpAddress, udpPort); + + _udpListener = new UdpClient(); + _udpListener.Client.Blocking = false; + _udpListener.Client.Bind(_endPoint); + } + + private static IPAddress FindVpnIp() + { + const String interfaceName = "innovenergy"; + + var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + + foreach (var networkInterface in networkInterfaces) + { + if (networkInterface.Name == interfaceName) + { + var ipProps = networkInterface.GetIPProperties(); + var uniCastIPs = ipProps.UnicastAddresses; + var controllerIpAddress = uniCastIPs[0].Address; + + Console.WriteLine("VPN IP is: "+ uniCastIPs[0].Address); + return controllerIpAddress; + } + } + + return IPAddress.None; + } + + public static Configuration? SetConfigurationFile() + { + if (_udpListener.Available > 0) + { + + IPEndPoint? serverEndpoint = null; + + var replyMessage = "ACK"; + var replyData = Encoding.UTF8.GetBytes(replyMessage); + + var udpMessage = _udpListener.Receive(ref serverEndpoint); + var message = Encoding.UTF8.GetString(udpMessage); + + var config = JsonSerializer.Deserialize(message); + + if (config != null) + { + Console.WriteLine($"Received a configuration message: GridSetPoint is " + config.GridSetPoint + + ", MinimumSoC is " + config.MinimumSoC + " and ForceCalibrationCharge is " + + config.CalibrationChargeState + " and CalibrationChargeDate is " + + config.CalibrationChargeDate); + + // Send the reply to the sender's endpoint + _udpListener.Send(replyData, replyData.Length, serverEndpoint); + Console.WriteLine($"Replied to {serverEndpoint}: {replyMessage}"); + return config; + } + } + + if (_endPoint != null && !_endPoint.Equals(_udpListener.Client.LocalEndPoint as IPEndPoint)) + { + Console.WriteLine("UDP address has changed, rebinding..."); + InitializeCommunicationToMiddleware(); + } + + + return null; + } + +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/RabbitMQManager.cs b/csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/RabbitMQManager.cs new file mode 100644 index 000000000..2de9f5665 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/MiddlewareClasses/RabbitMQManager.cs @@ -0,0 +1,61 @@ +using System.Text; +using System.Text.Json; +using InnovEnergy.App.SodiStoreMax.DataTypes; +using RabbitMQ.Client; + +namespace InnovEnergy.App.SodiStoreMax.MiddlewareClasses; + +public static class RabbitMqManager +{ + public static ConnectionFactory? Factory ; + public static IConnection ? Connection; + public static IModel? Channel; + + public static Boolean SubscribeToQueue(StatusMessage currentSalimaxState, String? s3Bucket,String VpnServerIp) + { + try + { + //_factory = new ConnectionFactory { HostName = VpnServerIp }; + + Factory = new ConnectionFactory + { + HostName = VpnServerIp, + Port = 5672, + VirtualHost = "/", + UserName = "producer", + Password = "b187ceaddb54d5485063ddc1d41af66f", + + }; + + Connection = Factory.CreateConnection(); + Channel = Connection.CreateModel(); + Channel.QueueDeclare(queue: "statusQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); + + Console.WriteLine("The controller sends its status to the middleware for the first time"); + if (s3Bucket != null) InformMiddleware(currentSalimaxState); + + + } + catch (Exception ex) + { + Console.WriteLine("An error occurred while connecting to the RabbitMQ queue: " + ex.Message); + return false; + } + return true; + } + + public static void InformMiddleware(StatusMessage status) + { + var message = JsonSerializer.Serialize(status); + var body = Encoding.UTF8.GetBytes(message); + + Channel.BasicPublish(exchange: string.Empty, + routingKey: "statusQueue", + basicProperties: null, + body: body); + + Console.WriteLine($"Producer sent message: {message}"); + } + + +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Program.cs b/csharp/App_backup/SodiStoreMax/src/Program.cs new file mode 100644 index 000000000..ec9f2e542 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Program.cs @@ -0,0 +1,945 @@ +#define Amax +#undef GridLimit + +using System.Diagnostics; +using System.IO.Compression; +using System.Reactive.Linq; +using System.Reactive.Threading.Tasks; +using System.Reflection.Metadata; +using System.Security; +using System.Text; +using Flurl.Http; +using InnovEnergy.App.SodiStoreMax; +using InnovEnergy.App.SodiStoreMax.Devices; +using InnovEnergy.App.SodiStoreMax.Ess; +using InnovEnergy.App.SodiStoreMax.MiddlewareClasses; +using InnovEnergy.App.SodiStoreMax.SaliMaxRelays; +using InnovEnergy.App.SodiStoreMax.System; +using InnovEnergy.App.SodiStoreMax.SystemConfig; +using InnovEnergy.Lib.Devices.AMPT; +using InnovEnergy.Lib.Devices.BatteryDeligreen; +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Devices.Trumpf.SystemControl; +using InnovEnergy.Lib.Devices.Trumpf.SystemControl.DataTypes; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc.DataTypes; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc.Control; +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Utils; +using InnovEnergy.App.SodiStoreMax.DataTypes; +using InnovEnergy.Lib.Utils.Net; +using static System.Int32; +using static InnovEnergy.App.SodiStoreMax.AggregationService.Aggregator; +using static InnovEnergy.App.SodiStoreMax.MiddlewareClasses.MiddlewareAgent; +using static InnovEnergy.Lib.Devices.Trumpf.SystemControl.DataTypes.SystemConfig; +using DeviceState = InnovEnergy.App.SodiStoreMax.Devices.DeviceState; + +#pragma warning disable IL2026 + +namespace InnovEnergy.App.SodiStoreMax; + +internal static class Program +{ + private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(2); + + private static readonly IReadOnlyList BatteryNodes; + + private static readonly Channel TruConvertAcChannel; + private static readonly Channel TruConvertDcChannel; + private static readonly Channel GridMeterChannel; + private static readonly Channel IslandBusLoadChannel; + private static readonly Channel PvOnDc; + private static readonly Channel PvOnAcGrid; + private static readonly Channel PvOnAcIsland; + private static readonly Channel RelaysChannel; + private static readonly Channel BatteriesChannel; + + private static Boolean _curtailFlag = false; + private const String VpnServerIp = "10.2.0.11"; + private static Boolean _subscribedToQueue = false; + private static Boolean _subscribeToQueueForTheFirstTime = false; + private static SalimaxAlarmState _prevSalimaxState = SalimaxAlarmState.Green; + private const UInt16 NbrOfFileToConcatenate = 30; + private static UInt16 _counterOfFile = 0; + private static SalimaxAlarmState _salimaxAlarmState = SalimaxAlarmState.Green; + private const String Port = "/dev/ttyUSB0"; + + + static Program() + { + var config = Config.Load(); + var d = config.Devices; + + Channel CreateChannel(SalimaxDevice device) => device.DeviceState == DeviceState.Disabled + ? new NullChannel() + : new TcpChannel(device); + + + TruConvertAcChannel = CreateChannel(d.TruConvertAcIp); + TruConvertDcChannel = CreateChannel(d.TruConvertDcIp); + GridMeterChannel = CreateChannel(d.GridMeterIp); + IslandBusLoadChannel = CreateChannel(d.IslandBusLoadMeterIp); + PvOnDc = CreateChannel(d.PvOnDc); + PvOnAcGrid = CreateChannel(d.PvOnAcGrid); + PvOnAcIsland = CreateChannel(d.PvOnAcIsland); + RelaysChannel = CreateChannel(d.RelaysIp); + BatteriesChannel = CreateChannel(d.BatteryIp); + + BatteryNodes = config + .Devices + .BatteryNodes + .Select(n => n.ConvertTo()) + .ToArray(config.Devices.BatteryNodes.Length); + } + + public static async Task Main(String[] args) + { + //Do not await + HourlyDataAggregationManager() + .ContinueWith(t=>t.Exception.WriteLine(), TaskContinuationOptions.OnlyOnFaulted) + .SupressAwaitWarning(); + + DailyDataAggregationManager() + .ContinueWith(t=>t.Exception.WriteLine(), TaskContinuationOptions.OnlyOnFaulted) + .SupressAwaitWarning(); + + InitializeCommunicationToMiddleware(); + + while (true) + { + try + { + await Run(); + } + catch (Exception e) + { + e.LogError(); + } + } + } + + + private static async Task Run() + { + "Starting SodiStore Max".WriteLine(); + + Watchdog.NotifyReady(); + + var batteryDeligreenDevice = BatteryNodes.Select(n => new BatteryDeligreenDevice(Port, n)) + .ToList(); + + var batteryDevices = new BatteryDeligreenDevices(batteryDeligreenDevice); + var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel); + var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel); + var gridMeterDevice = new EmuMeterDevice(GridMeterChannel); + var acIslandLoadMeter = new EmuMeterDevice(IslandBusLoadChannel); + var pvOnDcDevice = new AmptDevices(PvOnDc); + var pvOnAcGridDevice = new AmptDevices(PvOnAcGrid); + var pvOnAcIslandDevice = new AmptDevices(PvOnAcIsland); + +#if Amax + var saliMaxRelaysDevice = new RelaysDeviceAmax(RelaysChannel); +#else + var saliMaxRelaysDevice = new RelaysDevice(RelaysChannel); +#endif + + + StatusRecord ReadStatus() + { + var config = Config.Load(); + var devices = config.Devices; + var acDc = acDcDevices.Read(); + var dcDc = dcDcDevices.Read(); + var relays = saliMaxRelaysDevice.Read(); + var loadOnAcIsland = acIslandLoadMeter.Read(); + var gridMeter = gridMeterDevice.Read(); + var pvOnDc = pvOnDcDevice.Read(); + var battery = batteryDevices.Read(); + var pvOnAcGrid = pvOnAcGridDevice.Read(); + var pvOnAcIsland = pvOnAcIslandDevice.Read(); + + var gridBusToIslandBus = Topology.CalculateGridBusToIslandBusPower(pvOnAcIsland, loadOnAcIsland, acDc); + + var gridBusLoad = devices.LoadOnAcGrid.DeviceState == DeviceState.Disabled + ? new AcPowerDevice { Power = 0 } + : Topology.CalculateGridBusLoad(gridMeter, pvOnAcGrid, gridBusToIslandBus); + + var dcLoad = devices.LoadOnDc.DeviceState == DeviceState.Disabled + ? new DcPowerDevice { Power = 0 } + : Topology.CalculateDcLoad(acDc, pvOnDc, dcDc); + + var acDcToDcLink = devices.LoadOnDc.DeviceState == DeviceState.Disabled ? + Topology.CalculateAcDcToDcLink(pvOnDc, dcDc, acDc) + : new DcPowerDevice{ Power = acDc.Dc.Power}; + + + return new StatusRecord + { + AcDc = acDc, + DcDc = dcDc, + Battery = battery, + Relays = relays, + GridMeter = gridMeter, + PvOnAcGrid = pvOnAcGrid, + PvOnAcIsland = pvOnAcIsland, + PvOnDc = pvOnDc, + AcGridToAcIsland = gridBusToIslandBus, + AcDcToDcLink = acDcToDcLink, + LoadOnAcGrid = gridBusLoad, + LoadOnAcIsland = loadOnAcIsland, + LoadOnDc = dcLoad, + StateMachine = StateMachine.Default, + EssControl = EssControl.Default, + Log = new SystemLog { SalimaxAlarmState = SalimaxAlarmState.Green, Message = null, SalimaxAlarms = null, SalimaxWarnings = null}, //TODO: Put real stuff + Config = config // load from disk every iteration, so config can be changed while running + }; + } + + void WriteControl(StatusRecord r) + { + if (r.Relays is not null) + { +#if Amax + saliMaxRelaysDevice.Write((RelaysRecordAmax)r.Relays); +#else + ((RelaysDevice)saliMaxRelaysDevice).Write((RelaysRecord)r.Relays); +#endif + + } + + acDcDevices.Write(r.AcDc); + dcDcDevices.Write(r.DcDc); + } + + Console.WriteLine("press ctrl-c to stop"); + + while (true) + { + await Observable + .Interval(UpdateInterval) + .Select(_ => RunIteration()) + .SelectMany(r => UploadCsv(r, DateTime.Now.Round(UpdateInterval))) + .SelectError() + .ToTask(); + } + + + StatusRecord RunIteration() + { + Watchdog.NotifyAlive(); + + var record = ReadStatus(); + + SendSalimaxStateAlarm(GetSalimaxStateAlarm(record), record); // to improve + + record.ControlConstants(); + record.ControlSystemState(); + + //record.ControlPvPower(record.Config.CurtailP, record.Config.PvInstalledPower); + + var essControl = record.ControlEss().WriteLine(); + + record.EssControl = essControl; + + record.AcDc.SystemControl.ApplyAcDcDefaultSettings(); + record.DcDc.SystemControl.ApplyDcDcDefaultSettings(); + + DistributePower(record, essControl); + + //record.PerformLed(); + + WriteControl(record); + + $"{DateTime.Now.Round(UpdateInterval).ToUnixTime()} : {record.StateMachine.State}: {record.StateMachine.Message}".WriteLine(); + + record.CreateTopologyTextBlock().WriteLine(); + + (record.Relays is null ? "No relay Data available" : record.Relays.FiWarning ? "Alert: Fi Warning Detected" : "No Fi Warning Detected").WriteLine(); + (record.Relays is null ? "No relay Data available" : record.Relays.FiError ? "Alert: Fi Error Detected" : "No Fi Error Detected") .WriteLine(); + + record.Config.Save(); + + "===========================================".WriteLine(); + + return record; + } + + // ReSharper disable once FunctionNeverReturns + } + + private static void SendSalimaxStateAlarm(StatusMessage currentSalimaxState, StatusRecord record) + { + var s3Bucket = Config.Load().S3?.Bucket; + var subscribedNow = false; + + //Every 15 iterations(30 seconds), the installation sends a heartbit message to the queue + //_heartBitInterval++; + + //When the controller boots, it tries to subscribe to the queue + if (_subscribeToQueueForTheFirstTime == false) + { + subscribedNow = true; + _subscribeToQueueForTheFirstTime = true; + _prevSalimaxState = currentSalimaxState.Status; + _subscribedToQueue = RabbitMqManager.SubscribeToQueue(currentSalimaxState, s3Bucket, VpnServerIp); + } + + //If already subscribed to the queue and the status has been changed, update the queue + if (!subscribedNow && _subscribedToQueue && currentSalimaxState.Status != _prevSalimaxState) + { + _prevSalimaxState = currentSalimaxState.Status; + if (s3Bucket != null) + RabbitMqManager.InformMiddleware(currentSalimaxState); + } + // else if (_subscribedToQueue && _heartBitInterval >= 30) + // { + // //Send a heartbit to the backend + // Console.WriteLine("----------------------------------------Sending Heartbit----------------------------------------"); + // _heartBitInterval = 0; + // currentSalimaxState.Type = MessageType.Heartbit; + // + // if (s3Bucket != null) + // RabbitMqManager.InformMiddleware(currentSalimaxState); + // } + + //If there is an available message from the RabbitMQ Broker, apply the configuration file + Configuration? config = SetConfigurationFile(); + if (config != null) + { + record.ApplyConfigFile(config); + } + } + + // This preparing a message to send to salimax monitor + private static StatusMessage GetSalimaxStateAlarm(StatusRecord record) + { + var alarmCondition = record.DetectAlarmStates(); // this need to be emailed to support or customer + var s3Bucket = Config.Load().S3?.Bucket; + + var alarmList = new List(); + var warningList = new List(); + var bAlarmList = new List(); + var bWarningList = new List(); + + /* + if (record.Battery != null) + { + var i = 0; + + foreach (var battery in record.Battery.Devices) + { + var devicesBatteryNode = record.Config.Devices.BatteryNodes[i]; + + if (battery.LimpBitMap == 0) + { + // "All String are Active".WriteLine(); + } + else if (IsPowerOfTwo(battery.LimpBitMap)) + { + "1 String is disabled".WriteLine(); + Console.WriteLine(" ****************** "); + + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = "1 String is disabled" + }); + + bWarningList.Add("/"+i+1 + "/1 String is disabled"); // battery id instead ( i +1 ) of node id: requested from the frontend + } + else + { + "2 or more string are disabled".WriteLine(); + Console.WriteLine(" ****************** "); + + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = "2 or more string are disabled" + }); + bAlarmList.Add(i +";2 or more string are disabled"); + } + + foreach (var warning in record.Battery.Warnings) + { + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = warning + }); + bWarningList.Add(i +";" + warning); + } + + foreach (var alarm in battery.Alarms) + { + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Battery node" + devicesBatteryNode, + Description = alarm + }); + bWarningList.Add(i +";" + alarm); + } + i++; + } + }*/ + + if (alarmCondition is not null) + { + alarmCondition.WriteLine(); + + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Salimax", + Description = alarmCondition + }); + } + + foreach (var alarm in record.AcDc.Alarms) + { + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "AcDc", + Description = alarm.ToString() + }); + } + + foreach (var alarm in record.DcDc.Alarms) + { + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "DcDc", + Description = alarm.ToString() + }); + } + + foreach (var warning in record.AcDc.Warnings) + { + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "AcDc", + Description = warning.ToString() + }); + } + + foreach (var warning in record.DcDc.Warnings) + { + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "DcDc", + Description = warning.ToString() + }); + } + + _salimaxAlarmState = warningList.Any() + ? SalimaxAlarmState.Orange + : SalimaxAlarmState.Green; // this will be replaced by LedState + + _salimaxAlarmState = alarmList.Any() + ? SalimaxAlarmState.Red + : _salimaxAlarmState; // this will be replaced by LedState + + TryParse(s3Bucket?.Split("-")[0], out var installationId); + + var returnedStatus = new StatusMessage + { + InstallationId = installationId, + Product = 0, + Status = _salimaxAlarmState, + Type = MessageType.AlarmOrWarning, + Alarms = alarmList, + Warnings = warningList + }; + + return returnedStatus; + } + + private static String? DetectAlarmStates(this StatusRecord r) => r.Relays switch + { + { K2ConnectIslandBusToGridBus: false, K2IslandBusIsConnectedToGridBus: true } => " Contradiction: R0 is opening the K2 but the K2 is still close ", + { K1GridBusIsConnectedToGrid : false, K2IslandBusIsConnectedToGridBus: true } => " Contradiction: K1 is open but the K2 is still close ", + { FiError: true, K2IslandBusIsConnectedToGridBus: true } => " Contradiction: Fi error occured but the K2 is still close ", + _ => null + }; + + private static void ControlConstants(this StatusRecord r) + { + var inverters = r.AcDc.Devices; + var dcDevices = r.DcDc.Devices; + var configFile = r.Config; + var devicesConfig = r.AcDc.Devices.All(d => d.Control.Ac.GridType == GridType.GridTied400V50Hz) ? configFile.GridTie : configFile.IslandMode; // TODO if any of the grid tie mode + + Double maxBatteryChargingCurrentLive ; //used with deligreenBattery for limiting charging + Double maxBatteryDischargingCurrentLive; //used with deligreenBattery for limiting discharging + + + //var maxBatteryDischargingCurrentLive = 0.0; //never used with deligreenBattery + /* + // This adapting the max discharging current to the current Active Strings + if (r.Battery != null) + { + const Int32 stringsByBattery = 5; + var numberOfBatteriesConfigured = r.Config.Devices.BatteryNodes.Length; + var numberOfTotalStrings = stringsByBattery * numberOfBatteriesConfigured; + var dischargingCurrentByString = devicesConfig.DcDc.MaxBatteryDischargingCurrent / numberOfTotalStrings; + + var boolList = new List(); + + foreach (var stringActive in r.Battery.Devices.Select(b => b.BatteryStrings).ToList()) + { + boolList.Add(stringActive.String1Active); + boolList.Add(stringActive.String2Active); + boolList.Add(stringActive.String3Active); + boolList.Add(stringActive.String4Active); + boolList.Add(stringActive.String5Active); + } + + var numberOfBatteriesStringActive = boolList.Count(b => b); + + if (numberOfTotalStrings != 0) + { + maxBatteryDischargingCurrentLive = dischargingCurrentByString * numberOfBatteriesStringActive; + } + } + */ + // TODO The discharging current is well calculated but not communicated to live. But Written in S3 + + // Deligreen upper current limitation dynCCL + if (r.Battery?.Voltage != null && (r.Battery?.Voltage ?? 0) > 61.0 ) + { + maxBatteryChargingCurrentLive = r.Battery.Devices.Count * 10; // Max charging current is 10 A * Number of batteries + maxBatteryChargingCurrentLive.WriteLine("dynCCL Active: Max Battery Charging is "+ maxBatteryChargingCurrentLive); + } + else + { + maxBatteryChargingCurrentLive = devicesConfig.DcDc.MaxBatteryChargingCurrent; + } + + // Deligreen lower current limitation dynDCL + if (r.Battery?.Soc != null && (r.Battery?.Soc ?? 100) < r.Config.MinSoc ) + { + maxBatteryDischargingCurrentLive = 0; // Max charging current is 10 A * Number of batteries + maxBatteryDischargingCurrentLive.WriteLine("dynDCL Active: Max Battery disCharging is "+ maxBatteryDischargingCurrentLive); + } + else + { + maxBatteryDischargingCurrentLive = devicesConfig.DcDc.MaxBatteryDischargingCurrent; + } + + inverters.ForEach(d => d.Control.Dc.MaxVoltage = devicesConfig.AcDc.MaxDcLinkVoltage); + inverters.ForEach(d => d.Control.Dc.MinVoltage = devicesConfig.AcDc.MinDcLinkVoltage); + inverters.ForEach(d => d.Control.Dc.ReferenceVoltage = devicesConfig.AcDc.ReferenceDcLinkVoltage); + + inverters.ForEach(d => d.Control.Dc.PrechargeConfig = DcPrechargeConfig.PrechargeDcWithInternal); + + dcDevices.ForEach(d => d.Control.DroopControl.UpperVoltage = devicesConfig.DcDc.UpperDcLinkVoltage); + dcDevices.ForEach(d => d.Control.DroopControl.LowerVoltage = devicesConfig.DcDc.LowerDcLinkVoltage); + dcDevices.ForEach(d => d.Control.DroopControl.ReferenceVoltage = devicesConfig.DcDc.ReferenceDcLinkVoltage); + + dcDevices.ForEach(d => d.Control.CurrentControl.MaxBatteryChargingCurrent = maxBatteryChargingCurrentLive); + dcDevices.ForEach(d => d.Control.CurrentControl.MaxBatteryDischargingCurrent = maxBatteryDischargingCurrentLive); + dcDevices.ForEach(d => d.Control.MaxDcPower = devicesConfig.DcDc.MaxDcPower); + + dcDevices.ForEach(d => d.Control.VoltageLimits.MaxBatteryVoltage = devicesConfig.DcDc.MaxChargeBatteryVoltage); + dcDevices.ForEach(d => d.Control.VoltageLimits.MinBatteryVoltage = devicesConfig.DcDc.MinDischargeBatteryVoltage); + dcDevices.ForEach(d => d.Control.ControlMode = DcControlMode.VoltageDroop); + + r.DcDc.ResetAlarms(); + r.AcDc.ResetAlarms(); + } + + // This will be used for provider throttling, this example is only for either 100% or 0 % + private static void ControlPvPower(this StatusRecord r, UInt16 exportLimit = 0, UInt16 pvInstalledPower = 20) + { + // Maybe add a condition to do this only if we are in optimised Self consumption, this is not true + + if (r.GridMeter?.Ac.Power.Active == null) + { + Console.WriteLine(" No reading from Grid meter"); + return; + } + + if (pvInstalledPower == 0) + { + Console.WriteLine(" No curtailing, because Pv installed is equal to 0"); + return; + } + + const Int32 constantDeadBand = 5000; // magic number + const Double voltageRange = 100; // 100 Voltage configured rang for PV slope, if the configured slope change this must change also + var configFile = r.Config; + var inverters = r.AcDc.Devices; + var systemExportLimit = - exportLimit * 1000 ; // Conversion from Kw in W // the config file value is positive and limit should be negative from 0 to ... + var stepSize = ClampStepSize((UInt16)Math.Floor(voltageRange/ pvInstalledPower)); // in Voltage per 1 Kw + var deadBand = constantDeadBand/stepSize; + + // LINQ query to select distinct ActiveUpperVoltage + var result = r.AcDc.Devices + .Select(device => device?.Status?.DcVoltages?.Active?.ActiveUpperVoltage) + .Select(voltage => voltage.Value) // Extract the value since we've confirmed it's non-null + .Distinct() + .ToList(); + + Double upperVoltage; + + if (result.Count == 1) + { + upperVoltage = result[0]; + } + else + { + Console.WriteLine(" Different ActiveUpperVoltage between inverters "); // this should be reported to salimax Alarm + return; + } + + /************* For debugging purposes ********************/ + + systemExportLimit.WriteLine(" Export Limit in W"); + upperVoltage.WriteLine(" Upper Voltage"); + r.GridMeter.Ac.Power.Active.WriteLine(" Active Export"); + Console.WriteLine(" ****************** "); + + /*********************************************************/ + + if (r.GridMeter.Ac.Power.Active < systemExportLimit) + { + _curtailFlag = true; + upperVoltage = IncreaseInverterUpperLimit(upperVoltage, stepSize); + upperVoltage.WriteLine("Upper Voltage Increased: New Upper limit"); + } + else + { + if (_curtailFlag) + { + if (r.GridMeter.Ac.Power.Active > (systemExportLimit + deadBand)) + { + upperVoltage = DecreaseInverterUpperLimit(upperVoltage, stepSize); + + if (upperVoltage <= configFile.GridTie.AcDc.MaxDcLinkVoltage) + { + _curtailFlag = false; + upperVoltage = configFile.GridTie.AcDc.MaxDcLinkVoltage; + upperVoltage.WriteLine(" New Upper limit"); + Console.WriteLine("Upper Voltage decreased: Smaller than the default value, value clamped"); + } + else + { + Console.WriteLine("Upper Voltage decreased: New Upper limit"); + upperVoltage.WriteLine(" New Upper limit"); + } + } + else + { + deadBand.WriteLine("W :We are in Dead band area"); + upperVoltage.WriteLine(" same Upper limit from last cycle"); + } + } + else + { + Console.WriteLine("Curtail Flag is false , no need to curtail"); + upperVoltage.WriteLine(" same Upper limit from last cycle"); + } + } + inverters.ForEach(d => d.Control.Dc.MaxVoltage = upperVoltage); + Console.WriteLine(" ****************** "); + } + + // why this is not in Controller? + private static void DistributePower(StatusRecord record, EssControl essControl) + { + var nInverters = record.AcDc.Devices.Count; + + var powerPerInverterPhase = nInverters > 0 + ? essControl.PowerSetpoint / nInverters / 3 + : 0; + + record.AcDc.Devices.ForEach(d => + { + d.Control.Ac.PhaseControl = PhaseControl.Asymmetric; + d.Control.Ac.Power.L1 = powerPerInverterPhase; + d.Control.Ac.Power.L2 = powerPerInverterPhase; + d.Control.Ac.Power.L3 = powerPerInverterPhase; + }); + } + + // To test, most probably the curtailing flag will not work + /*private static void PerformLed(this StatusRecord record) + { + if (record.StateMachine.State == 23) + { + switch (record.EssControl.Mode) + { + case EssMode.CalibrationCharge: + record.Relays?.PerformSlowFlashingGreenLed(); + break; + case EssMode.OptimizeSelfConsumption when !_curtailFlag: + record.Relays?.PerformSolidGreenLed(); + break; + case EssMode.Off: + break; + case EssMode.OffGrid: + break; + case EssMode.HeatBatteries: + break; + case EssMode.ReachMinSoc: + break; + case EssMode.NoGridMeter: + break; + default: + { + if (_curtailFlag) + { + record.Relays?.PerformFastFlashingGreenLed(); + } + + break; + } + } + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc > 50) + { + record.Relays?.PerformSolidOrangeLed(); + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc < 50 && record.Battery.Soc > 20) + { + record.Relays?.PerformSlowFlashingOrangeLed(); + } + else if (record.Battery?.Soc != null && record.StateMachine.State != 23 && record.Battery.Soc < 20) + { + record.Relays?.PerformFastFlashingOrangeLed(); + } + + var criticalAlarm = record.DetectAlarmStates(); + + if (criticalAlarm is not null) + { + record.Relays?.PerformFastFlashingRedLed(); + } + }*/ + + private static Double IncreaseInverterUpperLimit(Double upperLimit, Double stepSize) + { + return upperLimit + stepSize; + } + + private static Double DecreaseInverterUpperLimit(Double upperLimit, Double stepSize) + { + return upperLimit - stepSize; + } + + private static UInt16 ClampStepSize(UInt16 stepSize) + { + return stepSize switch + { + > 5 => 5, + <= 1 => 1, + _ => stepSize + }; + } + + private static void ApplyAcDcDefaultSettings(this SystemControlRegisters? sc) + { + if (sc is null) + return; + + sc.ReferenceFrame = ReferenceFrame.Consumer; + sc.SystemConfig = AcDcAndDcDc; + + #if DEBUG + sc.CommunicationTimeout = TimeSpan.FromMinutes(2); + #else + sc.CommunicationTimeout = TimeSpan.FromSeconds(20); + #endif + + sc.PowerSetPointActivation = PowerSetPointActivation.Immediate; + sc.UseSlaveIdForAddressing = true; + sc.SlaveErrorHandling = SlaveErrorHandling.Relaxed; + sc.SubSlaveErrorHandling = SubSlaveErrorHandling.Off; + + sc.ResetAlarmsAndWarnings = true; + } + + private static void ApplyDcDcDefaultSettings(this SystemControlRegisters? sc) + { + + if (sc is null) + return; + + sc.SystemConfig = DcDcOnly; + #if DEBUG + sc.CommunicationTimeout = TimeSpan.FromMinutes(2); + #else + sc.CommunicationTimeout = TimeSpan.FromSeconds(20); + #endif + + sc.PowerSetPointActivation = PowerSetPointActivation.Immediate; + sc.UseSlaveIdForAddressing = true; + sc.SlaveErrorHandling = SlaveErrorHandling.Relaxed; + sc.SubSlaveErrorHandling = SubSlaveErrorHandling.Off; + + sc.ResetAlarmsAndWarnings = true; + } + + private static async Task UploadCsv(StatusRecord status, DateTime timeStamp) + { + + var csv = status.ToCsv().LogInfo(); + + await RestApiSavingFile(csv); + + var s3Config = status.Config.S3; + + if (s3Config is null) + return false; + + //Concatenating 15 files in one file + return await ConcatinatingAndCompressingFiles(timeStamp, s3Config); + } + + private static async Task ConcatinatingAndCompressingFiles(DateTime timeStamp, S3Config s3Config) + { + if (_counterOfFile >= NbrOfFileToConcatenate) + { + _counterOfFile = 0; + + var logFileConcatenator = new LogFileConcatenator(); + + var s3Path = timeStamp.ToUnixTime() + ".csv"; + s3Path.WriteLine(""); + var csvToSend = logFileConcatenator.ConcatenateFiles(NbrOfFileToConcatenate); + + var request = s3Config.CreatePutRequest(s3Path); + + //Use this for no compression + //var response = await request.PutAsync(new StringContent(csv)); + var compressedBytes = CompresseBytes(csvToSend); + + // Encode the compressed byte array as a Base64 string + string base64String = Convert.ToBase64String(compressedBytes); + + // Create StringContent from Base64 string + var stringContent = new StringContent(base64String, Encoding.UTF8, "application/base64"); + + // Upload the compressed data (ZIP archive) to S3 + var response = await request.PutAsync(stringContent); + + if (response.StatusCode != 200) + { + Console.WriteLine("ERROR: PUT"); + var error = await response.GetStringAsync(); + Console.WriteLine(error); + Heartbit(new DateTime(0)); + return false; + } + + Console.WriteLine("----------------------------------------Sending Heartbit----------------------------------------"); + + Heartbit(timeStamp); + } + _counterOfFile++; + + return true; + } + + private static void Heartbit(DateTime timeStamp) + { + var s3Bucket = Config.Load().S3?.Bucket; + var tryParse = TryParse(s3Bucket?.Split("-")[0], out var installationId); + var parse = TryParse(timeStamp.ToUnixTime().ToString(), out var nameOfCsvFile); + + if (tryParse) + { + var returnedStatus = new StatusMessage + { + InstallationId = installationId, + Product = 0, // Salimax is always 0 + Status = _salimaxAlarmState, + Type = MessageType.Heartbit, + Timestamp = nameOfCsvFile + }; + if (s3Bucket != null) + RabbitMqManager.InformMiddleware(returnedStatus); + } + } + + private static Byte[] CompresseBytes(String csvToSend) + { + //Compress CSV data to a byte array + Byte[] compressedBytes; + using (var memoryStream = new MemoryStream()) + { + //Create a zip directory and put the compressed file inside + using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) + { + var entry = archive.CreateEntry("data.csv", CompressionLevel.SmallestSize); // Add CSV data to the ZIP archive + using (var entryStream = entry.Open()) + using (var writer = new StreamWriter(entryStream)) + { + writer.Write(csvToSend); + } + } + + compressedBytes = memoryStream.ToArray(); + } + + return compressedBytes; + } + + private static async Task RestApiSavingFile(String csv) + { + // This is for the Rest API + // Check if the directory exists, and create it if it doesn't + const String directoryPath = "/var/www/html"; + + if (!Directory.Exists(directoryPath)) + { + Directory.CreateDirectory(directoryPath); + } + + string filePath = Path.Combine(directoryPath, "status.csv"); + + await File.WriteAllTextAsync(filePath, csv.SplitLines().Where(l => !l.Contains("Secret")).JoinLines()); + } + + private static Boolean IsPowerOfTwo(Int32 n) + { + return n > 0 && (n & (n - 1)) == 0; + } + + private static void ApplyConfigFile(this StatusRecord status, Configuration? config) + { + if (config == null) return; + + status.Config.MinSoc = config.MinimumSoC; + status.Config.GridSetPoint = config.GridSetPoint * 1000; // converted from kW to W + // status.Config.ForceCalibrationChargeState = config.CalibrationChargeState; + // + // if (config.CalibrationChargeState == CalibrationChargeType.RepetitivelyEvery) + // { + // status.Config.DayAndTimeForRepetitiveCalibration = config.CalibrationChargeDate; + // } + // else if (config.CalibrationChargeState == CalibrationChargeType.AdditionallyOnce) + // { + // status.Config.DayAndTimeForAdditionalCalibration = config.CalibrationChargeDate; + // } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/S3Config.cs b/csharp/App_backup/SodiStoreMax/src/S3Config.cs new file mode 100644 index 000000000..407e93330 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/S3Config.cs @@ -0,0 +1,79 @@ +using System.Security.Cryptography; +using Flurl; +using Flurl.Http; +using InnovEnergy.Lib.Utils; +using static System.Text.Encoding; +using Convert = System.Convert; + +namespace InnovEnergy.App.SodiStoreMax; + +public record S3Config +{ + public required String Bucket { get; init; } + public required String Region { get; init; } + public required String Provider { get; init; } + public required String Key { get; init; } + public required String Secret { get; init; } + public required String ContentType { get; init; } + + public String Host => $"{Bucket}.{Region}.{Provider}"; + public String Url => $"https://{Host}"; + + public IFlurlRequest CreatePutRequest(String s3Path) => CreateRequest("PUT", s3Path); + public IFlurlRequest CreateGetRequest(String s3Path) => CreateRequest("GET", s3Path); + + private IFlurlRequest CreateRequest(String method, String s3Path) + { + var date = DateTime.UtcNow.ToString("r"); + var auth = CreateAuthorization(method, s3Path, date); + + return Url + .AppendPathSegment(s3Path) + .WithHeader("Host", Host) + .WithHeader("Date", date) + .WithHeader("Authorization", auth) + .AllowAnyHttpStatus(); + } + + private String CreateAuthorization(String method, + String s3Path, + String date) + { + return CreateAuthorization + ( + method : method, + bucket : Bucket, + s3Path : s3Path, + date : date, + s3Key : Key, + s3Secret : Secret, + contentType: ContentType + ); + } + + + + private static String CreateAuthorization(String method, + String bucket, + String s3Path, + String date, + String s3Key, + String s3Secret, + String contentType = "application/base64", + String md5Hash = "") + { + + contentType = "application/base64; charset=utf-8"; + //contentType = "text/plain; charset=utf-8"; //this to use when sending plain csv to S3 + + var payload = $"{method}\n{md5Hash}\n{contentType}\n{date}\n/{bucket.Trim('/')}/{s3Path.Trim('/')}"; + using var hmacSha1 = new HMACSHA1(UTF8.GetBytes(s3Secret)); + + var signature = UTF8 + .GetBytes(payload) + .Apply(hmacSha1.ComputeHash) + .Apply(Convert.ToBase64String); + + return $"AWS {s3Key}:{signature}"; + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysDevice.cs b/csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysDevice.cs new file mode 100644 index 000000000..f6e11f694 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysDevice.cs @@ -0,0 +1,72 @@ +using InnovEnergy.Lib.Devices.Adam6360D; +using InnovEnergy.Lib.Devices.Amax5070; +using InnovEnergy.Lib.Protocols.Modbus.Channels; + +namespace InnovEnergy.App.SodiStoreMax.SaliMaxRelays; + +public class RelaysDevice +{ + private Adam6360DDevice AdamDevice { get; } + + public RelaysDevice(String hostname) => AdamDevice = new Adam6360DDevice(hostname, 2); + public RelaysDevice(Channel channel) => AdamDevice = new Adam6360DDevice(channel, 2); + + + public RelaysRecord? Read() + { + try + { + return AdamDevice.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDevice)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecord r) + { + try + { + AdamDevice.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDevice)}\n{e}".LogError(); + } + } +} + + +public class RelaysDeviceAmax +{ + private Amax5070Device AmaxDevice { get; } + + public RelaysDeviceAmax(Channel channel) => AmaxDevice = new Amax5070Device(channel); + + public RelaysRecordAmax? Read() + { + try + { + return AmaxDevice.Read(); + } + catch (Exception e) + { + $"Failed to read from {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + return null; + } + } + + public void Write(RelaysRecordAmax r) + { + try + { + AmaxDevice.Write(r); + } + catch (Exception e) + { + $"Failed to write to {nameof(RelaysDeviceAmax)}\n{e}".LogError(); + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysRecord.cs b/csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysRecord.cs new file mode 100644 index 000000000..bdfcd37c9 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SaliMaxRelays/RelaysRecord.cs @@ -0,0 +1,83 @@ +using InnovEnergy.Lib.Devices.Adam6360D; +using InnovEnergy.Lib.Devices.Amax5070; +namespace InnovEnergy.App.SodiStoreMax.SaliMaxRelays; + +public interface IRelaysRecord +{ + Boolean K1GridBusIsConnectedToGrid { get; } + Boolean K2IslandBusIsConnectedToGridBus { get; } + IEnumerable K3InverterIsConnectedToIslandBus { get; } + Boolean FiWarning { get; } + Boolean FiError { get; } + Boolean K2ConnectIslandBusToGridBus { get; set; } +} + +public class RelaysRecord : IRelaysRecord +{ + private readonly Adam6360DRegisters _Regs; + + private RelaysRecord(Adam6360DRegisters regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput6; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput4; + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + public Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput0; + public Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput1; + public Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput2; + public Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput3; + + public Boolean FiWarning => !_Regs.DigitalInput5; + public Boolean FiError => !_Regs.DigitalInput7; + + public Boolean K2ConnectIslandBusToGridBus { get => _Regs.Relay0; set => _Regs.Relay0 = value;} + + public static implicit operator Adam6360DRegisters(RelaysRecord d) => d._Regs; + public static implicit operator RelaysRecord(Adam6360DRegisters d) => new RelaysRecord(d); + +} + +public class RelaysRecordAmax : IRelaysRecord +{ + private readonly Amax5070Registers _Regs; + + private RelaysRecordAmax(Amax5070Registers regs) => _Regs = regs; + + public Boolean K1GridBusIsConnectedToGrid => _Regs.DigitalInput22; + public Boolean K2IslandBusIsConnectedToGridBus => !_Regs.DigitalInput20; + + public IEnumerable K3InverterIsConnectedToIslandBus + { + get + { + yield return K3Inverter1IsConnectedToIslandBus; + yield return K3Inverter2IsConnectedToIslandBus; + yield return K3Inverter3IsConnectedToIslandBus; + yield return K3Inverter4IsConnectedToIslandBus; + } + } + + public Boolean K3Inverter1IsConnectedToIslandBus => !_Regs.DigitalInput16; + public Boolean K3Inverter2IsConnectedToIslandBus => !_Regs.DigitalInput17; + public Boolean K3Inverter3IsConnectedToIslandBus => !_Regs.DigitalInput18; + public Boolean K3Inverter4IsConnectedToIslandBus => !_Regs.DigitalInput19; + + public Boolean FiWarning => !_Regs.DigitalInput21; + public Boolean FiError => !_Regs.DigitalInput23; + + public Boolean K2ConnectIslandBusToGridBus { get => _Regs.Relay23; set => _Regs.Relay23 = value;} + + public static implicit operator Amax5070Registers(RelaysRecordAmax d) => d._Regs; + public static implicit operator RelaysRecordAmax(Amax5070Registers d) => new RelaysRecordAmax(d); + +} diff --git a/csharp/App_backup/SodiStoreMax/src/Switch.cs b/csharp/App_backup/SodiStoreMax/src/Switch.cs new file mode 100644 index 000000000..932fdb8df --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Switch.cs @@ -0,0 +1,15 @@ +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.App.SodiStoreMax; + +public static class Switch +{ + public static TextBlock Open(String name) + { + return TextBlock.AlignCenterHorizontal + ( + " __╱ __ ", + name + ); + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/System/Controller.cs b/csharp/App_backup/SodiStoreMax/src/System/Controller.cs new file mode 100644 index 000000000..d25171854 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/System/Controller.cs @@ -0,0 +1,727 @@ +using InnovEnergy.App.SodiStoreMax.Ess; +using InnovEnergy.App.SodiStoreMax.SaliMaxRelays; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; +using static InnovEnergy.Lib.Devices.Trumpf.SystemControl.DataTypes.GridType; + +namespace InnovEnergy.App.SodiStoreMax.System; + +public static class Controller +{ + private static Int32 GetSystemState(this StatusRecord r) + { + var relays = r.Relays; + + if (relays is null) + return 101; // Message = "Panic: relay device is not available!", + + var acDcs = r.AcDc; + + if (acDcs.NotAvailable()) + return 102; + + var k4 = acDcs.AllGridTied() ? 0 + : acDcs.AllIsland() ? 1 + : 4; + + var k5 = acDcs.AllDisabled() ? 0 + : acDcs.AllEnabled() ? 1 + : 4; + + if (k4 == 4 || k5 == 4) + return 103; //Message = "Panic: ACDCs have unequal grid types or power stage", + + var nInverters = r.AcDc.Devices.Count; + + var k1 = relays.K1GridBusIsConnectedToGrid ? 1 : 0; + var k2 = relays.K2IslandBusIsConnectedToGridBus ? 1 : 0; + var k3 = relays.K3InverterIsConnectedToIslandBus.Take(nInverters).Any(c => c) ? 1 : 0; + + + // states as defined in states excel sheet + return 1 * k1 + + 2 * k2 + + 4 * k3 + + 8 * k4 + + 16 * k5; + } + + public static Boolean ControlSystemState(this StatusRecord s) + { + s.StateMachine.State = s.GetSystemState(); + + return s.StateMachine.State switch + { + 0 => State0(s), + 1 => State1(s), + 2 => State2(s), + 3 => State3(s), + 4 => State4(s), + 5 => State5(s), + 6 => State6(s), + 7 => State7(s), + 8 => State8(s), + 9 => State9(s), + 10 => State10(s), + 11 => State11(s), + 12 => State12(s), + 13 => State13(s), + 14 => State14(s), + 15 => State15(s), + 16 => State16(s), + 17 => State17(s), + 18 => State18(s), + 19 => State19(s), + 20 => State20(s), + 21 => State21(s), + 22 => State22(s), + 23 => State23(s), + 24 => State24(s), + 25 => State25(s), + 26 => State26(s), + 27 => State27(s), + 28 => State28(s), + 29 => State29(s), + 30 => State30(s), + 31 => State31(s), + + + 101 => State101(s), + 102 => State102(s), + 103 => State103(s), + _ => UnknownState(s) + }; + + } + + private static Boolean NotAvailable(this AcDcDevicesRecord acDcs) + { + return acDcs.SystemControl == null || acDcs.Devices.Count == 0; + } + + private static Boolean State0(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are off. Switching to Island Mode."; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 8 + } + + + private static Boolean State1(StatusRecord s) + { + s.StateMachine.Message = "Grid Tied mode active, closing k2"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return false; + + // => 3 + } + + private static Boolean State2(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 0 + } + + private static Boolean State3(StatusRecord s) + { + s.StateMachine.Message = "K2 closed, Turning on Ac/Dc"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return false; + + // => 19 + } + + + private static Boolean State4(StatusRecord s) + { + s.StateMachine.Message = "K2 is open, waiting K3 to open"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + + // => 0 + } + + private static Boolean State5(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => ? + } + + private static Boolean State6(StatusRecord s) + { + s.StateMachine.Message = "Inverters are off, opening K2"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + + // => 4 + } + + private static Boolean State7(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return false; + + // => ? + } + + private static Boolean State8(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are off and in Island Mode."; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + // => 24 + } + + private static Boolean State9(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are disconnected from Island Bus. Switching to GridTie Mode."; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 1 + } + + private static Boolean State10(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 8 + } + + private static Boolean State11(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 9 + } + + private static Boolean State12(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 8 + } + + private static Boolean State13(StatusRecord s) + { + s.StateMachine.Message = "Ac/Dc are off. Waiting for them to disconnect from Island Bus."; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return true; + + // => 9 + } + + private static Boolean State14(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 12 + } + + + private static Boolean State15(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 13 + } + + + private static Boolean State16(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 0 + } + + + private static Boolean State17(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 1 + } + + + private static Boolean State18(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 0 + } + + private static Boolean State19(StatusRecord s) + { + s.StateMachine.Message = "Waiting for Ac/Dc to connect to Island Bus"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return true; + + // => 23 + } + + + private static Boolean State20(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 4 + } + + private static Boolean State21(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 5 + } + + private static Boolean State22(StatusRecord s) + { + s.StateMachine.Message = "K1 opened, switching inverters off"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return true; + + // => 6 + } + + private static Boolean State23(StatusRecord s) + { + s.StateMachine.Message = "ESS"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableGridTieMode(); + s.Relays.ConnectIslandBusToGrid(); + + return true; + + // => 22 + } + + + private static Boolean State24(StatusRecord s) + { + s.StateMachine.Message = "Inverter are on waiting for k3 to close"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 28 + } + + private static Boolean State25(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 9 + } + + private static Boolean State26(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 10 + } + + private static Boolean State27(StatusRecord s) + { + s.StateMachine.Message = "K2 open and enable island mode"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 9 + } + + private static Boolean State28(StatusRecord s) + { + s.StateMachine.Message = "Island Mode"; + + s.DcDc.Enable(); + s.AcDc.Enable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 29 + } + + private static Boolean State29(StatusRecord s) + { + s.StateMachine.Message = "K1 closed, Switching off Inverters and moving to grid tie"; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 13 + } + + private static Boolean State30(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 14 + } + + private static Boolean State31(StatusRecord s) + { + s.StateMachine.Message = ""; + + s.DcDc.Disable(); + s.AcDc.Disable(); + s.AcDc.EnableIslandMode(); + s.Relays.DisconnectIslandBusFromGrid(); + + return false; + + // => 13 + } + + private static Boolean State101(StatusRecord s) + { + s.StateMachine.Message = "Relay device is not available"; + return s.EnableSafeDefaults(); + } + + private static Boolean State102(StatusRecord s) + { + s.StateMachine.Message = "ACDCs not available"; + return s.EnableSafeDefaults(); + } + + private static Boolean State103(StatusRecord s) + { + s.StateMachine.Message = "Panic: ACDCs have unequal grid types or PowerStage"; + s.AcDc.Enable(); + return false; + } + + // private static Boolean State104(StatusRecord s) + // { + // s.StateMachine.Message = "Panic: DCDCs not available"; + // return s.EnableSafeDefaults(); + // } + + + private static Boolean UnknownState(StatusRecord s) + { + // "Unknown System State" + return s.EnableSafeDefaults(); + } + + + + private static Boolean AllDisabled(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => !d.Control.PowerStageEnable); + } + + private static Boolean AllEnabled(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => d.Control.PowerStageEnable); + } + + + private static Boolean AllTheSame(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices + .Select(d => d.Control.PowerStageEnable) + .Distinct() + .Count() == 1; + } + + private static Boolean AllGridTied(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => d.Status.ActiveGridType is GridTied380V60Hz) + || acDcs.Devices.All(d => d.Status.ActiveGridType is GridTied400V50Hz) + || acDcs.Devices.All(d => d.Status.ActiveGridType is GridTied480V60Hz); + } + + private static Boolean AllIsland(this AcDcDevicesRecord acDcs) + { + return acDcs.Devices.All(d => d.Status.ActiveGridType is Island400V50Hz) + || acDcs.Devices.All(d => d.Status.ActiveGridType is Island480V60Hz); + } + + private static void ForAll(this IEnumerable ts, Action action) + { + foreach (var t in ts) + action(t); + } + + private static void Disable(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.PowerStageEnable = false); + } + + //this is must be deleted + private static void Disable(this DcDcDevicesRecord dcDc) + { + // For Test purpose, The transition from island mode to grid tier and vis versa , may not need to disable Dc/Dc. + // This will keep the Dc link powered. + + // dcDc.Devices + // .Select(d => d.Control) + // .ForAll(c => c.PowerStageEnable = false); + } + + private static void Enable(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.PowerStageEnable = true); + } + + private static void Enable(this DcDcDevicesRecord dcDc) + { + dcDc.Devices + .Select(d => d.Control) + .ForAll(c => c.PowerStageEnable = true); + } + + + private static void EnableGridTieMode(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.Ac.GridType = GridTied400V50Hz); // TODO: config grid type + } + + + private static void EnableIslandMode(this AcDcDevicesRecord acDc) + { + acDc.Devices + .Select(d => d.Control) + .ForAll(c => c.Ac.GridType = Island400V50Hz); // TODO: config grid type + } + + private static void DisconnectIslandBusFromGrid(this IRelaysRecord? relays) + { + if (relays is not null) + relays.K2ConnectIslandBusToGridBus = false; + } + + private static void ConnectIslandBusToGrid(this IRelaysRecord? relays) + { + if (relays is not null) + relays.K2ConnectIslandBusToGridBus = true; + } + + + private static Boolean EnableSafeDefaults(this StatusRecord s) + { + // After some tests, the safe state is switch off inverter and keep the last state of K2 , Dc/Dc and Grid type to avoid conflict. + + // s.DcDc.Disable(); + s.AcDc.Disable(); // Maybe comment this to avoid opening/closing K3 + // s.AcDc.EnableGridTieMode(); + // s.Relays.DisconnectIslandBusFromGrid(); + return false; + } + + public static DcDcDevicesRecord ResetAlarms(this DcDcDevicesRecord dcDcStatus) + { + var sc = dcDcStatus.SystemControl; + + if (sc is not null) + sc.ResetAlarmsAndWarnings = sc.Alarms.Any(); + + foreach (var d in dcDcStatus.Devices) + d.Control.ResetAlarmsAndWarnings = d.Status.Alarms.Any() || d.Status.Warnings.Any(); + + return dcDcStatus; + } + + public static AcDcDevicesRecord ResetAlarms(this AcDcDevicesRecord acDcStatus) + { + var sc = acDcStatus.SystemControl; + + if (sc is not null) + sc.ResetAlarmsAndWarnings = sc.Alarms.Any() || sc.Warnings.Any(); + + foreach (var d in acDcStatus.Devices) + d.Control.ResetAlarmsAndWarnings = d.Status.Alarms.Any() || d.Status.Warnings.Any(); + + return acDcStatus; + } + +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/System/StateMachine.cs b/csharp/App_backup/SodiStoreMax/src/System/StateMachine.cs new file mode 100644 index 000000000..6e0d498ec --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/System/StateMachine.cs @@ -0,0 +1,9 @@ +namespace InnovEnergy.App.SodiStoreMax.System; + +public record StateMachine +{ + public required String Message { get; set; } // TODO: init only + public required Int32 State { get; set; } // TODO: init only + + public static StateMachine Default { get; } = new StateMachine { State = 100, Message = "Unknown State" }; +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/SystemConfig/AcDcConfig.cs b/csharp/App_backup/SodiStoreMax/src/SystemConfig/AcDcConfig.cs new file mode 100644 index 000000000..28b514dc4 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SystemConfig/AcDcConfig.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SodiStoreMax.SystemConfig; + +public class AcDcConfig +{ + public required Double MaxDcLinkVoltage { get; set; } + public required Double MinDcLinkVoltage { get; set; } + public required Double ReferenceDcLinkVoltage { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/SystemConfig/CalibrationChargeType.cs b/csharp/App_backup/SodiStoreMax/src/SystemConfig/CalibrationChargeType.cs new file mode 100644 index 000000000..1b783b808 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SystemConfig/CalibrationChargeType.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.App.SodiStoreMax.SystemConfig; + +public enum CalibrationChargeType +{ + RepetitivelyEvery, + AdditionallyOnce, + ChargePermanently +} diff --git a/csharp/App_backup/SodiStoreMax/src/SystemConfig/Config.cs b/csharp/App_backup/SodiStoreMax/src/SystemConfig/Config.cs new file mode 100644 index 000000000..110db56cb --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SystemConfig/Config.cs @@ -0,0 +1,272 @@ +using System.Text.Json; +using InnovEnergy.App.SodiStoreMax.Devices; +using InnovEnergy.Lib.Utils; +using static System.Text.Json.JsonSerializer; + +namespace InnovEnergy.App.SodiStoreMax.SystemConfig; + +// shut up trim warnings +#pragma warning disable IL2026 + +public class Config //TODO: let IE choose from config files (Json) and connect to GUI +{ + private static String DefaultConfigFilePath => Path.Combine(Environment.CurrentDirectory, "config.json"); + private static DateTime DefaultDatetime => new(2024, 03, 11, 09, 00, 00); + + private static readonly JsonSerializerOptions JsonOptions = new() { WriteIndented = true }; + + public required Double MinSoc { get; set; } + public required UInt16 CurtailP { get; set; }// in Kw + public required UInt16 PvInstalledPower { get; set; }// in Kw + public required CalibrationChargeType ForceCalibrationChargeState { get; set; } + public required DateTime DayAndTimeForRepetitiveCalibration { get; set; } + public required DateTime DayAndTimeForAdditionalCalibration { get; set; } + public required Boolean DisplayIndividualBatteries { get; set; } + public required Double PConstant { get; set; } + public required Double GridSetPoint { get; set; } + public required Double BatterySelfDischargePower { get; set; } + public required Double HoldSocZone { get; set; } + public required DevicesConfig IslandMode { get; set; } + public required DevicesConfig GridTie { get; set; } + + public required DeviceConfig Devices { get; set; } + public required S3Config? S3 { get; set; } + + private static String? LastSavedData { get; set; } + + #if DEBUG + public static Config Default => new() + { + MinSoc = 20, + CurtailP = 0, + PvInstalledPower = 20, + ForceCalibrationChargeState = CalibrationChargeType.RepetitivelyEvery, + DayAndTimeForRepetitiveCalibration = DefaultDatetime, + DayAndTimeForAdditionalCalibration = DefaultDatetime, + DisplayIndividualBatteries = false, + PConstant = .5, + GridSetPoint = 0, + BatterySelfDischargePower = 200, + HoldSocZone = 1, // TODO: find better name, + IslandMode = new() + { + AcDc = new () + { + MinDcLinkVoltage = 690, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 810, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 50, + LowerDcLinkVoltage = 50, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + GridTie = new() + { + AcDc = new () + { + MinDcLinkVoltage = 720, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 810, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 50, + LowerDcLinkVoltage = 50, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + Devices = new () + { + RelaysIp = new() { Host = "localhost", Port = 5006, DeviceState = DeviceState.Measured}, + TsRelaysIp = new() { Host = "localhost", Port = 5006, DeviceState = DeviceState.Measured}, + GridMeterIp = new() { Host = "localhost", Port = 5003, DeviceState = DeviceState.Measured}, + PvOnAcGrid = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + LoadOnAcGrid = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + PvOnAcIsland = new() { Host = "true" , Port = 0 , DeviceState = DeviceState.Measured}, + IslandBusLoadMeterIp = new() { Host = "localhost", Port = 5004, DeviceState = DeviceState.Measured}, + TruConvertAcIp = new() { Host = "localhost", Port = 5001, DeviceState = DeviceState.Measured}, + PvOnDc = new() { Host = "localhost", Port = 5005, DeviceState = DeviceState.Measured}, + LoadOnDc = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + TruConvertDcIp = new() { Host = "localhost", Port = 5002, DeviceState = DeviceState.Measured}, + BatteryIp = new() { Host = "localhost", Port = 5007, DeviceState = DeviceState.Measured}, + BatteryNodes = new []{ 2, 3, 4, 5, 6 } + }, + + S3 = new() + { + Bucket = "1-3e5b3069-214a-43ee-8d85-57d72000c19d", + Region = "sos-ch-dk-2", + Provider = "exo.io", + ContentType = "text/plain; charset=utf-8", + Key = "EXO4ec5faf1a7650b79b5722fb5", + Secret = "LUxu1PGEA-POEIckoEyq6bYyz0RnenW6tmqccMKgkHQ" + }, + }; + #else + public static Config Default => new() + { + MinSoc = 20, + CurtailP = 0, + PvInstalledPower = 20, + ForceCalibrationChargeState = CalibrationChargeType.RepetitivelyEvery, + DayAndTimeForRepetitiveCalibration = DefaultDatetime, + DayAndTimeForAdditionalCalibration = DefaultDatetime, + DisplayIndividualBatteries = false, + PConstant = .5, + GridSetPoint = 0, + BatterySelfDischargePower = 200, + HoldSocZone = 1, // TODO: find better name, + IslandMode = new() + { + AcDc = new () + { + MinDcLinkVoltage = 690, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 810, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 50, + LowerDcLinkVoltage = 50, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + GridTie = new() + { + AcDc = new () + { + MinDcLinkVoltage = 720, + ReferenceDcLinkVoltage = 750, + MaxDcLinkVoltage = 780, + }, + + DcDc = new () + { + UpperDcLinkVoltage = 20, + LowerDcLinkVoltage = 20, + ReferenceDcLinkVoltage = 750, + + MaxBatteryChargingCurrent = 210, + MaxBatteryDischargingCurrent = 210, + MaxDcPower = 10000, + + MaxChargeBatteryVoltage = 57, + MinDischargeBatteryVoltage = 0, + }, + }, + + + S3 = new() + { + Bucket = "1-3e5b3069-214a-43ee-8d85-57d72000c19d", + Region = "sos-ch-dk-2", + Provider = "exo.io", + Key = "EXObb5a49acb1061781761895e7", + Secret = "sKhln0w8ii3ezZ1SJFF33yeDo8NWR1V4w2H0D4-350I", + ContentType = "text/plain; charset=utf-8" + }, + + Devices = new () + { + RelaysIp = new() { Host = "10.0.1.1", Port = 502, DeviceState = DeviceState.Measured}, + TsRelaysIp = new() { Host = "10.0.1.2", Port = 502, DeviceState = DeviceState.Measured}, + GridMeterIp = new() { Host = "10.0.4.1", Port = 502, DeviceState = DeviceState.Measured}, + PvOnAcGrid = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + LoadOnAcGrid = new() { Host = "true" , Port = 0 , DeviceState = DeviceState.Measured}, + PvOnAcIsland = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + IslandBusLoadMeterIp = new() { Host = "10.0.4.2", Port = 502, DeviceState = DeviceState.Measured}, + TruConvertAcIp = new() { Host = "10.0.2.1", Port = 502, DeviceState = DeviceState.Measured}, + PvOnDc = new() { Host = "10.0.5.1", Port = 502, DeviceState = DeviceState.Measured}, + LoadOnDc = new() { Host = "false" , Port = 0 , DeviceState = DeviceState.Measured}, + TruConvertDcIp = new() { Host = "10.0.3.1", Port = 502, DeviceState = DeviceState.Measured}, + BatteryIp = new() { Host = "localhost", Port = 6855, DeviceState = DeviceState.Measured }, + BatteryNodes = new []{ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, + }, + }; + #endif + + public void Save(String? path = null) + { + var configFilePath = path ?? DefaultConfigFilePath; + + try + { + var jsonString = Serialize(this, JsonOptions); + + if (LastSavedData == jsonString) + return; + + LastSavedData = jsonString; + + File.WriteAllText(configFilePath, jsonString); + } + catch (Exception e) + { + $"Failed to write config file {configFilePath}\n{e}".WriteLine(); + throw; + } + } + + + public static Config Load(String? path = null) + { + var configFilePath = path ?? DefaultConfigFilePath; + try + { + var jsonString = File.ReadAllText(configFilePath); + return Deserialize(jsonString)!; + } + catch (Exception e) + { + $"Failed to read config file {configFilePath}, using default config\n{e}".WriteLine(); + return Default; + } + } + + + public static async Task LoadAsync(String? path = null) + { + var configFilePath = path ?? DefaultConfigFilePath; + try + { + var jsonString = await File.ReadAllTextAsync(configFilePath); + return Deserialize(jsonString)!; + } + catch (Exception e) + { + Console.WriteLine($"Couldn't read config file {configFilePath}, using default config"); + e.Message.WriteLine(); + return Default; + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/SystemConfig/DcDcConfig.cs b/csharp/App_backup/SodiStoreMax/src/SystemConfig/DcDcConfig.cs new file mode 100644 index 000000000..182f71521 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SystemConfig/DcDcConfig.cs @@ -0,0 +1,15 @@ +namespace InnovEnergy.App.SodiStoreMax.SystemConfig; + +public class DcDcConfig +{ + public required Double LowerDcLinkVoltage { get; set; } + public required Double ReferenceDcLinkVoltage { get; init; } + public required Double UpperDcLinkVoltage { get; set; } + + public required Double MaxBatteryChargingCurrent { get; set; } + public required Double MaxBatteryDischargingCurrent { get; set; } + public required Double MaxDcPower { get; set; } + + public required Double MaxChargeBatteryVoltage { get; set; } + public required Double MinDischargeBatteryVoltage { get; set; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/SystemConfig/DeviceConfig.cs b/csharp/App_backup/SodiStoreMax/src/SystemConfig/DeviceConfig.cs new file mode 100644 index 000000000..aed893168 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SystemConfig/DeviceConfig.cs @@ -0,0 +1,21 @@ +using InnovEnergy.App.SodiStoreMax.Devices; +using InnovEnergy.Lib.Utils.Net; + +namespace InnovEnergy.App.SodiStoreMax.SystemConfig; + +public class DeviceConfig +{ + public required SalimaxDevice RelaysIp { get; init; } + public required SalimaxDevice TsRelaysIp { get; init; } + public required SalimaxDevice GridMeterIp { get; init; } + public required SalimaxDevice PvOnAcGrid { get; init; } + public required SalimaxDevice LoadOnAcGrid { get; init; } + public required SalimaxDevice PvOnAcIsland { get; init; } + public required SalimaxDevice IslandBusLoadMeterIp { get; init; } + public required SalimaxDevice TruConvertAcIp { get; init; } + public required SalimaxDevice PvOnDc { get; init; } + public required SalimaxDevice LoadOnDc { get; init; } + public required SalimaxDevice TruConvertDcIp { get; init; } + public required SalimaxDevice BatteryIp { get; init; } + public required Int32[] BatteryNodes { get; init; } +} diff --git a/csharp/App_backup/SodiStoreMax/src/SystemConfig/DevicesConfig.cs b/csharp/App_backup/SodiStoreMax/src/SystemConfig/DevicesConfig.cs new file mode 100644 index 000000000..ba049f5cb --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/SystemConfig/DevicesConfig.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.App.SodiStoreMax.SystemConfig; + +public class DevicesConfig +{ + public required AcDcConfig AcDc { get; init; } + public required DcDcConfig DcDc { get; init; } +} \ No newline at end of file diff --git a/csharp/App_backup/SodiStoreMax/src/Topology.cs b/csharp/App_backup/SodiStoreMax/src/Topology.cs new file mode 100644 index 000000000..5ad0190e1 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/src/Topology.cs @@ -0,0 +1,530 @@ +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using InnovEnergy.App.SodiStoreMax.Devices; +using InnovEnergy.App.SodiStoreMax.Ess; +using InnovEnergy.Lib.Devices.AMPT; +using InnovEnergy.Lib.Devices.BatteryDeligreen; +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; +using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; +using InnovEnergy.Lib.Units; +using InnovEnergy.Lib.Units.Power; +using InnovEnergy.Lib.Utils; +using Ac3Bus = InnovEnergy.Lib.Units.Composite.Ac3Bus; + +namespace InnovEnergy.App.SodiStoreMax; + +// ┌────┐ ┌────┐ +// │ Pv │ │ Pv │ ┌────┐ +// └────┘ └────┘ │ Pv │ +// V V └────┘ +// V V V +// (b) 0 W (e) 0 W V +// V V (i) 13.2 kW ┌────────────┐ +// V V V │ Battery │ +// ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌─────────┐ V ├────────────┤ +// │ Grid │ │ Grid Bus │ │ Island Bus │ │ AC/DC │ ┌────────┐ ┌───────┐ │ 52.3 V │ +// ├─────────┤ -10.3 kW ├──────────┤ -11.7 kW ├────────────┤ -11.7 kW ├─────────┤ -11.7 kW │ Dc Bus │ 1008 W │ DC/DC │ 1008 W │ 99.1 % │ +// │ -3205 W │<<<<<<<<<<│ 244 V │<<<<<<<<<<│ 244 V │<<<<<<<<<<│ -6646 W │<<<<<<<<<<├────────┤>>>>>>>>>>├───────┤>>>>>>>>>>│ 490 mA │ +// │ -3507 W │ (a) │ 244 V │ (d) │ 244 V │ (g) │ -5071 W │ (h) │ 776 V │ (k) │ 56 V │ (l) │ 250 °C │ +// │ -3605 W │ K1 │ 246 V │ K2 │ 246 V │ K3 └─────────┘ └────────┘ └───────┘ │ 445 A │ +// └─────────┘ └──────────┘ └────────────┘ V │ 0 Warnings │ +// V V V │ 0 Alarms │ +// V V (j) 0 W └────────────┘ +// (c) 1400 W (f) 0 W V +// V V V +// V V ┌──────┐ +// ┌──────┐ ┌──────┐ │ Load │ +// │ Load │ │ Load │ └──────┘ +// └──────┘ └──────┘ + + +// Calculated values: c,d & h +// ========================== +// +// +// AC side +// a + b - c - d = 0 [eq1] +// d + e - f - g = 0 [eq2] +// +// c & d are not measured! +// +// d = f + g - e [eq2] +// c = a + b - d [eq1] +// +// DC side +// h + i - j - k = 0 [eq3] +// +// if Dc load not existing, h = i - k [eq4] + +// k = l assuming no losses in DCDC // this is changed now l is equal total battery power +// j = h + i - k [eq3] + + +public static class Topology +{ + + public static TextBlock CreateTopologyTextBlock(this StatusRecord status) + { + var a = status.GridMeter?.Ac.Power.Active; + var b = status.PvOnAcGrid?.Dc.Power.Value; + var e = status.PvOnAcIsland?.Dc.Power.Value; + var f = status.LoadOnAcIsland?.Ac.Power.Active; + var g = status.AcDc.Dc.Power.Value; + var h = status.AcDcToDcLink?.Power.Value; + var i = status.PvOnDc?.Dc.Power.Value; + var k = status.DcDc.Dc.Link.Power.Value; + var l = status.Battery is not null ? status.Battery.Power : 0; + var j = status.LoadOnDc?.Power.Value; + var d = status.AcGridToAcIsland?.Power.Active; + var c = status.LoadOnAcGrid?.Power.Active; + + ///////////////////////////// + + var grid = status.CreateGridColumn(a); + var gridBus = status.CreateGridBusColumn(b, c, d); + var islandBus = status.CreateIslandBusColumn(e, f, g); + var inverter = status.CreateInverterColumn(h); + var dcBus = status.CreateDcBusColumn(i, j, k); + var dcDc = status.CreateDcDcColumn(l); + var batteries = status.CreateBatteryColumn(); + + return TextBlock.AlignCenterVertical + ( + grid, + gridBus, + islandBus, + inverter, + dcBus, + dcDc, + batteries + ); + } + + private static TextBlock CreateGridColumn(this StatusRecord status, ActivePower? a) + { + // ┌─────────┐ + // │ Grid │ + // ├─────────┤ -10.3 kW + // │ -3205 W │<<<<<<<<<< + // │ -3507 W │ (a) + // │ -3605 W │ K1 + // └─────────┘ + + var gridMeterAc = status.GridMeter?.Ac; + var k1 = status.Relays?.K1GridBusIsConnectedToGrid; + + var gridBox = PhasePowersActive(gridMeterAc).TitleBox("Grid"); + var gridFlow = SwitchedFlow(k1, a, "K1"); + + return TextBlock.AlignCenterVertical(gridBox, gridFlow); + } + + + private static TextBlock CreateGridBusColumn(this StatusRecord status, + ActivePower? b, + ActivePower? c, + ActivePower? d) + { + + // ┌────┐ + // │ Pv │ + // └────┘ + // V + // V + // (b) 0 W + // V + // V + // ┌──────────┐ + // │ Grid Bus │ + // ├──────────┤ -11.7 kW + // │ 244 V │<<<<<<<<<< + // │ 244 V │ (d) + // │ 246 V │ K2 + // └──────────┘ + // V + // V + // (c) 1400 W + // V + // V + // ┌──────┐ + // │ Load │ + // └──────┘ + + + ////////////// top ////////////// + + var pvBox = TextBlock.FromString("PV").Box(); + var pvFlow = Flow.Vertical(b); + + ////////////// center ////////////// + + // on IslandBus show voltages measured by inverter + // on GridBus show voltages measured by grid meter + // ought to be approx the same + + var gridMeterAc = status.GridMeter?.Ac; + var k2 = status.Relays?.K2IslandBusIsConnectedToGridBus; + + var busBox = PhaseVoltages(gridMeterAc).TitleBox("Grid Bus"); + var busFlow = SwitchedFlow(k2, d, "K2"); + + ////////////// bottom ////////////// + + var loadFlow = Flow.Vertical(c); + var loadBox = TextBlock.FromString("Load").Box(); + + ////////////// assemble ////////////// + + return TextBlock.AlignCenterVertical + ( + TextBlock.AlignCenterHorizontal(pvBox, pvFlow, busBox, loadFlow, loadBox), + busFlow + ); + } + + + private static TextBlock CreateIslandBusColumn(this StatusRecord status, + ActivePower? e, + ActivePower? f, + ActivePower? g) + { + + // ┌────┐ + // │ Pv │ + // └────┘ + // V + // V + // (e) 0 W + // V + // V + // ┌────────────┐ + // │ Island Bus │ + // ├────────────┤ -11.7 kW + // │ 244 V │<<<<<<<<<< + // │ 244 V │ (g) + // │ 246 V │ K3 + // └────────────┘ + // V + // V + // (f) 0 W + // V + // V + // ┌──────┐ + // │ Load │ + // └──────┘ + + + ////////////// top ////////////// + + var pvBox = TextBlock.FromString("PV").Box(); + var pvFlow = Flow.Vertical(e); + + ////////////// center ////////////// + + // on IslandBus show voltages measured by inverter + // on GridBus show voltages measured by grid meter + // ought to be approx the same + + var inverterAc = status.AcDc.Ac; + var busBox = PhaseVoltages(inverterAc).TitleBox("Island Bus"); + var busFlow = status.IslandBusToInverterConnection(g); + + ////////////// bottom ////////////// + + var loadFlow = Flow.Vertical(f); + var loadBox = TextBlock.FromString("Load").Box(); + + ////////////// assemble ////////////// + + return TextBlock.AlignCenterVertical + ( + TextBlock.AlignCenterHorizontal(pvBox, pvFlow, busBox, loadFlow, loadBox), + busFlow + ); + } + + + + private static TextBlock CreateInverterColumn(this StatusRecord status, ActivePower? h) + { + // ┌─────────┐ + // │ AC/DC │ + // ├─────────┤ -11.7 kW + // │ -6646 W │<<<<<<<<<< + // │ -5071 W │ (h) + // └─────────┘ + + var inverterBox = status + .AcDc + .Devices + .Select(d => d.Status.Ac.Power.Active) + .Apply(TextBlock.AlignLeft) + .TitleBox("AC/DC"); + + var dcFlow = Flow.Horizontal(h); + + return TextBlock.AlignCenterVertical(inverterBox, dcFlow); + } + + + [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")] + private static TextBlock IslandBusToInverterConnection(this StatusRecord status, ActivePower? g) + { + if (status.Relays is null) + return TextBlock.FromString("????????"); + + var nInverters = status.AcDc.Devices.Count; + + var k3S = status + .Relays + .K3InverterIsConnectedToIslandBus + .Take(nInverters); + + if (k3S.Prepend(true).All(s => s)) // TODO: display when no ACDC present + return Flow.Horizontal(g); + + return Switch.Open("K3"); + } + + private static TextBlock CreateDcDcColumn(this StatusRecord status, ActivePower? p) + { + var dc48Voltage = status.DcDc.Dc.Battery.Voltage.ToDisplayString(); + + var busBox = TextBlock + .AlignLeft(dc48Voltage) + .TitleBox("DC/DC"); + + var busFlow = Flow.Horizontal(p); + + return TextBlock.AlignCenterVertical(busBox, busFlow); + } + + private static TextBlock CreateDcBusColumn(this StatusRecord status, + ActivePower? i, + ActivePower? j, + ActivePower? k) + { + // ┌────┐ + // │ Pv │ + // └────┘ + // V + // V + // (i) 13.2 kW + // V + // V + // ┌────────┐ + // │ Dc Bus │ 1008 W + // ├────────┤>>>>>>>>>> + // │ 776 V │ (k) + // └────────┘ + // V + // V + // (j) 0 W + // V + // V + // ┌──────┐ + // │ Load │ + // └──────┘ + // + + + /////////////////// top /////////////////// + + var mppt = status.PvOnDc; + + var nStrings = mppt is not null + ? "x" + mppt.Strings.Count + : "?"; + + var pvBox = TextBlock.FromString($"PV {nStrings}").Box(); + var pvToBus = Flow.Vertical(i); + + /////////////////// center /////////////////// + + var dcBusVoltage = status.DcDc.Dc.Link.Voltage; + + var dcBusBox = dcBusVoltage + .ToDisplayString() + .Apply(TextBlock.FromString) + .TitleBox("DC Bus "); + + var busFlow = Flow.Horizontal(k); + + /////////////////// bottom /////////////////// + + var busToLoad = Flow.Vertical(j); + var loadBox = TextBlock.FromString("DC Load").Box(); + + ////////////// assemble ////////////// + + return TextBlock.AlignCenterVertical + ( + TextBlock.AlignCenterHorizontal(pvBox, pvToBus, dcBusBox, busToLoad, loadBox), + busFlow + ); + } + + private static TextBlock CreateBatteryColumn(this StatusRecord status) + { + var bat = status.Battery; + if (bat is null) + return TextBlock.AlignLeft("no battery").Box(); + + + var batteryAvgBox = CreateAveragedBatteryBox(bat); + + var batteryBoxes = bat + .Devices + .Select(CreateBatteryBox) + .ToReadOnlyList(); + + + var individualWithAvgBox = TextBlock + .AlignCenterVertical + ( + batteryAvgBox , + batteryBoxes.Any() + ? TextBlock.AlignLeft(batteryBoxes) + : TextBlock.Empty + ); + + return status.Config.DisplayIndividualBatteries ? individualWithAvgBox : batteryAvgBox; + } + + private static TextBlock CreateAveragedBatteryBox(BatteryDeligreenRecords bat) + { + var voltage = bat.Voltage.ToDisplayString(); + var soc = bat.Devices.Any() ? bat.Devices.Average(b => b.BatteryDeligreenDataRecord.Soc).Percent().ToDisplayString() : "0"; // TODO + var current = bat.Current.ToDisplayString(); + var busCurrent = bat.Devices.Any() ? bat.Devices.Sum(b => b.BatteryDeligreenDataRecord.BusCurrent).A().ToDisplayString() : "0"; + var temp = bat.TemperatureCell1.ToDisplayString(); + //var alarms = bat.Alarms.Count + " Alarms"; + //var warnings = bat.Warnings.Count + " Warnings"; + var nBatteries = bat.Devices.Count; + + return TextBlock + .AlignLeft + ( + voltage, + soc, + current, + busCurrent, + temp + ) + .TitleBox($"Battery x{nBatteries}"); + } + + private static TextBlock PhaseVoltages(Ac3Bus? ac) + { + return TextBlock.AlignLeft + ( + ac?.L1.Voltage.ToDisplayString() ?? "???", + ac?.L2.Voltage.ToDisplayString() ?? "???", + ac?.L3.Voltage.ToDisplayString() ?? "???" + ); + } + + private static TextBlock PhasePowersActive(Ac3Bus? ac) + { + return TextBlock.AlignLeft + ( + ac?.L1.Power.Active.ToDisplayString() ?? "???", + ac?.L2.Power.Active.ToDisplayString() ?? "???", + ac?.L3.Power.Active.ToDisplayString() ?? "???" + ); + } + + private static TextBlock CreateBatteryBox(BatteryDeligreenRecord battery, Int32 i) + { + var batteryWarnings = "";// battery.Warnings.Any(); + var batteryAlarms = "";// battery.Alarms.Any(); + + var content = TextBlock.AlignLeft + ( + battery.BatteryDeligreenDataRecord.BusVoltage.ToDisplayString(), + battery.BatteryDeligreenDataRecord.Soc.ToDisplayString(), + battery.BatteryDeligreenDataRecord.BusCurrent.ToDisplayString() + " C/D", + battery.BatteryDeligreenDataRecord.TemperaturesList.PowerTemperature.ToDisplayString(), + battery.BatteryDeligreenDataRecord.BatteryCapacity.ToString(CultureInfo.CurrentCulture) , + batteryWarnings, + batteryAlarms + ); + + var box = content.TitleBox($"Battery {i + 1}"); + var flow = Flow.Horizontal(battery.BatteryDeligreenDataRecord.Power); + + return TextBlock.AlignCenterVertical(flow, box); + } + + + private static TextBlock SwitchedFlow(Boolean? switchClosed, ActivePower? power, String kx) + { + return switchClosed is null ? TextBlock.FromString("??????????") + : !switchClosed.Value ? Switch.Open(kx) + : power is null ? TextBlock.FromString("??????????") + : Flow.Horizontal(power); + } + + //We are fake using the ampt instead of PvOnAc, We dont have a Pv on Ac at the moment and we don't have it classes :TODO + public static AcPowerDevice? CalculateGridBusLoad(EmuMeterRegisters? gridMeter, AmptStatus? pvOnAcGrid, AcPowerDevice? gridBusToIslandBusPower) + { + var a = gridMeter ?.Ac.Power; + var b = pvOnAcGrid is not null? pvOnAcGrid?.Dc.Power.Value: 0; + var d = gridBusToIslandBusPower?.Power; + + if (a is null || b is null || d is null) + return null; + + var c = a + b - d; // [eq1] + + return new AcPowerDevice { Power = c }; + } + + //We are fake using the ampt instead of PvOnAc, We dont have a Pv on Ac at the moment and we don't have it classes :TODO + public static DcPowerDevice? CalculateAcDcToDcLink(AmptStatus? pvOnDc, DcDcDevicesRecord? dcDc, AcDcDevicesRecord acDc) + { + var i = pvOnDc?.Dc.Power; + var k = dcDc?.Dc.Link.Power; // We don't check on the DcDc because this device is mandatory + var g = acDc?.Dc.Power; + + if (i is null || k is null ) + { + return new DcPowerDevice { Power = g }; + } + + var h = -(i - k); // [eq4] + + return new DcPowerDevice { Power = h }; + } + + //We are fake using the ampt instead of PvOnAc, We dont have a Pv on Ac at the moment and we don't have it classes :TODO + public static AcPowerDevice? CalculateGridBusToIslandBusPower(AmptStatus? pvOnAcIsland, EmuMeterRegisters? loadOnAcIsland, AcDcDevicesRecord? acDc) + { + var e = pvOnAcIsland is not null? pvOnAcIsland?.Dc.Power.Value: 0; + var f = loadOnAcIsland is not null? loadOnAcIsland?.Ac.Power : 0; + var g = acDc ?.Ac.Power; // We don't check on the AcDc because this device is mandatory, if this does not exist the system will not start + + if (e is null || f is null || g is null) + return null; + + var d = f + g - e; // [eq2] + + return new AcPowerDevice { Power = d }; + } + + public static DcPowerDevice? CalculateDcLoad(AcDcDevicesRecord? acDc, AmptStatus? pvOnDc, DcDcDevicesRecord? dcDc) + { + var h = acDc?.Dc.Power; // We don't check on the AcDc because this device is mandatory + var i = pvOnDc is not null? pvOnDc?.Dc.Power: 0; + var k = dcDc?.Dc.Link.Power; // We don't check on the DcDc because this device is mandatory + + if (h is null || i is null || k is null) + return null; + + var j = h + i - k; // [eq3] + + return new DcPowerDevice { Power = j}; + } + +} diff --git a/csharp/App_backup/SodiStoreMax/tunnelstoSalimaxX.sh b/csharp/App_backup/SodiStoreMax/tunnelstoSalimaxX.sh new file mode 100755 index 000000000..03b256195 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/tunnelstoSalimaxX.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +host="ie-entwicklung@$1" + +tunnel() { + name=$1 + ip=$2 + rPort=$3 + lPort=$4 + + echo -n "$name @ $ip mapped to localhost:$lPort " + ssh -nNTL "$lPort:$ip:$rPort" "$host" 2> /dev/null & + + until nc -vz 127.0.0.1 $lPort 2> /dev/null + do + echo -n . + sleep 0.3 + done + + echo "ok" +} + +echo "" + +tunnel "Trumpf Inverter (http) " 10.0.2.1 80 8001 +tunnel "Trumpf DCDC (http) " 10.0.3.1 80 8002 +tunnel "Ext Emu Meter (http) " 10.0.4.1 80 8003 +tunnel "Int Emu Meter (http) " 10.0.4.2 80 8004 +tunnel "AMPT (http) " 10.0.5.1 8080 8005 + +tunnel "Trumpf Inverter (modbus)" 10.0.2.1 502 5001 +tunnel "Trumpf DCDC (modbus) " 10.0.3.1 502 5002 +tunnel "Ext Emu Meter (modbus) " 10.0.4.1 502 5003 +tunnel "Int Emu Meter " 10.0.4.2 502 5004 +tunnel "AMPT (modbus) " 10.0.5.1 502 5005 +tunnel "Adam " 10.0.1.1 502 5006 #for AMAX is 10.0.1.3 +tunnel "Batteries " 127.0.0.1 6855 5007 + +echo +echo "press any key to close the tunnels ..." +read -r -n 1 -s +kill $(jobs -p) +echo "done" + diff --git a/csharp/App_backup/SodiStoreMax/uploadBatteryFw/AF0A.bin b/csharp/App_backup/SodiStoreMax/uploadBatteryFw/AF0A.bin new file mode 100644 index 0000000000000000000000000000000000000000..e5b7b9aba4bd3faaa32acad19314bfac5a4307da GIT binary patch literal 589824 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 J@c);A{{wk90$Bh6 literal 0 HcmV?d00001 diff --git a/csharp/App_backup/SodiStoreMax/uploadBatteryFw/update_firmware.sh b/csharp/App_backup/SodiStoreMax/uploadBatteryFw/update_firmware.sh new file mode 100755 index 000000000..fab8d1174 --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/uploadBatteryFw/update_firmware.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +dotnet_version='net6.0' +salimax_ip="$1" +username='ie-entwicklung' +root_password='Salimax4x25' + +set -e + +ip_addresses=("10.2.3.115" "10.2.3.104" "10.2.4.33" "10.2.4.32" "10.2.4.36" "10.2.4.35" "10.2.4.154" "10.2.4.113" "10.2.4.29") +battery_ids=("2" "3" "4" "5" "6" "7" "8" "9" "10" "11") + + +for ip_address in "${ip_addresses[@]}"; do + scp upload-bms-firmware AF0A.bin "$username"@"$ip_address":/home/"$username" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl stop battery.service" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S apt install python3-pip -y" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S pip3 install pymodbus" + + for battery in "${battery_ids[@]}"; do + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S python3 upload-bms-firmware ttyUSB0 " "$battery" " AF0A.bin" + done + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl start battery.service" + ssh "$username"@"$ip_address" "echo '$root_password' | sudo -S systemctl rm upload-bms-firmware AF0A.bin" + +echo "Deployed and ran commands on $ip_address" +done + + diff --git a/csharp/App_backup/SodiStoreMax/uploadBatteryFw/upload-bms-firmware b/csharp/App_backup/SodiStoreMax/uploadBatteryFw/upload-bms-firmware new file mode 100755 index 000000000..58d2c804d --- /dev/null +++ b/csharp/App_backup/SodiStoreMax/uploadBatteryFw/upload-bms-firmware @@ -0,0 +1,288 @@ +#!/usr/bin/python2 -u +# coding=utf-8 + +import os +import struct +from time import sleep + +import serial +from os import system +import logging + +from pymodbus.client import ModbusSerialClient as Modbus +from pymodbus.exceptions import ModbusIOException +from pymodbus.pdu import ModbusResponse +from os.path import dirname, abspath +from sys import path, argv, exit + +path.append(dirname(dirname(abspath(__file__)))) + +PAGE_SIZE = 0x100 +HALF_PAGE =int( PAGE_SIZE / 2) +WRITE_ENABLE = [1] +FIRMWARE_VERSION_REGISTER = 1054 + +ERASE_FLASH_REGISTER = 0x2084 +RESET_REGISTER = 0x2087 +logging.basicConfig(level=logging.INFO) + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import List, NoReturn, Iterable, Optional + +def calc_stm32_crc_round(crc, data): + # type: (int, int) -> int + crc = crc ^ data + for _ in range(32): + xor = (crc & 0x80000000) != 0 + crc = (crc & 0x7FFFFFFF) << 1 # clear bit 31 because python ints have "infinite" bits + if xor: + crc = crc ^ 0x04C11DB7 + + return crc + + +def calc_stm32_crc(data): + # type: (Iterable[int]) -> int + crc = 0xFFFFFFFF + + for dw in data: + crc = calc_stm32_crc_round(crc, dw) + + return crc + + +def init_modbus(tty): + # type: (str) -> Modbus + + return Modbus( + port='/dev/' + tty, + method='rtu', + baudrate=115200, + stopbits=1, + bytesize=8, + timeout=0.5, # seconds + parity=serial.PARITY_ODD) + + +def failed(response): + # type: (ModbusResponse) -> bool + + # Todo 'ModbusIOException' object has no attribute 'function_code' + return response.function_code > 0x80 + + +def clear_flash(modbus, slave_address): + # type: (Modbus, int) -> bool + + print ('erasing flash...') + + write_response = modbus.write_registers(address=0x2084, values=[1], slave=slave_address) + + if failed(write_response): + print('erasing flash FAILED') + return False + + flash_countdown = 17 + while flash_countdown > 0: + read_response = modbus.read_holding_registers(address=0x2085, count=1, slave=slave_address) + + if failed(read_response): + print('erasing flash FAILED') + return False + + if read_response.registers[0] != flash_countdown: + flash_countdown = read_response.registers[0] + + msg = str(100 * (16 - flash_countdown) / 16) + '%' + print('\r{0} '.format(msg), end=' ') + + print('done!') + + return True + + +# noinspection PyShadowingBuiltins +def bytes_to_words(bytes): + # type: (str) -> List[int] + return list(struct.unpack('>' + int(len(bytes)/2) * 'H', bytes)) + + +def send_half_page_1(modbus, slave_address, data, page): + # type: (Modbus, int, str, int) -> NoReturn + + first_half = [page] + bytes_to_words(data[:HALF_PAGE]) + write_first_half = modbus.write_registers(0x2000, first_half, slave=slave_address) + + if failed(write_first_half): + raise Exception("Failed to write page " + str(page)) + + +def send_half_page_2(modbus, slave_address, data, page): + # type: (Modbus, int, str, int) -> NoReturn + + registers = bytes_to_words(data[HALF_PAGE:]) + calc_crc(page, data) + WRITE_ENABLE + result = modbus.write_registers(0x2041, registers, slave=slave_address) + + if failed(result): + raise Exception("Failed to write page " + str(page)) + + +def get_fw_name(fw_path): + # type: (str) -> str + return fw_path.split('/')[-1].split('.')[0] + + +def upload_fw(modbus, slave_id, fw_path, fw_name): + # type: (Modbus, int, str, str) -> NoReturn + + with open(fw_path, "rb") as f: + + size = os.fstat(f.fileno()).st_size + n_pages = int(size / PAGE_SIZE) + + print('uploading firmware ' + fw_name + ' to BMS ...') + + for page in range(0, n_pages): + page_data = f.read(PAGE_SIZE) + + msg = "page " + str(page + 1) + '/' + str(n_pages) + ' ' + str(100 * page / n_pages + 1) + '%' + print('\r{0} '.format(msg), end=' ') + + if is_page_empty(page_data): + continue + sleep(0.01) + send_half_page_1(modbus, slave_id, page_data, page) + sleep(0.01) + send_half_page_2(modbus, slave_id, page_data, page) + + +def is_page_empty(page): + # type: (str) -> bool + return page.count(b'\xff') == len(page) + + +def reset_bms(modbus, slave_id): + # type: (Modbus, int) -> bool + + print ('resetting BMS...') + + result = modbus.write_registers(RESET_REGISTER, [1], slave=slave_id) + + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) + + if success: + print('done') + else: + print('FAILED to reset battery!') + + return success + + +def calc_crc(page, data): + # type: (int, str) -> List[int] + + crc = calc_stm32_crc([page] + bytes_to_words(data)) + crc_bytes = struct.pack('>L', crc) + + return bytes_to_words(crc_bytes) + + +def identify_battery(modbus, slave_id): + # type: (Modbus, int) -> Optional[str] + print("slave id=",slave_id) + target = 'battery ' + str(slave_id) + ' at ' + '502' + + try: + + print(('contacting ...')) + + response = modbus.read_input_registers(address=FIRMWARE_VERSION_REGISTER, count=1, slave=slave_id) + fw = '{0:0>4X}'.format(response.registers[0]) + + print(('found battery with firmware ' + fw)) + + return fw + + except: + print(('failed to communicate with ')) + return None + + +def print_usage(): + print(('Usage: ' + __file__ + ' ')) + print(('Example: ' + __file__ + ' ttyUSB0 2 A08C.bin')) + + +def parse_cmdline_args(argv): + # type: (List[str]) -> (str, str, str, str) + + def fail_with(msg): + print(msg) + print_usage() + exit(1) + + if len(argv) < 1: + fail_with('missing argument for tty device') + + if len(argv) < 2: + fail_with('missing argument for battery ID') + + if len(argv) < 3: + fail_with('missing argument for firmware') + + return argv[0], int(argv[1]), argv[2], get_fw_name(argv[2]) + + +def verify_firmware(modbus, battery_id, fw_name): + # type: (Modbus, int, str) -> NoReturn + + fw_verify = identify_battery(modbus, battery_id) + + if fw_verify == fw_name: + print('SUCCESS') + else: + print('FAILED to verify uploaded firmware!') + if fw_verify is not None: + print('expected firmware version ' + fw_name + ' but got ' + fw_verify) + + +def wait_for_bms_reboot(): + # type: () -> NoReturn + + # wait 20s for the battery to reboot + + print('waiting for BMS to reboot...') + + for t in range(20, 0, -1): + print('\r{0} '.format(t), end=' ') + sleep(1) + + print('0') + + +def main(argv): + # type: (List[str]) -> NoReturn + + tty, battery_id, fw_path, fw_name = parse_cmdline_args(argv) + with init_modbus(tty) as modbus: + + if identify_battery(modbus, battery_id) is None: + return + + clear_flash(modbus, battery_id) + upload_fw(modbus, battery_id, fw_path, fw_name) + + if not reset_bms(modbus, battery_id): + return + + wait_for_bms_reboot() + + verify_firmware(modbus, battery_id, fw_name) + + +main(argv[1:]) diff --git a/csharp/App_backup/VrmGrabber/Controller.cs b/csharp/App_backup/VrmGrabber/Controller.cs new file mode 100644 index 000000000..46dddd884 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Controller.cs @@ -0,0 +1,260 @@ +using CliWrap; +using HandlebarsDotNet; +using InnovEnergy.App.VrmGrabber.Database; +using InnovEnergy.Lib.Utils; +using Microsoft.AspNetCore.Mvc; +using VrmInstallation = InnovEnergy.Lib.Victron.VictronVRM.Installation; + +namespace InnovEnergy.App.VrmGrabber; + +public record InstallationToHtmlInterface( + String Name, + String Ip, + Int64 Vrm, + String Identifier, + String Serial, + String EscapedName, + String Online, + String LastSeen, + String NumBatteries, + String BatteryVersion, + String BatteryUpdateStatus, + String ServerIp = "10.2.0.1", //TODO MAKE ME DYNAMIC + String FirmwareVersion = "AF09" //Todo automatically grab newest version? + ); + +[Controller] +public class Controller : ControllerBase +{ + + //Todo automatically grab newest version? + private const String FirmwareVersion = "AF09"; + + + [HttpGet] + [Route("/")] + [Produces("text/html")] + public ActionResult Index() + { + const String source = @" + + +

+ + + + + + + + + + + + + + + + {{#inst}} + {{> installations}} + {{/inst}} + +
Name This site is updated once per day!GuiVRMGrafanaIdentifierLast SeenSerial#BatteriesFirmware-VersionUpdateLast Update Status
+
"; + + + + const String partialSource = @"{{Name}} + {{online}} {{Ip}} + VRM + Grafana + {{Identifier}} + {{LastSeen}} + {{Serial}} + {{NumBatteries}} + {{BatteryVersion}} + ⬆️{{FirmwareVersion}} + {{BatteryUpdateStatus}} + "; + + var installationsInDb = Db.Installations.OrderBy(i => i.Name, StringComparer.OrdinalIgnoreCase).ToList(); + if (installationsInDb.Count == 0) return new ContentResult + { + ContentType = "text/html", + Content = "

Please wait page is still loading

" + }; + + Handlebars.RegisterTemplate("installations", partialSource); + var template = Handlebars.Compile(source); + var installsForHtml = installationsInDb.Select(i => new InstallationToHtmlInterface( + i.Name, + i.Ip, + i.Vrm, + i.Identifier, + i.Serial, + i.EscapedName, + i.Online, + DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64(i.LastSeen)).ToString(), + i.NumberOfBatteries, + i.BatteryFirmwareVersion, + i.BatteryUpdateStatus)); + + var data = new + { + inst = installsForHtml, + }; + + var result = template(data); + + return new ContentResult + { + ContentType = "text/html", + Content = result + }; + } + + + [HttpGet("UpdateBatteryFirmware/{installationIp}")] + public async Task UpdateBatteryFirmware(String installationIp) + { + //We need the DeviceName of the battery (ttyUSB?) + var pathToBattery = await Db.ExecuteBufferedAsyncCommandOnIp(installationIp, "dbus-send --system --dest=com.victronenergy.system --type=method_call --print-reply /ServiceMapping/com_victronenergy_battery_1 com.victronenergy.BusItem.GetText"); + + var split = pathToBattery.Split('"'); + var split2 = pathToBattery.Split(' '); + + if (split.Length < 2 || split2.Length < 1) + { + Console.WriteLine(pathToBattery + " Split failed "); + return "Update failed"; + } + if (split[1] == "Failed" || split2[0] == "Error") return "Update failed"; + + + + await SendNewBatteryFirmware(installationIp); + var batteryTtyName = split[1].Split(".").Last(); + var localCommand = "echo start"; + var installation = Db.Installations.First(installation => installation.Ip == installationIp); + installation.BatteryUpdateStatus = "Running"; + Db.Update(installation: installation); + var batteryIdsResult = await Db.ExecuteBufferedAsyncCommandOnIp(installationIp, $"dbus-send --system --dest=com.victronenergy.battery.{batteryTtyName} --type=method_call --print-reply / com.victronenergy.BusItem.GetText | grep -E -o '_Battery/[0-9]+/' | grep -E -o '[0-9]+'| sort -u"); + var batteryIds = batteryIdsResult.Split("\n").ToList(); + batteryIds.Pop(); + + foreach (var batteryId in batteryIds) + { + localCommand = localCommand.Append( + $" && /opt/innovenergy/scripts/upload-bms-firmware {batteryTtyName} {batteryId} /opt/innovenergy/bms-firmware/{FirmwareVersion}.bin"); + } + #pragma warning disable CS4014 + // Console.WriteLine(localCommand); + Db.ExecuteBufferedAsyncCommandOnIp(installationIp, localCommand) + .ContinueWith(async t => + { + Console.WriteLine(t.Result); + installation.BatteryUpdateStatus = "Complete"; + // installation.BatteryFirmwareVersion = FirmwareVersion; + Db.Update(installation: installation); + var vrmInst = await FindVrmInstallationByIp(installation.Ip!); + await UpdateVrmTagsToNewFirmware(installationIp); + await Db.UpdateAlarms(vrmInst); + }); + #pragma warning restore CS4014 + return "Battery update is successfully initiated, it will take around 15 minutes to complete! You can close this page now."; + } + + private static async Task UpdateVrmTagsToNewFirmware(String installationIp) + { + var vrmInstallation = await FindVrmInstallationByIp(installationIp); + var tags = await vrmInstallation.GetTags(); + + async void RemoveTag(String t) => await vrmInstallation.RemoveTags(t); + + tags.Where(tag => tag.StartsWith("FM-")) + .Do(RemoveTag); + + await vrmInstallation.AddTags("FM-" + FirmwareVersion); + } + + private static async Task FindVrmInstallationByIp(String installationIp) + { + var installationId = Db.Installations.Where(i => i.Ip == installationIp).Select(i => i.Vrm).First(); + var vrmAccount = await Db.GetVrmAccount(); + return await vrmAccount.GetInstallation(installationId!); + } + + private static async Task SendNewBatteryFirmware(String installationIp) + { + await Cli.Wrap("rsync") + .WithArguments($@"-r --relative bms-firmware/{FirmwareVersion}.bin") + .AppendArgument($@"root@{installationIp}:/opt/innovenergy") + .ExecuteAsync(); + } + // [HttpGet(nameof(GetInstallation))] + // [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + // public Object GetInstallation(UInt64 serialNumber) + // { + // var instList = Db.InstallationsAndDetails.Values.ToList(); + // foreach (var detailList in instList.Select((value, index) => new { Value = value, Index = index})) + // { + // if (detailList.Value.All(detail => detail.Json["idSite"]?.GetValue() != serialNumber)) continue; + // var retour = Db.InstallationsAndDetails.Keys.ToList()[detailList.Index].Json; + // retour["details"] = JsonSerializer.Deserialize(JsonSerializer.Serialize(detailList.Value.Select(d => d.Json).ToArray())); + // return retour; + // } + // + // return new NotFoundResult(); + // } +} + diff --git a/csharp/App_backup/VrmGrabber/Controller_test.cs b/csharp/App_backup/VrmGrabber/Controller_test.cs new file mode 100644 index 000000000..40213effd --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Controller_test.cs @@ -0,0 +1,311 @@ +using CliWrap; +using HandlebarsDotNet; +using InnovEnergy.App.VrmGrabber.Database; +using InnovEnergy.Lib.Utils; +using Microsoft.AspNetCore.Mvc; +using VrmInstallation = InnovEnergy.Lib.Victron.VictronVRM.Installation; + +namespace InnovEnergy.App.VrmGrabber; + +public record InstallationToHtmlInterface( + String Name, + String Ip, + Int64 Vrm, + String Identifier, + String Serial, + String EscapedName, + String Online, + String LastSeen, + String NumBatteries, + String BatteryVersion, + String BatteryUpdateStatus, + String ServerIp = "10.2.0.1", //TODO MAKE ME DYNAMIC + String FirmwareVersion = "AF09", //Todo automatically grab newest version? + String NodeRedFiles = "NodeRedFiles" + ); + +[Controller] +public class Controller : ControllerBase +{ + + //Todo automatically grab newest version? + private const String FirmwareVersion = "AF09"; + + + [HttpGet] + [Route("/")] + [Produces("text/html")] + public ActionResult Index() + { + const String source = @" + + +
+ + + + + + + + + + + + + + + + + {{#inst}} + {{> installations}} + {{/inst}} + +
Name This site is updated once per day!GuiVRMGrafanaIdentifierLast SeenSerial#BatteriesFirmware-VersionUpdateLast Update StatusUpload Node Red Files
+
"; + + + + const String partialSource = @"{{Name}} + {{online}} {{Ip}} + VRM + Grafana + {{Identifier}} + {{LastSeen}} + {{Serial}} + {{NumBatteries}} + {{BatteryVersion}} + ⬆️{{FirmwareVersion}} + {{BatteryUpdateStatus}} + ⬆️{{NodeRedFiles}} + "; + + var installationsInDb = Db.Installations.OrderBy(i => i.Name, StringComparer.OrdinalIgnoreCase).ToList(); + if (installationsInDb.Count == 0) return new ContentResult + { + ContentType = "text/html", + Content = "

Please wait page is still loading

" + }; + + Handlebars.RegisterTemplate("installations", partialSource); + var template = Handlebars.Compile(source); + var installsForHtml = installationsInDb.Select(i => new InstallationToHtmlInterface( + i.Name, + i.Ip, + i.Vrm, + i.Identifier, + i.Serial, + i.EscapedName, + i.Online, + DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64(i.LastSeen)).ToString(), + i.NumberOfBatteries, + i.BatteryFirmwareVersion, + i.BatteryUpdateStatus)); + + var data = new + { + inst = installsForHtml, + }; + + var result = template(data); + + return new ContentResult + { + ContentType = "text/html", + Content = result + }; + } + + + [HttpGet("UpdateBatteryFirmware/{installationIp}")] + public async Task UpdateBatteryFirmware(String installationIp) + { + //We need the DeviceName of the battery (ttyUSB?) + var pathToBattery = await Db.ExecuteBufferedAsyncCommandOnIp(installationIp, "dbus-send --system --dest=com.victronenergy.system --type=method_call --print-reply /ServiceMapping/com_victronenergy_battery_1 com.victronenergy.BusItem.GetText"); + + var split = pathToBattery.Split('"'); + var split2 = pathToBattery.Split(' '); + + if (split.Length < 2 || split2.Length < 1) + { + Console.WriteLine(pathToBattery + " Split failed "); + return "Update failed"; + } + if (split[1] == "Failed" || split2[0] == "Error") return "Update failed"; + + + + await SendNewBatteryFirmware(installationIp); + var batteryTtyName = split[1].Split(".").Last(); + var localCommand = "echo start"; + var installation = Db.Installations.First(installation => installation.Ip == installationIp); + installation.BatteryUpdateStatus = "Running"; + Db.Update(installation: installation); + var batteryIdsResult = await Db.ExecuteBufferedAsyncCommandOnIp(installationIp, $"dbus-send --system --dest=com.victronenergy.battery.{batteryTtyName} --type=method_call --print-reply / com.victronenergy.BusItem.GetText | grep -E -o '_Battery/[0-9]+/' | grep -E -o '[0-9]+'| sort -u"); + var batteryIds = batteryIdsResult.Split("\n").ToList(); + batteryIds.Pop(); + + foreach (var batteryId in batteryIds) + { + localCommand = localCommand.Append( + $" && /opt/innovenergy/scripts/upload-bms-firmware {batteryTtyName} {batteryId} /opt/innovenergy/bms-firmware/{FirmwareVersion}.bin"); + } + #pragma warning disable CS4014 + // Console.WriteLine(localCommand); + Db.ExecuteBufferedAsyncCommandOnIp(installationIp, localCommand) + .ContinueWith(async t => + { + Console.WriteLine(t.Result); + installation.BatteryUpdateStatus = "Complete"; + // installation.BatteryFirmwareVersion = FirmwareVersion; + Db.Update(installation: installation); + var vrmInst = await FindVrmInstallationByIp(installation.Ip!); + await UpdateVrmTagsToNewFirmware(installationIp); + await Db.UpdateAlarms(vrmInst); + }); + #pragma warning restore CS4014 + return "Battery update is successfully initiated, it will take around 15 minutes to complete! You can close this page now."; + } + + private static async Task UpdateVrmTagsToNewFirmware(String installationIp) + { + var vrmInstallation = await FindVrmInstallationByIp(installationIp); + var tags = await vrmInstallation.GetTags(); + + async void RemoveTag(String t) => await vrmInstallation.RemoveTags(t); + + tags.Where(tag => tag.StartsWith("FM-")) + .Do(RemoveTag); + + await vrmInstallation.AddTags("FM-" + FirmwareVersion); + } + + private static async Task FindVrmInstallationByIp(String installationIp) + { + var installationId = Db.Installations.Where(i => i.Ip == installationIp).Select(i => i.Vrm).First(); + var vrmAccount = await Db.GetVrmAccount(); + return await vrmAccount.GetInstallation(installationId!); + } + + private static async Task SendNewBatteryFirmware(String installationIp) + { + await Cli.Wrap("rsync") + .WithArguments($@"-r --relative bms-firmware/{FirmwareVersion}.bin") + .AppendArgument($@"root@{installationIp}:/opt/innovenergy") + .ExecuteAsync(); + } + // [HttpGet(nameof(GetInstallation))] + // [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + // public Object GetInstallation(UInt64 serialNumber) + // { + // var instList = Db.InstallationsAndDetails.Values.ToList(); + // foreach (var detailList in instList.Select((value, index) => new { Value = value, Index = index})) + // { + // if (detailList.Value.All(detail => detail.Json["idSite"]?.GetValue() != serialNumber)) continue; + // var retour = Db.InstallationsAndDetails.Keys.ToList()[detailList.Index].Json; + // retour["details"] = JsonSerializer.Deserialize(JsonSerializer.Serialize(detailList.Value.Select(d => d.Json).ToArray())); + // return retour; + // } + // + // return new NotFoundResult(); + // } + + // remove the original ones???????? + [HttpPost("UploadNodeRedFiles/{installationIp}")] + public async Task UploadNodeRedFiles(String installationIp) + { + // Define the mapping of files to remote locations + var fileLocationMappings = new Dictionary + { + { "flows.json", "/opt/data/nodered/.node-red/" }, + { "settings-user.js", "/opt/data/nodered/.node-red/" }, + { "rc.local", "/data/" }, + { "dbus-fzsonick-48tl", "/data/"} + }; + + var nodeRedFilesFolder = Path.Combine(Directory.GetCurrentDirectory(), "NodeRedFiles"); + if (!Directory.Exists(nodeRedFilesFolder)) + { + return BadRequest("NodeRedFiles folder does not exist."); + } + + var tasks = fileLocationMappings.Select(async mapping => + { + var fileName = mapping.Key; + var remoteLocation = mapping.Value; + + var filePath = Path.Combine(nodeRedFilesFolder, fileName); + if (!System.IO.File.Exists(filePath)) + { + throw new FileNotFoundException($"File {fileName} not found in {nodeRedFilesFolder}."); + } + + // Execute the SCP command to upload the file + await Cli.Wrap("rsync") + .WithArguments($@"-r {filePath}") + .AppendArgument($@"root@{installationIp}:{remoteLocation}") + .ExecuteAsync(); + }); + + try + { + await Task.WhenAll(tasks); + return Ok("All files uploaded successfully."); + } + catch (Exception ex) + { + return StatusCode(500, $"An error occurred while uploading files: {ex.Message}"); + } + } +} + diff --git a/csharp/App_backup/VrmGrabber/DataTypes/Installation.cs b/csharp/App_backup/VrmGrabber/DataTypes/Installation.cs new file mode 100644 index 000000000..58e68a4d5 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/DataTypes/Installation.cs @@ -0,0 +1,43 @@ +using SQLite; + +namespace InnovEnergy.App.VrmGrabber.DataTypes; + + +public class Installation +{ + public Installation(String? argName, String? argIp, Int64 argVrm, String? argIdentifier, String? serial, String? urlEncode, String? online, String? lastSeen, String details, String numberOfBatteries, String batteryFirmwareVersion, String? batteryUpdateStatus) + { + Name = argName; + Ip = argIp; + Vrm = argVrm; + Identifier = argIdentifier; + Serial = serial; + EscapedName = urlEncode; + Online = online; + LastSeen = lastSeen; + Details = details; + NumberOfBatteries = numberOfBatteries; + BatteryFirmwareVersion = batteryFirmwareVersion; + BatteryUpdateStatus = batteryUpdateStatus; + } + + public Installation() + { + } + + public String? Name { get; set;} + public String? Ip { get; set;} + public Int64 Vrm { get; set;} + + [PrimaryKey] + public String? Identifier { get; set;} + public String? Serial { get; set;} + public String? EscapedName { get; set;} + public String? Online { get; set;} + public String? LastSeen { get; set;} + public String? NumberOfBatteries { get; set;} + public String? BatteryFirmwareVersion { get; set;} + public String? BatteryUpdateStatus { get; set;} + + public String? Details { get; set; } //JSON +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/DataTypes/Methods/Installation.cs b/csharp/App_backup/VrmGrabber/DataTypes/Methods/Installation.cs new file mode 100644 index 000000000..7f89dd8d5 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/DataTypes/Methods/Installation.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.App.VrmGrabber.DataTypes.Methods; + + +public static class InstallationMethods +{ +} + diff --git a/csharp/App_backup/VrmGrabber/DataTypes/TreeNode.cs b/csharp/App_backup/VrmGrabber/DataTypes/TreeNode.cs new file mode 100644 index 000000000..e141688b7 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/DataTypes/TreeNode.cs @@ -0,0 +1,11 @@ +using SQLite; + +namespace InnovEnergy.App.VrmGrabber.DataTypes; + +public abstract partial class TreeNode +{ + [PrimaryKey, AutoIncrement] + public virtual Int64 Id { get; set; } + public String Information { get; set; } = ""; // unstructured random info + +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/Database/Create.cs b/csharp/App_backup/VrmGrabber/Database/Create.cs new file mode 100644 index 000000000..b8d7dc25f --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Database/Create.cs @@ -0,0 +1,13 @@ +using InnovEnergy.App.VrmGrabber.DataTypes; + +namespace InnovEnergy.App.VrmGrabber.Database; + + +public static partial class Db +{ + public static Boolean Create(Installation installation) + { + // SQLite wrapper is smart and *modifies* t's Id to the one generated (autoincrement) by the insertion + return Connection.Insert(installation) > 0; + } +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/Database/Db.cs b/csharp/App_backup/VrmGrabber/Database/Db.cs new file mode 100644 index 000000000..f0adf3cda --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Database/Db.cs @@ -0,0 +1,299 @@ +using System.Diagnostics.CodeAnalysis; +using System.IO.Enumeration; +using System.Runtime.InteropServices; +using System.Text.Json.Nodes; +using System.Web; +using CliWrap; +using CliWrap.Buffered; +using InnovEnergy.App.RemoteSupportConsole; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VictronVRM; +using SQLite; +using static System.Text.Json.JsonSerializer; +using static InnovEnergy.App.VrmGrabber.Database.Systemd; +using Installation = InnovEnergy.App.VrmGrabber.DataTypes.Installation; +using VrmInstallation = InnovEnergy.Lib.Victron.VictronVRM.Installation; +using FILE=System.IO.File; + + +namespace InnovEnergy.App.VrmGrabber.Database; + +public static class Systemd +{ + [DllImport("libsystemd.so.0", CharSet = CharSet.Unicode)] + public static extern Int32 sd_notify(Int32 unsetEnvironment, String state); +} + +public class InstallationDetails +{ + public InstallationDetails(String? ip, IReadOnlyList details) + { + Details = details; + Ip = ip; + } + + public IReadOnlyList? Details { get; set; } + public String? Ip { get; set; } +} + +public static partial class Db +{ + public static Dictionary InstallationsAndDetails; + + + private const String DbPath = "./db.sqlite"; + + private static SQLiteConnection Connection { get; } = new SQLiteConnection(DbPath); + + public static TableQuery Installations => Connection.Table(); + + public static void Init() + { + // used to force static constructor + } + + + static Db() + { + // on startup create/migrate tables + + Connection.RunInTransaction(() => { Connection.CreateTable(); }); + } + + public static async Task UpdateDetailsAndInstallations() + { + sd_notify(0, "READY=1"); + do { + await UpdateInstallationsAndDetailsFromVrm(0); + } + while (true) ; + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] + private static async Task UpdateInstallationsAndDetailsFromVrm(Int32 _) + { + var user = await GetVrmAccount(); + var readOnlyInstallations = await user.GetInstallations(); + + var installations = readOnlyInstallations.ToList(); + installations.Shuffle(); // This + + foreach (var installation in installations) + { + Console.WriteLine(installation.Name); + sd_notify(0, "WATCHDOG=1"); + var details = await GetInstallationDetails(installation); + // Thread.Sleep(1000); + await UpdateAlarms(installation); + var ip = Ip(details); + var updatedInstallation = new Installation( + installation.Name, + ip[0], + (Int64)installation.IdSite, + installation.Identifier, + details.Details.MachineSerial() ?? "Unknown", + HttpUtility.UrlEncode(installation.Name), + ip[1], + details.Details.Last().Json["timestamp"].ToString(), + Serialize(details.Details), + await NumberOfBatteries(ip[0], ip[1]), + await BatteryFirmwareVersion(ip[0], ip[1]), + "No updates" + ); + + if (ip[0] != "Unknown") + await UpdateInstallationName(installation, ip[0]); + + if (GetInstallationByIdentifier(installation.Identifier) == null) + { + Create(updatedInstallation); + } + else + { + Update(updatedInstallation); + } + } + } + + [RequiresUnreferencedCode( + "Calls System.Text.Json.JsonSerializer.SerializeToElement(TValue, JsonSerializerOptions)")] + public static async Task UpdateAlarms(VrmInstallation installation) + { + // installation.GetDevices().batteryMonitor.setTemperatureAlarms(245,250,315,313); + var alarmJson = JsonNode.Parse(File.ReadAllText("./alarm.json"))!.AsObject(); + var tags = await installation.GetTags(); + if (tags.Contains("FM-AF09")) + { + // Console.WriteLine(installation.IdSite.ToString()); + // await installation.GetAlarms(); + return await installation.SetAlarms(alarmJson); + + } + + return true; + } + + public static async Task GetVrmAccount() + { + var fileContent = await File.ReadAllTextAsync("./token.json"); + var acc = Deserialize(fileContent); + var user = VrmAccount.Token(acc!.idUser, acc.token); + return user; + } + + private static async Task BatteryFirmwareVersion(String? ip, String? online) + { + if (ip is null or "Unknown" || online == "❌") return "Unknown"; + var pathToBattery = await ExecuteBufferedAsyncCommandOnIp(ip, "dbus-send --system --dest=com.victronenergy.system --type=method_call --print-reply /ServiceMapping/com_victronenergy_battery_1 com.victronenergy.BusItem.GetText"); + + if (pathToBattery.Split('"')[1].StartsWith("Error")) return "Unknown"; + + + var command = $"dbus-send --system --dest={pathToBattery.Split('"')[1]} --type=method_call --print-reply /FirmwareVersion com.victronenergy.BusItem.GetText"; + var returnString = await ExecuteBufferedAsyncCommandOnIp(ip, command); + var returnStringShortened = returnString.Split('"')[1]; + return returnStringShortened.Length > 10 ? "Unknown" : returnStringShortened; + } + + private static async Task NumberOfBatteries(String? ip, String? online) + { + if (ip is null or "Unknown" || online == "❌") return "Failed"; + var pathToBattery = await ExecuteBufferedAsyncCommandOnIp(ip, "dbus-send --system --dest=com.victronenergy.system --type=method_call --print-reply /ServiceMapping/com_victronenergy_battery_1 com.victronenergy.BusItem.GetText"); + + if (pathToBattery.Split('"')[1].StartsWith("Error")) return "Failed"; + + var cmd = await ExecuteBufferedAsyncCommandOnIp(ip,$"dbus-send --system --dest={pathToBattery.Split('"')[1]} --type=method_call --print-reply /NbOfBatteries com.victronenergy.BusItem.GetText" ); + var cmdResult = cmd.Split('"')[1]; + return cmdResult; //No Batteries can be found + } + + + public static async Task ExecuteBufferedAsyncCommandOnIp(String? ip, String command) + { + if (ip is null or "Unknown") return "Failed"; + + var cmd = await Cli.Wrap("ssh") + .WithArguments($@"root@{ip}") + .AppendArgument("-o StrictHostKeyChecking=no") + .AppendArgument(command) + .WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(); + return cmd.ExitCode == 0 ? cmd.StandardOutput : cmd.StandardError; + } + + private static String?[] Ip(InstallationDetails details) + { + var online = "❌"; + var lookup = details.Ip; + if (lookup == "Unknown") + { + var serial = details.Details.MachineSerial() ?? "Unknown"; + + if (serial != "Unknown" && FILE.Exists($@"/etc/openvpn/server/Salino/ccd/{serial}")) + lookup = FILE.ReadAllText($@"/etc/openvpn/server/Salino/ccd/{serial}").Split(' ')[1]; + } + else + { + online = "✅"; + } + + return new[] { lookup, online }; + } + + private static async Task GetInstallationDetails(VrmInstallation i) + { + await Task.Delay(1000); + try + { + var details = await i.GetDetails(); + + var ip = await VpnInfo.LookUpIp(i.Identifier, details.MachineSerial()) ?? "Unknown"; + + var installationDetails = new InstallationDetails(ip, details); + + return installationDetails; + } + catch (Exception e) + { + Console.WriteLine(e); + } + + return new InstallationDetails("Unknown", Array.Empty()); + } + + private static async Task UpdateInstallationName(VrmInstallation installation, String? ip) + { + var oldNameInFileRequest = await Cli.Wrap("ssh") + .WithArguments($@"root@{ip}") + .AppendArgument("-o StrictHostKeyChecking=accept-new") + .AppendArgument("cat /data/innovenergy/openvpn/installation-name") + .WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(); + + var oldNameInFileWithoutNewLine = oldNameInFileRequest.StandardOutput.TrimEnd(); + + if (oldNameInFileRequest.ExitCode == 0 && oldNameInFileWithoutNewLine != installation.Name) + { + var overwriteNameCommand = Cli.Wrap("ssh") + .WithArguments($@"root@{ip}") + .AppendArgument($"echo '{installation.Name}' > /data/innovenergy/openvpn/installation-name"); + + var overwriteNameResponse = await overwriteNameCommand + .WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(); + + if (overwriteNameResponse.ExitCode != 0) + { + Console.WriteLine(overwriteNameResponse.StandardError); + Console.WriteLine("Renaming did not work"); + } + else + { + var rebootAfterRename = await Cli.Wrap("ssh") + .WithArguments($@"root@{ip}") + .AppendArgument("reboot") + .WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(); + + if (rebootAfterRename.ExitCode != 0) + { + Console.WriteLine(overwriteNameResponse.StandardError); + Console.WriteLine("Rebooting did not work"); + } + else + { + Console.WriteLine($"Renamed and rebooted {installation.Name}"); + } + } + } + } + + + private static Boolean RunTransaction(Func func) + { + var savepoint = Connection.SaveTransactionPoint(); + var success = false; + + try + { + success = func(); + } + finally + { + if (success) + Connection.Release(savepoint); + else + Connection.RollbackTo(savepoint); + } + + return success; + } +} + +public class AccToken +{ + public UInt64 idUser { get; init;} + public String token { get; init;} +} + + +/* +dbus-send --system --dest=com.victronenergy.battery.ttyUSB1 --print-reply /FirmwareVersion \ +org.freedesktop.DBus.Properties.Get string:com.victronenergy.battery.ttyUSB1 + */ diff --git a/csharp/App_backup/VrmGrabber/Database/Delete.cs b/csharp/App_backup/VrmGrabber/Database/Delete.cs new file mode 100644 index 000000000..2bcd06a6a --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Database/Delete.cs @@ -0,0 +1,17 @@ +using InnovEnergy.App.VrmGrabber.DataTypes; + +namespace InnovEnergy.App.VrmGrabber.Database; + + +public static partial class Db +{ + public static Boolean Delete(Installation installation) + { + return RunTransaction(DeleteInstallationAndItsDependencies); + + Boolean DeleteInstallationAndItsDependencies() + { + return Installations.Delete(i => i.Identifier == installation.Identifier) > 0; + } + } +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/Database/Read.cs b/csharp/App_backup/VrmGrabber/Database/Read.cs new file mode 100644 index 000000000..9f7643862 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Database/Read.cs @@ -0,0 +1,14 @@ +using InnovEnergy.App.VrmGrabber.DataTypes; + +namespace InnovEnergy.App.VrmGrabber.Database; + + +public static partial class Db +{ + + public static Installation? GetInstallationByIdentifier(String? identifier) + { + return Installations + .FirstOrDefault(i => i.Identifier == identifier); + } +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/Database/Update.cs b/csharp/App_backup/VrmGrabber/Database/Update.cs new file mode 100644 index 000000000..723378685 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Database/Update.cs @@ -0,0 +1,13 @@ +using InnovEnergy.App.VrmGrabber.DataTypes; + +namespace InnovEnergy.App.VrmGrabber.Database; + + +public static partial class Db +{ + + public static Boolean Update(Installation installation) + { + return Connection.Update(installation) > 0; + } +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/Program.cs b/csharp/App_backup/VrmGrabber/Program.cs new file mode 100644 index 000000000..693f847cc --- /dev/null +++ b/csharp/App_backup/VrmGrabber/Program.cs @@ -0,0 +1,36 @@ +using InnovEnergy.App.VrmGrabber.Database; +using Microsoft.OpenApi.Models; + +namespace InnovEnergy.App.VrmGrabber; + +public static class Program +{ + public static async Task Main(String[] args) + { + var updateTask = Db.UpdateDetailsAndInstallations(); + var builder = WebApplication.CreateBuilder(args); + + builder.Services.AddControllers(); + // builder.Services.AddSwaggerGen(c => + // { + // c.UseAllOfToExtendReferenceSchemas(); + // c.SupportNonNullableReferenceTypes(); + // }); + + var app = builder.Build(); + // app.UseSwagger(); + // app.UseSwaggerUI(); + // app.UseHttpsRedirection(); + app.MapControllers(); + // app.MapGet("/", () => Controller.Index()); + var webTask = app.RunAsync(); + await Task.WhenAll(webTask, updateTask); + } + + private static OpenApiInfo OpenApiInfo { get; } = new OpenApiInfo + { + Title = "InnovEnergy VRM Grabber", + Version = "v1" + }; + +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/ShuffleClass.cs b/csharp/App_backup/VrmGrabber/ShuffleClass.cs new file mode 100644 index 000000000..a52e40cdf --- /dev/null +++ b/csharp/App_backup/VrmGrabber/ShuffleClass.cs @@ -0,0 +1,17 @@ +namespace InnovEnergy.App.VrmGrabber; + +public static class ShuffleClass +{ + private static readonly Random Rng = new Random(); + + public static void Shuffle(this IList list) + { + var n = list.Count; + while (n > 1) { + n--; + var k = Rng.Next(n + 1); + (list[k], list[n]) = (list[n], list[k]); + } + } + +} \ No newline at end of file diff --git a/csharp/App_backup/VrmGrabber/VrmGrabber.csproj b/csharp/App_backup/VrmGrabber/VrmGrabber.csproj new file mode 100644 index 000000000..2f42775f2 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/VrmGrabber.csproj @@ -0,0 +1,50 @@ + + + + + + false + InnovEnergy.App.VrmGrabber + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ContentIncludedByDefault Remove="wwwroot/index.html" /> + + + + + PreserveNewest + + + + diff --git a/csharp/App_backup/VrmGrabber/VrmGrabber.sln b/csharp/App_backup/VrmGrabber/VrmGrabber.sln new file mode 100644 index 000000000..3e0482092 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/VrmGrabber.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VrmGrabber", "VrmGrabber.csproj", "{A3BDD9AD-F065-444E-9C2E-F777810E3BF9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A3BDD9AD-F065-444E-9C2E-F777810E3BF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3BDD9AD-F065-444E-9C2E-F777810E3BF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3BDD9AD-F065-444E-9C2E-F777810E3BF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3BDD9AD-F065-444E-9C2E-F777810E3BF9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {274A19A1-A0B6-4EAF-BCF6-475F7C511EF3} + EndGlobalSection +EndGlobal diff --git a/csharp/App_backup/VrmGrabber/alarm.json b/csharp/App_backup/VrmGrabber/alarm.json new file mode 100644 index 000000000..a99f75c16 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/alarm.json @@ -0,0 +1,10 @@ +{ + "idDataAttribute":115, + "instance":1, + "lowAlarm":245, + "lowAlarmHysteresis":250, + "highAlarm":315, + "highAlarmHysteresis":313, + "AlarmEnabled":1, + "NotifyAfterSeconds":60, + "meta_info": {"icon":"device-battery-monitor","name":"Battery Monitor [1]","idDeviceType":2,"dataAttribute":"Battery temperature"}} diff --git a/csharp/App_backup/VrmGrabber/bms-firmware/AF09.bin b/csharp/App_backup/VrmGrabber/bms-firmware/AF09.bin new file mode 100644 index 0000000000000000000000000000000000000000..d714f466b9bf68a3618cba13e652e69bf107760d GIT binary patch literal 589824 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 zt^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi z;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS z0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P z72pbR1-JrS0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#m zTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3 zz!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu z0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi;0kaBxB^@Ot^ikn zE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi;0kaB zxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7 zfGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR z1-JrS0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~C zSAZ+P72pbR1-JrS0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&M za0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E z09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t z3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi;0kaBxB^@O zt^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS0j>a7fGfZi z;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmh~CSAZ+P72pbR1-JrS z0j>a7fGfZi;0kaBxB^@Ot^iknE5H@t3UCFu0$c&E09Sx3z!l&Ma0R#mTmi1Y|KAkY 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 zI0Kvk&H!hCGr$?(3~&ZG1DpZQ0B3+Rz!~5Sa0WO7oB_@NXMi)n8Q=_X1~>zp0nPwt zfHS}u;0$mEI0Kvk&H!hCGr$?(3~&ZG1DpZQ0B3+Rz!~5Sa0WO7oB_@NXMi)n8Q=_X z1~>zp0nPwtfHS}u;0$mEI0Kvk&H!hCGr$?(3~&ZG1DpZQ0B3+Rz!~5Sa0WO7oB_@N zXMi)n8Q=_X1~>zp0nPwtfHS}u;0$mEI0Kvk&H!hCGr$?(3~&ZG1DpZQ0B3+Rz!~5S za0WO7oB_@NXMi)n8Q=_X1~>zp0nPwtfHS}u;0$mEI0Kvk&H!hCGr$?(3~&ZG1DpZQ z0B3+Rz!~5Sa0WO7oB_@NXMi)n8Q=_X1~>zp0nPwtfHS}u;0$mEI0Kvk&H!hCGr$?( z3~&ZG1DpZQ0B3+Rz!~5Sa0WO7oB_@NXMi)n8Q=_X1~>zp0nPwtfHS}u;0$mEI0Kvk z&H!hCGr$?(3~&ZG1DpZQ0B3+Rz!~5Sa0WO7oB_@NXMi)n8Q=_X1~>zp0nPwtfHS}u z;0$mEI0Kvk&H!hCGr$?(3~&ZG1DpZQ0B3+Rz!~5Sa0WO7oB_@NXMi)n8Q=_X1~>zp g0nPwtfHS}u;0$mEI0Kvk&H!hCGr$@6|I5Jt0hE?;8UO$Q literal 0 HcmV?d00001 diff --git a/csharp/App_backup/VrmGrabber/db.sqlite b/csharp/App_backup/VrmGrabber/db.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..29961ffced4894e9beb9ec31ac66164e1bbf1c53 GIT binary patch literal 962560 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�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

BiOxsf}`q0Byz5#WRl&=Erb>Z=&88=o1h z1gv0Qk*+xPwhOFqV8DU3K`l5j=!ky5FWNF2pBStLDm(wy(&}#)RN=Uw7}SFEf{y6* z`)zy?msCZoG8MoqLk%jafMe|2gAdN_jJBpABkT%GF(X}kXTbL-tqwHdeSA8+3By<% zxP|7vS9kZ^8qd#HzsDPw=zsfS@~T0wGR#?QP-9No;gK-Mpd-ah0dubq^LBl&EkI5` zhlr!QuGo7}Oi)b7RR(y*@hxeNM*`f>2HYGZ|yUV~s| zm}i{r8j1xaK98YR!v3YeDKdcF8U7>J0QNefh||w8-l8Mwi%Fabxys;X$C6B^Y!~iW zqj0#rGH^E~`R?pBW4J{}&KL750e48QGPqfWrH0$kDBFcQ)+ZcpzYN?h8SW@i#H)$E zo-Zao0`8DpRdCm3r_a*e4xGP57Xl>sEZJsCZdF@ah2UaF;gTawgRqpxW^c@ zg+%!A+?uWEfd{N_WSvh}TxXs{u8c0`h4Bfrd!~bP!;}brq4P$e@eUAYm z{QvLiA(a_GvJEc9k6xF~Cs4JgxFRS3_Z0wO=T!y37N*>|d$kmx2{_7QZVPavK~(vRJ%wTz`}b<1A6KtS+4xU@A&cmm7_Qb> zr2s$TMJ|3}@`H_H$)oY)ZX-T#pN_wRH$Sif^kS%gNUO#m6rYQG)Y*d1jHrwA8>4qB zzcN@X)MQ6#h0Vta8f5Tc!jeE@N#5+nMQZk=8LdxK4!xDd{HloCzJ~;p^97uux@U4Z3)9qW|zH7s0@o7vrBZ8w`F#LtMv}F#AeEx zHVrF7DcQ=O*bcC^>%=0UcQ(^J{=AR!@?1HRAX)?|RDb#N-+=%B{a^db-^2fX`rn^( z1pfF>|LR}-!5@A9w}1WFXMgmA-~8ck{q_(4-aq}p74?Q0|KbbhcY*;-Km>Yj_g@@4 zf9SlJEyp zx8wUKr!T&G5t4r9^`0lhpLw@0j-Nkk^`3_hc>c`0c^*FE`Qhv5<|BUfkN&=k#3-!` zUmPW^H%Iv@ zJNxixvYcX2=fK%_UXLa>-O=e#P4G1c+u4ZcZ+`dk_}F;|k$ZdeW%^ZNho&+YFT0D; zWUx1+K$t-?8GtH8~zs6rv-kVxmocuOB!wrMih%rc!5Q^!q7Gk|0;+9;AI>Hjh zHHkFsgukdbhXk8?Z3djWs}j(d$Mm+_yTc6FFe{S>kk){$Fr!n;$?Kn`p)-CZ_(bQ^ zZ{q_PeDR$XKuG!`Rh#hY!MR3)`EWv?y$$>d>y+PndksI0UGx(HC%Tz!Q=rH!{%uQlAd*KX9)7_z?+n4-6d?_pqCcUORFqro&_ zxR`MQI2(3H4kk3-WYo;Av8?HqTyPDeC5>$Q4+N{|^r;VGz?wH#fNGuBdDBq$o8f4< z&;?=JSmV7^)+Y8+P1MLQe*4p_tKExpG;NLk4f#k9ag|eOx1nY9{e5@b|FLuZ?r8V& z@{QA7F78mJH0+@)YBI*}vtU5x!jGN9UT=B79AU-v9T=&)?7@M3x}b6!YJ?XRRXCUn z1S-zepz9#%c{aRRE`mMha~J=knc~TQr%E!*nNQJY;C{o%unnTJ!x_MAu?u^DN^9=@u!pKdAUQ`nbPTn&TZ6k0`xM1ZS(1KV zRGOs8zv<2$qX~EPTIsu*HW+l*>n~57_nv%%>)F7(3xa;sl~#!>8e~t=_27y~-nBppUQ*EQJCj>yIj1XT!J-R8go;+?a}2L%ZQs${{O9@vDZ`PM Q)N&+G>n|g?yMOZk09jX!!2kdN literal 0 HcmV?d00001 diff --git a/csharp/App_backup/VrmGrabber/server.py b/csharp/App_backup/VrmGrabber/server.py new file mode 100644 index 000000000..5d5c350ec --- /dev/null +++ b/csharp/App_backup/VrmGrabber/server.py @@ -0,0 +1,14 @@ +import requests as requests +from flask import Flask +from json2html import json2html + +app = Flask(__name__) +serverUrl = "https://127.0.0.1:8000/api" #todo change me + +@app.route('/') +def hello(): + json = requests.get(serverUrl + '/GetInstallationList', verify=False) #TODO VERIFY + + if json.content == b'0': + return "Still loading Installations" + return json2html.convert(json = json.json(), escape=False) diff --git a/csharp/App_backup/VrmGrabber/token.json b/csharp/App_backup/VrmGrabber/token.json new file mode 100644 index 000000000..9a0fbea24 --- /dev/null +++ b/csharp/App_backup/VrmGrabber/token.json @@ -0,0 +1 @@ +{"idUser":55450,"token":"909379784fa601a52ab4756c1cc9690ecc769db4b661214f9b165eda20be9913"} \ No newline at end of file diff --git a/firmware/2025-02-24.json b/firmware/2025-02-24.json new file mode 100644 index 000000000..1309e125b --- /dev/null +++ b/firmware/2025-02-24.json @@ -0,0 +1 @@ +UEsDBBQAAAAIAGZRWVqEoBx0dAAAAJUAAAAJAAAAZGF0YS5qc29ubcqxCsIwEADQf7k5HrlL7pJ0VAeXguAXhBJqlhbSgIr474o4Oj54TxjrclknGJiRDIz5/pUntAaOdZuuuc11mfe599Ie5/VWGgw71oDRBSIXOYmqioHD3yqaUNSKEFGyEryBU8n9836BRB1qDJocO2/Zv95QSwECFAMUAAAACABmUVlahKAcdHQAAACVAAAACQAAAAAAAAAAAAAAgAEAAAAAZGF0YS5qc29uUEsFBgAAAAABAAEANwAAAJsAAAAAAA== \ No newline at end of file diff --git a/firmware/2025-02-25.json b/firmware/2025-02-25.json new file mode 100644 index 000000000..1309e125b --- /dev/null +++ b/firmware/2025-02-25.json @@ -0,0 +1 @@ +UEsDBBQAAAAIAGZRWVqEoBx0dAAAAJUAAAAJAAAAZGF0YS5qc29ubcqxCsIwEADQf7k5HrlL7pJ0VAeXguAXhBJqlhbSgIr474o4Oj54TxjrclknGJiRDIz5/pUntAaOdZuuuc11mfe599Ie5/VWGgw71oDRBSIXOYmqioHD3yqaUNSKEFGyEryBU8n9836BRB1qDJocO2/Zv95QSwECFAMUAAAACABmUVlahKAcdHQAAACVAAAACQAAAAAAAAAAAAAAgAEAAAAAZGF0YS5qc29uUEsFBgAAAAABAAEANwAAAJsAAAAAAA== \ No newline at end of file diff --git a/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/aggregator.py b/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/aggregator.py index 1e6c2511d..fdcbc7ed7 100755 --- a/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/aggregator.py +++ b/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/aggregator.py @@ -212,16 +212,16 @@ class Aggregator: if node_number not in node_data: node_data[node_number] = {'soc': [], 'discharge': [], 'charge': [], 'heating': []} - value = device_data.get("Soc", {}).get("value", "N/A") + value = device_data.get("Soc", {}) node_data[node_number]['soc'].append(float(value)) - value = device_data.get("Dc", {}).get("Power", "N/A").get("value", "N/A") + value = device_data.get("Dc", {}).get("Power", "N/A") value = float(value) if value < 0: node_data[node_number]['discharge'].append(value) else: node_data[node_number]['charge'].append(value) - value = device_data.get("HeatingPower", "N/A").get("value", "N/A") + value = device_data.get("HeatingPower", "N/A") value = float(value) node_data[node_number]['heating'].append(value) diff --git a/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py index 6e5185fcf..9b1f2b68c 100755 --- a/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +++ b/firmware/Cerbo_Release/CerboReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py @@ -1073,10 +1073,7 @@ def insert_nested_data(data, split_list, value, symbol): key = split_list[0] # Get the first key in the list if len(split_list) == 1: - data[key] = { - "value": round(value, 2) if isinstance(value, float) else value, - #"symbol": str(symbol) - } + data[key] = round(value, 2) if isinstance(value, float) else value else: if key not in data: data[key] = {} # Create a new dictionary if key doesn't exist @@ -1134,37 +1131,6 @@ def create_json_files(signals, statuses, node_numbers, alarms_number_list, warni with open(json_path, 'w') as jsonfile: # json.dump(data, jsonfile, indent=4) json.dump(data, jsonfile, separators=(',', ':')) -# -# def create_csv_files(signals, statuses, node_numbers, alarms_number_list, warnings_number_list): -# global s3_config, num_of_csv_files_saved -# timestamp = int(time.time()) -# if timestamp % 2 != 0: -# timestamp -= 1 -# # Create CSV directory if it doesn't exist -# if not os.path.exists(JSON_DIR): -# os.makedirs(JSON_DIR) -# csv_filename = f"{timestamp}.csv" -# csv_path = os.path.join(JSON_DIR, csv_filename) -# num_of_csv_files_saved+=1 -# -# # Append values to the CSV file -# if not os.path.exists(csv_path): -# with open(csv_path, 'a', newline='') as csvfile: -# csv_writer = csv.writer(csvfile, delimiter=';') -# # Add a special row for the nodes configuration -# nodes_config_path = "/Config/Devices/BatteryNodes" -# nodes_list = ",".join(str(node) for node in node_numbers) -# config_row = [nodes_config_path, nodes_list, ""] -# csv_writer.writerow(config_row) -# # Iterate over each node and signal to create rows in the new format -# for i, node in enumerate(node_numbers): -# csv_writer.writerow([f"/Battery/Devices/{str(i+1)}/Alarms", alarms_number_list[i], ""]) -# csv_writer.writerow([f"/Battery/Devices/{str(i+1)}/Warnings", warnings_number_list[i], ""]) -# for s in signals: -# signal_name = insert_id(s.name, i+1) -# value = s.get_value(statuses[i]) -# row_values = [signal_name, value, s.get_text] -# csv_writer.writerow(row_values) BATTERY_COUNTS_FILE = '/data/battery_count.csv' def load_battery_counts(): diff --git a/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/aggregator.py b/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/aggregator.py index 548437fb2..ae9620bd1 100755 --- a/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/aggregator.py +++ b/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/aggregator.py @@ -215,16 +215,16 @@ class Aggregator: if node_number not in node_data: node_data[node_number] = {'soc': [], 'discharge': [], 'charge': [], 'heating': []} - value = device_data.get("Soc", {}).get("value", "N/A") + value = device_data.get("Soc", {}) node_data[node_number]['soc'].append(float(value)) - value = device_data.get("Dc", {}).get("Power", "N/A").get("value", "N/A") + value = device_data.get("Dc", {}).get("Power", "N/A") value=float(value) if value < 0: node_data[node_number]['discharge'].append(value) else: node_data[node_number]['charge'].append(value) - value = device_data.get("HeatingPower", "N/A").get("value", "N/A") + value = device_data.get("HeatingPower", "N/A") value = float(value) node_data[node_number]['heating'].append(value) diff --git a/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py index 68c986cc5..a7bc071e3 100755 --- a/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +++ b/firmware/Venus_Release/VenusReleaseFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py @@ -712,10 +712,8 @@ def insert_nested_data(data, split_list, value, symbol): key = split_list[0] # Get the first key in the list if len(split_list) == 1: - data[key] = { - "value": round(value, 2) if isinstance(value, float) else value, - #"symbol": str(symbol) - } + data[key] = round(value, 2) if isinstance(value, float) else value + else: if key not in data: data[key] = {} # Create a new dictionary if key doesn't exist @@ -748,11 +746,13 @@ def create_json_files(signals, statuses, node_numbers, alarms_number_list, warni device_data["Alarms"] = alarms_number_list[i] device_data["Warnings"] = warnings_number_list[i] + # Iterate over the signals and add their values for s in signals: + #print(s.name) split_list = s.name.split("/")[3:] - #print(split_list) value = s.get_value(statuses[i]) + #print(value) symbol=s.get_text insert_nested_data(device_data, split_list, value, symbol) diff --git a/firmware/update_all_installations.sh b/firmware/update_all_installations.sh index 1ea7c0a92..53e9bf9ce 100755 --- a/firmware/update_all_installations.sh +++ b/firmware/update_all_installations.sh @@ -11,8 +11,516 @@ set -e venus_release_file_path="./Venus_Release/VenusReleaseFiles" cerbo_release_file_path="./Cerbo_Release/CerboReleaseFiles" -venus_ip_addresses=("10.2.0.191" "10.2.1.36" "10.2.1.108") -cerbo_ip_addresses=("10.2.2.212" "10.2.4.181" "10.2.3.198") +venus_ip_addresses=("10.2.4.155" "10.2.3.178" "10.2.3.164" "10.2.4.114" "10.2.3.133" "10.2.2.72" "10.2.2.11" "10.2.2.128" "10.2.2.100" "10.2.2.243") +# +#venus_ip_addresses=( +# "10.2.1.35" "10.2.0.104" "10.2.1.159" "10.2.0.224" "10.2.0.155" "10.2.0.209" "10.2.0.227" "10.2.0.211" +# "10.2.1.134" "10.2.0.130" "10.2.1.169" "10.2.0.105" "10.2.0.220" "10.2.1.124" "10.2.1.2" "10.2.1.158" +# "10.2.0.195" "10.2.1.171" "10.2.0.225" "10.2.1.53" "10.2.0.107" "10.2.0.153" "10.2.1.106" "10.2.1.117" +# "10.2.0.145" "10.2.0.110" "10.2.1.177" "10.2.1.247" "10.2.0.101" "10.2.0.108" "10.2.1.120" "10.2.1.160" +# "10.2.0.98" "10.2.0.94" "10.2.1.173" "10.2.0.113" "10.2.0.150" "10.2.0.233" "10.2.1.162" "10.2.1.138" +# "10.2.1.165" "10.2.1.163" "10.2.1.32" "10.2.1.110" "10.2.0.103" "10.2.1.113" "10.2.0.216" "10.2.0.184" +# "10.2.0.191" "10.2.1.60" "10.2.1.219" "10.2.0.214" "10.2.1.83" "10.2.1.39" "10.2.0.194" "10.2.1.81" +# "10.2.1.125" "10.2.0.154" "10.2.0.196" "10.2.0.99" "10.2.1.130" "10.2.1.33" "10.2.0.249" "10.2.0.133" +# "10.2.1.118" "10.2.0.138" "10.2.0.144" "10.2.0.141" "10.2.0.188" "10.2.1.74" "10.2.1.141" "10.2.1.142" +# "10.2.0.193" "10.2.1.145" "10.2.1.15" "10.2.1.70" "10.2.0.135" "10.2.0.247" "10.2.0.134" "10.2.1.21" +# "10.2.0.131" "10.2.1.1" "10.2.1.73" "10.2.0.243" "10.2.1.19" "10.2.1.166" "10.2.0.192" "10.2.1.12" +# "10.2.2.188" "10.2.0.158" "10.2.1.146" "10.2.1.27" "10.2.0.202" "10.2.0.157" "10.2.1.55" "10.2.1.16" +# "10.2.1.28" "10.2.4.242" "10.2.0.254" "10.2.1.128" "10.2.1.58" "10.2.1.156" "10.2.1.137" "10.2.1.135" +# "10.2.1.24" "10.2.0.128" "10.2.1.90" "10.2.1.153" "10.2.1.93" "10.2.1.111" "10.2.1.71" "10.2.1.37" +# "10.2.0.127" "10.2.0.126" "10.2.1.22" "10.2.1.91" "10.2.1.123" "10.2.1.220" "10.2.1.114" "10.2.1.41" +# "10.2.0.125" "10.2.1.62" "10.2.0.161" "10.2.1.121" "10.2.1.10" "10.2.0.112" "10.2.0.111" "10.2.0.218" +# "10.2.1.49" "10.2.0.230" "10.2.1.170" "10.2.0.114" "10.2.0.140" "10.2.4.241" "10.2.1.107" "10.2.0.185" +# "10.2.0.124" "10.2.1.85" "10.2.0.123" "10.2.1.23" "10.2.1.44" "10.2.1.172" "10.2.1.129" "10.2.1.14" +# "10.2.1.59" "10.2.1.56" "10.2.1.149" "10.2.1.140" "10.2.1.116" "10.2.1.57" "10.2.1.26" "10.2.0.210" +# "10.2.0.237" "10.2.1.47" "10.2.1.127" "10.2.0.199" "10.2.0.252" "10.2.1.119" "10.2.0.122" "10.2.0.251" +# "10.2.1.7" "10.2.1.45" "10.2.1.157" "10.2.1.139" "10.2.0.119" "10.2.0.250" "10.2.1.148" "10.2.1.92" +# "10.2.0.245" "10.2.0.246" "10.2.1.80" "10.2.0.204" "10.2.0.203" "10.2.0.205" "10.2.1.78" "10.2.4.210" +# "10.2.0.222" "10.2.1.36" "10.2.1.3" "10.2.0.244" "10.2.1.176" "10.2.0.242" "10.2.1.30" "10.2.1.61" +# "10.2.1.168" "10.2.0.215" "10.2.1.76" "10.2.1.43" "10.2.0.200" "10.2.0.115" "10.2.1.115" "10.2.0.238" +# "10.2.0.189" "10.2.0.160" "10.2.0.149" "10.2.1.161" "10.2.1.101" "10.2.1.40" "10.2.0.229" "10.2.1.52" +# "10.2.0.239" "10.2.0.132" "10.2.0.162" "10.2.1.25" "10.2.0.118" "10.2.1.151" "10.2.0.190" "10.2.1.108" +# "10.2.0.219" "10.2.1.100" "10.2.1.109" +#) + + +#cerbo_ip_addresses=("10.2.1.150") +# +cerbo_ip_addresses=( + +10.2.5.5 +10.2.4.98 +10.2.4.97 +10.2.4.96 +10.2.4.95 +10.2.4.94 +10.2.4.92 +10.2.4.91 +10.2.4.90 +10.2.4.9 +10.2.4.88 +10.2.4.87 +10.2.4.84 +10.2.4.83 +10.2.4.82 +10.2.4.81 +10.2.4.80 +10.2.4.78 +10.2.4.77 +10.2.4.75 +10.2.4.73 +10.2.4.71 +10.2.4.70 +10.2.4.69 +10.2.4.68 +10.2.4.66 +10.2.4.63 +10.2.4.61 +10.2.4.60 +10.2.4.59 +10.2.4.57 +10.2.4.55 +10.2.4.51 +10.2.4.48 +10.2.4.47 +10.2.4.45 +10.2.4.44 +10.2.4.42 +10.2.4.4 +10.2.4.37 +10.2.4.34 +10.2.4.31 +10.2.4.30 +10.2.4.28 +10.2.4.27 +10.2.4.25 +10.2.4.24 +10.2.4.24 +10.2.4.232 +10.2.4.223 +10.2.4.213 +10.2.4.206 +10.2.4.205 +10.2.4.201 +10.2.4.20 +10.2.4.193 +10.2.4.191 +10.2.4.190 +10.2.4.188 +10.2.4.183 +10.2.4.181 +10.2.4.180 +10.2.4.179 +10.2.4.178 +10.2.4.177 +10.2.4.175 +10.2.4.17 +10.2.4.169 +10.2.4.166 +10.2.4.160 +10.2.4.158 +10.2.4.157 +10.2.4.155 +10.2.4.15 +10.2.4.149 +10.2.4.148 +10.2.4.146 +10.2.4.143 +10.2.4.141 +10.2.4.140 +10.2.4.14 +10.2.4.137 +10.2.4.136 +10.2.4.135 +10.2.4.134 +10.2.4.129 +10.2.4.127 +10.2.4.126 +10.2.4.125 +10.2.4.123 +10.2.4.122 +10.2.4.120 +10.2.4.12 +10.2.4.119 +10.2.4.118 +10.2.4.116 +10.2.4.115 +10.2.4.114 +10.2.4.111 +10.2.4.11 +10.2.4.109 +10.2.4.108 +10.2.4.103 +10.2.4.102 +10.2.4.100 +10.2.4.10 +10.2.3.98 +10.2.3.97 +10.2.3.91 +10.2.3.90 +10.2.3.9 +10.2.3.83 +10.2.3.8 +10.2.3.79 +10.2.3.76 +10.2.3.75 +10.2.3.74 +10.2.3.73 +10.2.3.72 +10.2.3.70 +10.2.3.7 +10.2.3.69 +10.2.3.68 +10.2.3.67 +10.2.3.66 +10.2.3.64 +10.2.3.61 +10.2.3.6 +10.2.3.54 +10.2.3.51 +10.2.3.5 +10.2.3.48 +10.2.3.46 +10.2.3.45 +10.2.3.44 +10.2.3.42 +10.2.3.41 +10.2.3.40 +10.2.3.4 +10.2.3.38 +10.2.3.37 +10.2.3.36 +10.2.3.35 +10.2.3.34 +10.2.3.30 +10.2.3.3 +10.2.3.28 +10.2.3.26 +10.2.3.253 +10.2.3.252 +10.2.3.251 +10.2.3.249 +10.2.3.247 +10.2.3.244 +10.2.3.243 +10.2.3.241 +10.2.3.240 +10.2.3.24 +10.2.3.238 +10.2.3.237 +10.2.3.236 +10.2.3.231 +10.2.3.23 +10.2.3.226 +10.2.3.225 +10.2.3.224 +10.2.3.223 +10.2.3.222 +10.2.3.221 +10.2.3.220 +10.2.3.218 +10.2.3.216 +10.2.3.215 +10.2.3.214 +10.2.3.21 +10.2.3.209 +10.2.3.205 +10.2.3.203 +10.2.3.202 +10.2.3.201 +10.2.3.200 +10.2.3.2 +10.2.3.198 +10.2.3.197 +10.2.3.195 +10.2.3.194 +10.2.3.190 +10.2.3.19 +10.2.3.188 +10.2.3.186 +10.2.3.185 +10.2.3.184 +10.2.3.183 +10.2.3.182 +10.2.3.181 +10.2.3.180 +10.2.3.18 +10.2.3.178 +10.2.3.177 +10.2.3.176 +10.2.3.175 +10.2.3.174 +10.2.3.173 +10.2.3.170 +10.2.3.169 +10.2.3.168 +10.2.3.166 +10.2.3.165 +10.2.3.164 +10.2.3.162 +10.2.3.161 +10.2.3.160 +10.2.3.159 +10.2.3.158 +10.2.3.157 +10.2.3.156 +10.2.3.155 +10.2.3.154 +10.2.3.152 +10.2.3.150 +10.2.3.15 +10.2.3.148 +10.2.3.147 +10.2.3.146 +10.2.3.144 +10.2.3.143 +10.2.3.141 +10.2.3.14 +10.2.3.135 +10.2.3.134 +10.2.3.133 +10.2.3.132 +10.2.3.131 +10.2.3.130 +10.2.3.13 +10.2.3.129 +10.2.3.126 +10.2.3.125 +10.2.3.124 +10.2.3.122 +10.2.3.12 +10.2.3.119 +10.2.3.118 +10.2.3.117 +10.2.3.116 +10.2.3.113 +10.2.3.112 +10.2.3.111 +10.2.3.108 +10.2.3.107 +10.2.3.102 +10.2.3.10 +10.2.3.1 +10.2.2.99 +10.2.2.98 +10.2.2.96 +10.2.2.91 +10.2.2.90 +10.2.2.89 +10.2.2.87 +10.2.2.86 +10.2.2.85 +10.2.2.83 +10.2.2.82 +10.2.2.81 +10.2.2.8 +10.2.2.79 +10.2.2.78 +10.2.2.77 +10.2.2.76 +10.2.2.74 +10.2.2.73 +10.2.2.72 +10.2.2.71 +10.2.2.70 +10.2.2.69 +10.2.2.66 +10.2.2.65 +10.2.2.64 +10.2.2.61 +10.2.2.59 +10.2.2.58 +10.2.2.57 +10.2.2.56 +10.2.2.52 +10.2.2.5 +10.2.2.47 +10.2.2.46 +10.2.2.45 +10.2.2.44 +10.2.2.43 +10.2.2.42 +10.2.2.39 +10.2.2.38 +10.2.2.36 +10.2.2.35 +10.2.2.34 +10.2.2.33 +10.2.2.32 +10.2.2.30 +10.2.2.3 +10.2.2.29 +10.2.2.26 +10.2.2.254 +10.2.2.250 +10.2.2.25 +10.2.2.249 +10.2.2.248 +10.2.2.245 +10.2.2.244 +10.2.2.243 +10.2.2.242 +10.2.2.240 +10.2.2.24 +10.2.2.239 +10.2.2.238 +10.2.2.235 +10.2.2.234 +10.2.2.233 +10.2.2.232 +10.2.2.231 +10.2.2.23 +10.2.2.229 +10.2.2.228 +10.2.2.227 +10.2.2.225 +10.2.2.224 +10.2.2.223 +10.2.2.222 +10.2.2.221 +10.2.2.220 +10.2.2.22 +10.2.2.219 +10.2.2.216 +10.2.2.215 +10.2.2.214 +10.2.2.213 +10.2.2.212 +10.2.2.211 +10.2.2.21 +10.2.2.208 +10.2.2.207 +10.2.2.205 +10.2.2.204 +10.2.2.203 +10.2.2.202 +10.2.2.201 +10.2.2.2 +10.2.2.198 +10.2.2.197 +10.2.2.196 +10.2.2.194 +10.2.2.193 +10.2.2.192 +10.2.2.190 +10.2.2.19 +10.2.2.189 +10.2.2.184 +10.2.2.183 +10.2.2.182 +10.2.2.181 +10.2.2.180 +10.2.2.178 +10.2.2.176 +10.2.2.174 +10.2.2.173 +10.2.2.172 +10.2.2.171 +10.2.2.170 +10.2.2.169 +10.2.2.166 +10.2.2.164 +10.2.2.163 +10.2.2.162 +10.2.2.161 +10.2.2.16 +10.2.2.159 +10.2.2.158 +10.2.2.156 +10.2.2.153 +10.2.2.152 +10.2.2.151 +10.2.2.150 +10.2.2.15 +10.2.2.146 +10.2.2.145 +10.2.2.144 +10.2.2.143 +10.2.2.142 +10.2.2.141 +10.2.2.140 +10.2.2.14 +10.2.2.137 +10.2.2.133 +10.2.2.131 +10.2.2.13 +10.2.2.129 +10.2.2.128 +10.2.2.127 +10.2.2.126 +10.2.2.124 +10.2.2.122 +10.2.2.121 +10.2.2.120 +10.2.2.12 +10.2.2.118 +10.2.2.117 +10.2.2.116 +10.2.2.115 +10.2.2.114 +10.2.2.111 +10.2.2.11 +10.2.2.109 +10.2.2.107 +10.2.2.105 +10.2.2.104 +10.2.2.103 +10.2.2.101 +10.2.2.100 +10.2.2.10 +10.2.2.1 +10.2.1.86 +10.2.1.79 +10.2.1.254 +10.2.1.253 +10.2.1.252 +10.2.1.251 +10.2.1.244 +10.2.1.243 +10.2.1.240 +10.2.1.237 +10.2.1.234 +10.2.1.231 +10.2.1.230 +10.2.1.229 +10.2.1.228 +10.2.1.227 +10.2.1.226 +10.2.1.225 +10.2.1.224 +10.2.1.223 +10.2.1.216 +10.2.1.215 +10.2.1.213 +10.2.1.212 +10.2.1.211 +10.2.1.209 +10.2.1.208 +10.2.1.207 +10.2.1.206 +10.2.1.205 +10.2.1.204 +10.2.1.203 +10.2.1.200 +10.2.1.199 +10.2.1.196 +10.2.1.195 +10.2.1.194 +10.2.1.193 +10.2.1.192 +10.2.1.191 +10.2.1.190 +10.2.1.189 +10.2.1.187 +10.2.1.186 +10.2.1.185 +10.2.1.180 +10.2.1.179 +10.2.1.150 +10.2.1.133 +10.2.1.104 +10.2.0.179 +) deploy() { local device_type=$1 @@ -62,6 +570,8 @@ deploy() { echo "Warning: Failed to copy file to /data on $ip_address" fi + + # Copy files if scp -o ConnectTimeout=10 "$release_file_path/dbus-fzsonick-48tl/aggregator.py" "root@$ip_address:/opt/victronenergy/dbus-fzsonick-48tl"; then echo "Copied file to /opt on $ip_address" diff --git a/typescript/frontend-marios2/deploy.sh b/typescript/frontend-marios2/deploy.sh index 13a10bf39..0c030cdff 100755 --- a/typescript/frontend-marios2/deploy.sh +++ b/typescript/frontend-marios2/deploy.sh @@ -1,4 +1,4 @@ -#npm run build && rsync -rv .* ubuntu@194.182.190.208:~/frontend/ && ssh ubuntu@194.182.190.208 'sudo cp -rf ~/frontend/build/* /var/www/html/monitor.innov.energy/html/' && ssh ubuntu@194.182.190.208 'sudo npm install -g serve' +npm run build && rsync -rv .* ubuntu@194.182.190.208:~/frontend/ && ssh ubuntu@194.182.190.208 'sudo cp -rf ~/frontend/build/* /var/www/html/monitor.innov.energy/html/' && ssh ubuntu@194.182.190.208 'sudo npm install -g serve' -npm run build && rsync -rv .* ubuntu@91.92.154.141:~/frontend/ && ssh ubuntu@91.92.154.141 'sudo cp -rf ~/frontend/build/* /var/www/html/monitor.innov.energy/html/' && ssh ubuntu@91.92.154.141 'sudo npm install -g serve' +#npm run build && rsync -rv .* ubuntu@91.92.154.141:~/frontend/ && ssh ubuntu@91.92.154.141 'sudo cp -rf ~/frontend/build/* /var/www/html/monitor.innov.energy/html/' && ssh ubuntu@91.92.154.141 'sudo npm install -g serve' diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx index 4927b0e14..1b4cd22a9 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx @@ -11,7 +11,7 @@ import { TableRow, Typography } from '@mui/material'; -import { TopologyValues } from '../Log/graph.util'; +import { JSONRecordData } from '../Log/graph.util'; import { Link, Route, @@ -24,11 +24,11 @@ import { FormattedMessage } from 'react-intl'; import { I_S3Credentials } from '../../../interfaces/S3Types'; import routes from '../../../Resources/routes.json'; import CircularProgress from '@mui/material/CircularProgress'; -import DetailedBatteryView from './DetailedBatteryView'; import MainStats from './MainStats'; +import DetailedBatteryView from './DetailedBatteryView'; interface BatteryViewProps { - values: TopologyValues; + values: JSONRecordData; s3Credentials: I_S3Credentials; installationId: number; productNum: number; @@ -42,8 +42,12 @@ function BatteryView(props: BatteryViewProps) { const currentLocation = useLocation(); const navigate = useNavigate(); const sortedBatteryView = - props.values != null - ? [...props.values.batteryView].sort((a, b) => b.BatteryId - a.BatteryId) + props.values != null && props.values?.Battery?.Devices + ? Object.entries(props.values.Battery.Devices) + .map(([BatteryId, battery]) => { + return { BatteryId, battery }; // Here we return an object with the id and device + }) + .sort((a, b) => parseInt(b.BatteryId) - parseInt(a.BatteryId)) : []; const [loading, setLoading] = useState(sortedBatteryView.length == 0); @@ -52,13 +56,13 @@ function BatteryView(props: BatteryViewProps) { navigate(routes.mainstats); }; - const findBatteryData = (batteryId: number) => { - for (let i = 0; i < props.values.batteryView.length; i++) { - if (props.values.batteryView[i].BatteryId == batteryId) { - return props.values.batteryView[i]; - } - } - }; + // const findBatteryData = (batteryId: number) => { + // for (let i = 0; i < props.values.batteryView.length; i++) { + // if (props.values.batteryView[i].BatteryId == batteryId) { + // return props.values.batteryView[i]; + // } + // } + // }; useEffect(() => { if (sortedBatteryView.length == 0) { @@ -176,20 +180,37 @@ function BatteryView(props: BatteryViewProps) { > } /> - {props.values.batteryView.map((battery) => ( - - } - /> - ))} + {Object.entries(props.values.Battery.Devices).map( + ([BatteryId, battery]) => ( + + } + /> + ) + )} + {/*{props.values.batteryView.map((battery) => (*/} + {/* */} + {/* }*/} + {/* />*/} + {/*))}*/} @@ -219,9 +240,9 @@ function BatteryView(props: BatteryViewProps) { - {sortedBatteryView.map((battery) => ( + {sortedBatteryView.map(({ BatteryId, battery }) => ( - {'Node ' + battery.BatteryId} + {'Node ' + BatteryId} - {battery.FwVersion.value} + {battery.FwVersion} - {battery.Power.value + ' ' + battery.Power.unit} + {battery.Dc.Power + ' ' + 'W'} 57 + battery.Dc.Voltage < 44 || battery.Dc.Voltage > 57 ? '#FF033E' : '#32CD32', - color: - battery.Voltage.value === '' ? 'white' : 'inherit' + color: battery.Dc.Voltage ? 'black' : 'white' }} > - {battery.Voltage.value + ' ' + battery.Voltage.unit} + {battery.Dc.Voltage + ' ' + 'V'} - {battery.Soc.value + ' ' + battery.Soc.unit} + {battery.Soc + ' %'} 300 + battery.Temperatures.Cells.Average > 300 ? '#FF033E' - : battery.AverageTemperature.value > 280 + : battery.Temperatures.Cells.Average > 280 ? '#ffbf00' - : battery.AverageTemperature.value < 245 + : battery.Temperatures.Cells.Average < 245 ? '#008FFB' : '#32CD32' }} > - {battery.AverageTemperature.value + - ' ' + - battery.AverageTemperature.unit} + {battery.Temperatures.Cells.Average + ' °C'} - {battery.Warnings.value === '' ? ( + {battery.Warnings === '' ? ( 'None' - ) : battery.Warnings.value.toString().split('-').length > - 1 ? ( + ) : battery.Warnings.toString().split('-').length > 1 ? ( ) : ( - battery.Warnings.value + battery.Warnings )} - {battery.Alarms.value === '' ? ( + {battery.Alarms === '' ? ( 'None' - ) : battery.Alarms.value.toString().split('-').length > - 1 ? ( + ) : battery.Alarms.toString().split('-').length > 1 ? ( ) : ( - battery.Alarms.value + battery.Alarms )} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx index 9dad16594..8b887ec25 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryViewSalidomo.tsx @@ -43,11 +43,14 @@ function BatteryViewSalidomo(props: BatteryViewProps) { const currentLocation = useLocation(); const navigate = useNavigate(); - const sortedBatteryView = Object.entries(props.values.Battery.Devices) - .map(([BatteryId, battery]) => { - return { BatteryId, battery }; // Here we return an object with the id and device - }) - .sort((a, b) => parseInt(b.BatteryId) - parseInt(a.BatteryId)); + const sortedBatteryView = + props.values != null + ? Object.entries(props.values.Battery.Devices) + .map(([BatteryId, battery]) => { + return { BatteryId, battery }; // Here we return an object with the id and device + }) + .sort((a, b) => parseInt(b.BatteryId) - parseInt(a.BatteryId)) + : []; const [loading, setLoading] = useState(sortedBatteryView.length == 0); @@ -243,7 +246,7 @@ function BatteryViewSalidomo(props: BatteryViewProps) { textAlign: 'center' }} > - {battery.FwVersion.value} + {battery.FwVersion} - {battery.Dc.Power.value + ' W'} + {battery.Dc.Power + ' W'} 57 + battery.Dc.Voltage < 44 || battery.Dc.Voltage > 57 ? '#FF033E' : '#32CD32', - color: battery.Dc.Voltage.value ? 'inherit' : 'white' + color: battery.Dc.Voltage ? 'inherit' : 'white' }} > - {battery.Dc.Voltage.value + ' V'} + {battery.Dc.Voltage + ' V'} - {battery.Soc.value + ' %'} + {battery.Soc + ' %'} 300 + battery.Temperatures.Cells.Average > 300 ? '#FF033E' - : battery.Temperatures.Cells.Average.value > 280 + : battery.Temperatures.Cells.Average > 280 ? '#ffbf00' - : battery.Temperatures.Cells.Average.value < 245 + : battery.Temperatures.Cells.Average < 245 ? '#008FFB' : '#32CD32' }} > - {battery.Temperatures.Cells.Average.value + ' C'} + {battery.Temperatures.Cells.Average + ' C'} {/*{props.productNum === 0 && (*/} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx index f5edd711c..34f8d9954 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx @@ -16,7 +16,7 @@ import { TableRow, Typography } from '@mui/material'; -import { Battery } from '../Log/graph.util'; +import { Device } from '../Log/graph.util'; import { useNavigate } from 'react-router-dom'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import Button from '@mui/material/Button'; @@ -25,8 +25,9 @@ import { UserType } from '../../../interfaces/UserTypes'; import { UserContext } from '../../../contexts/userContext'; interface DetailedBatteryViewProps { + batteryId: number; s3Credentials: I_S3Credentials; - batteryData: Battery; + batteryData: Device; installationId: number; productNum: number; } @@ -49,7 +50,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { const [errorMessage, setErrorMessage] = useState(''); const [selectedVersion, setSelectedVersion] = useState( - props.batteryData.FwVersion.value + props.batteryData.FwVersion ); const handleBatteryViewButton = () => { @@ -65,35 +66,35 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { }; const [GreenisBlinking, setGreenisBlinking] = useState( - props.batteryData.GreenLeds.value === 'Blinking' + props.batteryData.Leds.Green === 'Blinking' ); const [AmberisBlinking, setAmberisBlinking] = useState( - props.batteryData.AmberLeds.value === 'Blinking' + props.batteryData.Leds.Amber === 'Blinking' ); const [RedisBlinking, setRedisBlinking] = useState( - props.batteryData.RedLeds.value === 'Blinking' + props.batteryData.Leds.Red === 'Blinking' ); const [BlueisBlinking, setBlueisBlinking] = useState( - props.batteryData.BlueLeds.value === 'Blinking' + props.batteryData.Leds.Blue === 'Blinking' ); useEffect(() => { const intervalId = setInterval(() => { - if (props.batteryData.AmberLeds.value === 'Blinking') { + if (props.batteryData.Leds.Amber === 'Blinking') { setAmberisBlinking((prevIsBlinking) => !prevIsBlinking); } - if (props.batteryData.RedLeds.value === 'Blinking') { + if (props.batteryData.Leds.Red === 'Blinking') { setRedisBlinking((prevIsBlinking) => !prevIsBlinking); } - if (props.batteryData.BlueLeds.value === 'Blinking') { + if (props.batteryData.Leds.Blue === 'Blinking') { setBlueisBlinking((prevIsBlinking) => !prevIsBlinking); } - if (props.batteryData.GreenLeds.value === 'Blinking') { + if (props.batteryData.Leds.Green === 'Blinking') { setGreenisBlinking((prevIsBlinking) => !prevIsBlinking); } }, 500); // Blink every 500 milliseconds @@ -129,7 +130,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { const res = await axiosConfig .post( - `/UpdateFirmware?batteryNode=${props.batteryData.BatteryId.toString()}&installationId=${ + `/UpdateFirmware?batteryNode=${props.batteryId.toString()}&installationId=${ props.installationId }&version=${selectedVersion}` ) @@ -169,7 +170,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { try { // Start the job to generate the battery log const startRes = await axiosConfig.post( - `/StartDownloadBatteryLog?batteryNode=${props.batteryData.BatteryId.toString()}&installationId=${ + `/StartDownloadBatteryLog?batteryNode=${props.batteryId.toString()}&installationId=${ props.installationId }` ); @@ -635,7 +636,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { fontWeight: 'bold' }} > - {'Node ' + props.batteryData.BatteryId} + {'Node ' + props.batteryId}
@@ -643,8 +644,8 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.String1Active.value == 'True' || - Number(props.batteryData.String1Active.value) == 0 + props.batteryData.BatteryStrings.String1Active == 'True' || + Number(props.batteryData.BatteryStrings) == 0 ? '#32CD32' : '#FF033E' }} @@ -653,8 +654,8 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.String2Active.value == 'True' || - Number(props.batteryData.String2Active.value) == 0 + props.batteryData.BatteryStrings.String2Active == 'True' || + Number(props.batteryData.BatteryStrings.String2Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -663,8 +664,8 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.String3Active.value == 'True' || - Number(props.batteryData.String3Active.value) == 0 + props.batteryData.BatteryStrings.String3Active == 'True' || + Number(props.batteryData.BatteryStrings.String3Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -673,8 +674,8 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.String4Active.value == 'True' || - Number(props.batteryData.String4Active.value) == 0 + props.batteryData.BatteryStrings.String4Active == 'True' || + Number(props.batteryData.BatteryStrings.String4Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -683,8 +684,8 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.String5Active.value == 'True' || - Number(props.batteryData.String5Active.value) == 0 + props.batteryData.BatteryStrings.String5Active == 'True' || + Number(props.batteryData.BatteryStrings.String5Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -699,8 +700,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { marginTop: '-10px', borderRadius: '50%', backgroundColor: - props.batteryData.GreenLeds.value === 'On' || - GreenisBlinking + props.batteryData.Leds.Green === 'On' || GreenisBlinking ? 'green' : 'transparent' }} @@ -714,8 +714,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { marginTop: '10px', borderRadius: '50%', backgroundColor: - props.batteryData.AmberLeds.value === 'On' || - AmberisBlinking + props.batteryData.Leds.Amber === 'On' || AmberisBlinking ? 'orange' : 'transparent' }} @@ -729,7 +728,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { marginTop: '10px', borderRadius: '50%', backgroundColor: - props.batteryData.BlueLeds.value === 'On' || BlueisBlinking + props.batteryData.Leds.Blue === 'On' || BlueisBlinking ? '#00ccff' : 'transparent' }} @@ -743,7 +742,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { marginTop: '10px', borderRadius: '50%', backgroundColor: - props.batteryData.RedLeds.value === 'On' || RedisBlinking + props.batteryData.Leds.Red === 'On' || RedisBlinking ? 'red' : 'transparent' }} @@ -803,9 +802,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Voltage.value + - ' ' + - props.batteryData.Voltage.unit} + {props.batteryData.Dc.Voltage + ' V'} @@ -825,9 +822,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Current.value + - ' ' + - props.batteryData.Current.unit} + {props.batteryData.Dc.Current + ' A'} @@ -847,9 +842,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Power.value + - ' ' + - props.batteryData.Power.unit} + {props.batteryData.Dc.Power + ' W'} @@ -870,9 +863,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.BusCurrent.value + - ' ' + - props.batteryData.BusCurrent.unit} + {props.batteryData.BusCurrent + ' A'} @@ -892,9 +883,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.CellsCurrent.value + - ' ' + - props.batteryData.CellsCurrent.unit} + {props.batteryData.CellsCurrent + ' °C'} @@ -914,9 +903,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.HeatingCurrent.value + - ' ' + - props.batteryData.HeatingCurrent.unit} + {props.batteryData.HeatingCurrent + ' A'} @@ -937,9 +924,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Soc.value + - ' ' + - props.batteryData.Soc.unit} + {props.batteryData.Soc + ' %'} @@ -999,9 +984,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.HeatingTemperature.value + - ' ' + - props.batteryData.HeatingTemperature.unit} + {props.batteryData.Temperatures.Heating + ' °C'} @@ -1021,9 +1004,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.BoardTemperature.value + - ' ' + - props.batteryData.BoardTemperature.unit} + {props.batteryData.Temperatures.Board + ' °C'} @@ -1043,9 +1024,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.AverageTemperature.value + - ' ' + - props.batteryData.AverageTemperature.unit} + {props.batteryData.Temperatures.Cells.Average + ' °C'} @@ -1065,9 +1044,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.LeftCellsTemperature.value + - ' ' + - props.batteryData.LeftCellsTemperature.unit} + {props.batteryData.Temperatures.Cells.Left + ' °C'} @@ -1087,9 +1064,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.RightCellsTemperature.value + - ' ' + - props.batteryData.RightCellsTemperature.unit} + {props.batteryData.Temperatures.Cells.Right + ' °C'} @@ -1109,9 +1084,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.AverageTemperature.value + - ' ' + - props.batteryData.AverageTemperature.unit} + {props.batteryData.Temperatures.Cells.Average + ' °C'} @@ -1131,9 +1104,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.StateTemperature.value + - ' ' + - props.batteryData.StateTemperature.unit} + {props.batteryData.Temperatures.State + ' °C'} @@ -1193,9 +1164,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.ConnectedToDcBus.value + - ' ' + - props.batteryData.ConnectedToDcBus.unit} + {props.batteryData.IoStatus.ConnectedToDcBus} @@ -1215,9 +1184,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.AlarmOutActive.value + - ' ' + - props.batteryData.AlarmOutActive.unit} + {props.batteryData.IoStatus.AlarmOutActive} @@ -1237,9 +1204,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.InternalFanActive.value + - ' ' + - props.batteryData.InternalFanActive.unit} + {props.batteryData.IoStatus.InternalFanActive} @@ -1259,9 +1224,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.VoltMeasurementAllowed.value + - ' ' + - props.batteryData.VoltMeasurementAllowed.unit} + {props.batteryData.IoStatus.VoltMeasurementAllowed} @@ -1281,9 +1244,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.AuxRelayBus.value + - ' ' + - props.batteryData.AuxRelayBus.unit} + {props.batteryData.IoStatus.AuxRelayBus} @@ -1303,9 +1264,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.RemoteStateActive.value + - ' ' + - props.batteryData.RemoteStateActive.unit} + {props.batteryData.IoStatus.RemoteStateActive} @@ -1325,9 +1284,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.RiscActive.value + - ' ' + - props.batteryData.RiscActive.unit} + {props.batteryData.IoStatus.RiscActive} @@ -1385,9 +1342,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Eoc.value + - ' ' + - props.batteryData.Eoc.unit} + {props.batteryData.Eoc} @@ -1408,9 +1363,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.SerialNumber.value + - ' ' + - props.batteryData.SerialNumber.unit} + {props.batteryData.SerialNumber} @@ -1431,9 +1384,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.FwVersion.value + - ' ' + - props.batteryData.FwVersion.unit} + {props.batteryData.FwVersion} @@ -1453,9 +1404,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.TimeSinceTOC.value + - ' ' + - props.batteryData.TimeSinceTOC.unit} + {props.batteryData.TimeSinceTOC} {props.productNum === 0 && ( @@ -1476,9 +1425,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.CalibrationChargeRequested.value + - ' ' + - props.batteryData.CalibrationChargeRequested.unit} + {props.batteryData.CalibrationChargeRequested} )} @@ -1499,9 +1446,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.MaxChargePower.value + - ' ' + - props.batteryData.MaxChargePower.unit} + {props.batteryData.MaxChargePower + ' W'} @@ -1521,9 +1466,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.MaxDischargePower.value + - ' ' + - props.batteryData.MaxDischargePower.unit} + {props.batteryData.MaxDischargePower + ' W'} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryViewSalidomo.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryViewSalidomo.tsx index e428a83e9..e62529324 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryViewSalidomo.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryViewSalidomo.tsx @@ -51,7 +51,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { const [errorMessage, setErrorMessage] = useState(''); const [selectedVersion, setSelectedVersion] = useState( - props.batteryData.FwVersion.value + props.batteryData.FwVersion ); const handleBatteryViewButton = () => { @@ -67,35 +67,35 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { }; const [GreenisBlinking, setGreenisBlinking] = useState( - props.batteryData.Leds.Green.value === 'Blinking' + props.batteryData.Leds.Green === 'Blinking' ); const [AmberisBlinking, setAmberisBlinking] = useState( - props.batteryData.Leds.Amber.value === 'Blinking' + props.batteryData.Leds.Amber === 'Blinking' ); const [RedisBlinking, setRedisBlinking] = useState( - props.batteryData.Leds.Red.value === 'Blinking' + props.batteryData.Leds.Red === 'Blinking' ); const [BlueisBlinking, setBlueisBlinking] = useState( - props.batteryData.Leds.Blue.value === 'Blinking' + props.batteryData.Leds.Blue === 'Blinking' ); useEffect(() => { const intervalId = setInterval(() => { - if (props.batteryData.Leds.Amber.value === 'Blinking') { + if (props.batteryData.Leds.Amber === 'Blinking') { setAmberisBlinking((prevIsBlinking) => !prevIsBlinking); } - if (props.batteryData.Leds.Red.value === 'Blinking') { + if (props.batteryData.Leds.Red === 'Blinking') { setRedisBlinking((prevIsBlinking) => !prevIsBlinking); } - if (props.batteryData.Leds.Blue.value === 'Blinking') { + if (props.batteryData.Leds.Blue === 'Blinking') { setBlueisBlinking((prevIsBlinking) => !prevIsBlinking); } - if (props.batteryData.Leds.Green.value === 'Blinking') { + if (props.batteryData.Leds.Green === 'Blinking') { setGreenisBlinking((prevIsBlinking) => !prevIsBlinking); } }, 500); // Blink every 500 milliseconds @@ -645,11 +645,8 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.BatteryStrings.String1Active.value == - 'True' || - Number( - props.batteryData.BatteryStrings.String1Active.value - ) == 0 + props.batteryData.BatteryStrings.String1Active == 'True' || + Number(props.batteryData.BatteryStrings.String1Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -658,11 +655,8 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.BatteryStrings.String2Active.value == - 'True' || - Number( - props.batteryData.BatteryStrings.String2Active.value - ) == 0 + props.batteryData.BatteryStrings.String2Active == 'True' || + Number(props.batteryData.BatteryStrings.String2Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -671,11 +665,8 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.BatteryStrings.String3Active.value == - 'True' || - Number( - props.batteryData.BatteryStrings.String3Active.value - ) == 0 + props.batteryData.BatteryStrings.String3Active == 'True' || + Number(props.batteryData.BatteryStrings.String3Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -684,11 +675,8 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.BatteryStrings.String4Active.value == - 'True' || - Number( - props.batteryData.BatteryStrings.String4Active.value - ) == 0 + props.batteryData.BatteryStrings.String4Active == 'True' || + Number(props.batteryData.BatteryStrings.String4Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -697,11 +685,8 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { style={{ ...batteryStringStyle, backgroundColor: - props.batteryData.BatteryStrings.String5Active.value == - 'True' || - Number( - props.batteryData.BatteryStrings.String5Active.value - ) == 0 + props.batteryData.BatteryStrings.String5Active == 'True' || + Number(props.batteryData.BatteryStrings.String5Active) == 0 ? '#32CD32' : '#FF033E' }} @@ -716,8 +701,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { marginTop: '-10px', borderRadius: '50%', backgroundColor: - props.batteryData.Leds.Green.value === 'On' || - GreenisBlinking + props.batteryData.Leds.Green === 'On' || GreenisBlinking ? 'green' : 'transparent' }} @@ -731,8 +715,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { marginTop: '10px', borderRadius: '50%', backgroundColor: - props.batteryData.Leds.Amber.value === 'On' || - AmberisBlinking + props.batteryData.Leds.Amber === 'On' || AmberisBlinking ? 'orange' : 'transparent' }} @@ -746,7 +729,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { marginTop: '10px', borderRadius: '50%', backgroundColor: - props.batteryData.Leds.Blue.value === 'On' || BlueisBlinking + props.batteryData.Leds.Blue === 'On' || BlueisBlinking ? '#00ccff' : 'transparent' }} @@ -760,7 +743,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { marginTop: '10px', borderRadius: '50%', backgroundColor: - props.batteryData.Leds.Red.value === 'On' || RedisBlinking + props.batteryData.Leds.Red === 'On' || RedisBlinking ? 'red' : 'transparent' }} @@ -820,7 +803,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Dc.Voltage.value + ' V'} + {props.batteryData.Dc.Voltage + ' V'} @@ -840,7 +823,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Dc.Current.value + ' A'} + {props.batteryData.Dc.Current + ' A'} @@ -860,7 +843,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Dc.Power.value + ' W'} + {props.batteryData.Dc.Power + ' W'} @@ -881,7 +864,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.BusCurrent.value + ' A'} + {props.batteryData.BusCurrent + ' A'} @@ -901,7 +884,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.CellsCurrent.value + ' A'} + {props.batteryData.CellsCurrent + ' A'} @@ -921,7 +904,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.HeatingCurrent.value + ' A'} + {props.batteryData.HeatingCurrent + ' A'} @@ -942,7 +925,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Soc.value + ' %'} + {props.batteryData.Soc + ' %'} @@ -1000,7 +983,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.IoStatus.ConnectedToDcBus.value + {props.batteryData.IoStatus.ConnectedToDcBus ? 'True' : 'False'} @@ -1022,7 +1005,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.IoStatus.AlarmOutActive.value + {props.batteryData.IoStatus.AlarmOutActive ? 'True' : 'False'} @@ -1044,7 +1027,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.IoStatus.InternalFanActive.value + {props.batteryData.IoStatus.InternalFanActive ? 'True' : 'False'} @@ -1066,7 +1049,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.IoStatus.VoltMeasurementAllowed.value + {props.batteryData.IoStatus.VoltMeasurementAllowed ? 'True' : 'False'} @@ -1088,9 +1071,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.IoStatus.AuxRelayBus.value - ? 'True' - : 'False'} + {props.batteryData.IoStatus.AuxRelayBus ? 'True' : 'False'} @@ -1110,7 +1091,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.IoStatus.RemoteStateActive.value + {props.batteryData.IoStatus.RemoteStateActive ? 'True' : 'False'} @@ -1132,9 +1113,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.IoStatus.RiscActive.value - ? 'True' - : 'False'} + {props.batteryData.IoStatus.RiscActive ? 'True' : 'False'} @@ -1192,7 +1171,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.Eoc.value} + {props.batteryData.Eoc} @@ -1213,7 +1192,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.SerialNumber.value} + {props.batteryData.SerialNumber} @@ -1234,7 +1213,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.FwVersion.value} + {props.batteryData.FwVersion} @@ -1254,7 +1233,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.TimeSinceTOC.value} + {props.batteryData.TimeSinceTOC} @@ -1275,7 +1254,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.MaxChargePower.value + ' W'} + {props.batteryData.MaxChargePower + ' W'} @@ -1295,7 +1274,7 @@ function DetailedBatteryViewSalidomo(props: DetailedBatteryViewProps) { paddingRight: '12px' }} > - {props.batteryData.MaxDischargePower.value + ' W'} + {props.batteryData.MaxDischargePower + ' W'} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx index d771d967c..75c60f8fa 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/MainStats.tsx @@ -16,7 +16,7 @@ import { getChartOptions } from '../Overview/chartOptions'; import { BatteryDataInterface, BatteryOverviewInterface, - transformInputToBatteryViewData + transformInputToBatteryViewDataJson } from '../../../interfaces/Chart'; import dayjs, { Dayjs } from 'dayjs'; import { TimeSpan, UnixTime } from '../../../dataCache/time'; @@ -96,7 +96,7 @@ function MainStats(props: MainStatsProps) { const resultPromise: Promise<{ chartData: BatteryDataInterface; chartOverview: BatteryOverviewInterface; - }> = transformInputToBatteryViewData( + }> = transformInputToBatteryViewDataJson( props.s3Credentials, props.id, product, @@ -192,7 +192,7 @@ function MainStats(props: MainStatsProps) { const resultPromise: Promise<{ chartData: BatteryDataInterface; chartOverview: BatteryOverviewInterface; - }> = transformInputToBatteryViewData( + }> = transformInputToBatteryViewDataJson( props.s3Credentials, props.id, product, @@ -254,7 +254,7 @@ function MainStats(props: MainStatsProps) { const resultPromise: Promise<{ chartData: BatteryDataInterface; chartOverview: BatteryOverviewInterface; - }> = transformInputToBatteryViewData( + }> = transformInputToBatteryViewDataJson( props.s3Credentials, props.id, product, diff --git a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx index 5e1a5e5f6..829ba84a8 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx @@ -1,4 +1,4 @@ -import { ConfigurationValues, TopologyValues } from '../Log/graph.util'; +import { ConfigurationValues, JSONRecordData } from '../Log/graph.util'; import { Alert, Box, @@ -31,7 +31,7 @@ import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker'; import { TimePicker } from '@mui/lab'; interface ConfigurationProps { - values: TopologyValues; + values: JSONRecordData; id: number; } @@ -40,6 +40,8 @@ function Configuration(props: ConfigurationProps) { return null; } + console.log('111111111111111111111111111111111111111111111111'); + const CalibrationChargeOptions = [ 'Repetitive Calibration', 'Additional Calibration', @@ -86,19 +88,19 @@ function Configuration(props: ConfigurationProps) { const { currentUser, setUser } = context; const [formValues, setFormValues] = useState({ - minimumSoC: props.values.minimumSoC[0].value, - gridSetPoint: (props.values.gridSetPoint[0].value as number) / 1000, + minimumSoC: props.values.Config.MinSoc, + gridSetPoint: (props.values.Config.GridSetPoint as number) / 1000, CalibrationChargeState: CalibrationChargeOptionsController.indexOf( - props.values.calibrationChargeState[0].value.toString() + props.values.Config.ForceCalibrationChargeState.toString() ), calibrationChargeDate: CalibrationChargeOptionsController.indexOf( - props.values.calibrationChargeState[0].value.toString() + props.values.Config.ForceCalibrationChargeState.toString() ) == 0 - ? dayjs(props.values.repetitiveCalibrationChargeDate[0].value) + ? dayjs(props.values.Config.DayAndTimeForRepetitiveCalibration) // .add(localOffset, 'minute') .toDate() - : dayjs(props.values.additionalCalibrationChargeDate[0].value) + : dayjs(props.values.Config.DayAndTimeForAdditionalCalibration) // .add(localOffset, 'minute') .toDate() }); @@ -106,9 +108,9 @@ function Configuration(props: ConfigurationProps) { const handleSubmit = async (e) => { if ( CalibrationChargeOptionsController.indexOf( - props.values.calibrationChargeState[0].value.toString() + props.values.Config.ForceCalibrationChargeState.toString() ) != 2 && - props.values.mode[0].value === 'CalibrationCharge' + props.values.EssControl.Mode === 'CalibrationCharge' ) { setDateSelectionError( 'You cannot change the date while the installation is in Calibration Charge Mode' @@ -192,10 +194,10 @@ function Configuration(props: ConfigurationProps) { ), ['calibrationChargeDate']: CalibrationChargeOptions.indexOf(event.target.value) == 0 - ? dayjs(props.values.repetitiveCalibrationChargeDate[0].value) + ? dayjs(props.values.Config.DayAndTimeForRepetitiveCalibration) // .add(localOffset, 'minute') .toDate() - : dayjs(props.values.additionalCalibrationChargeDate[0].value) + : dayjs(props.values.Config.DayAndTimeForAdditionalCalibration) // .add(localOffset, 'minute') .toDate() }); @@ -466,13 +468,14 @@ function Configuration(props: ConfigurationProps) { /> } value={ - (props.values.installedDcDcPower[0].value as number) * 10 + (props.values.DcDc.SystemControl + .NumberOfConnectedSlaves as number) * 10 } fullWidth />
- {props.values.maximumDischargePower && ( + {props.values.Config.MaxBatteryDischargingCurrent && (
} value={ - (props.values.maximumDischargePower[0].value as number) * + (props.values.Config + .MaxBatteryDischargingCurrent as number) * 48 * - (props.values.DcDcNum[0].value as number) + (props.values.DcDc.SystemControl + .NumberOfConnectedSlaves as number) } fullWidth />
)} -
- - } - value={props.values.battery.length - 4} - fullWidth - /> -
+ {/*
*/} + {/* */} + {/* }*/} + {/* value={Object.keys(props.values.Battery.Devices).length}*/} + {/* fullWidth*/} + {/* />*/} + {/*
*/}
(undefined); - const [values, setValues] = useState(null); + const [values, setValues] = useState(null); const status = props.current_installation.status; const [connected, setConnected] = useState(true); const [loading, setLoading] = useState(true); @@ -82,7 +79,7 @@ function Installation(props: singleInstallationProps) { for (var i = timeperiodToSearch; i > 0; i -= 2) { timestampToFetch = UnixTime.now().earlier(TimeSpan.fromSeconds(i)); try { - res = await fetchData(timestampToFetch, s3Credentials); + res = await fetchDataJson(timestampToFetch, s3Credentials, false); if (res !== FetchResult.notAvailable && res !== FetchResult.tryLater) { break; } @@ -101,18 +98,18 @@ function Installation(props: singleInstallationProps) { setLoading(false); const timestamp = Object.keys(res)[Object.keys(res).length - 1]; - - setValues( - extractValues({ - time: UnixTime.fromTicks(parseInt(timestamp, 10)), - value: res[timestamp] - }) - ); + setValues(res[timestamp]); + // setValues( + // extractValues({ + // time: UnixTime.fromTicks(parseInt(timestamp, 10)), + // value: res[timestamp] + // }) + // ); return true; }; const fetchDataPeriodically = async () => { - var timeperiodToSearch = 90; + var timeperiodToSearch = 200; let res; let timestampToFetch; @@ -123,7 +120,7 @@ function Installation(props: singleInstallationProps) { timestampToFetch = UnixTime.now().earlier(TimeSpan.fromSeconds(i)); try { - res = await fetchData(timestampToFetch, s3Credentials); + res = await fetchDataJson(timestampToFetch, s3Credentials, false); if (res !== FetchResult.notAvailable && res !== FetchResult.tryLater) { break; } @@ -150,13 +147,14 @@ function Installation(props: singleInstallationProps) { console.log(`Timestamp: ${timestamp}`); console.log(res[timestamp]); + setValues(res[timestamp]); // Set values asynchronously with delay - setValues( - extractValues({ - time: UnixTime.fromTicks(parseInt(timestamp, 10)), - value: res[timestamp] - }) - ); + // setValues( + // extractValues({ + // time: UnixTime.fromTicks(parseInt(timestamp, 10)), + // value: res[timestamp] + // }) + // ); // Wait for 2 seconds before processing next timestamp await timeout(2000); } @@ -164,14 +162,14 @@ function Installation(props: singleInstallationProps) { timestampToFetch = timestampToFetch.later(TimeSpan.fromSeconds(60)); console.log('NEW TIMESTAMP TO FETCH IS ' + timestampToFetch); - for (i = 0; i < 10; i++) { + for (i = 0; i < 30; i++) { if (!continueFetching.current) { return false; } try { console.log('Trying to fetch timestamp ' + timestampToFetch); - res = await fetchData(timestampToFetch, s3Credentials); + res = await fetchDataJson(timestampToFetch, s3Credentials, false); if ( res !== FetchResult.notAvailable && res !== FetchResult.tryLater @@ -293,7 +291,7 @@ function Installation(props: singleInstallationProps) { fontSize: '14px' }} > - {values.mode[0].value} + {values.EssControl.Mode}
)} diff --git a/typescript/frontend-marios2/src/content/dashboards/Installations/fetchData.tsx b/typescript/frontend-marios2/src/content/dashboards/Installations/fetchData.tsx index 6d14cb5d4..add63dcf9 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Installations/fetchData.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Installations/fetchData.tsx @@ -1,14 +1,8 @@ import { UnixTime } from 'src/dataCache/time'; import { I_S3Credentials } from 'src/interfaces/S3Types'; import { FetchResult } from 'src/dataCache/dataCache'; -import { DataRecord } from 'src/dataCache/data'; import { S3Access } from 'src/dataCache/S3/S3Access'; -import { - JSONRecordData, - parseChunk, - parseChunkJson, - parseCsv -} from '../Log/graph.util'; +import { JSONRecordData, parseChunkJson } from '../Log/graph.util'; import JSZip from 'jszip'; export const fetchDataJson = ( @@ -34,7 +28,6 @@ export const fetchDataJson = ( if (r.status === 404) { return Promise.resolve(FetchResult.notAvailable); } else if (r.status === 200) { - console.log('FOUND ITTTTTTTTTTTT'); const jsontext = await r.text(); // Assuming the server returns the Base64 encoded ZIP file as text const byteArray = Uint8Array.from(atob(jsontext), (c) => c.charCodeAt(0) @@ -44,7 +37,6 @@ export const fetchDataJson = ( const zip = await JSZip.loadAsync(byteArray); // Assuming the Json file is named "data.json" inside the ZIP archive const jsonContent = await zip.file('data.json').async('text'); - //console.log(jsonContent); return parseChunkJson(jsonContent); } else { return Promise.resolve(FetchResult.notAvailable); @@ -111,104 +103,104 @@ export const fetchAggregatedDataJson = ( //-------------------------------------------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -export const fetchData = ( - timestamp: UnixTime, - s3Credentials?: I_S3Credentials, - cutdigits?: boolean -): Promise>> => { - const s3Path = cutdigits - ? `${timestamp.ticks.toString().slice(0, -2)}.csv` - : `${timestamp.ticks}.csv`; - if (s3Credentials && s3Credentials.s3Bucket) { - const s3Access = new S3Access( - s3Credentials.s3Bucket, - s3Credentials.s3Region, - s3Credentials.s3Provider, - s3Credentials.s3Key, - s3Credentials.s3Secret - ); - - return s3Access - .get(s3Path) - .then(async (r) => { - if (r.status === 404) { - return Promise.resolve(FetchResult.notAvailable); - } else if (r.status === 200) { - console.log('FOUND ITTTTTTTTTTTT'); - const csvtext = await r.text(); // Assuming the server returns the Base64 encoded ZIP file as text - const contentEncoding = r.headers.get('content-type'); - - //console.log(contentEncoding); - - if (contentEncoding != 'application/base64; charset=utf-8') { - // console.log('uncompressed'); - return parseChunk(csvtext); - } - - const byteArray = Uint8Array.from(atob(csvtext), (c) => - c.charCodeAt(0) - ); - - //Decompress the byte array using JSZip - const zip = await JSZip.loadAsync(byteArray); - // Assuming the CSV file is named "data.csv" inside the ZIP archive - const csvContent = await zip.file('data.csv').async('text'); - - //console.log(csvContent); - - return parseChunk(csvContent); - } else { - return Promise.resolve(FetchResult.notAvailable); - } - }) - .catch((e) => { - return Promise.resolve(FetchResult.tryLater); - }); - } -}; - -export const fetchAggregatedData = ( - date: string, - s3Credentials?: I_S3Credentials -): Promise> => { - const s3Path = `${date}.csv`; - if (s3Credentials && s3Credentials.s3Bucket) { - const s3Access = new S3Access( - s3Credentials.s3Bucket, - s3Credentials.s3Region, - s3Credentials.s3Provider, - s3Credentials.s3Key, - s3Credentials.s3Secret - ); - return s3Access - .get(s3Path) - .then(async (r) => { - if (r.status === 404) { - return Promise.resolve(FetchResult.notAvailable); - } else if (r.status === 200) { - const csvtext = await r.text(); // Assuming the server returns the Base64 encoded ZIP file as text - const contentEncoding = r.headers.get('content-type'); - - if (contentEncoding != 'application/base64; charset=utf-8') { - return parseCsv(csvtext); - } - - const byteArray = Uint8Array.from(atob(csvtext), (c) => - c.charCodeAt(0) - ); - - //Decompress the byte array using JSZip - const zip = await JSZip.loadAsync(byteArray); - // Assuming the CSV file is named "data.csv" inside the ZIP archive - const csvContent = await zip.file('data.csv').async('text'); - return parseCsv(csvContent); - } else { - return Promise.resolve(FetchResult.notAvailable); - } - }) - .catch((e) => { - return Promise.resolve(FetchResult.tryLater); - }); - } -}; +// +// export const fetchData = ( +// timestamp: UnixTime, +// s3Credentials?: I_S3Credentials, +// cutdigits?: boolean +// ): Promise>> => { +// const s3Path = cutdigits +// ? `${timestamp.ticks.toString().slice(0, -2)}.csv` +// : `${timestamp.ticks}.csv`; +// if (s3Credentials && s3Credentials.s3Bucket) { +// const s3Access = new S3Access( +// s3Credentials.s3Bucket, +// s3Credentials.s3Region, +// s3Credentials.s3Provider, +// s3Credentials.s3Key, +// s3Credentials.s3Secret +// ); +// +// return s3Access +// .get(s3Path) +// .then(async (r) => { +// if (r.status === 404) { +// return Promise.resolve(FetchResult.notAvailable); +// } else if (r.status === 200) { +// //console.log('FOUND ITTTTTTTTTTTT'); +// const csvtext = await r.text(); // Assuming the server returns the Base64 encoded ZIP file as text +// const contentEncoding = r.headers.get('content-type'); +// +// //console.log(contentEncoding); +// +// if (contentEncoding != 'application/base64; charset=utf-8') { +// // console.log('uncompressed'); +// return parseChunk(csvtext); +// } +// +// const byteArray = Uint8Array.from(atob(csvtext), (c) => +// c.charCodeAt(0) +// ); +// +// //Decompress the byte array using JSZip +// const zip = await JSZip.loadAsync(byteArray); +// // Assuming the CSV file is named "data.csv" inside the ZIP archive +// const csvContent = await zip.file('data.csv').async('text'); +// +// //console.log(csvContent); +// +// return parseChunk(csvContent); +// } else { +// return Promise.resolve(FetchResult.notAvailable); +// } +// }) +// .catch((e) => { +// return Promise.resolve(FetchResult.tryLater); +// }); +// } +// }; +// +// export const fetchAggregatedData = ( +// date: string, +// s3Credentials?: I_S3Credentials +// ): Promise> => { +// const s3Path = `${date}.csv`; +// if (s3Credentials && s3Credentials.s3Bucket) { +// const s3Access = new S3Access( +// s3Credentials.s3Bucket, +// s3Credentials.s3Region, +// s3Credentials.s3Provider, +// s3Credentials.s3Key, +// s3Credentials.s3Secret +// ); +// return s3Access +// .get(s3Path) +// .then(async (r) => { +// if (r.status === 404) { +// return Promise.resolve(FetchResult.notAvailable); +// } else if (r.status === 200) { +// const csvtext = await r.text(); // Assuming the server returns the Base64 encoded ZIP file as text +// const contentEncoding = r.headers.get('content-type'); +// +// if (contentEncoding != 'application/base64; charset=utf-8') { +// return parseCsv(csvtext); +// } +// +// const byteArray = Uint8Array.from(atob(csvtext), (c) => +// c.charCodeAt(0) +// ); +// +// //Decompress the byte array using JSZip +// const zip = await JSZip.loadAsync(byteArray); +// // Assuming the CSV file is named "data.csv" inside the ZIP archive +// const csvContent = await zip.file('data.csv').async('text'); +// return parseCsv(csvContent); +// } else { +// return Promise.resolve(FetchResult.notAvailable); +// } +// }) +// .catch((e) => { +// return Promise.resolve(FetchResult.tryLater); +// }); +// } +// }; diff --git a/typescript/frontend-marios2/src/content/dashboards/Log/graph.util.tsx b/typescript/frontend-marios2/src/content/dashboards/Log/graph.util.tsx index ba6fe98eb..78333ef2e 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Log/graph.util.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Log/graph.util.tsx @@ -1,61 +1,87 @@ // The interface for each device in the Battery object + interface Leds { - Blue: { value: string }; - Amber: { value: string }; - Green: { value: string }; - Red: { value: string }; + Blue: string; + Amber: string; + Green: string; + Red: string; } interface Dc { - Current: { value: number }; - Voltage: { value: number }; - Power: { value: number }; + Current: number; + Voltage: number; + Power: number; } interface Temperatures { Cells: { - Average: { value: number }; + Average: number; + Right: number; + Left: number; }; + State: number; + Board: number; + Heating: number; } interface IoStatus { - ConnectedToDcBus: { value: boolean }; - AuxRelayBus: { value: boolean }; - AlarmOutActive: { value: boolean }; - InternalFanActive: { value: boolean }; - RemoteStateActive: { value: boolean }; - VoltMeasurementAllowed: { value: boolean }; - RiscActive: { value: boolean }; + ConnectedToDcBus: boolean; + AuxRelayBus: boolean; + AlarmOutActive: boolean; + InternalFanActive: boolean; + RemoteStateActive: boolean; + VoltMeasurementAllowed: boolean; + RiscActive: boolean; } interface BatteryStrings { - String1Active: { value: string }; - String2Active: { value: string }; - String3Active: { value: string }; - String4Active: { value: string }; - String5Active: { value: string }; + String1Active: string; + String2Active: string; + String3Active: string; + String4Active: string; + String5Active: string; } export interface Device { Leds: Leds; - Eoc: { value: boolean }; - Soc: { value: number }; - SerialNumber: { value: string }; - TimeSinceTOC: { value: string }; - MaxChargePower: { value: number }; - CellsCurrent: { value: number }; - SOCAh: { value: number }; + Eoc: boolean; + Soc: number; + SerialNumber: string; + TimeSinceTOC: string; + MaxChargePower: number; + CellsCurrent: number; + SOCAh: number; Dc: Dc; - FwVersion: { value: string }; - HeatingCurrent: { value: number }; - MaxDischargePower: { value: number }; + FwVersion: string; + HeatingCurrent: number; + MaxDischargePower: number; Temperatures: Temperatures; - BusCurrent: { value: number }; - HeatingPower: { value: number }; + BusCurrent: number; + HeatingPower: number; IoStatus: IoStatus; BatteryStrings: BatteryStrings; - Alarms: number; - Warnings: number; + CalibrationChargeRequested: string; + Alarms: string; + Warnings: string; +} + +export interface Power { + Active: number; + Apparent: number; + Reactive: number; +} + +export interface PvString { + Power: number; + Voltage: number; + Current: number; +} + +export interface Line { + Voltage: number; + Current: number; + Phi: number; + Power: Power; } // The interface for the Battery structure, with dynamic keys (Device IDs) @@ -64,14 +90,182 @@ export interface JSONRecordData { Devices: { [deviceId: string]: Device; // Device ID as the key }; + + Dc: { + Voltage: number; + Current: number; + Power: number; + }; + + // Power: number; + // Current: number; + CurrentMinSoc: number; + Soc: number; + Soh: number; + Temperature: number; + // Voltage: number; }; - Config: { - Devices: { - BatteryNodes: { - value: string[]; + + AcDc: { + Ac: { + Frequency: number; + L1: Line; + L2: Line; + L3: Line; + Power: Power; + }; + + Dc: { + Voltage: number; + Current: number; + Power: number; + }; + + Alarms: string[]; + Warnings: string[]; + }; + + AcDcToDcLink: { Power: number }; + PvOnAcGrid: { Power: Power }; + PvOnAcIsland: { Power: Power }; + AcGridToAcIsland: { Power: Power }; + + islandBus: { + AcDc: { + Ac: { + L1: Line; + L2: Line; + L3: Line; }; }; }; + + Config: { + BatterySelfDischargePower: number; + CurtailP: number; + DayAndTimeForAdditionalCalibration: string; + DayAndTimeForRepetitiveCalibration: string; + DisplayIndividualBatteries: string; + MaxBatteryDischargingCurrent: number; + ForceCalibrationChargeState: string; + GridSetPoint: number; + HoldSocZone: number; + MinSoc: number; + PConstant: number; + PvInstalledPower: number; + + Devices: { + BatteryNodes: string; + BatteryIp: { DeviceState: string }; + GridMeterIp: { DeviceState: string }; + IslandBusLoadMeterIp: { DeviceState: string }; + LoadOnAcGrid: { DeviceState: string }; + LoadOnDc: { DeviceState: string }; + PvOnAcGrid: { DeviceState: string }; + PvOnAcIsland: { DeviceState: string }; + PvOnDc: { DeviceState: string }; + RelaysIp: { DeviceState: string }; + TruConvertAcIp: { DeviceState: string }; + TruConvertDcIp: { DeviceState: string }; + TsRelaysIp: { DeviceState: string }; + }; + }; + + DcDc: { + Dc: { + Battery: { + Voltage: number; + Current: number; + Power: number; + }; + Link: { + Voltage: number; + Current: number; + Power: number; + }; + }; + + SystemControl: { + Alarms: string; + CommunicationTimeout: string; + DeviceState: string; + NumberOfConnectedSlaves: number; + NumberOfConnectedSubSlaves: number; + PowerSetPointActivation: string; + PowerSetPointTrigger: string; + ReferenceFrame: string; + ResetAlarmsAndWarnings: string; + SlaveErrorHandling: string; + SubSlaveErrorHandling: string; + SystemConfig: string; + TargetSlave: number; + UseSlaveIdForAddressing: string; + Warnings: string; + }; + + Alarms: string[]; + Warnings: string[]; + }; + + EssControl: { + Mode: string; + LimitedBy: string; + PowerCorrection: number; + PowerSetPoint: number; + }; + + GridMeter: { + Ac: { + Frequency: number; + L1: Line; + L2: Line; + L3: Line; + Power: Power; + }; + ActivePowerExportT1: number; + ActivePowerExportT2: number; + ActivePowerExportT3: number; + ActivePowerExportT4: number; + ActivePowerImportT1: number; + ActivePowerImportT2: number; + ActivePowerImportT3: number; + ActivePowerImportT4: number; + }; + + LoadOnAcGrid: { Power: Power }; + + LoadOnAcIsland: { + Ac: { + Frequency: number; + L1: Line; + L2: Line; + L3: Line; + Power: Power; + }; + ActivePowerExportT1: number; + ActivePowerExportT2: number; + ActivePowerExportT3: number; + ActivePowerExportT4: number; + ActivePowerImportT1: number; + ActivePowerImportT2: number; + ActivePowerImportT3: number; + ActivePowerImportT4: number; + }; + + LoadOnDc: { Power: number }; + + PvOnDc: { + DcWh: number; + NbrOfStrings: number; + Dc: { + Voltage: number; + Current: number; + Power: number; + }; + Strings: { + [PvId: string]: PvString; + }; + }; } export const parseChunkJson = ( @@ -83,8 +277,6 @@ export const parseChunkJson = ( let currentTimestamp = null; lines.forEach((line) => { - //console.log(line); - const fields = line.split(';'); if (fields[0] === 'Timestamp') { currentTimestamp = fields[1]; @@ -106,61 +298,60 @@ export const parseChunkJson = ( //-------------------------------------------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -import { DataPoint, DataRecord } from 'src/dataCache/data'; - +// export interface I_CsvEntry { value: string | number; unit: string; } -export const parseCsv = (text: string): DataRecord => { - const y = text - .split(/\r?\n/) - .filter((split) => split.length > 0) - .map((l) => { - return l.split(';'); - }); - - return y - .map((fields) => { - if (isNaN(Number(fields[1])) || fields[1] === '') { - return { [fields[0]]: { value: fields[1], unit: fields[2] } }; - } - return { [fields[0]]: { value: parseFloat(fields[1]), unit: fields[2] } }; - }) - .reduce((acc, current) => ({ ...acc, ...current }), {} as DataRecord); -}; - -export const parseChunk = (text: string): Record => { - const lines = text.split(/\r?\n/).filter((line) => line.length > 0); - - let result: Record = {}; - let currentTimestamp = null; - - lines.forEach((line) => { - const fields = line.split(';'); - if (fields[0] === 'Timestamp') { - currentTimestamp = fields[1]; - result[currentTimestamp] = {}; - } else if (currentTimestamp) { - let key = fields[0]; - let value = fields[1]; - let unit = fields[2]; - - if (isNaN(Number(value)) || value === '') { - result[currentTimestamp][key] = { value: value, unit: unit }; - } else { - result[currentTimestamp][key] = { - value: parseFloat(value), - unit: unit - }; - } - } - }); - return result; -}; - +// +// export const parseCsv = (text: string): DataRecord => { +// const y = text +// .split(/\r?\n/) +// .filter((split) => split.length > 0) +// .map((l) => { +// return l.split(';'); +// }); +// +// return y +// .map((fields) => { +// if (isNaN(Number(fields[1])) || fields[1] === '') { +// return { [fields[0]]: { value: fields[1], unit: fields[2] } }; +// } +// return { [fields[0]]: { value: parseFloat(fields[1]), unit: fields[2] } }; +// }) +// .reduce((acc, current) => ({ ...acc, ...current }), {} as DataRecord); +// }; +// +// export const parseChunk = (text: string): Record => { +// const lines = text.split(/\r?\n/).filter((line) => line.length > 0); +// +// let result: Record = {}; +// let currentTimestamp = null; +// +// lines.forEach((line) => { +// const fields = line.split(';'); +// if (fields[0] === 'Timestamp') { +// currentTimestamp = fields[1]; +// result[currentTimestamp] = {}; +// } else if (currentTimestamp) { +// let key = fields[0]; +// let value = fields[1]; +// let unit = fields[2]; +// +// if (isNaN(Number(value)) || value === '') { +// result[currentTimestamp][key] = { value: value, unit: unit }; +// } else { +// result[currentTimestamp][key] = { +// value: parseFloat(value), +// unit: unit +// }; +// } +// } +// }); +// return result; +// }; +// export interface I_BoxDataValue { unit: string; value: string | number; @@ -172,445 +363,454 @@ export type ConfigurationValues = { CalibrationChargeState: number; calibrationChargeDate: Date | null; }; +// +// export interface Pv { +// PvId: number; +// Power: I_BoxDataValue; +// Voltage: I_BoxDataValue; +// Current: I_BoxDataValue; +// } +// +// export interface Battery { +// BatteryId: number; +// FwVersion: I_BoxDataValue; +// Power: I_BoxDataValue; +// Voltage: I_BoxDataValue; +// Soc: I_BoxDataValue; +// AverageTemperature: I_BoxDataValue; +// Warnings: I_BoxDataValue; +// Alarms: I_BoxDataValue; +// Current: I_BoxDataValue; +// BusCurrent: I_BoxDataValue; +// CellsCurrent: I_BoxDataValue; +// HeatingCurrent: I_BoxDataValue; +// HeatingPower: I_BoxDataValue; +// SOCAh: I_BoxDataValue; +// BlueLeds: I_BoxDataValue; +// RedLeds: I_BoxDataValue; +// GreenLeds: I_BoxDataValue; +// AmberLeds: I_BoxDataValue; +// HeatingTemperature: I_BoxDataValue; +// BoardTemperature: I_BoxDataValue; +// LeftCellsTemperature: I_BoxDataValue; +// RightCellsTemperature: I_BoxDataValue; +// StateTemperature: I_BoxDataValue; +// String1Active: I_BoxDataValue; +// String2Active: I_BoxDataValue; +// String3Active: I_BoxDataValue; +// String4Active: I_BoxDataValue; +// String5Active: I_BoxDataValue; +// ConnectedToDcBus: I_BoxDataValue; +// AlarmOutActive: I_BoxDataValue; +// InternalFanActive: I_BoxDataValue; +// VoltMeasurementAllowed: I_BoxDataValue; +// AuxRelayBus: I_BoxDataValue; +// RemoteStateActive: I_BoxDataValue; +// RiscActive: I_BoxDataValue; +// Eoc: I_BoxDataValue; +// SerialNumber: I_BoxDataValue; +// TimeSinceTOC: I_BoxDataValue; +// CalibrationChargeRequested: I_BoxDataValue; +// MaxChargePower: I_BoxDataValue; +// MaxDischargePower: I_BoxDataValue; +// } +// +// const PvKeys = ['PvId', 'Power', 'Voltage', 'Current']; +// +// const BatteryKeys = [ +// 'BatteryId', +// 'FwVersion', +// 'Power', +// 'Voltage', +// 'Soc', +// 'AverageTemperature', +// 'Warnings', +// 'Alarms', +// 'Current', +// 'BusCurrent', +// 'CellsCurrent', +// 'HeatingCurrent', +// 'HeatingPower', +// 'SOCAh', +// 'BlueLeds', +// 'RedLeds', +// 'GreenLeds', +// 'AmberLeds', +// 'HeatingTemperature', +// 'BoardTemperature', +// 'LeftCellsTemperature', +// 'RightCellsTemperature', +// 'StateTemperature', +// 'String1Active', +// 'String2Active', +// 'String3Active', +// 'String4Active', +// 'String5Active', +// 'ConnectedToDcBus', +// 'AlarmOutActive', +// 'InternalFanActive', +// 'VoltMeasurementAllowed', +// 'AuxRelayBus', +// 'RemoteStateActive', +// 'RiscActive', +// 'Eoc', +// 'SerialNumber', +// 'TimeSinceTOC', +// 'CalibrationChargeRequested', +// 'MaxChargePower', +// 'MaxDischargePower' +// ]; +// +// export type TopologyValues = { +// gridBox: I_BoxDataValue[]; +// pvOnAcGridBox: I_BoxDataValue[]; +// loadOnAcGridBox: I_BoxDataValue[]; +// pvOnIslandBusBox: I_BoxDataValue[]; +// loadOnIslandBusBox: I_BoxDataValue[]; +// pvOnDcBox: I_BoxDataValue[]; +// loadOnDcBox: I_BoxDataValue[]; +// batteryBox: I_BoxDataValue[]; +// +// grid: I_BoxDataValue[]; +// gridToAcInConnection: I_BoxDataValue[]; +// gridBus: I_BoxDataValue[]; +// islandBus: I_BoxDataValue[]; +// dcBus: I_BoxDataValue[]; +// dcBusToDcDcConnection: I_BoxDataValue[]; +// dcDCToBatteryConnection: I_BoxDataValue[]; +// battery: I_BoxDataValue[]; +// dcBusToLoadOnDcConnection: I_BoxDataValue[]; +// islandBusToLoadOnIslandBusConnection: I_BoxDataValue[]; +// gridBusToPvOnGridbusConnection: I_BoxDataValue[]; +// gridBusToLoadOnGridBusConnection: I_BoxDataValue[]; +// inverter: I_BoxDataValue[]; +// dcDc: I_BoxDataValue[]; +// islandBusToInverter: I_BoxDataValue[]; +// inverterToDcBus: I_BoxDataValue[]; +// gridBusToIslandBusConnection: I_BoxDataValue[]; +// pvOnDcBusToDcBusConnection: I_BoxDataValue[]; +// pvOnIslandBusToIslandBusConnection: I_BoxDataValue[]; +// minimumSoC: I_BoxDataValue[]; +// installedDcDcPower: I_BoxDataValue[]; +// gridSetPoint: I_BoxDataValue[]; +// maximumDischargePower: I_BoxDataValue[]; +// DcDcNum: I_BoxDataValue[]; +// calibrationChargeState: I_BoxDataValue[]; +// mode: I_BoxDataValue[]; +// repetitiveCalibrationChargeDate: I_BoxDataValue[]; +// additionalCalibrationChargeDate: I_BoxDataValue[]; +// +// batteryView: Battery[]; +// +// pvView: Pv[]; +// }; +// type TopologyPaths = { [key in keyof TopologyValues]: string[] }; +// +// const batteryIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +// +// const pvIds = [ +// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, +// 23, 24, 25, 26, 27, 28, 29, 30 +// ]; +// +// const PvPaths = [ +// '/PvOnDc/Strings/%id%/Power', +// '/PvOnDc/Strings/%id%/Voltage', +// '/PvOnDc/Strings/%id%/Current' +// ]; +// +// const batteryPaths = [ +// '/Battery/Devices/%id%/FwVersion', +// '/Battery/Devices/%id%/Dc/Power', +// '/Battery/Devices/%id%/Dc/Voltage', +// '/Battery/Devices/%id%/Soc', +// '/Battery/Devices/%id%/Temperatures/Cells/Average', +// '/Battery/Devices/%id%/Warnings', +// '/Battery/Devices/%id%/Alarms', +// +// '/Battery/Devices/%id%/Dc/Current', +// '/Battery/Devices/%id%/BusCurrent', +// '/Battery/Devices/%id%/CellsCurrent', +// '/Battery/Devices/%id%/HeatingCurrent', +// '/Battery/Devices/%id%/HeatingPower', +// '/Battery/Devices/%id%/SOCAh', +// +// '/Battery/Devices/%id%/Leds/Blue', +// '/Battery/Devices/%id%/Leds/Red', +// '/Battery/Devices/%id%/Leds/Green', +// '/Battery/Devices/%id%/Leds/Amber', +// +// '/Battery/Devices/%id%/Temperatures/Heating', +// '/Battery/Devices/%id%/Temperatures/Board', +// '/Battery/Devices/%id%/Temperatures/Cells/Left', +// '/Battery/Devices/%id%/Temperatures/Cells/Right', +// '/Battery/Devices/%id%/Temperatures/State', +// +// '/Battery/Devices/%id%/BatteryStrings/String1Active', +// '/Battery/Devices/%id%/BatteryStrings/String2Active', +// '/Battery/Devices/%id%/BatteryStrings/String3Active', +// '/Battery/Devices/%id%/BatteryStrings/String4Active', +// '/Battery/Devices/%id%/BatteryStrings/String5Active', +// +// '/Battery/Devices/%id%/IoStatus/ConnectedToDcBus', +// '/Battery/Devices/%id%/IoStatus/AlarmOutActive', +// '/Battery/Devices/%id%/IoStatus/InternalFanActive', +// '/Battery/Devices/%id%/IoStatus/VoltMeasurementAllowed', +// '/Battery/Devices/%id%/IoStatus/AuxRelayBus', +// '/Battery/Devices/%id%/IoStatus/RemoteStateActive', +// '/Battery/Devices/%id%/IoStatus/RiscActive', +// +// '/Battery/Devices/%id%/Eoc', +// '/Battery/Devices/%id%/SerialNumber', +// '/Battery/Devices/%id%/TimeSinceTOC', +// '/Battery/Devices/%id%/CalibrationChargeRequested', +// '/Battery/Devices/%id%/MaxChargePower', +// '/Battery/Devices/%id%/MaxDischargePower' +// ]; +// +// export const topologyPaths: TopologyPaths = { +// gridBox: ['/Config/Devices/GridMeterIp/DeviceState'], +// pvOnAcGridBox: ['/Config/Devices/PvOnAcGrid/DeviceState'], +// loadOnAcGridBox: ['/Config/Devices/LoadOnAcGrid/DeviceState'], +// pvOnIslandBusBox: ['/Config/Devices/PvOnAcIsland/DeviceState'], +// loadOnIslandBusBox: ['/Config/Devices/IslandBusLoadMeterIp/DeviceState'], +// pvOnDcBox: ['/Config/Devices/PvOnDc/DeviceState'], +// loadOnDcBox: ['/Config/Devices/LoadOnDc/DeviceState'], +// batteryBox: ['/Config/Devices/BatteryIp/DeviceState'], +// +// grid: [ +// '/GridMeter/Ac/L1/Power/Active', +// '/GridMeter/Ac/L2/Power/Active', +// '/GridMeter/Ac/L3/Power/Active' +// ], +// gridToAcInConnection: ['/GridMeter/Ac/Power/Active'], +// +// gridBus: [ +// '/GridMeter/Ac/L1/Voltage', +// '/GridMeter/Ac/L2/Voltage', +// '/GridMeter/Ac/L3/Voltage' +// ], +// gridBusToPvOnGridbusConnection: ['/PvOnAcGrid/Power/Active'], +// +// gridBusToLoadOnGridBusConnection: ['/LoadOnAcGrid/Power/Active'], +// gridBusToIslandBusConnection: ['/AcGridToAcIsland/Power/Active'], +// +// islandBus: [ +// '/AcDc/Ac/L1/Voltage', +// '/AcDc/Ac/L2/Voltage', +// '/AcDc/Ac/L3/Voltage' +// ], +// islandBusToLoadOnIslandBusConnection: ['/LoadOnAcIsland/Ac/Power/Active'], +// islandBusToInverter: ['/AcDc/Dc/Power'], +// pvOnIslandBusToIslandBusConnection: ['/PvOnAcIsland/Power/Active'], +// +// inverter: [ +// '/AcDc/Ac/L1/Power/Active', +// '/AcDc/Ac/L2/Power/Active', +// '/AcDc/Ac/L3/Power/Active', +// '/AcDc/Ac/L4/Power/Active' +// ], +// inverterToDcBus: ['/AcDcToDcLink/Power'], +// +// dcBus: ['/DcDc/Dc/Link/Voltage'], +// dcBusToDcDcConnection: ['/DcDc/Dc/Link/Power'], +// pvOnDcBusToDcBusConnection: ['/PvOnDc/Dc/Power'], +// dcBusToLoadOnDcConnection: ['/LoadOnDc/Power'], +// +// dcDc: ['/DcDc/Dc/Battery/Voltage'], +// dcDCToBatteryConnection: ['/Battery/Dc/Power'], +// +// battery: [ +// '/Battery/Soc', +// '/Battery/Dc/Voltage', +// '/Battery/Dc/Current', +// '/Battery/Temperature', +// '/Battery/Devices/1/Dc/Voltage', +// '/Battery/Devices/2/Dc/Voltage', +// '/Battery/Devices/3/Dc/Voltage', +// '/Battery/Devices/4/Dc/Voltage', +// '/Battery/Devices/5/Dc/Voltage', +// '/Battery/Devices/6/Dc/Voltage', +// '/Battery/Devices/7/Dc/Voltage', +// '/Battery/Devices/8/Dc/Voltage', +// '/Battery/Devices/9/Dc/Voltage', +// '/Battery/Devices/10/Dc/Voltage' +// ], +// +// batteryView: batteryIds.flatMap((id) => +// batteryPaths.map((path) => path.replace('%id%', id.toString())) +// ), +// +// pvView: pvIds.flatMap((id) => +// PvPaths.map((path) => path.replace('%id%', id.toString())) +// ), +// +// minimumSoC: ['/Config/MinSoc'], +// installedDcDcPower: ['/DcDc/SystemControl/NumberOfConnectedSlaves'], +// gridSetPoint: ['/Config/GridSetPoint'], +// maximumDischargePower: ['/Config/MaxBatteryDischargingCurrent'], +// DcDcNum: ['/DcDc/SystemControl/NumberOfConnectedSlaves'], +// calibrationChargeState: ['/Config/ForceCalibrationChargeState'], +// mode: ['/EssControl/Mode'], +// repetitiveCalibrationChargeDate: [ +// '/Config/DayAndTimeForRepetitiveCalibration' +// ], +// additionalCalibrationChargeDate: [ +// '/Config/DayAndTimeForAdditionalCalibration' +// ] +// }; +// +// //We are using the function every time we fetch the data from S3 (every 2 seconds). +// //The data is of the following form: TopologyValues +// //key: I_BoxDataValue[] ==> key: [{unit:'',value:''},{unit:'',value:''},...] +// //battery_view: [ {"Battery_id": 2,'FwVersion': {'unit':,'value':}}, +// // {"Battery_id": 4,'FwVersion': {'unit':,'value':}} +// //] +// //For batteries, we follow a different approach. We define a key battery_view that is of type Battery[] +// +// export const extractValues = ( +// timeSeriesData: DataPoint +// ): TopologyValues | null => { +// const extractedValues: TopologyValues = {} as TopologyValues; +// for (const topologyKey of Object.keys(topologyPaths)) { +// //Each topologykey may have more than one paths (for example inverter) +// const paths = topologyPaths[topologyKey]; +// let topologyValues: { unit: string; value: string | number }[] = []; +// +// if (topologyKey === 'pvView') { +// extractedValues[topologyKey] = []; +// let pv_index = 0; +// let pathIndex = 0; +// +// while (pathIndex < paths.length) { +// let pv = {}; +// let existingKeys = 0; +// +// //We prepare a pv object for each node. We extract the number of nodes from the '/PvOnDc/NbrOfStrings' path. +// //PvKeys[0] is the pv id. +// pv[PvKeys[0]] = pv_index; +// //Then, search all the remaining battery keys +// for (let i = 1; i < PvKeys.length; i++) { +// const path = paths[pathIndex]; +// if (timeSeriesData.value.hasOwnProperty(path)) { +// existingKeys++; +// +// pv[PvKeys[i]] = { +// unit: timeSeriesData.value[path].unit.includes('~') +// ? timeSeriesData.value[path].unit.replace('~', '') +// : timeSeriesData.value[path].unit, +// value: +// typeof timeSeriesData.value[path].value === 'string' +// ? timeSeriesData.value[path].value +// : Number(timeSeriesData.value[path].value).toFixed(1) +// }; +// } +// pathIndex++; +// } +// pv_index++; +// if (existingKeys > 0) { +// extractedValues[topologyKey].push(pv as Pv); +// } +// } +// } else if (topologyKey === 'batteryView') { +// extractedValues[topologyKey] = []; +// const node_ids_from_csv = timeSeriesData.value[ +// '/Config/Devices/BatteryNodes' +// ].value +// .toString() +// .split(','); +// +// let battery_index = 0; +// let pathIndex = 0; +// +// while (pathIndex < paths.length) { +// let battery = {}; +// let existingKeys = 0; +// +// //We prepare a battery object for each node. We extract the nodes from the '/Config/Devices/BatteryNodes' path. For example, nodes can be [2,4,5,6] (one is missing) +// //BatteryKeys[0] is the battery id. We set the battery id to the corresponding node id. +// battery[BatteryKeys[0]] = node_ids_from_csv[battery_index]; +// //Then, search all the remaining battery keys +// for (let i = 1; i < BatteryKeys.length; i++) { +// const path = paths[pathIndex]; +// if (timeSeriesData.value.hasOwnProperty(path)) { +// existingKeys++; +// +// battery[BatteryKeys[i]] = { +// unit: timeSeriesData.value[path].unit.includes('~') +// ? timeSeriesData.value[path].unit.replace('~', '') +// : timeSeriesData.value[path].unit, +// value: +// typeof timeSeriesData.value[path].value === 'string' +// ? timeSeriesData.value[path].value +// : Number(timeSeriesData.value[path].value).toFixed(1) +// }; +// } +// pathIndex++; +// } +// battery_index++; +// if (existingKeys > 0) { +// extractedValues[topologyKey].push(battery as Battery); +// } +// } +// } else { +// // Check if any of the specified paths exist in the dataRecord +// for (const path of paths) { +// if (timeSeriesData.value.hasOwnProperty(path)) { +// topologyValues.push({ +// unit: timeSeriesData.value[path].unit.includes('~') +// ? timeSeriesData.value[path].unit.replace('~', '') +// : timeSeriesData.value[path].unit, +// value: timeSeriesData.value[path].value +// }); +// } +// } +// if (topologyValues.length > 0) { +// extractedValues[topologyKey] = topologyValues; +// } +// } +// } +// +// return extractedValues; +// }; -export interface Pv { - PvId: number; - Power: I_BoxDataValue; - Voltage: I_BoxDataValue; - Current: I_BoxDataValue; -} +export const getHighestConnectionValue = (values: JSONRecordData) => { + // Define the paths you want to check + const paths = [ + 'GridMeter.Ac.Power.Active', + 'PvOnAcGrid.Power.Active', + 'AcGridToAcIsland.Power.Active', + 'LoadOnAcGrid.Power.Active', + 'PvOnAcIsland.Power.Active', + 'AcDc.Dc.Power', + 'LoadOnAcIsland.Ac.Power.Active', + 'AcDcToDcLink.Power', + 'PvOnDc.Dc.Power', + 'DcDc.Dc.Link.Power', + 'LoadOnDc.Power', + 'Battery.Dc.Power' + ]; -export interface Battery { - BatteryId: number; - FwVersion: I_BoxDataValue; - Power: I_BoxDataValue; - Voltage: I_BoxDataValue; - Soc: I_BoxDataValue; - AverageTemperature: I_BoxDataValue; - Warnings: I_BoxDataValue; - Alarms: I_BoxDataValue; - Current: I_BoxDataValue; - BusCurrent: I_BoxDataValue; - CellsCurrent: I_BoxDataValue; - HeatingCurrent: I_BoxDataValue; - HeatingPower: I_BoxDataValue; - SOCAh: I_BoxDataValue; - BlueLeds: I_BoxDataValue; - RedLeds: I_BoxDataValue; - GreenLeds: I_BoxDataValue; - AmberLeds: I_BoxDataValue; - HeatingTemperature: I_BoxDataValue; - BoardTemperature: I_BoxDataValue; - LeftCellsTemperature: I_BoxDataValue; - RightCellsTemperature: I_BoxDataValue; - StateTemperature: I_BoxDataValue; - String1Active: I_BoxDataValue; - String2Active: I_BoxDataValue; - String3Active: I_BoxDataValue; - String4Active: I_BoxDataValue; - String5Active: I_BoxDataValue; - ConnectedToDcBus: I_BoxDataValue; - AlarmOutActive: I_BoxDataValue; - InternalFanActive: I_BoxDataValue; - VoltMeasurementAllowed: I_BoxDataValue; - AuxRelayBus: I_BoxDataValue; - RemoteStateActive: I_BoxDataValue; - RiscActive: I_BoxDataValue; - Eoc: I_BoxDataValue; - SerialNumber: I_BoxDataValue; - TimeSinceTOC: I_BoxDataValue; - CalibrationChargeRequested: I_BoxDataValue; - MaxChargePower: I_BoxDataValue; - MaxDischargePower: I_BoxDataValue; -} + // Helper function to safely get a value from a nested path + const getValueAtPath = (obj: any, path: string) => { + return path.split('.').reduce((acc, part) => { + return acc && acc[part] !== undefined ? acc[part] : null; + }, obj); + }; -const PvKeys = ['PvId', 'Power', 'Voltage', 'Current']; + // Find the maximum value by iterating over the paths + return paths.reduce((maxValue, path) => { + // Safely get the value at the path + const value = getValueAtPath(values, path); -const BatteryKeys = [ - 'BatteryId', - 'FwVersion', - 'Power', - 'Voltage', - 'Soc', - 'AverageTemperature', - 'Warnings', - 'Alarms', - 'Current', - 'BusCurrent', - 'CellsCurrent', - 'HeatingCurrent', - 'HeatingPower', - 'SOCAh', - 'BlueLeds', - 'RedLeds', - 'GreenLeds', - 'AmberLeds', - 'HeatingTemperature', - 'BoardTemperature', - 'LeftCellsTemperature', - 'RightCellsTemperature', - 'StateTemperature', - 'String1Active', - 'String2Active', - 'String3Active', - 'String4Active', - 'String5Active', - 'ConnectedToDcBus', - 'AlarmOutActive', - 'InternalFanActive', - 'VoltMeasurementAllowed', - 'AuxRelayBus', - 'RemoteStateActive', - 'RiscActive', - 'Eoc', - 'SerialNumber', - 'TimeSinceTOC', - 'CalibrationChargeRequested', - 'MaxChargePower', - 'MaxDischargePower' -]; - -export type TopologyValues = { - gridBox: I_BoxDataValue[]; - pvOnAcGridBox: I_BoxDataValue[]; - loadOnAcGridBox: I_BoxDataValue[]; - pvOnIslandBusBox: I_BoxDataValue[]; - loadOnIslandBusBox: I_BoxDataValue[]; - pvOnDcBox: I_BoxDataValue[]; - loadOnDcBox: I_BoxDataValue[]; - batteryBox: I_BoxDataValue[]; - - grid: I_BoxDataValue[]; - gridToAcInConnection: I_BoxDataValue[]; - gridBus: I_BoxDataValue[]; - islandBus: I_BoxDataValue[]; - dcBus: I_BoxDataValue[]; - dcBusToDcDcConnection: I_BoxDataValue[]; - dcDCToBatteryConnection: I_BoxDataValue[]; - battery: I_BoxDataValue[]; - dcBusToLoadOnDcConnection: I_BoxDataValue[]; - islandBusToLoadOnIslandBusConnection: I_BoxDataValue[]; - gridBusToPvOnGridbusConnection: I_BoxDataValue[]; - gridBusToLoadOnGridBusConnection: I_BoxDataValue[]; - inverter: I_BoxDataValue[]; - dcDc: I_BoxDataValue[]; - islandBusToInverter: I_BoxDataValue[]; - inverterToDcBus: I_BoxDataValue[]; - gridBusToIslandBusConnection: I_BoxDataValue[]; - pvOnDcBusToDcBusConnection: I_BoxDataValue[]; - pvOnIslandBusToIslandBusConnection: I_BoxDataValue[]; - minimumSoC: I_BoxDataValue[]; - installedDcDcPower: I_BoxDataValue[]; - gridSetPoint: I_BoxDataValue[]; - maximumDischargePower: I_BoxDataValue[]; - DcDcNum: I_BoxDataValue[]; - calibrationChargeState: I_BoxDataValue[]; - mode: I_BoxDataValue[]; - repetitiveCalibrationChargeDate: I_BoxDataValue[]; - additionalCalibrationChargeDate: I_BoxDataValue[]; - - batteryView: Battery[]; - - pvView: Pv[]; -}; -type TopologyPaths = { [key in keyof TopologyValues]: string[] }; - -const batteryIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - -const pvIds = [ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30 -]; - -const PvPaths = [ - '/PvOnDc/Strings/%id%/Power', - '/PvOnDc/Strings/%id%/Voltage', - '/PvOnDc/Strings/%id%/Current' -]; - -const batteryPaths = [ - '/Battery/Devices/%id%/FwVersion', - '/Battery/Devices/%id%/Dc/Power', - '/Battery/Devices/%id%/Dc/Voltage', - '/Battery/Devices/%id%/Soc', - '/Battery/Devices/%id%/Temperatures/Cells/Average', - '/Battery/Devices/%id%/Warnings', - '/Battery/Devices/%id%/Alarms', - - '/Battery/Devices/%id%/Dc/Current', - '/Battery/Devices/%id%/BusCurrent', - '/Battery/Devices/%id%/CellsCurrent', - '/Battery/Devices/%id%/HeatingCurrent', - '/Battery/Devices/%id%/HeatingPower', - '/Battery/Devices/%id%/SOCAh', - - '/Battery/Devices/%id%/Leds/Blue', - '/Battery/Devices/%id%/Leds/Red', - '/Battery/Devices/%id%/Leds/Green', - '/Battery/Devices/%id%/Leds/Amber', - - '/Battery/Devices/%id%/Temperatures/Heating', - '/Battery/Devices/%id%/Temperatures/Board', - '/Battery/Devices/%id%/Temperatures/Cells/Left', - '/Battery/Devices/%id%/Temperatures/Cells/Right', - '/Battery/Devices/%id%/Temperatures/State', - - '/Battery/Devices/%id%/BatteryStrings/String1Active', - '/Battery/Devices/%id%/BatteryStrings/String2Active', - '/Battery/Devices/%id%/BatteryStrings/String3Active', - '/Battery/Devices/%id%/BatteryStrings/String4Active', - '/Battery/Devices/%id%/BatteryStrings/String5Active', - - '/Battery/Devices/%id%/IoStatus/ConnectedToDcBus', - '/Battery/Devices/%id%/IoStatus/AlarmOutActive', - '/Battery/Devices/%id%/IoStatus/InternalFanActive', - '/Battery/Devices/%id%/IoStatus/VoltMeasurementAllowed', - '/Battery/Devices/%id%/IoStatus/AuxRelayBus', - '/Battery/Devices/%id%/IoStatus/RemoteStateActive', - '/Battery/Devices/%id%/IoStatus/RiscActive', - - '/Battery/Devices/%id%/Eoc', - '/Battery/Devices/%id%/SerialNumber', - '/Battery/Devices/%id%/TimeSinceTOC', - '/Battery/Devices/%id%/CalibrationChargeRequested', - '/Battery/Devices/%id%/MaxChargePower', - '/Battery/Devices/%id%/MaxDischargePower' -]; - -export const topologyPaths: TopologyPaths = { - gridBox: ['/Config/Devices/GridMeterIp/DeviceState'], - pvOnAcGridBox: ['/Config/Devices/PvOnAcGrid/DeviceState'], - loadOnAcGridBox: ['/Config/Devices/LoadOnAcGrid/DeviceState'], - pvOnIslandBusBox: ['/Config/Devices/PvOnAcIsland/DeviceState'], - loadOnIslandBusBox: ['/Config/Devices/IslandBusLoadMeterIp/DeviceState'], - pvOnDcBox: ['/Config/Devices/PvOnDc/DeviceState'], - loadOnDcBox: ['/Config/Devices/LoadOnDc/DeviceState'], - batteryBox: ['/Config/Devices/BatteryIp/DeviceState'], - - grid: [ - '/GridMeter/Ac/L1/Power/Active', - '/GridMeter/Ac/L2/Power/Active', - '/GridMeter/Ac/L3/Power/Active' - ], - gridToAcInConnection: ['/GridMeter/Ac/Power/Active'], - - gridBus: [ - '/GridMeter/Ac/L1/Voltage', - '/GridMeter/Ac/L2/Voltage', - '/GridMeter/Ac/L3/Voltage' - ], - gridBusToPvOnGridbusConnection: ['/PvOnAcGrid/Power/Active'], - - gridBusToLoadOnGridBusConnection: ['/LoadOnAcGrid/Power/Active'], - gridBusToIslandBusConnection: ['/AcGridToAcIsland/Power/Active'], - - islandBus: [ - '/AcDc/Ac/L1/Voltage', - '/AcDc/Ac/L2/Voltage', - '/AcDc/Ac/L3/Voltage' - ], - islandBusToLoadOnIslandBusConnection: ['/LoadOnAcIsland/Ac/Power/Active'], - islandBusToInverter: ['/AcDc/Dc/Power'], - pvOnIslandBusToIslandBusConnection: ['/PvOnAcIsland/Power/Active'], - - inverter: [ - '/AcDc/Ac/L1/Power/Active', - '/AcDc/Ac/L2/Power/Active', - '/AcDc/Ac/L3/Power/Active', - '/AcDc/Ac/L4/Power/Active' - ], - inverterToDcBus: ['/AcDcToDcLink/Power'], - - dcBus: ['/DcDc/Dc/Link/Voltage'], - dcBusToDcDcConnection: ['/DcDc/Dc/Link/Power'], - pvOnDcBusToDcBusConnection: ['/PvOnDc/Dc/Power'], - dcBusToLoadOnDcConnection: ['/LoadOnDc/Power'], - - dcDc: ['/DcDc/Dc/Battery/Voltage'], - dcDCToBatteryConnection: ['/Battery/Dc/Power'], - - battery: [ - '/Battery/Soc', - '/Battery/Dc/Voltage', - '/Battery/Dc/Current', - '/Battery/Temperature', - '/Battery/Devices/1/Dc/Voltage', - '/Battery/Devices/2/Dc/Voltage', - '/Battery/Devices/3/Dc/Voltage', - '/Battery/Devices/4/Dc/Voltage', - '/Battery/Devices/5/Dc/Voltage', - '/Battery/Devices/6/Dc/Voltage', - '/Battery/Devices/7/Dc/Voltage', - '/Battery/Devices/8/Dc/Voltage', - '/Battery/Devices/9/Dc/Voltage', - '/Battery/Devices/10/Dc/Voltage' - ], - - batteryView: batteryIds.flatMap((id) => - batteryPaths.map((path) => path.replace('%id%', id.toString())) - ), - - pvView: pvIds.flatMap((id) => - PvPaths.map((path) => path.replace('%id%', id.toString())) - ), - - minimumSoC: ['/Config/MinSoc'], - installedDcDcPower: ['/DcDc/SystemControl/NumberOfConnectedSlaves'], - gridSetPoint: ['/Config/GridSetPoint'], - maximumDischargePower: ['/Config/MaxBatteryDischargingCurrent'], - DcDcNum: ['/DcDc/SystemControl/NumberOfConnectedSlaves'], - calibrationChargeState: ['/Config/ForceCalibrationChargeState'], - mode: ['/EssControl/Mode'], - repetitiveCalibrationChargeDate: [ - '/Config/DayAndTimeForRepetitiveCalibration' - ], - additionalCalibrationChargeDate: [ - '/Config/DayAndTimeForAdditionalCalibration' - ] -}; - -//We are using the function every time we fetch the data from S3 (every 2 seconds). -//The data is of the following form: TopologyValues -//key: I_BoxDataValue[] ==> key: [{unit:'',value:''},{unit:'',value:''},...] -//battery_view: [ {"Battery_id": 2,'FwVersion': {'unit':,'value':}}, -// {"Battery_id": 4,'FwVersion': {'unit':,'value':}} -//] -//For batteries, we follow a different approach. We define a key battery_view that is of type Battery[] - -export const extractValues = ( - timeSeriesData: DataPoint -): TopologyValues | null => { - const extractedValues: TopologyValues = {} as TopologyValues; - for (const topologyKey of Object.keys(topologyPaths)) { - //Each topologykey may have more than one paths (for example inverter) - const paths = topologyPaths[topologyKey]; - let topologyValues: { unit: string; value: string | number }[] = []; - - if (topologyKey === 'pvView') { - extractedValues[topologyKey] = []; - let pv_index = 0; - let pathIndex = 0; - - while (pathIndex < paths.length) { - let pv = {}; - let existingKeys = 0; - - //We prepare a pv object for each node. We extract the number of nodes from the '/PvOnDc/NbrOfStrings' path. - //PvKeys[0] is the pv id. - pv[PvKeys[0]] = pv_index; - //Then, search all the remaining battery keys - for (let i = 1; i < PvKeys.length; i++) { - const path = paths[pathIndex]; - if (timeSeriesData.value.hasOwnProperty(path)) { - existingKeys++; - - pv[PvKeys[i]] = { - unit: timeSeriesData.value[path].unit.includes('~') - ? timeSeriesData.value[path].unit.replace('~', '') - : timeSeriesData.value[path].unit, - value: - typeof timeSeriesData.value[path].value === 'string' - ? timeSeriesData.value[path].value - : Number(timeSeriesData.value[path].value).toFixed(1) - }; - } - pathIndex++; - } - pv_index++; - if (existingKeys > 0) { - extractedValues[topologyKey].push(pv as Pv); - } - } - } else if (topologyKey === 'batteryView') { - extractedValues[topologyKey] = []; - const node_ids_from_csv = timeSeriesData.value[ - '/Config/Devices/BatteryNodes' - ].value - .toString() - .split(','); - - let battery_index = 0; - let pathIndex = 0; - - while (pathIndex < paths.length) { - let battery = {}; - let existingKeys = 0; - - //We prepare a battery object for each node. We extract the nodes from the '/Config/Devices/BatteryNodes' path. For example, nodes can be [2,4,5,6] (one is missing) - //BatteryKeys[0] is the battery id. We set the battery id to the corresponding node id. - battery[BatteryKeys[0]] = node_ids_from_csv[battery_index]; - //Then, search all the remaining battery keys - for (let i = 1; i < BatteryKeys.length; i++) { - const path = paths[pathIndex]; - if (timeSeriesData.value.hasOwnProperty(path)) { - existingKeys++; - - battery[BatteryKeys[i]] = { - unit: timeSeriesData.value[path].unit.includes('~') - ? timeSeriesData.value[path].unit.replace('~', '') - : timeSeriesData.value[path].unit, - value: - typeof timeSeriesData.value[path].value === 'string' - ? timeSeriesData.value[path].value - : Number(timeSeriesData.value[path].value).toFixed(1) - }; - } - pathIndex++; - } - battery_index++; - if (existingKeys > 0) { - extractedValues[topologyKey].push(battery as Battery); - } - } - } else { - // Check if any of the specified paths exist in the dataRecord - for (const path of paths) { - if (timeSeriesData.value.hasOwnProperty(path)) { - topologyValues.push({ - unit: timeSeriesData.value[path].unit.includes('~') - ? timeSeriesData.value[path].unit.replace('~', '') - : timeSeriesData.value[path].unit, - value: timeSeriesData.value[path].value - }); - } - } - if (topologyValues.length > 0) { - extractedValues[topologyKey] = topologyValues; - } + // If the value exists and is a number, check if it's greater than the current max + if (value !== null) { + return Math.max(maxValue, Math.abs(value)); } - } - - return extractedValues; + return maxValue; + }, 0); // Initialize maxValue to 0 }; -export const getHighestConnectionValue = (values: TopologyValues) => { - return Object.keys(values) - .filter((value) => value.includes('Connection')) - .reduce((acc, curr) => { - let topologyValue = values[ - curr as keyof TopologyValues - ][0] as I_BoxDataValue; - - const value = Math.abs(topologyValue.value as number); - return value > acc ? value : acc; - }, 0); -}; - -export const getAmount = ( - highestConnectionValue: number, - values: I_BoxDataValue[] -) => { - // console.log( - // 'value=', - // Math.abs(values[0].value as number), - // 'highest is', - // highestConnectionValue, - // 'and amount is ', - // parseFloat( - // (Math.abs(values[0].value as number) / highestConnectionValue).toFixed(1) - // ) - // ); - return parseFloat( - (Math.abs(values[0].value as number) / highestConnectionValue).toFixed(1) - ); +export const getAmount = (highestConnectionValue: number, value: number) => { + return parseFloat((Math.abs(value) / highestConnectionValue).toFixed(1)); }; diff --git a/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx b/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx index 0b3c81f96..5e798ae25 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Overview/overview.tsx @@ -15,8 +15,8 @@ import { chartAggregatedDataInterface, chartDataInterface, overviewInterface, - transformInputToAggregatedData, - transformInputToDailyData + transformInputToAggregatedDataJson, + transformInputToDailyDataJson } from 'src/interfaces/Chart'; import Button from '@mui/material/Button'; import { FormattedMessage } from 'react-intl'; @@ -82,13 +82,13 @@ function Overview(props: OverviewProps) { const [endDate, setEndDate] = useState(dayjs()); const [isZooming, setIsZooming] = useState(false); - console.log( - UnixTime.fromTicks(new Date().getTime() / 1000).earlier( - TimeSpan.fromDays(1) - ) - ); - - console.log(UnixTime.fromTicks(new Date().getTime() / 1000)); + // console.log( + // UnixTime.fromTicks(new Date().getTime() / 1000).earlier( + // TimeSpan.fromDays(1) + // ) + // ); + // + // console.log(UnixTime.fromTicks(new Date().getTime() / 1000)); useEffect(() => { if (isZooming) { setLoading(true); @@ -101,7 +101,7 @@ function Overview(props: OverviewProps) { const resultPromise: Promise<{ chartData: chartDataInterface; chartOverview: overviewInterface; - }> = transformInputToDailyData( + }> = transformInputToDailyDataJson( props.s3Credentials, props.id, UnixTime.fromTicks(new Date().getTime() / 1000).earlier( @@ -136,7 +136,7 @@ function Overview(props: OverviewProps) { const resultPromise: Promise<{ chartData: chartDataInterface; chartOverview: overviewInterface; - }> = transformInputToDailyData( + }> = transformInputToDailyDataJson( props.s3Credentials, props.id, UnixTime.fromTicks(startX).earlier(TimeSpan.fromHours(2)), @@ -193,7 +193,7 @@ function Overview(props: OverviewProps) { chartAggregatedData: chartAggregatedDataInterface; chartOverview: overviewInterface; dateList: string[]; - }> = transformInputToAggregatedData( + }> = transformInputToAggregatedDataJson( props.s3Credentials, dayjs().subtract(1, 'week'), dayjs() @@ -264,7 +264,7 @@ function Overview(props: OverviewProps) { const resultPromise: Promise<{ chartData: chartDataInterface; chartOverview: overviewInterface; - }> = transformInputToDailyData( + }> = transformInputToDailyDataJson( props.s3Credentials, props.id, UnixTime.fromTicks(startDate.unix()), @@ -296,7 +296,7 @@ function Overview(props: OverviewProps) { chartAggregatedData: chartAggregatedDataInterface; chartOverview: overviewInterface; dateList: string[]; - }> = transformInputToAggregatedData( + }> = transformInputToAggregatedDataJson( props.s3Credentials, startDate, endDate diff --git a/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx b/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx index 3bdd2825c..49434e2a6 100644 --- a/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/PvView/PvView.tsx @@ -10,13 +10,13 @@ import { TableRow, Typography } from '@mui/material'; -import { TopologyValues } from '../Log/graph.util'; +import { JSONRecordData } from '../Log/graph.util'; import { useLocation, useNavigate } from 'react-router-dom'; import routes from '../../../Resources/routes.json'; import CircularProgress from '@mui/material/CircularProgress'; interface PvViewProps { - values: TopologyValues; + values: JSONRecordData; connected: boolean; } @@ -26,9 +26,14 @@ function PvView(props: PvViewProps) { } const currentLocation = useLocation(); const navigate = useNavigate(); + const sortedPvView = - props.values != null - ? [...props.values.pvView].sort((a, b) => a.PvId - b.PvId) + props.values != null && props.values.PvOnDc + ? Object.entries(props.values.PvOnDc.Strings) + .map(([pvId, pv]) => { + return { pvId, pv }; // Here we return an object with the id and device + }) + .sort((a, b) => parseInt(b.pvId) - parseInt(a.pvId)) : []; const [loading, setLoading] = useState(sortedPvView.length == 0); @@ -37,13 +42,13 @@ function PvView(props: PvViewProps) { navigate(routes.mainstats); }; - const findBatteryData = (batteryId: number) => { - for (let i = 0; i < props.values.batteryView.length; i++) { - if (props.values.batteryView[i].BatteryId == batteryId) { - return props.values.batteryView[i]; - } - } - }; + // const findBatteryData = (batteryId: number) => { + // for (let i = 0; i < props.values.batteryView.length; i++) { + // if (props.values.batteryView[i].BatteryId == batteryId) { + // return props.values.batteryView[i]; + // } + // } + // }; useEffect(() => { if (sortedPvView.length == 0) { @@ -123,9 +128,9 @@ function PvView(props: PvViewProps) { - {sortedPvView.map((pv) => ( + {sortedPvView.map(({ pvId, pv }) => ( - {'AMPT ' + pv.PvId} + {'AMPT ' + pvId} - {pv.Power.value + ' ' + pv.Power.unit} + {pv.Power + ' W'} - {pv.Voltage.value + ' ' + pv.Voltage.unit} + {pv.Voltage + ' V'} - {pv.Current.value + ' ' + pv.Current.unit} + {pv.Current + ' A'} ))} diff --git a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx index d5131e1d2..db2a2ddb0 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/Installation.tsx @@ -104,6 +104,8 @@ function SalidomoInstallation(props: singleInstallationProps) { setLoading(false); console.log('NUMBER OF FILES=' + Object.keys(res).length); + console.log('res=', res); + while (continueFetching.current) { for (const timestamp of Object.keys(res)) { if (!continueFetching.current) { @@ -111,7 +113,7 @@ function SalidomoInstallation(props: singleInstallationProps) { return false; } console.log(`Timestamp: ${timestamp}`); - //console.log('object is' + res[timestamp]); + console.log('object is', res); // Set values asynchronously with delay setValues(res[timestamp]); diff --git a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx index 2adc8315b..2eaeed85e 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SodiohomeInstallations/Installation.tsx @@ -8,7 +8,7 @@ import { } from '@mui/material'; import { I_Installation } from 'src/interfaces/InstallationTypes'; import { UserContext } from 'src/contexts/userContext'; -import { TopologyValues } from 'src/content/dashboards/Log/graph.util'; +import { JSONRecordData } from 'src/content/dashboards/Log/graph.util'; import { FormattedMessage } from 'react-intl'; import { Navigate, Route, Routes, useLocation } from 'react-router-dom'; import routes from '../../../Resources/routes.json'; @@ -36,7 +36,7 @@ function SodioHomeInstallation(props: singleInstallationProps) { const location = useLocation().pathname; const [errorLoadingS3Data, setErrorLoadingS3Data] = useState(false); const [currentTab, setCurrentTab] = useState(undefined); - const [values, setValues] = useState(null); + const [values, setValues] = useState(null); const status = props.current_installation.status; const [ failedToCommunicateWithInstallation, diff --git a/typescript/frontend-marios2/src/content/dashboards/Topology/Topology.tsx b/typescript/frontend-marios2/src/content/dashboards/Topology/Topology.tsx index bae7deb89..d9a92dae1 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Topology/Topology.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Topology/Topology.tsx @@ -10,11 +10,11 @@ import TopologyColumn from './topologyColumn'; import { getAmount, getHighestConnectionValue, - TopologyValues + JSONRecordData } from '../Log/graph.util'; interface TopologyProps { - values: TopologyValues; + values: JSONRecordData; connected: boolean; loading: boolean; } @@ -25,6 +25,9 @@ function Topology(props: TopologyProps) { } const highestConnectionValue = props.values != null ? getHighestConnectionValue(props.values) : 0; + + //console.log(props.values.DcDc.Dc.Battery.Voltage); + const [showValues, setShowValues] = useState(false); const handleSwitch = () => () => { @@ -109,17 +112,38 @@ function Topology(props: TopologyProps) { + {/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/} + {/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/} + {/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/} + {/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/} + {/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/} + {props.data && props.title === 'Battery' && ( - {props.title} (x{props.data.length - 4}) + {props.title} (x{props.data[4].value}) )} {props.title != 'Battery' && ( diff --git a/typescript/frontend-marios2/src/content/dashboards/Topology/topologyFlow.tsx b/typescript/frontend-marios2/src/content/dashboards/Topology/topologyFlow.tsx index 95e436e1c..e4c2069dc 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Topology/topologyFlow.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Topology/topologyFlow.tsx @@ -6,7 +6,7 @@ import { I_BoxDataValue } from '../Log/graph.util'; export interface TopologyFlowProps { orientation: string; position?: string; - data?: I_BoxDataValue[]; + data?: I_BoxDataValue; amount?: number; showValues: boolean; } @@ -28,6 +28,8 @@ function formatPower(value) { return 'Invalid'; } + value = parseFloat(value); + const prefixes = ['', 'k', 'M', 'G', 'T']; let magnitude = 0; let negative = false; @@ -103,7 +105,7 @@ function TopologyFlow(props: TopologyFlowProps) { zIndex: 1 }} > - {props.showValues && props.data[0].value != 0 && ( + {props.showValues && props.data.value != 0 && ( - {formatPower(props.data[0].value) === 0 + {formatPower(props.data.value) === 0 ? null - : formatPower(props.data[0].value)} - {formatPower(props.data[0].value) === 0 - ? null - : props.data[0].unit} + : formatPower(props.data.value)} + {formatPower(props.data.value) === 0 ? null : props.data.unit} )} @@ -154,15 +154,13 @@ function TopologyFlow(props: TopologyFlowProps) { > {props.orientation === 'horizontal' && props.data && - props.data[0].value != 0 && ( + props.data.value != 0 && ( <>
{dotStyles.map((style, index) => (
= 0 - ? 'dotRight' - : 'dotLeft' + (props.data.value as number) >= 0 ? 'dotRight' : 'dotLeft' } key={index} style={{ @@ -177,7 +175,7 @@ function TopologyFlow(props: TopologyFlowProps) { {props.orientation === 'vertical' && props.data && - props.data[0].value != 0 && ( + props.data.value != 0 && (
{dotStylesVertical.map((style, index) => (
(o ? o[key] : undefined), result); + if (get(result, path) !== undefined) { + const value = path + .split('.') + .reduce((o, key) => (o ? o[key] : undefined), result); - if (value < chartOverview[category].min) { - chartOverview[category].min = value; + if (value < chartOverview[category].min) { + chartOverview[category].min = value; + } + + if (value > chartOverview[category].max) { + chartOverview[category].max = value; + } + chartData[category].data[pathsToSave[j]].data.push([ + adjustedTimestampArray[i], + value + ]); + } else { + // chartData[category].data[pathsToSave[j]].data.push([ + // adjustedTimestampArray[i], + // null + // ]); } - - if (value > chartOverview[category].max) { - chartOverview[category].max = value; - } - chartData[category].data[pathsToSave[j]].data.push([ - adjustedTimestampArray[i], - value - ]); - // } else { - // // chartData[category].data[pathsToSave[j]].data.push([ - // // adjustedTimestampArray[i], - // // null - // // ]); - // } } } } } + categories.forEach((category) => { let value = Math.max( Math.abs(chartOverview[category].max), @@ -278,6 +278,198 @@ export const transformInputToBatteryViewDataJson = async ( chartOverview.Current.unit = '(' + prefixes[chartOverview['Current'].magnitude] + 'A' + ')'; + console.log(chartData); + + return { + chartData: chartData, + chartOverview: chartOverview + }; +}; + +export const transformInputToDailyDataJson = async ( + s3Credentials: I_S3Credentials, + id: number, + start_time?: UnixTime, + end_time?: UnixTime +): Promise<{ + chartData: chartDataInterface; + chartOverview: overviewInterface; +}> => { + const prefixes = ['', 'k', 'M', 'G', 'T']; + const MAX_NUMBER = 9999999; + const pathsToSearch = [ + 'Battery.Soc', + 'Battery.Temperature', + 'Battery.Dc.Power', + 'GridMeter.Ac.Power.Active', + 'PvOnDc.Dc.Power', + 'DcDc.Dc.Link.Voltage', + 'LoadOnAcGrid.Power.Active', + 'LoadOnDc.Power' + ]; + const categories = [ + 'soc', + 'temperature', + 'dcPower', + 'gridPower', + 'pvProduction', + 'dcBusVoltage', + 'ACLoad', + 'DCLoad' + ]; + + const chartData: chartDataInterface = { + soc: { name: 'State Of Charge', data: [] }, + temperature: { name: 'Battery Temperature', data: [] }, + dcPower: { name: 'Battery Power', data: [] }, + gridPower: { name: 'Grid Power', data: [] }, + pvProduction: { name: 'Pv Production', data: [] }, + dcBusVoltage: { name: 'DC Bus Voltage', data: [] }, + ACLoad: { name: 'AC Load', data: [] }, + DCLoad: { name: 'DC Load', data: [] } + }; + + const chartOverview: overviewInterface = { + soc: { magnitude: 0, unit: '', min: 0, max: 0 }, + temperature: { magnitude: 0, unit: '', min: 0, max: 0 }, + dcPower: { magnitude: 0, unit: '', min: 0, max: 0 }, + dcPowerWithoutHeating: { magnitude: 0, unit: '', min: 0, max: 0 }, + gridPower: { magnitude: 0, unit: '', min: 0, max: 0 }, + pvProduction: { magnitude: 0, unit: '', min: 0, max: 0 }, + dcBusVoltage: { magnitude: 0, unit: '', min: 0, max: 0 }, + overview: { magnitude: 0, unit: '', min: 0, max: 0 }, + ACLoad: { magnitude: 0, unit: '', min: 0, max: 0 }, + DCLoad: { magnitude: 0, unit: '', min: 0, max: 0 } + }; + + categories.forEach((category) => { + chartData[category].data = []; + chartOverview[category] = { + magnitude: 0, + unit: '', + min: MAX_NUMBER, + max: -MAX_NUMBER + }; + }); + + let timestampArray: number[] = []; + let adjustedTimestampArray = []; + const timestampPromises = []; + + await axiosConfig + .get( + `/GetCsvTimestampsForInstallation?id=${id}&start=${start_time.ticks}&end=${end_time.ticks}` + ) + .then((res: AxiosResponse) => { + timestampArray = res.data; + }) + .catch((err: AxiosError) => { + if (err.response && err.response.status == 401) { + //removeToken(); + //navigate(routes.login); + } + }); + + for (var i = 0; i < timestampArray.length; i++) { + timestampPromises.push( + fetchJsonDataForOneTime( + UnixTime.fromTicks(timestampArray[i]), + s3Credentials + ) + ); + + const adjustedTimestamp = new Date(timestampArray[i] * 1000); + //Timezone offset is negative, so we convert the timestamp to the current zone by subtracting the corresponding offset + adjustedTimestamp.setHours( + adjustedTimestamp.getHours() - adjustedTimestamp.getTimezoneOffset() / 60 + ); + adjustedTimestampArray.push(adjustedTimestamp); + } + + const results: Promise>>[] = + await Promise.all(timestampPromises); + + for (let i = 0; i < results.length; i++) { + if (results[i] == null) { + // Handle not available or try later case + } else { + const timestamp = Object.keys(results[i])[ + Object.keys(results[i]).length - 1 + ]; + const result = results[i][timestamp]; + let category_index = 0; + // eslint-disable-next-line @typescript-eslint/no-loop-func + pathsToSearch.forEach((path) => { + if (get(result, path) !== undefined) { + const value = path + .split('.') + .reduce((o, key) => (o ? o[key] : undefined), result); + + if (value < chartOverview[categories[category_index]].min) { + chartOverview[categories[category_index]].min = value; + } + + if (value > chartOverview[categories[category_index]].max) { + chartOverview[categories[category_index]].max = value; + } + chartData[categories[category_index]].data.push([ + adjustedTimestampArray[i], + value + ]); + } else { + //data[path].push([adjustedTimestamp, null]); + } + category_index++; + }); + } + } + + categories.forEach((category) => { + let value = Math.max( + Math.abs(chartOverview[category].max), + Math.abs(chartOverview[category].min) + ); + let magnitude = 0; + + if (value < 0) { + value = -value; + } + while (value >= 1000) { + value /= 1000; + magnitude++; + } + chartOverview[category].magnitude = magnitude; + }); + + chartOverview.soc.unit = '(%)'; + chartOverview.soc.min = 0; + chartOverview.soc.max = 100; + chartOverview.temperature.unit = '(°C)'; + chartOverview.dcPower.unit = + '(' + prefixes[chartOverview['dcPower'].magnitude] + 'W' + ')'; + chartOverview.gridPower.unit = + '(' + prefixes[chartOverview['gridPower'].magnitude] + 'W' + ')'; + chartOverview.pvProduction.unit = + '(' + prefixes[chartOverview['pvProduction'].magnitude] + 'W' + ')'; + chartOverview.dcBusVoltage.unit = + '(' + prefixes[chartOverview['dcBusVoltage'].magnitude] + 'V' + ')'; + + chartOverview.overview = { + magnitude: Math.max( + chartOverview['gridPower'].magnitude, + chartOverview['pvProduction'].magnitude + ), + unit: '(kW)', + min: Math.min( + chartOverview['gridPower'].min, + chartOverview['pvProduction'].min + ), + max: Math.max( + chartOverview['gridPower'].max, + chartOverview['pvProduction'].max + ) + }; + return { chartData: chartData, chartOverview: chartOverview @@ -401,7 +593,6 @@ export const transformInputToAggregatedDataJson = async ( ) { // Handle not available or try later case } else { - console.log(result); dateList.push(currentDay.format('DD-MM')); pathsToSearch.forEach((path) => { const value = path @@ -528,8 +719,6 @@ export const transformInputToAggregatedDataJson = async ( ) }; - // console.log(chartAggregatedData); - return { chartAggregatedData: chartAggregatedData, chartOverview: chartOverview, @@ -537,6 +726,15 @@ export const transformInputToAggregatedDataJson = async ( }; }; +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + //UNCOMMENT THE FOLLOWING FOR CSV // We use this function in order to retrieve data for main stats. //The data is of the following form: @@ -548,215 +746,215 @@ export const transformInputToAggregatedDataJson = async ( // 'Node1': {name:'Node1', data: [[timestamp,value],[timestamp,value]]}, // 'Node2': {name:'Node2', data: [[timestamp,value],[timestamp,value]]}, // ]} - -export const transformInputToBatteryViewData = async ( - s3Credentials: I_S3Credentials, - id: number, - product: number, - start_time?: UnixTime, - end_time?: UnixTime -): Promise<{ - chartData: BatteryDataInterface; - chartOverview: BatteryOverviewInterface; -}> => { - const prefixes = ['', 'k', 'M', 'G', 'T']; - const MAX_NUMBER = 9999999; - const categories = ['Soc', 'Temperature', 'Power', 'Voltage', 'Current']; - const pathCategories = [ - 'Soc', - 'Temperatures/Cells/Average', - 'Dc/Power', - 'Dc/Voltage', - 'Dc/Current' - ]; - - const pathsToSearch = [ - '/Battery/Devices/1/', - '/Battery/Devices/2/', - '/Battery/Devices/3/', - '/Battery/Devices/4/', - '/Battery/Devices/5/', - '/Battery/Devices/6/', - '/Battery/Devices/7/', - '/Battery/Devices/8/', - '/Battery/Devices/9/', - '/Battery/Devices/10/' - ]; - - const pathsToSave = []; - - const chartData: BatteryDataInterface = { - Soc: { name: 'State Of Charge', data: [] }, - Temperature: { name: 'Temperature', data: [] }, - Power: { name: 'Power', data: [] }, - Voltage: { name: 'Voltage', data: [] }, - Current: { name: 'Voltage', data: [] } - }; - - const chartOverview: BatteryOverviewInterface = { - Soc: { magnitude: 0, unit: '', min: 0, max: 0 }, - Temperature: { magnitude: 0, unit: '', min: 0, max: 0 }, - Power: { magnitude: 0, unit: '', min: 0, max: 0 }, - Voltage: { magnitude: 0, unit: '', min: 0, max: 0 }, - Current: { magnitude: 0, unit: '', min: 0, max: 0 } - }; - - let initialiation = true; - - let timestampArray: number[] = []; - let adjustedTimestampArray = []; - const timestampPromises = []; - - await axiosConfig - .get( - `/GetCsvTimestampsForInstallation?id=${id}&start=${start_time.ticks}&end=${end_time.ticks}` - ) - .then((res: AxiosResponse) => { - timestampArray = res.data; - }) - .catch((err: AxiosError) => { - if (err.response && err.response.status == 401) { - //removeToken(); - //navigate(routes.login); - } - }); - - for (var i = 0; i < timestampArray.length; i++) { - timestampPromises.push( - fetchDataForOneTime( - UnixTime.fromTicks(timestampArray[i], true), - s3Credentials - ) - ); - - const adjustedTimestamp = - product == 0 - ? new Date(timestampArray[i] * 1000) - : new Date(timestampArray[i] * 100000); - //Timezone offset is negative, so we convert the timestamp to the current zone by subtracting the corresponding offset - adjustedTimestamp.setHours( - adjustedTimestamp.getHours() - adjustedTimestamp.getTimezoneOffset() / 60 - ); - adjustedTimestampArray.push(adjustedTimestamp); - } - - const results: Promise>>[] = - await Promise.all(timestampPromises); - - for (let i = 0; i < results.length; i++) { - if (results[i] == null) { - // Handle not available or try later case - } else { - const timestamp = Object.keys(results[i])[ - Object.keys(results[i]).length - 1 - ]; - const result = results[i][timestamp]; - const battery_nodes = result['/Config/Devices/BatteryNodes'].value - .toString() - .split(','); - - //Initialize the chartData structure based on the node names extracted from the first result - let old_length = pathsToSave.length; - - if (battery_nodes.length > old_length) { - battery_nodes.forEach((node) => { - if (!pathsToSave.includes('Node' + node)) { - pathsToSave.push('Node' + node); - } - }); - } - - if (initialiation) { - initialiation = false; - categories.forEach((category) => { - chartData[category].data = []; - chartOverview[category] = { - magnitude: 0, - unit: '', - min: MAX_NUMBER, - max: -MAX_NUMBER - }; - }); - } - - if (battery_nodes.length > old_length) { - categories.forEach((category) => { - pathsToSave.forEach((path) => { - if (pathsToSave.indexOf(path) >= old_length) { - chartData[category].data[path] = { name: path, data: [] }; - } - }); - }); - } - - for ( - let category_index = 0; - category_index < pathCategories.length; - category_index++ - ) { - let category = categories[category_index]; - - for (let j = 0; j < pathsToSave.length; j++) { - let path = pathsToSearch[j] + pathCategories[category_index]; - - if (result[path]) { - const value = result[path]; - - if (value.value < chartOverview[category].min) { - chartOverview[category].min = value.value; - } - - if (value.value > chartOverview[category].max) { - chartOverview[category].max = value.value; - } - chartData[category].data[pathsToSave[j]].data.push([ - adjustedTimestampArray[i], - value.value - ]); - } else { - // chartData[category].data[pathsToSave[j]].data.push([ - // adjustedTimestampArray[i], - // null - // ]); - } - } - } - } - } - categories.forEach((category) => { - let value = Math.max( - Math.abs(chartOverview[category].max), - Math.abs(chartOverview[category].min) - ); - let magnitude = 0; - - if (value < 0) { - value = -value; - } - while (value >= 1000) { - value /= 1000; - magnitude++; - } - chartOverview[category].magnitude = magnitude; - }); - - chartOverview.Soc.unit = '(%)'; - chartOverview.Soc.min = 0; - chartOverview.Soc.max = 100; - chartOverview.Temperature.unit = '(°C)'; - chartOverview.Power.unit = - '(' + prefixes[chartOverview['Power'].magnitude] + 'W' + ')'; - chartOverview.Voltage.unit = - '(' + prefixes[chartOverview['Voltage'].magnitude] + 'V' + ')'; - - chartOverview.Current.unit = - '(' + prefixes[chartOverview['Current'].magnitude] + 'A' + ')'; - - return { - chartData: chartData, - chartOverview: chartOverview - }; -}; +// +// export const transformInputToBatteryViewData = async ( +// s3Credentials: I_S3Credentials, +// id: number, +// product: number, +// start_time?: UnixTime, +// end_time?: UnixTime +// ): Promise<{ +// chartData: BatteryDataInterface; +// chartOverview: BatteryOverviewInterface; +// }> => { +// const prefixes = ['', 'k', 'M', 'G', 'T']; +// const MAX_NUMBER = 9999999; +// const categories = ['Soc', 'Temperature', 'Power', 'Voltage', 'Current']; +// const pathCategories = [ +// 'Soc', +// 'Temperatures/Cells/Average', +// 'Dc/Power', +// 'Dc/Voltage', +// 'Dc/Current' +// ]; +// +// const pathsToSearch = [ +// '/Battery/Devices/1/', +// '/Battery/Devices/2/', +// '/Battery/Devices/3/', +// '/Battery/Devices/4/', +// '/Battery/Devices/5/', +// '/Battery/Devices/6/', +// '/Battery/Devices/7/', +// '/Battery/Devices/8/', +// '/Battery/Devices/9/', +// '/Battery/Devices/10/' +// ]; +// +// const pathsToSave = []; +// +// const chartData: BatteryDataInterface = { +// Soc: { name: 'State Of Charge', data: [] }, +// Temperature: { name: 'Temperature', data: [] }, +// Power: { name: 'Power', data: [] }, +// Voltage: { name: 'Voltage', data: [] }, +// Current: { name: 'Voltage', data: [] } +// }; +// +// const chartOverview: BatteryOverviewInterface = { +// Soc: { magnitude: 0, unit: '', min: 0, max: 0 }, +// Temperature: { magnitude: 0, unit: '', min: 0, max: 0 }, +// Power: { magnitude: 0, unit: '', min: 0, max: 0 }, +// Voltage: { magnitude: 0, unit: '', min: 0, max: 0 }, +// Current: { magnitude: 0, unit: '', min: 0, max: 0 } +// }; +// +// let initialiation = true; +// +// let timestampArray: number[] = []; +// let adjustedTimestampArray = []; +// const timestampPromises = []; +// +// await axiosConfig +// .get( +// `/GetCsvTimestampsForInstallation?id=${id}&start=${start_time.ticks}&end=${end_time.ticks}` +// ) +// .then((res: AxiosResponse) => { +// timestampArray = res.data; +// }) +// .catch((err: AxiosError) => { +// if (err.response && err.response.status == 401) { +// //removeToken(); +// //navigate(routes.login); +// } +// }); +// +// for (var i = 0; i < timestampArray.length; i++) { +// timestampPromises.push( +// fetchDataForOneTime( +// UnixTime.fromTicks(timestampArray[i], true), +// s3Credentials +// ) +// ); +// +// const adjustedTimestamp = +// product == 0 +// ? new Date(timestampArray[i] * 1000) +// : new Date(timestampArray[i] * 100000); +// //Timezone offset is negative, so we convert the timestamp to the current zone by subtracting the corresponding offset +// adjustedTimestamp.setHours( +// adjustedTimestamp.getHours() - adjustedTimestamp.getTimezoneOffset() / 60 +// ); +// adjustedTimestampArray.push(adjustedTimestamp); +// } +// +// const results: Promise>>[] = +// await Promise.all(timestampPromises); +// +// for (let i = 0; i < results.length; i++) { +// if (results[i] == null) { +// // Handle not available or try later case +// } else { +// const timestamp = Object.keys(results[i])[ +// Object.keys(results[i]).length - 1 +// ]; +// const result = results[i][timestamp]; +// const battery_nodes = result['/Config/Devices/BatteryNodes'].value +// .toString() +// .split(','); +// +// //Initialize the chartData structure based on the node names extracted from the first result +// let old_length = pathsToSave.length; +// +// if (battery_nodes.length > old_length) { +// battery_nodes.forEach((node) => { +// if (!pathsToSave.includes('Node' + node)) { +// pathsToSave.push('Node' + node); +// } +// }); +// } +// +// if (initialiation) { +// initialiation = false; +// categories.forEach((category) => { +// chartData[category].data = []; +// chartOverview[category] = { +// magnitude: 0, +// unit: '', +// min: MAX_NUMBER, +// max: -MAX_NUMBER +// }; +// }); +// } +// +// if (battery_nodes.length > old_length) { +// categories.forEach((category) => { +// pathsToSave.forEach((path) => { +// if (pathsToSave.indexOf(path) >= old_length) { +// chartData[category].data[path] = { name: path, data: [] }; +// } +// }); +// }); +// } +// +// for ( +// let category_index = 0; +// category_index < pathCategories.length; +// category_index++ +// ) { +// let category = categories[category_index]; +// +// for (let j = 0; j < pathsToSave.length; j++) { +// let path = pathsToSearch[j] + pathCategories[category_index]; +// +// if (result[path]) { +// const value = result[path]; +// +// if (value.value < chartOverview[category].min) { +// chartOverview[category].min = value.value; +// } +// +// if (value.value > chartOverview[category].max) { +// chartOverview[category].max = value.value; +// } +// chartData[category].data[pathsToSave[j]].data.push([ +// adjustedTimestampArray[i], +// value.value +// ]); +// } else { +// // chartData[category].data[pathsToSave[j]].data.push([ +// // adjustedTimestampArray[i], +// // null +// // ]); +// } +// } +// } +// } +// } +// categories.forEach((category) => { +// let value = Math.max( +// Math.abs(chartOverview[category].max), +// Math.abs(chartOverview[category].min) +// ); +// let magnitude = 0; +// +// if (value < 0) { +// value = -value; +// } +// while (value >= 1000) { +// value /= 1000; +// magnitude++; +// } +// chartOverview[category].magnitude = magnitude; +// }); +// +// chartOverview.Soc.unit = '(%)'; +// chartOverview.Soc.min = 0; +// chartOverview.Soc.max = 100; +// chartOverview.Temperature.unit = '(°C)'; +// chartOverview.Power.unit = +// '(' + prefixes[chartOverview['Power'].magnitude] + 'W' + ')'; +// chartOverview.Voltage.unit = +// '(' + prefixes[chartOverview['Voltage'].magnitude] + 'V' + ')'; +// +// chartOverview.Current.unit = +// '(' + prefixes[chartOverview['Current'].magnitude] + 'A' + ')'; +// +// return { +// chartData: chartData, +// chartOverview: chartOverview +// }; +// }; // We use this function in order to retrieve data for main stats. // The data is of the following form: @@ -768,444 +966,444 @@ export const transformInputToBatteryViewData = async ( // 'Node1': {name:'Node1', data: [[timestamp,value],[timestamp,value]]}, // 'Node2': {name:'Node2', data: [[timestamp,value],[timestamp,value]]}, // ]} - -const fetchDataForOneTime = async ( - startUnixTime: UnixTime, - s3Credentials: I_S3Credentials -): Promise>> => { - var timeperiodToSearch = 2; - let res; - let timestampToFetch; - - for (var i = 0; i < timeperiodToSearch; i++) { - timestampToFetch = startUnixTime.later(TimeSpan.fromSeconds(i)); - - try { - res = await fetchData(timestampToFetch, s3Credentials); - - if (res !== FetchResult.notAvailable && res !== FetchResult.tryLater) { - //console.log('Successfully fetched ' + timestampToFetch); - return res; - } - } catch (err) { - console.error('Error fetching data:', err); - } - } - return null; -}; - -export const transformInputToDailyData = async ( - s3Credentials: I_S3Credentials, - id: number, - start_time?: UnixTime, - end_time?: UnixTime -): Promise<{ - chartData: chartDataInterface; - chartOverview: overviewInterface; -}> => { - //const navigate = useNavigate(); - //const tokencontext = useContext(TokenContext); - //const { removeToken } = tokencontext; - const prefixes = ['', 'k', 'M', 'G', 'T']; - const MAX_NUMBER = 9999999; - const pathsToSearch = [ - '/Battery/Soc', - '/Battery/Temperature', - '/Battery/Dc/Power', - '/GridMeter/Ac/Power/Active', - '/PvOnDc/Dc/Power', - '/DcDc/Dc/Link/Voltage', - '/LoadOnAcGrid/Power/Active', - '/LoadOnDc/Power' - ]; - const categories = [ - 'soc', - 'temperature', - 'dcPower', - 'gridPower', - 'pvProduction', - 'dcBusVoltage', - 'ACLoad', - 'DCLoad' - ]; - - const chartData: chartDataInterface = { - soc: { name: 'State Of Charge', data: [] }, - temperature: { name: 'Battery Temperature', data: [] }, - dcPower: { name: 'Battery Power', data: [] }, - gridPower: { name: 'Grid Power', data: [] }, - pvProduction: { name: 'Pv Production', data: [] }, - dcBusVoltage: { name: 'DC Bus Voltage', data: [] }, - ACLoad: { name: 'AC Load', data: [] }, - DCLoad: { name: 'DC Load', data: [] } - }; - - const chartOverview: overviewInterface = { - soc: { magnitude: 0, unit: '', min: 0, max: 0 }, - temperature: { magnitude: 0, unit: '', min: 0, max: 0 }, - dcPower: { magnitude: 0, unit: '', min: 0, max: 0 }, - dcPowerWithoutHeating: { magnitude: 0, unit: '', min: 0, max: 0 }, - gridPower: { magnitude: 0, unit: '', min: 0, max: 0 }, - pvProduction: { magnitude: 0, unit: '', min: 0, max: 0 }, - dcBusVoltage: { magnitude: 0, unit: '', min: 0, max: 0 }, - overview: { magnitude: 0, unit: '', min: 0, max: 0 }, - ACLoad: { magnitude: 0, unit: '', min: 0, max: 0 }, - DCLoad: { magnitude: 0, unit: '', min: 0, max: 0 } - }; - - categories.forEach((category) => { - chartData[category].data = []; - chartOverview[category] = { - magnitude: 0, - unit: '', - min: MAX_NUMBER, - max: -MAX_NUMBER - }; - }); - - let timestampArray: number[] = []; - let adjustedTimestampArray = []; - const timestampPromises = []; - - await axiosConfig - .get( - `/GetCsvTimestampsForInstallation?id=${id}&start=${start_time.ticks}&end=${end_time.ticks}` - ) - .then((res: AxiosResponse) => { - timestampArray = res.data; - }) - .catch((err: AxiosError) => { - if (err.response && err.response.status == 401) { - //removeToken(); - //navigate(routes.login); - } - }); - - for (var i = 0; i < timestampArray.length; i++) { - timestampPromises.push( - fetchDataForOneTime(UnixTime.fromTicks(timestampArray[i]), s3Credentials) - ); - - const adjustedTimestamp = new Date(timestampArray[i] * 1000); - //Timezone offset is negative, so we convert the timestamp to the current zone by subtracting the corresponding offset - adjustedTimestamp.setHours( - adjustedTimestamp.getHours() - adjustedTimestamp.getTimezoneOffset() / 60 - ); - adjustedTimestampArray.push(adjustedTimestamp); - } - - const results: Promise>>[] = - await Promise.all(timestampPromises); - - for (let i = 0; i < results.length; i++) { - if (results[i] == null) { - // Handle not available or try later case - } else { - const timestamp = Object.keys(results[i])[ - Object.keys(results[i]).length - 1 - ]; - const result = results[i][timestamp]; - let category_index = 0; - // eslint-disable-next-line @typescript-eslint/no-loop-func - pathsToSearch.forEach((path) => { - if (result[path]) { - const value = result[path]; - - if (value.value < chartOverview[categories[category_index]].min) { - chartOverview[categories[category_index]].min = value.value; - } - - if (value.value > chartOverview[categories[category_index]].max) { - chartOverview[categories[category_index]].max = value.value; - } - chartData[categories[category_index]].data.push([ - adjustedTimestampArray[i], - value.value - ]); - } else { - //data[path].push([adjustedTimestamp, null]); - } - category_index++; - }); - } - } - - categories.forEach((category) => { - let value = Math.max( - Math.abs(chartOverview[category].max), - Math.abs(chartOverview[category].min) - ); - let magnitude = 0; - - if (value < 0) { - value = -value; - } - while (value >= 1000) { - value /= 1000; - magnitude++; - } - chartOverview[category].magnitude = magnitude; - }); - - chartOverview.soc.unit = '(%)'; - chartOverview.soc.min = 0; - chartOverview.soc.max = 100; - chartOverview.temperature.unit = '(°C)'; - chartOverview.dcPower.unit = - '(' + prefixes[chartOverview['dcPower'].magnitude] + 'W' + ')'; - chartOverview.gridPower.unit = - '(' + prefixes[chartOverview['gridPower'].magnitude] + 'W' + ')'; - chartOverview.pvProduction.unit = - '(' + prefixes[chartOverview['pvProduction'].magnitude] + 'W' + ')'; - chartOverview.dcBusVoltage.unit = - '(' + prefixes[chartOverview['dcBusVoltage'].magnitude] + 'V' + ')'; - - chartOverview.overview = { - magnitude: Math.max( - chartOverview['gridPower'].magnitude, - chartOverview['pvProduction'].magnitude - ), - unit: '(kW)', - min: Math.min( - chartOverview['gridPower'].min, - chartOverview['pvProduction'].min - ), - max: Math.max( - chartOverview['gridPower'].max, - chartOverview['pvProduction'].max - ) - }; - - return { - chartData: chartData, - chartOverview: chartOverview - }; -}; - -export const transformInputToAggregatedData = async ( - s3Credentials: I_S3Credentials, - start_date: dayjs.Dayjs, - end_date: dayjs.Dayjs -): Promise<{ - chartAggregatedData: chartAggregatedDataInterface; - chartOverview: overviewInterface; - dateList: string[]; -}> => { - const data = {}; - const overviewData = {}; - const MAX_NUMBER = 9999999; - const dateList = []; - - //let currentDate = dayjs(); - let currentDay = start_date; - // type === 'weekly' - // ? currentDate.subtract(1, 'week') - // : currentDate.subtract(1, 'month'); - - const pathsToSearch = [ - '/MinSoc', - '/MaxSoc', - '/PvPower', - '/DischargingBatteryPower', - '/ChargingBatteryPower', - '/GridImportPower', - '/GridExportPower', - '/HeatingPower' - ]; - - const categories = [ - 'minsoc', - 'maxsoc', - 'pvProduction', - 'dcChargingPower', - 'heatingPower', - 'dcDischargingPower', - 'gridImportPower', - 'gridExportPower' - ]; - - const chartAggregatedData: chartAggregatedDataInterface = { - minsoc: { name: 'min SOC', data: [] }, - maxsoc: { name: 'max SOC', data: [] }, - pvProduction: { name: 'Pv Energy', data: [] }, - dcChargingPower: { name: 'Charging Battery Energy', data: [] }, - heatingPower: { name: 'Heating Energy', data: [] }, - dcDischargingPower: { name: 'Discharging Battery Energy', data: [] }, - gridImportPower: { name: 'Grid Import Energy', data: [] }, - gridExportPower: { name: 'Grid Export Energy', data: [] } - }; - - const chartOverview: overviewInterface = { - soc: { magnitude: 0, unit: '', min: 0, max: 0 }, - temperature: { magnitude: 0, unit: '', min: 0, max: 0 }, - dcPower: { magnitude: 0, unit: '', min: 0, max: 0 }, - dcPowerWithoutHeating: { magnitude: 0, unit: '', min: 0, max: 0 }, - gridPower: { magnitude: 0, unit: '', min: 0, max: 0 }, - pvProduction: { magnitude: 0, unit: '', min: 0, max: 0 }, - dcBusVoltage: { magnitude: 0, unit: '', min: 0, max: 0 }, - overview: { magnitude: 0, unit: '', min: 0, max: 0 }, - ACLoad: { magnitude: 0, unit: '', min: 0, max: 0 }, - DCLoad: { magnitude: 0, unit: '', min: 0, max: 0 } - }; - - pathsToSearch.forEach((path) => { - data[path] = []; - overviewData[path] = { - magnitude: 0, - unit: '', - min: MAX_NUMBER, - max: -MAX_NUMBER - }; - }); - - const timestampPromises = []; - - while (currentDay.isBefore(end_date)) { - timestampPromises.push( - fetchAggregatedData(currentDay.format('YYYY-MM-DD'), s3Credentials) - ); - currentDay = currentDay.add(1, 'day'); - } - - const results = await Promise.all(timestampPromises); - currentDay = start_date; - - for (let i = 0; i < results.length; i++) { - const result = results[i]; - if ( - result === FetchResult.notAvailable || - result === FetchResult.tryLater - ) { - // Handle not available or try later case - } else { - dateList.push(currentDay.format('DD-MM')); - pathsToSearch.forEach((path) => { - if (result[path]) { - if (path === '/GridExportPower') { - result[path].value = -result[path].value; - } - if (result[path].value < overviewData[path].min) { - overviewData[path].min = result[path].value; - } - if (result[path].value > overviewData[path].max) { - overviewData[path].max = result[path].value; - } - // if (path === '/GridExportPower' && Math.abs(result[path].value) < 0.1) { - // result[path].value = -0.3; - // } - data[path].push(result[path].value as number); - } - }); - } - currentDay = currentDay.add(1, 'day'); - } - - pathsToSearch.forEach((path) => { - let value = Math.max( - Math.abs(overviewData[path].max), - Math.abs(overviewData[path].min) - ); - let magnitude = 0; - - if (value < 0) { - value = -value; - } - while (value >= 1000) { - value /= 1000; - magnitude++; - } - overviewData[path].magnitude = magnitude; - }); - - let path = '/MinSoc'; - chartAggregatedData.minsoc.data = data[path]; - - path = '/MaxSoc'; - chartAggregatedData.maxsoc.data = data[path]; - - chartOverview.soc = { - unit: '(%)', - magnitude: overviewData[path].magnitude, - min: 0, - max: 100 - }; - - path = '/PvPower'; - chartAggregatedData.pvProduction.data = data[path]; - - chartOverview.pvProduction = { - magnitude: overviewData[path].magnitude, - unit: '(kWh)', - min: overviewData[path].min, - max: overviewData[path].max - }; - - path = '/ChargingBatteryPower'; - chartAggregatedData.dcChargingPower.data = data[path]; - - path = '/DischargingBatteryPower'; - chartAggregatedData.dcDischargingPower.data = data[path]; - - path = '/HeatingPower'; - chartAggregatedData.heatingPower.data = data[path]; - - chartOverview.dcPowerWithoutHeating = { - magnitude: Math.max( - overviewData['/ChargingBatteryPower'].magnitude, - overviewData['/DischargingBatteryPower'].magnitude - ), - unit: '(kWh)', - min: overviewData['/DischargingBatteryPower'].min, - max: overviewData['/ChargingBatteryPower'].max - }; - - chartOverview.dcPower = { - magnitude: Math.max( - overviewData['/ChargingBatteryPower'].magnitude, - overviewData['/HeatingPower'].magnitude, - overviewData['/DischargingBatteryPower'].magnitude - ), - unit: '(kWh)', - min: overviewData['/DischargingBatteryPower'].min, - max: - overviewData['/ChargingBatteryPower'].max + - overviewData['/HeatingPower'].max - }; - - path = '/GridImportPower'; - chartAggregatedData.gridImportPower.data = data[path]; - - path = '/GridExportPower'; - chartAggregatedData.gridExportPower.data = data[path]; - - chartOverview.gridPower = { - magnitude: Math.max( - overviewData['/GridImportPower'].magnitude, - overviewData['/GridExportPower'].magnitude - ), - unit: '(kWh)', - min: overviewData['/GridExportPower'].min, - max: overviewData['/GridImportPower'].max - }; - - chartOverview.overview = { - magnitude: 0, - unit: '(kWh)', - min: Math.min( - overviewData['/GridImportPower'].min, - overviewData['/GridExportPower'].min, - overviewData['/PvPower'].min - ), - max: Math.max( - overviewData['/GridImportPower'].max, - overviewData['/GridExportPower'].max, - overviewData['/PvPower'].max - ) - }; - - return { - chartAggregatedData: chartAggregatedData, - chartOverview: chartOverview, - dateList: dateList - }; -}; +// +// const fetchDataForOneTime = async ( +// startUnixTime: UnixTime, +// s3Credentials: I_S3Credentials +// ): Promise>> => { +// var timeperiodToSearch = 2; +// let res; +// let timestampToFetch; +// +// for (var i = 0; i < timeperiodToSearch; i++) { +// timestampToFetch = startUnixTime.later(TimeSpan.fromSeconds(i)); +// +// try { +// res = await fetchData(timestampToFetch, s3Credentials); +// +// if (res !== FetchResult.notAvailable && res !== FetchResult.tryLater) { +// //console.log('Successfully fetched ' + timestampToFetch); +// return res; +// } +// } catch (err) { +// console.error('Error fetching data:', err); +// } +// } +// return null; +// }; +// +// export const transformInputToDailyData = async ( +// s3Credentials: I_S3Credentials, +// id: number, +// start_time?: UnixTime, +// end_time?: UnixTime +// ): Promise<{ +// chartData: chartDataInterface; +// chartOverview: overviewInterface; +// }> => { +// //const navigate = useNavigate(); +// //const tokencontext = useContext(TokenContext); +// //const { removeToken } = tokencontext; +// const prefixes = ['', 'k', 'M', 'G', 'T']; +// const MAX_NUMBER = 9999999; +// const pathsToSearch = [ +// '/Battery/Soc', +// '/Battery/Temperature', +// '/Battery/Dc/Power', +// '/GridMeter/Ac/Power/Active', +// '/PvOnDc/Dc/Power', +// '/DcDc/Dc/Link/Voltage', +// '/LoadOnAcGrid/Power/Active', +// '/LoadOnDc/Power' +// ]; +// const categories = [ +// 'soc', +// 'temperature', +// 'dcPower', +// 'gridPower', +// 'pvProduction', +// 'dcBusVoltage', +// 'ACLoad', +// 'DCLoad' +// ]; +// +// const chartData: chartDataInterface = { +// soc: { name: 'State Of Charge', data: [] }, +// temperature: { name: 'Battery Temperature', data: [] }, +// dcPower: { name: 'Battery Power', data: [] }, +// gridPower: { name: 'Grid Power', data: [] }, +// pvProduction: { name: 'Pv Production', data: [] }, +// dcBusVoltage: { name: 'DC Bus Voltage', data: [] }, +// ACLoad: { name: 'AC Load', data: [] }, +// DCLoad: { name: 'DC Load', data: [] } +// }; +// +// const chartOverview: overviewInterface = { +// soc: { magnitude: 0, unit: '', min: 0, max: 0 }, +// temperature: { magnitude: 0, unit: '', min: 0, max: 0 }, +// dcPower: { magnitude: 0, unit: '', min: 0, max: 0 }, +// dcPowerWithoutHeating: { magnitude: 0, unit: '', min: 0, max: 0 }, +// gridPower: { magnitude: 0, unit: '', min: 0, max: 0 }, +// pvProduction: { magnitude: 0, unit: '', min: 0, max: 0 }, +// dcBusVoltage: { magnitude: 0, unit: '', min: 0, max: 0 }, +// overview: { magnitude: 0, unit: '', min: 0, max: 0 }, +// ACLoad: { magnitude: 0, unit: '', min: 0, max: 0 }, +// DCLoad: { magnitude: 0, unit: '', min: 0, max: 0 } +// }; +// +// categories.forEach((category) => { +// chartData[category].data = []; +// chartOverview[category] = { +// magnitude: 0, +// unit: '', +// min: MAX_NUMBER, +// max: -MAX_NUMBER +// }; +// }); +// +// let timestampArray: number[] = []; +// let adjustedTimestampArray = []; +// const timestampPromises = []; +// +// await axiosConfig +// .get( +// `/GetCsvTimestampsForInstallation?id=${id}&start=${start_time.ticks}&end=${end_time.ticks}` +// ) +// .then((res: AxiosResponse) => { +// timestampArray = res.data; +// }) +// .catch((err: AxiosError) => { +// if (err.response && err.response.status == 401) { +// //removeToken(); +// //navigate(routes.login); +// } +// }); +// +// for (var i = 0; i < timestampArray.length; i++) { +// timestampPromises.push( +// fetchDataForOneTime(UnixTime.fromTicks(timestampArray[i]), s3Credentials) +// ); +// +// const adjustedTimestamp = new Date(timestampArray[i] * 1000); +// //Timezone offset is negative, so we convert the timestamp to the current zone by subtracting the corresponding offset +// adjustedTimestamp.setHours( +// adjustedTimestamp.getHours() - adjustedTimestamp.getTimezoneOffset() / 60 +// ); +// adjustedTimestampArray.push(adjustedTimestamp); +// } +// +// const results: Promise>>[] = +// await Promise.all(timestampPromises); +// +// for (let i = 0; i < results.length; i++) { +// if (results[i] == null) { +// // Handle not available or try later case +// } else { +// const timestamp = Object.keys(results[i])[ +// Object.keys(results[i]).length - 1 +// ]; +// const result = results[i][timestamp]; +// let category_index = 0; +// // eslint-disable-next-line @typescript-eslint/no-loop-func +// pathsToSearch.forEach((path) => { +// if (result[path]) { +// const value = result[path]; +// +// if (value.value < chartOverview[categories[category_index]].min) { +// chartOverview[categories[category_index]].min = value.value; +// } +// +// if (value.value > chartOverview[categories[category_index]].max) { +// chartOverview[categories[category_index]].max = value.value; +// } +// chartData[categories[category_index]].data.push([ +// adjustedTimestampArray[i], +// value.value +// ]); +// } else { +// //data[path].push([adjustedTimestamp, null]); +// } +// category_index++; +// }); +// } +// } +// +// categories.forEach((category) => { +// let value = Math.max( +// Math.abs(chartOverview[category].max), +// Math.abs(chartOverview[category].min) +// ); +// let magnitude = 0; +// +// if (value < 0) { +// value = -value; +// } +// while (value >= 1000) { +// value /= 1000; +// magnitude++; +// } +// chartOverview[category].magnitude = magnitude; +// }); +// +// chartOverview.soc.unit = '(%)'; +// chartOverview.soc.min = 0; +// chartOverview.soc.max = 100; +// chartOverview.temperature.unit = '(°C)'; +// chartOverview.dcPower.unit = +// '(' + prefixes[chartOverview['dcPower'].magnitude] + 'W' + ')'; +// chartOverview.gridPower.unit = +// '(' + prefixes[chartOverview['gridPower'].magnitude] + 'W' + ')'; +// chartOverview.pvProduction.unit = +// '(' + prefixes[chartOverview['pvProduction'].magnitude] + 'W' + ')'; +// chartOverview.dcBusVoltage.unit = +// '(' + prefixes[chartOverview['dcBusVoltage'].magnitude] + 'V' + ')'; +// +// chartOverview.overview = { +// magnitude: Math.max( +// chartOverview['gridPower'].magnitude, +// chartOverview['pvProduction'].magnitude +// ), +// unit: '(kW)', +// min: Math.min( +// chartOverview['gridPower'].min, +// chartOverview['pvProduction'].min +// ), +// max: Math.max( +// chartOverview['gridPower'].max, +// chartOverview['pvProduction'].max +// ) +// }; +// +// return { +// chartData: chartData, +// chartOverview: chartOverview +// }; +// }; +// +// export const transformInputToAggregatedData = async ( +// s3Credentials: I_S3Credentials, +// start_date: dayjs.Dayjs, +// end_date: dayjs.Dayjs +// ): Promise<{ +// chartAggregatedData: chartAggregatedDataInterface; +// chartOverview: overviewInterface; +// dateList: string[]; +// }> => { +// const data = {}; +// const overviewData = {}; +// const MAX_NUMBER = 9999999; +// const dateList = []; +// +// //let currentDate = dayjs(); +// let currentDay = start_date; +// // type === 'weekly' +// // ? currentDate.subtract(1, 'week') +// // : currentDate.subtract(1, 'month'); +// +// const pathsToSearch = [ +// '/MinSoc', +// '/MaxSoc', +// '/PvPower', +// '/DischargingBatteryPower', +// '/ChargingBatteryPower', +// '/GridImportPower', +// '/GridExportPower', +// '/HeatingPower' +// ]; +// +// const categories = [ +// 'minsoc', +// 'maxsoc', +// 'pvProduction', +// 'dcChargingPower', +// 'heatingPower', +// 'dcDischargingPower', +// 'gridImportPower', +// 'gridExportPower' +// ]; +// +// const chartAggregatedData: chartAggregatedDataInterface = { +// minsoc: { name: 'min SOC', data: [] }, +// maxsoc: { name: 'max SOC', data: [] }, +// pvProduction: { name: 'Pv Energy', data: [] }, +// dcChargingPower: { name: 'Charging Battery Energy', data: [] }, +// heatingPower: { name: 'Heating Energy', data: [] }, +// dcDischargingPower: { name: 'Discharging Battery Energy', data: [] }, +// gridImportPower: { name: 'Grid Import Energy', data: [] }, +// gridExportPower: { name: 'Grid Export Energy', data: [] } +// }; +// +// const chartOverview: overviewInterface = { +// soc: { magnitude: 0, unit: '', min: 0, max: 0 }, +// temperature: { magnitude: 0, unit: '', min: 0, max: 0 }, +// dcPower: { magnitude: 0, unit: '', min: 0, max: 0 }, +// dcPowerWithoutHeating: { magnitude: 0, unit: '', min: 0, max: 0 }, +// gridPower: { magnitude: 0, unit: '', min: 0, max: 0 }, +// pvProduction: { magnitude: 0, unit: '', min: 0, max: 0 }, +// dcBusVoltage: { magnitude: 0, unit: '', min: 0, max: 0 }, +// overview: { magnitude: 0, unit: '', min: 0, max: 0 }, +// ACLoad: { magnitude: 0, unit: '', min: 0, max: 0 }, +// DCLoad: { magnitude: 0, unit: '', min: 0, max: 0 } +// }; +// +// pathsToSearch.forEach((path) => { +// data[path] = []; +// overviewData[path] = { +// magnitude: 0, +// unit: '', +// min: MAX_NUMBER, +// max: -MAX_NUMBER +// }; +// }); +// +// const timestampPromises = []; +// +// while (currentDay.isBefore(end_date)) { +// timestampPromises.push( +// fetchAggregatedData(currentDay.format('YYYY-MM-DD'), s3Credentials) +// ); +// currentDay = currentDay.add(1, 'day'); +// } +// +// const results = await Promise.all(timestampPromises); +// currentDay = start_date; +// +// for (let i = 0; i < results.length; i++) { +// const result = results[i]; +// if ( +// result === FetchResult.notAvailable || +// result === FetchResult.tryLater +// ) { +// // Handle not available or try later case +// } else { +// dateList.push(currentDay.format('DD-MM')); +// pathsToSearch.forEach((path) => { +// if (result[path]) { +// if (path === '/GridExportPower') { +// result[path].value = -result[path].value; +// } +// if (result[path].value < overviewData[path].min) { +// overviewData[path].min = result[path].value; +// } +// if (result[path].value > overviewData[path].max) { +// overviewData[path].max = result[path].value; +// } +// // if (path === '/GridExportPower' && Math.abs(result[path].value) < 0.1) { +// // result[path].value = -0.3; +// // } +// data[path].push(result[path].value as number); +// } +// }); +// } +// currentDay = currentDay.add(1, 'day'); +// } +// +// pathsToSearch.forEach((path) => { +// let value = Math.max( +// Math.abs(overviewData[path].max), +// Math.abs(overviewData[path].min) +// ); +// let magnitude = 0; +// +// if (value < 0) { +// value = -value; +// } +// while (value >= 1000) { +// value /= 1000; +// magnitude++; +// } +// overviewData[path].magnitude = magnitude; +// }); +// +// let path = '/MinSoc'; +// chartAggregatedData.minsoc.data = data[path]; +// +// path = '/MaxSoc'; +// chartAggregatedData.maxsoc.data = data[path]; +// +// chartOverview.soc = { +// unit: '(%)', +// magnitude: overviewData[path].magnitude, +// min: 0, +// max: 100 +// }; +// +// path = '/PvPower'; +// chartAggregatedData.pvProduction.data = data[path]; +// +// chartOverview.pvProduction = { +// magnitude: overviewData[path].magnitude, +// unit: '(kWh)', +// min: overviewData[path].min, +// max: overviewData[path].max +// }; +// +// path = '/ChargingBatteryPower'; +// chartAggregatedData.dcChargingPower.data = data[path]; +// +// path = '/DischargingBatteryPower'; +// chartAggregatedData.dcDischargingPower.data = data[path]; +// +// path = '/HeatingPower'; +// chartAggregatedData.heatingPower.data = data[path]; +// +// chartOverview.dcPowerWithoutHeating = { +// magnitude: Math.max( +// overviewData['/ChargingBatteryPower'].magnitude, +// overviewData['/DischargingBatteryPower'].magnitude +// ), +// unit: '(kWh)', +// min: overviewData['/DischargingBatteryPower'].min, +// max: overviewData['/ChargingBatteryPower'].max +// }; +// +// chartOverview.dcPower = { +// magnitude: Math.max( +// overviewData['/ChargingBatteryPower'].magnitude, +// overviewData['/HeatingPower'].magnitude, +// overviewData['/DischargingBatteryPower'].magnitude +// ), +// unit: '(kWh)', +// min: overviewData['/DischargingBatteryPower'].min, +// max: +// overviewData['/ChargingBatteryPower'].max + +// overviewData['/HeatingPower'].max +// }; +// +// path = '/GridImportPower'; +// chartAggregatedData.gridImportPower.data = data[path]; +// +// path = '/GridExportPower'; +// chartAggregatedData.gridExportPower.data = data[path]; +// +// chartOverview.gridPower = { +// magnitude: Math.max( +// overviewData['/GridImportPower'].magnitude, +// overviewData['/GridExportPower'].magnitude +// ), +// unit: '(kWh)', +// min: overviewData['/GridExportPower'].min, +// max: overviewData['/GridImportPower'].max +// }; +// +// chartOverview.overview = { +// magnitude: 0, +// unit: '(kWh)', +// min: Math.min( +// overviewData['/GridImportPower'].min, +// overviewData['/GridExportPower'].min, +// overviewData['/PvPower'].min +// ), +// max: Math.max( +// overviewData['/GridImportPower'].max, +// overviewData['/GridExportPower'].max, +// overviewData['/PvPower'].max +// ) +// }; +// +// return { +// chartAggregatedData: chartAggregatedData, +// chartOverview: chartOverview, +// dateList: dateList +// }; +// };